.
This commit is contained in:
parent
afce4d140e
commit
54d56b1df4
|
@ -41,10 +41,14 @@ func (o *observer) Remove(id string, rch chan interface{}) error {
|
||||||
newArr = append(newArr, ch)
|
newArr = append(newArr, ch)
|
||||||
} else {
|
} else {
|
||||||
close(ch)
|
close(ch)
|
||||||
|
ch = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(newArr) == 0 {
|
||||||
|
delete(o.events,id)
|
||||||
|
} else {
|
||||||
o.events[id] = newArr
|
o.events[id] = newArr
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (o *observer) Notify(id string, arg interface{}) error {
|
func (o *observer) Notify(id string, arg interface{}) error {
|
||||||
|
@ -73,6 +77,9 @@ func init() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// interface
|
||||||
|
|
||||||
func Add(id string, ch chan interface{}) error {
|
func Add(id string, ch chan interface{}) error {
|
||||||
return _observer.Add(id, ch)
|
return _observer.Add(id, ch)
|
||||||
}
|
}
|
||||||
|
@ -82,3 +89,7 @@ func Remove(id string, rch chan interface{}) error {
|
||||||
func Notify(id string, arg interface{}) error {
|
func Notify(id string, arg interface{}) error {
|
||||||
return _observer.Notify(id, arg)
|
return _observer.Notify(id, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetCount() (int) {
|
||||||
|
return len(_observer.events)
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,97 @@
|
||||||
package observer
|
package observer
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
func TestObserver(t *testing.T) {
|
type Test struct {
|
||||||
|
Id string
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAddNotifyObserver(t *testing.T) {
|
||||||
|
|
||||||
|
// others package notify call
|
||||||
|
go func() {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
Notify("test", Test{Id: "test"})
|
||||||
|
}()
|
||||||
|
|
||||||
|
ch := make(chan interface{},0)
|
||||||
|
Add("test", ch)
|
||||||
|
|
||||||
|
dd := <-ch
|
||||||
|
bb := dd.(Test)
|
||||||
|
assert.Equal(t, "test", bb.Id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRemoveObserver(t *testing.T) {
|
||||||
|
|
||||||
|
ch := make(chan interface{},0)
|
||||||
|
Add("test", ch)
|
||||||
|
|
||||||
|
err := Remove("test", ch)
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
func TestMultiAddObserver(t *testing.T) {
|
||||||
|
ch1 := make(chan interface{},0)
|
||||||
|
ch2 := make(chan interface{},0)
|
||||||
|
ch3 := make(chan interface{},0)
|
||||||
|
ch4 := make(chan interface{},0)
|
||||||
|
ch5 := make(chan interface{},0)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
d:=<-ch1
|
||||||
|
dd := d.(Test)
|
||||||
|
assert.Equal(t, dd.Id,"test")
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
d:=<-ch2
|
||||||
|
dd := d.(Test)
|
||||||
|
assert.Equal(t, dd.Id,"test")
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
d:=<-ch3
|
||||||
|
dd := d.(Test)
|
||||||
|
assert.Equal(t, dd.Id,"test")
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
d:=<-ch4
|
||||||
|
dd := d.(Test)
|
||||||
|
assert.Equal(t, dd.Id,"test")
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
d:=<-ch4
|
||||||
|
dd := d.(Test)
|
||||||
|
assert.Equal(t, dd.Id,"test")
|
||||||
|
}()
|
||||||
|
|
||||||
|
Add("test", ch1)
|
||||||
|
Add("test", ch2)
|
||||||
|
Add("test", ch3)
|
||||||
|
Add("test", ch4)
|
||||||
|
Add("test", ch5)
|
||||||
|
|
||||||
|
// others package notify call
|
||||||
|
go func() {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
Notify("test", Test{Id: "test"})
|
||||||
|
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
Remove("test", ch1)
|
||||||
|
Remove("test", ch2)
|
||||||
|
Remove("test", ch3)
|
||||||
|
Remove("test", ch4)
|
||||||
|
Remove("test", ch5)
|
||||||
|
}()
|
||||||
|
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user