Skip to content

Commit

Permalink
fix: #20 group listeners fire error
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Oct 3, 2021
1 parent f93466b commit 6cdbf66
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 3 deletions.
65 changes: 64 additions & 1 deletion issues_test.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package event_test

import (
"bytes"
"container/list"
"fmt"
"testing"

"github.com/gookit/event"
"github.com/gookit/goutil/dump"
"github.com/stretchr/testify/assert"
)

type testNotify struct {}
type testNotify struct{}

func (notify *testNotify) Handle(e event.Event) error {
isRun = true
Expand All @@ -30,3 +34,62 @@ func TestIssue_8(t *testing.T) {
assert.Nil(t, err)
assert.True(t, isRun)
}

// https://github.com/gookit/event/issues/8
func TestIssues_9(t *testing.T) {
evBus := event.NewManager("")
eName := "evt1"

f1 := makeFn(11)
evBus.On(eName, f1)

f2 := makeFn(22)
evBus.On(eName, f2)
assert.Equal(t, 2, evBus.ListenersCount(eName))

f3 := event.ListenerFunc(func(e event.Event) error {
dump.Println(e.Name())
return nil
})
evBus.On(eName, f3)

l := list.New()
l.PushBack(f1)
l.PushBack(f2)
l.PushBack(f3)

dump.Println(l.Len())

evBus.RemoveListener(eName, f1) // DON'T REMOVE ALL !!!
assert.Equal(t, 2, evBus.ListenersCount(eName))

evBus.MustFire(eName, event.M{"arg0": "val0", "arg1": "val1"})
}

func makeFn(a int) event.ListenerFunc {
return func(e event.Event) error {
dump.Println(a, e.Name())
return nil
}
}

// https://github.com/gookit/event/issues/20
func TestIssues_20(t *testing.T) {
buf := new(bytes.Buffer)
mgr := event.NewManager("test")

handler := event.ListenerFunc(func(e event.Event) error {
_, _ = fmt.Fprintf(buf, "%s-%s|", e.Name(), e.Get("user"))
return nil
})

mgr.On("app.user.*", handler)
// ERROR: if not register "app.user.add", will not trigger "app.user.*"
// mgr.On("app.user.add", handler)

err, _ := mgr.Fire("app.user.add", event.M{"user": "INHERE"})
assert.NoError(t, err)
assert.Same(t, "app.user.add-INHERE|", buf.String())

dump.P(buf.String())
}
13 changes: 11 additions & 2 deletions manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,19 @@ func (em *Manager) Trigger(name string, params M) (error, Event) {
func (em *Manager) Fire(name string, params M) (err error, e Event) {
name = goodName(name)

// not found listeners.
// NOTICE: must check the '*' global listeners
if false == em.HasListeners(name) && false == em.HasListeners(Wildcard) {
return
// has group listeners. "app.*" "app.db.*"
// eg: "app.db.run" will trigger listeners on the "app.db.*"
pos := strings.LastIndexByte(name, '.')
if pos > 0 && pos < len(name) {
groupName := name[:pos+1] + Wildcard // "app.db.*"

// not found listeners.
if false == em.HasListeners(groupName) {
return
}
}
}

// call listeners use defined Event
Expand Down

0 comments on commit 6cdbf66

Please sign in to comment.