mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 13:46:44 -04:00
85 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|