From 0ed805099e202c735d4b907bf62eea7f14b1844f Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Wed, 27 Aug 2014 16:10:33 +0800 Subject: [PATCH] Fix register callbacks in some cases --- callback.go | 12 +++++------ callback_test.go | 53 +++++++++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/callback.go b/callback.go index cab2bd94..fa8b4822 100644 --- a/callback.go +++ b/callback.go @@ -88,7 +88,7 @@ func getRIndex(strs []string, str string) int { } func sortProcessors(cps []*callback_processor) []*func(scope *Scope) { - var sortCallbackProcessor func(c *callback_processor, force bool) + var sortCallbackProcessor func(c *callback_processor) var names, sortedNames = []string{}, []string{} for _, cp := range cps { @@ -104,7 +104,7 @@ func sortProcessors(cps []*callback_processor) []*func(scope *Scope) { names = append(names, cp.name) } - sortCallbackProcessor = func(c *callback_processor, force bool) { + sortCallbackProcessor = func(c *callback_processor) { if getRIndex(sortedNames, c.name) > -1 { return } @@ -114,7 +114,7 @@ func sortProcessors(cps []*callback_processor) []*func(scope *Scope) { sortedNames = append(sortedNames[:index], append([]string{c.name}, sortedNames[index:]...)...) } else if index := getRIndex(names, c.before); index > -1 { sortedNames = append(sortedNames, c.name) - sortCallbackProcessor(cps[index], true) + sortCallbackProcessor(cps[index]) } else { sortedNames = append(sortedNames, c.name) } @@ -128,19 +128,19 @@ func sortProcessors(cps []*callback_processor) []*func(scope *Scope) { if len(cp.before) == 0 { cp.before = c.name } - sortCallbackProcessor(cp, true) + sortCallbackProcessor(cp) } else { sortedNames = append(sortedNames, c.name) } } - if getRIndex(sortedNames, c.name) == -1 && force { + if getRIndex(sortedNames, c.name) == -1 { sortedNames = append(sortedNames, c.name) } } for _, cp := range cps { - sortCallbackProcessor(cp, false) + sortCallbackProcessor(cp) } var funcs = []*func(scope *Scope){} diff --git a/callback_test.go b/callback_test.go index 6fa05f49..fb814556 100644 --- a/callback_test.go +++ b/callback_test.go @@ -36,42 +36,49 @@ func TestRegisterCallback(t *testing.T) { } } -func TestRegisterCallbackWithBasicOrder(t *testing.T) { - var callback = &callback{processors: []*callback_processor{}} +func TestRegisterCallbackWithOrder(t *testing.T) { + var callback1 = &callback{processors: []*callback_processor{}} + callback1.Create().Register("before_create1", before_create1) + callback1.Create().Register("create", create) + callback1.Create().Register("after_create1", after_create1) + callback1.Create().Before("after_create1").Register("after_create2", after_create2) + if !equalFuncs(callback1.creates, []string{"before_create1", "create", "after_create2", "after_create1"}) { + t.Errorf("register callback with order") + } - callback.Update().Register("create", create) - callback.Update().Before("create").Register("before_create1", before_create1) - callback.Update().After("after_create2").Register("after_create1", after_create1) - callback.Update().Before("before_create1").Register("before_create2", before_create2) - callback.Update().Register("after_create2", after_create2) + var callback2 = &callback{processors: []*callback_processor{}} - if !equalFuncs(callback.updates, []string{"before_create2", "before_create1", "create", "after_create2", "after_create1"}) { + callback2.Update().Register("create", create) + callback2.Update().Before("create").Register("before_create1", before_create1) + callback2.Update().After("after_create2").Register("after_create1", after_create1) + callback2.Update().Before("before_create1").Register("before_create2", before_create2) + callback2.Update().Register("after_create2", after_create2) + + if !equalFuncs(callback2.updates, []string{"before_create2", "before_create1", "create", "after_create2", "after_create1"}) { t.Errorf("register callback with order") } } -func TestRegisterCallbackWithComplexOrder1(t *testing.T) { - var callback = &callback{processors: []*callback_processor{}} +func TestRegisterCallbackWithComplexOrder(t *testing.T) { + var callback1 = &callback{processors: []*callback_processor{}} - callback.Query().Before("after_create1").After("before_create1").Register("create", create) - callback.Query().Register("before_create1", before_create1) - callback.Query().Register("after_create1", after_create1) + callback1.Query().Before("after_create1").After("before_create1").Register("create", create) + callback1.Query().Register("before_create1", before_create1) + callback1.Query().Register("after_create1", after_create1) - if !equalFuncs(callback.queries, []string{"before_create1", "create", "after_create1"}) { + if !equalFuncs(callback1.queries, []string{"before_create1", "create", "after_create1"}) { t.Errorf("register callback with order") } -} -func TestRegisterCallbackWithComplexOrder2(t *testing.T) { - var callback = &callback{processors: []*callback_processor{}} + var callback2 = &callback{processors: []*callback_processor{}} - callback.Delete().Before("after_create1").After("before_create1").Register("create", create) - callback.Delete().Before("create").Register("before_create1", before_create1) - callback.Delete().After("before_create1").Register("before_create2", before_create2) - callback.Delete().Register("after_create1", after_create1) - callback.Delete().After("after_create1").Register("after_create2", after_create2) + callback2.Delete().Before("after_create1").After("before_create1").Register("create", create) + callback2.Delete().Before("create").Register("before_create1", before_create1) + callback2.Delete().After("before_create1").Register("before_create2", before_create2) + callback2.Delete().Register("after_create1", after_create1) + callback2.Delete().After("after_create1").Register("after_create2", after_create2) - if !equalFuncs(callback.deletes, []string{"before_create1", "before_create2", "create", "after_create1", "after_create2"}) { + if !equalFuncs(callback2.deletes, []string{"before_create1", "before_create2", "create", "after_create1", "after_create2"}) { t.Errorf("register callback with order") } }