Files
cheesy-arena-lite/field/notifier_test.go
2017-08-31 22:00:09 -07:00

85 lines
2.1 KiB
Go

// Copyright 2014 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
package field
import (
"github.com/stretchr/testify/assert"
"io/ioutil"
"log"
"testing"
)
func TestNotifier(t *testing.T) {
notifier := NewNotifier()
// Should do nothing when there are no listeners.
notifier.Notify("test message")
notifier.Notify(12345)
notifier.Notify(struct{}{})
listener := notifier.Listen()
notifier.Notify("test message")
assert.Equal(t, "test message", <-listener)
notifier.Notify(12345)
assert.Equal(t, 12345, <-listener)
// Should allow multiple messages without blocking.
notifier.Notify("message1")
notifier.Notify("message2")
notifier.Notify("message3")
assert.Equal(t, "message1", <-listener)
assert.Equal(t, "message2", <-listener)
assert.Equal(t, "message3", <-listener)
// Should stop sending messages and not block once the buffer is full.
log.SetOutput(ioutil.Discard) // Silence noisy log output.
for i := 0; i < 20; i++ {
notifier.Notify(i)
}
var value interface{}
var lastValue interface{}
for lastValue == nil {
select {
case value = <-listener:
default:
lastValue = value
return
}
}
notifier.Notify("next message")
assert.True(t, lastValue.(int) < 10)
assert.Equal(t, "next message", <-listener)
}
func TestNotifyMultipleListeners(t *testing.T) {
notifier := NewNotifier()
listeners := [50]chan interface{}{}
for i := 0; i < len(listeners); i++ {
listeners[i] = notifier.Listen()
}
notifier.Notify("test message")
notifier.Notify(12345)
for listener, _ := range notifier.listeners {
assert.Equal(t, "test message", <-listener)
assert.Equal(t, 12345, <-listener)
}
// Should reap closed channels automatically.
close(listeners[4])
notifier.Notify("message1")
assert.Equal(t, 49, len(notifier.listeners))
for listener, _ := range notifier.listeners {
assert.Equal(t, "message1", <-listener)
}
close(listeners[16])
close(listeners[21])
close(listeners[49])
notifier.Notify("message2")
assert.Equal(t, 46, len(notifier.listeners))
for listener, _ := range notifier.listeners {
assert.Equal(t, "message2", <-listener)
}
}