-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathobserver_test.go
89 lines (71 loc) · 1.68 KB
/
observer_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import "fmt"
import "testing"
type Subscriber interface {
Notify(string)
}
type Publisher struct {
ObserverList []Subscriber
}
func (p *Publisher) AddSubscriber(o Subscriber) {
p.ObserverList = append(p.ObserverList, o)
}
func (p *Publisher) RemoveObserver(o Subscriber) {
var indexToRemove int
for i, observer := range p.ObserverList {
if observer == o {
indexToRemove = i
break
}
}
p.ObserverList = append(
p.ObserverList[:indexToRemove],
p.ObserverList[indexToRemove+1:]...,
)
}
func (p *Publisher) NotifyObservers(message string) {
for _, observer := range p.ObserverList {
observer.Notify(message)
}
}
type TestObserver struct {
ID int
Message string
}
func (p *TestObserver) Notify(m string) {
fmt.Printf("Obderver %d: message '%s' received \n", p.ID, m)
p.Message = m
}
func TestSubject(t *testing.T) {
testObserver1 := &TestObserver{1, ""}
testObserver2 := &TestObserver{2, ""}
testObserver3 := &TestObserver{3, ""}
publisher := Publisher{}
t.Run("AddSubscriber", func(t *testing.T) {
publisher.AddSubscriber(testObserver1)
publisher.AddSubscriber(testObserver2)
publisher.AddSubscriber(testObserver3)
if len(publisher.ObserverList) != 3 {
t.Fail()
}
})
t.Run("RemoveObserver", func(t *testing.T) {
publisher.RemoveObserver(testObserver2)
if len(publisher.ObserverList) != 2 {
t.Fail()
}
})
t.Run("Notify", func(t *testing.T) {
for _, observer := range publisher.ObserverList {
printObserver, _ := observer.(*TestObserver)
message := "hello"
publisher.NotifyObservers(message)
if printObserver.Message == "" {
t.Error()
}
if printObserver.Message != message {
t.Error()
}
}
})
}