This commit is contained in:
jackdaw@loafle.com 2017-04-14 15:28:33 +09:00
parent afce4d140e
commit 54d56b1df4
2 changed files with 106 additions and 5 deletions

View File

@ -41,10 +41,14 @@ func (o *observer) Remove(id string, rch chan interface{}) error {
newArr = append(newArr, ch)
} else {
close(ch)
ch = nil
}
}
if len(newArr) == 0 {
delete(o.events,id)
} else {
o.events[id] = newArr
}
return nil
}
func (o *observer) Notify(id string, arg interface{}) error {
@ -73,6 +77,9 @@ func init() {
})
}
// interface
func Add(id string, ch chan interface{}) error {
return _observer.Add(id, ch)
}
@ -82,3 +89,7 @@ func Remove(id string, rch chan interface{}) error {
func Notify(id string, arg interface{}) error {
return _observer.Notify(id, arg)
}
func GetCount() (int) {
return len(_observer.events)
}

View File

@ -1,7 +1,97 @@
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)
}