package event import ( "testing" "time" ) func TestNew(t *testing.T) { bus := New() if bus == nil { t.Log("New EventBus not created!") t.Fail() } } func TestHasCallback(t *testing.T) { bus := New() bus.Subscribe("topic", func() {}) if bus.HasCallback("topic_topic") { t.Fail() } if !bus.HasCallback("topic") { t.Fail() } } func TestSubscribe(t *testing.T) { bus := New() if bus.Subscribe("topic", func() {}) != nil { t.Fail() } if bus.Subscribe("topic", "String") == nil { t.Fail() } } func TestSubscribeOnce(t *testing.T) { bus := New() if bus.SubscribeOnce("topic", func() {}) != nil { t.Fail() } if bus.SubscribeOnce("topic", "String") == nil { t.Fail() } } func TestSubscribeOnceAndManySubscribe(t *testing.T) { bus := New() event := "topic" flag := 0 fn := func() { flag += 1 } bus.SubscribeOnce(event, fn) bus.Subscribe(event, fn) bus.Subscribe(event, fn) bus.Publish(event) if flag != 3 { t.Fail() } } func TestUnsubscribe(t *testing.T) { bus := New() handler := func() {} bus.Subscribe("topic", handler) if bus.Unsubscribe("topic", handler) != nil { t.Fail() } if bus.Unsubscribe("topic", handler) == nil { t.Fail() } } func TestPublish(t *testing.T) { bus := New() bus.Subscribe("topic", func(a int, b int) { if a != b { t.Fail() } }) bus.Publish("topic", 10, 10) } func TestSubcribeOnceAsync(t *testing.T) { results := make([]int, 0) bus := New() bus.SubscribeOnceAsync("topic", func(a int, out *[]int) { *out = append(*out, a) }) bus.Publish("topic", 10, &results) bus.Publish("topic", 10, &results) bus.WaitAsync() if len(results) != 1 { t.Fail() } if bus.HasCallback("topic") { t.Fail() } } func TestSubscribeAsyncTransactional(t *testing.T) { results := make([]int, 0) bus := New() bus.SubscribeAsync("topic", func(a int, out *[]int, dur string) { sleep, _ := time.ParseDuration(dur) time.Sleep(sleep) *out = append(*out, a) }, true) bus.Publish("topic", 1, &results, "1s") bus.Publish("topic", 2, &results, "0s") bus.WaitAsync() if len(results) != 2 { t.Fail() } if results[0] != 1 || results[1] != 2 { t.Fail() } } func TestSubscribeAsync(t *testing.T) { results := make(chan int) bus := New() bus.SubscribeAsync("topic", func(a int, out chan<- int) { out <- a }, false) bus.Publish("topic", 1, results) bus.Publish("topic", 2, results) numResults := 0 go func() { for _ = range results { numResults++ } }() bus.WaitAsync() time.Sleep(10 * time.Millisecond) if numResults != 2 { t.Fail() } }