v2 / vlib / eventbus / eventbus_test.v
215 lines · 191 sloc · 7.16 KB · ce3a1611a16cbeecbe4b46f407de84e03eb08668
Raw
1@[has_globals]
2module main
3
4import eventbus
5
6struct EventData {
7 data string
8 n int
9}
10
11struct FakeReceiver {
12 ok bool
13}
14
15fn test_eventbus_string() {
16 ev_data := &EventData{'hello', 1}
17 mut eb := eventbus.new[string]()
18 eb.subscriber.subscribe_once('on_test', on_test_without_receiver)
19 assert eb.has_subscriber('on_test')
20 assert !eb.has_subscriber('not_exist')
21 assert eb.subscriber.is_subscribed('on_test')
22 eprintln('> publishing to on_test 1')
23 reset_ncalls()
24 eb.publish('on_test', eb, ev_data)
25 assert calls_of_on_test_without_receiver == 1
26 reset_ncalls()
27 assert !eb.has_subscriber('on_test')
28 assert !eb.subscriber.is_subscribed('on_test')
29 // subscribe 3 times more:
30 eb.subscriber.subscribe('on_test', on_test_without_receiver)
31 eb.subscriber.subscribe('on_test', on_test_without_receiver)
32 eb.subscriber.subscribe('on_test', on_test_without_receiver)
33 assert eb.has_subscriber('on_test')
34 assert eb.subscriber.is_subscribed('on_test')
35 eprintln('> publishing to on_test 2')
36 reset_ncalls()
37 eb.publish('on_test', eb, &EventData{'hello', 2})
38 assert calls_of_on_test_without_receiver == 1, 'even though we had more than 1 subscription, to the same event, the callback should be called just once because of the deduplication'
39 reset_ncalls()
40 eb.clear_all()
41 assert !eb.has_subscriber('on_test')
42 assert !eb.subscriber.is_subscribed('on_test')
43 // check that unsubscription actually remove the handler:
44 reset_ncalls()
45 eb.publish('on_test', eb, &EventData{'hello', 3})
46 assert calls_of_on_test_without_receiver == 0
47 reset_ncalls()
48}
49
50enum Events {
51 event_1
52 event_2
53 event_3
54}
55
56fn test_eventbus_enum() {
57 reset_ncalls()
58 ev_data := &EventData{'hello', 1}
59 mut eb := eventbus.EventBus.new[Events]()
60 eprintln('> subscribing once on_test for Events enum bus ...')
61 eb.subscriber.subscribe_once(Events.event_1, on_test_without_receiver)
62 assert eb.has_subscriber(Events.event_1)
63 assert !eb.has_subscriber(Events.event_2)
64 assert eb.subscriber.is_subscribed(Events.event_1)
65 eprintln('> publishing even_1 ...')
66 eb.publish(Events.event_1, eb, ev_data)
67 assert !eb.has_subscriber(Events.event_1)
68 assert !eb.subscriber.is_subscribed(Events.event_1)
69 eb.subscriber.subscribe(Events.event_1, on_test_without_receiver)
70 assert eb.has_subscriber(Events.event_1)
71 assert eb.subscriber.is_subscribed(Events.event_1)
72 eb.clear_all()
73 assert !eb.has_subscriber(Events.event_1)
74 assert !eb.subscriber.is_subscribed(Events.event_1)
75
76 assert calls_of_on_test_without_receiver == 1
77 assert call_of_on_test_with_receiver == 0
78}
79
80fn test_eventbus_int() {
81 reset_ncalls()
82 ev_data := &EventData{'hello', 1}
83 mut eb := eventbus.EventBus.new[int]()
84 eprintln('> subscribing once on_test for int bus ...')
85 eb.subscriber.subscribe_once(9999, on_test_without_receiver)
86 assert eb.has_subscriber(9999)
87 assert !eb.has_subscriber(1111)
88 assert eb.subscriber.is_subscribed(9999)
89 eb.publish(9999, eb, ev_data)
90 assert !eb.has_subscriber(9999)
91 assert !eb.subscriber.is_subscribed(9999)
92 eb.subscriber.subscribe(9999, on_test_without_receiver)
93 assert eb.has_subscriber(9999)
94 assert eb.subscriber.is_subscribed(9999)
95 eb.clear_all()
96 assert !eb.has_subscriber(9999)
97 assert !eb.subscriber.is_subscribed(9999)
98
99 assert calls_of_on_test_without_receiver == 1
100 assert call_of_on_test_with_receiver == 0
101}
102
103fn test_subscribe_method() {
104 reset_ncalls()
105 // given
106 mut eb := eventbus.new[string]()
107 r := FakeReceiver{}
108 assert !eb.subscriber.is_subscribed_method('on_test_with_receiver', r)
109 // when
110 eb.subscriber.subscribe_method('on_test_with_receiver', on_test_with_receiver, r)
111 // then
112 assert eb.subscriber.is_subscribed_method('on_test_with_receiver', r)
113
114 assert calls_of_on_test_without_receiver == 0
115 assert call_of_on_test_with_receiver == 0
116}
117
118fn test_unsubscribe_method() {
119 reset_ncalls()
120 // given
121 mut eb := eventbus.new[string]()
122 r := FakeReceiver{}
123 r2 := FakeReceiver{}
124 // when
125 eb.subscriber.subscribe_method('on_test_with_receiver', on_test_with_receiver, r)
126 eb.subscriber.subscribe_method('on_test_with_receiver', on_test_with_receiver, r2)
127 eb.subscriber.unsubscribe_method('on_test_with_receiver', r)
128 // then
129 assert !eb.subscriber.is_subscribed_method('on_test_with_receiver', r)
130 assert eb.subscriber.is_subscribed_method('on_test_with_receiver', r2)
131
132 assert calls_of_on_test_without_receiver == 0
133 assert call_of_on_test_with_receiver == 0
134}
135
136fn test_publish() {
137 reset_ncalls()
138 // given
139 ev_data := &EventData{'hello', 1}
140 mut eb := eventbus.new[string]()
141 r1 := FakeReceiver{}
142 r2 := FakeReceiver{}
143 // when
144 eb.subscriber.subscribe_once('on_test', on_test_without_receiver)
145 eprintln('> publishing once 1 ...')
146 eb.publish('on_test', eb, ev_data)
147 // then
148 assert !eb.subscriber.is_subscribed('on_test')
149 assert calls_of_on_test_without_receiver == 1
150
151 eb.subscriber.subscribe_method('on_test', on_test_with_receiver, r1) // subscribe r1 3 times
152 eb.subscriber.subscribe_method('on_test', on_test_with_receiver, r1)
153 eb.subscriber.subscribe_method('on_test', on_test_with_receiver, r1)
154 eb.subscriber.subscribe_method('on_test', on_test_with_receiver, r2) // subscribe r2 3 times
155 eb.subscriber.subscribe_method('on_test', on_test_with_receiver, r2)
156 eb.subscriber.subscribe_method('on_test', on_test_with_receiver, r2)
157 eb.publish('on_test', eb, &EventData{'hello', 123})
158
159 assert calls_of_on_test_without_receiver == 1 // this should not change, since the subscription was done through subscribe_once.
160 assert call_of_on_test_with_receiver == 2 // make sure that even though we subscribed several times, only 2 calls are made (once per receiver)
161}
162
163fn test_publish_with_receiver() {
164 reset_ncalls()
165 // given
166 mut eb := eventbus.new[string]()
167 ev_data := &EventData{'hello', 1}
168 r := FakeReceiver{}
169 // when
170 eb.subscriber.subscribe_method('on_test_with_receiver', on_test_with_receiver, r)
171 eb.publish('on_test_with_receiver', eb, ev_data)
172
173 assert calls_of_on_test_without_receiver == 0
174 assert call_of_on_test_with_receiver == 1
175}
176
177fn test_unsubscribe_reveiver() {
178 reset_ncalls()
179 // given
180 mut eb := eventbus.new[string]()
181 r := &FakeReceiver{}
182 // when
183 eb.subscriber.subscribe_method('on_test_with_receiver', on_test_with_receiver, r)
184 eb.subscriber.subscribe_method('on_test', on_test_without_receiver, r)
185 eb.subscriber.unsubscribe_receiver(r)
186 assert !eb.subscriber.is_subscribed_method('on_test_with_receiver', r)
187 assert !eb.subscriber.is_subscribed_method('on_test', r)
188
189 assert calls_of_on_test_without_receiver == 0
190 assert call_of_on_test_with_receiver == 0
191}
192
193fn on_test_without_receiver(receiver voidptr, ev &EventData, sender voidptr) {
194 calls_of_on_test_without_receiver++
195 eprintln('>> ${@LOCATION:-80s} | receiver: ${voidptr(receiver):16} | sender: ${sender:16} | ev.data: ${ev.data} | ev.n: ${ev.n}')
196 assert receiver == 0
197 assert sender != 0
198 assert ev.data == 'hello'
199}
200
201fn on_test_with_receiver(receiver &FakeReceiver, ev &EventData, sender voidptr) {
202 call_of_on_test_with_receiver++
203 eprintln('>> ${@LOCATION:-80s} | receiver: ${voidptr(receiver):16} | sender: ${sender:16} | ev.data: ${ev.data} | ev.n: ${ev.n}')
204 assert receiver.ok == false
205 assert sender != 0
206 assert ev.data == 'hello'
207}
208
209__global calls_of_on_test_without_receiver = 0
210__global call_of_on_test_with_receiver = 0
211
212fn reset_ncalls() {
213 calls_of_on_test_without_receiver = 0
214 call_of_on_test_with_receiver = 0
215}
216