com.wallstop-studios.dxmessaging 1.0.0-rc8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/.gitattributes +63 -0
  2. package/CHANGELOG.md +0 -0
  3. package/CHANGELOG.md.meta +7 -0
  4. package/Editor.meta +8 -0
  5. package/LICENSE.md +7 -0
  6. package/LICENSE.md.meta +7 -0
  7. package/README.md +76 -0
  8. package/README.md.meta +7 -0
  9. package/Runtime/Core/Extensions/MessageExtensions.cs +275 -0
  10. package/Runtime/Core/Extensions/MessageExtensions.cs.meta +11 -0
  11. package/Runtime/Core/Extensions.meta +8 -0
  12. package/Runtime/Core/IMessage.cs +12 -0
  13. package/Runtime/Core/IMessage.cs.meta +11 -0
  14. package/Runtime/Core/InstanceId.cs +117 -0
  15. package/Runtime/Core/InstanceId.cs.meta +11 -0
  16. package/Runtime/Core/MessageBus/IMessageBus.cs +249 -0
  17. package/Runtime/Core/MessageBus/IMessageBus.cs.meta +11 -0
  18. package/Runtime/Core/MessageBus/MessageBus.cs +961 -0
  19. package/Runtime/Core/MessageBus/MessageBus.cs.meta +11 -0
  20. package/Runtime/Core/MessageBus/MessagingRegistration.cs +100 -0
  21. package/Runtime/Core/MessageBus/MessagingRegistration.cs.meta +11 -0
  22. package/Runtime/Core/MessageBus/RegistrationLog.cs +111 -0
  23. package/Runtime/Core/MessageBus/RegistrationLog.cs.meta +11 -0
  24. package/Runtime/Core/MessageBus.meta +8 -0
  25. package/Runtime/Core/MessageHandler.cs +1589 -0
  26. package/Runtime/Core/MessageHandler.cs.meta +11 -0
  27. package/Runtime/Core/MessageRegistrationHandle.cs +55 -0
  28. package/Runtime/Core/MessageRegistrationHandle.cs.meta +11 -0
  29. package/Runtime/Core/MessageRegistrationToken.cs +885 -0
  30. package/Runtime/Core/MessageRegistrationToken.cs.meta +11 -0
  31. package/Runtime/Core/Messages/IBroadcastMessage.cs +27 -0
  32. package/Runtime/Core/Messages/IBroadcastMessage.cs.meta +11 -0
  33. package/Runtime/Core/Messages/ITargetedMessage.cs +26 -0
  34. package/Runtime/Core/Messages/ITargetedMessage.cs.meta +11 -0
  35. package/Runtime/Core/Messages/IUntargetedMessage.cs +26 -0
  36. package/Runtime/Core/Messages/IUntargetedMessage.cs.meta +11 -0
  37. package/Runtime/Core/Messages.meta +8 -0
  38. package/Runtime/Core/MessagingDebug.cs +71 -0
  39. package/Runtime/Core/MessagingDebug.cs.meta +11 -0
  40. package/Runtime/Core.meta +8 -0
  41. package/Runtime/Unity/MessageAwareComponent.cs +77 -0
  42. package/Runtime/Unity/MessageAwareComponent.cs.meta +11 -0
  43. package/Runtime/Unity/MessagingComponent.cs +73 -0
  44. package/Runtime/Unity/MessagingComponent.cs.meta +11 -0
  45. package/Runtime/Unity.meta +8 -0
  46. package/Runtime/WallstopStudios.DxMessaging.asmdef +18 -0
  47. package/Runtime/WallstopStudios.DxMessaging.asmdef.meta +7 -0
  48. package/Runtime.meta +8 -0
  49. package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef +23 -0
  50. package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef.meta +7 -0
  51. package/Tests/Editor.meta +8 -0
  52. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +196 -0
  53. package/Tests/Runtime/Benchmarks/PerformanceTests.cs.meta +11 -0
  54. package/Tests/Runtime/Benchmarks.meta +8 -0
  55. package/Tests/Runtime/Core/BroadcastTests.cs +600 -0
  56. package/Tests/Runtime/Core/BroadcastTests.cs.meta +11 -0
  57. package/Tests/Runtime/Core/GlobalAcceptAllTests.cs +169 -0
  58. package/Tests/Runtime/Core/GlobalAcceptAllTests.cs.meta +11 -0
  59. package/Tests/Runtime/Core/MessagingTestBase.cs +164 -0
  60. package/Tests/Runtime/Core/MessagingTestBase.cs.meta +11 -0
  61. package/Tests/Runtime/Core/NominalTests.cs +1468 -0
  62. package/Tests/Runtime/Core/NominalTests.cs.meta +11 -0
  63. package/Tests/Runtime/Core/PostProcessorTests.cs +849 -0
  64. package/Tests/Runtime/Core/PostProcessorTests.cs.meta +11 -0
  65. package/Tests/Runtime/Core/RegistrationTests.cs +1045 -0
  66. package/Tests/Runtime/Core/RegistrationTests.cs.meta +11 -0
  67. package/Tests/Runtime/Core/TargetedTests.cs +596 -0
  68. package/Tests/Runtime/Core/TargetedTests.cs.meta +11 -0
  69. package/Tests/Runtime/Core/UntargetedTests.cs +149 -0
  70. package/Tests/Runtime/Core/UntargetedTests.cs.meta +11 -0
  71. package/Tests/Runtime/Core.meta +8 -0
  72. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +9 -0
  73. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs.meta +11 -0
  74. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +140 -0
  75. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs.meta +11 -0
  76. package/Tests/Runtime/Scripts/Components.meta +8 -0
  77. package/Tests/Runtime/Scripts/Messages/ComplexTargetedMessage.cs +28 -0
  78. package/Tests/Runtime/Scripts/Messages/ComplexTargetedMessage.cs.meta +11 -0
  79. package/Tests/Runtime/Scripts/Messages/SimpleBroadcastMessage.cs +8 -0
  80. package/Tests/Runtime/Scripts/Messages/SimpleBroadcastMessage.cs.meta +11 -0
  81. package/Tests/Runtime/Scripts/Messages/SimpleTargetedMessage.cs +8 -0
  82. package/Tests/Runtime/Scripts/Messages/SimpleTargetedMessage.cs.meta +11 -0
  83. package/Tests/Runtime/Scripts/Messages/SimpleUntargetedMessage.cs +8 -0
  84. package/Tests/Runtime/Scripts/Messages/SimpleUntargetedMessage.cs.meta +11 -0
  85. package/Tests/Runtime/Scripts/Messages.meta +8 -0
  86. package/Tests/Runtime/Scripts.meta +8 -0
  87. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +22 -0
  88. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef.meta +7 -0
  89. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj +1 -0
  90. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj.meta +7 -0
  91. package/Tests/Runtime.meta +8 -0
  92. package/Tests.meta +8 -0
  93. package/Third Party Notices.md +1 -0
  94. package/Third Party Notices.md.meta +7 -0
  95. package/package.json +33 -0
  96. package/package.json.meta +7 -0
@@ -0,0 +1,1468 @@
1
+ namespace DxMessaging.Tests.Runtime.Core
2
+ {
3
+ using System;
4
+ using System.Collections;
5
+ using System.Collections.Generic;
6
+ using DxMessaging.Core;
7
+ using DxMessaging.Core.Extensions;
8
+ using DxMessaging.Core.MessageBus;
9
+ using DxMessaging.Core.Messages;
10
+ using NUnit.Framework;
11
+ using Scripts.Components;
12
+ using Scripts.Messages;
13
+ using UnityEngine;
14
+ using UnityEngine.TestTools;
15
+ using Object = UnityEngine.Object;
16
+
17
+ public sealed class NominalTests : MessagingTestBase
18
+ {
19
+ [UnityTest]
20
+ public IEnumerator Nominal()
21
+ {
22
+ GameObject test = new(nameof(Nominal), typeof(SimpleMessageAwareComponent));
23
+ _spawned.Add(test);
24
+ GameObject nonTest = new("Non-Test", typeof(SimpleMessageAwareComponent));
25
+ _spawned.Add(nonTest);
26
+
27
+ SimpleMessageAwareComponent firstComponent = test.GetComponent<SimpleMessageAwareComponent>();
28
+
29
+ int untargetedWorks = 0;
30
+ int targetedWorks = 0;
31
+ int targetedWithoutTargetingWorks = 0;
32
+ int broadcastWorks = 0;
33
+ int broadcastWithoutSourceWorks = 0;
34
+ Dictionary<object, int> componentTargetedWorks = new();
35
+ Dictionary<object, int> componentBroadcastWorks = new();
36
+
37
+ void SetupComponent(SimpleMessageAwareComponent toSetup)
38
+ {
39
+ toSetup.untargetedHandler = () => ++untargetedWorks;
40
+ toSetup.targetedHandler = () => ++targetedWorks;
41
+ toSetup.targetedWithoutTargetingHandler = () => ++targetedWithoutTargetingWorks;
42
+ toSetup.broadcastHandler = () => ++broadcastWorks;
43
+ toSetup.broadcastWithoutSourceHandler = () => ++broadcastWithoutSourceWorks;
44
+ toSetup.componentTargetedHandler = () =>
45
+ {
46
+ if (!componentTargetedWorks.TryGetValue(toSetup, out int existing))
47
+ {
48
+ existing = 0;
49
+ }
50
+
51
+ componentTargetedWorks[toSetup] = ++existing;
52
+ };
53
+ toSetup.componentBroadcastHandler = () =>
54
+ {
55
+ if (!componentBroadcastWorks.TryGetValue(toSetup, out int existing))
56
+ {
57
+ existing = 0;
58
+ }
59
+
60
+ componentBroadcastWorks[toSetup] = ++existing;
61
+ };
62
+ }
63
+
64
+ SetupComponent(firstComponent);
65
+
66
+ // Generate non-component targeted methods
67
+ SimpleUntargetedMessage untargetedMessage = new();
68
+ untargetedMessage.EmitUntargeted();
69
+ Assert.AreEqual(1, untargetedWorks);
70
+ Assert.AreEqual(0, targetedWorks);
71
+ Assert.AreEqual(0, broadcastWorks);
72
+ Assert.AreEqual(0, componentTargetedWorks.Count);
73
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
74
+ Assert.AreEqual(0, targetedWithoutTargetingWorks);
75
+ Assert.AreEqual(0, broadcastWithoutSourceWorks);
76
+
77
+ untargetedMessage.EmitUntargeted();
78
+ Assert.AreEqual(2, untargetedWorks);
79
+ Assert.AreEqual(0, targetedWorks);
80
+ Assert.AreEqual(0, broadcastWorks);
81
+ Assert.AreEqual(0, componentTargetedWorks.Count);
82
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
83
+ Assert.AreEqual(0, targetedWithoutTargetingWorks);
84
+ Assert.AreEqual(0, broadcastWithoutSourceWorks);
85
+
86
+ SimpleTargetedMessage targetedMessage = new();
87
+ targetedMessage.EmitGameObjectTargeted(test);
88
+ Assert.AreEqual(2, untargetedWorks);
89
+ Assert.AreEqual(1, targetedWorks);
90
+ Assert.AreEqual(0, broadcastWorks);
91
+ Assert.AreEqual(0, componentTargetedWorks.Count);
92
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
93
+ Assert.AreEqual(1, targetedWithoutTargetingWorks);
94
+ Assert.AreEqual(0, broadcastWithoutSourceWorks);
95
+
96
+ SimpleBroadcastMessage broadcastMessage = new();
97
+ broadcastMessage.EmitGameObjectBroadcast(test);
98
+ Assert.AreEqual(2, untargetedWorks);
99
+ Assert.AreEqual(1, targetedWorks);
100
+ Assert.AreEqual(1, broadcastWorks);
101
+ Assert.AreEqual(0, componentTargetedWorks.Count);
102
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
103
+ Assert.AreEqual(1, targetedWithoutTargetingWorks);
104
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
105
+
106
+ yield return null;
107
+
108
+ /*
109
+ If we add a second component, our Untargeted, GameObjectTargeted,
110
+ and GameObjectBroadcast receivers will be called *twice* for each
111
+ message emission, once per component.
112
+ */
113
+ SimpleMessageAwareComponent secondComponent = test.AddComponent<SimpleMessageAwareComponent>();
114
+ SetupComponent(secondComponent);
115
+
116
+ // Targeted
117
+ targetedMessage.EmitGameObjectTargeted(test);
118
+ Assert.AreEqual(2, untargetedWorks);
119
+ Assert.AreEqual(3, targetedWorks);
120
+ Assert.AreEqual(1, broadcastWorks);
121
+ Assert.AreEqual(0, componentTargetedWorks.Count);
122
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
123
+ Assert.AreEqual(3, targetedWithoutTargetingWorks);
124
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
125
+
126
+ targetedMessage.EmitGameObjectTargeted(nonTest);
127
+ Assert.AreEqual(2, untargetedWorks);
128
+ Assert.AreEqual(3, targetedWorks);
129
+ Assert.AreEqual(1, broadcastWorks);
130
+ Assert.AreEqual(0, componentTargetedWorks.Count);
131
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
132
+ Assert.AreEqual(5, targetedWithoutTargetingWorks);
133
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
134
+
135
+ // Component Targeted
136
+ targetedMessage.EmitComponentTargeted(firstComponent);
137
+ Assert.AreEqual(2, untargetedWorks);
138
+ Assert.AreEqual(3, targetedWorks);
139
+ Assert.AreEqual(1, broadcastWorks);
140
+ Assert.AreEqual(1, componentTargetedWorks.Count);
141
+ Assert.AreEqual(1, componentTargetedWorks[firstComponent]);
142
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
143
+ Assert.AreEqual(7, targetedWithoutTargetingWorks);
144
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
145
+
146
+ targetedMessage.EmitComponentTargeted(secondComponent);
147
+ Assert.AreEqual(2, untargetedWorks);
148
+ Assert.AreEqual(3, targetedWorks);
149
+ Assert.AreEqual(1, broadcastWorks);
150
+ Assert.AreEqual(2, componentTargetedWorks.Count);
151
+ Assert.AreEqual(1, componentTargetedWorks[firstComponent]);
152
+ Assert.AreEqual(1, componentTargetedWorks[secondComponent]);
153
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
154
+ Assert.AreEqual(9, targetedWithoutTargetingWorks);
155
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
156
+
157
+ targetedMessage.EmitComponentTargeted(firstComponent);
158
+ Assert.AreEqual(2, untargetedWorks);
159
+ Assert.AreEqual(3, targetedWorks);
160
+ Assert.AreEqual(1, broadcastWorks);
161
+ Assert.AreEqual(2, componentTargetedWorks.Count);
162
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
163
+ Assert.AreEqual(1, componentTargetedWorks[secondComponent]);
164
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
165
+ Assert.AreEqual(11, targetedWithoutTargetingWorks);
166
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
167
+
168
+ targetedMessage.EmitComponentTargeted(secondComponent);
169
+ Assert.AreEqual(2, untargetedWorks);
170
+ Assert.AreEqual(3, targetedWorks);
171
+ Assert.AreEqual(1, broadcastWorks);
172
+ Assert.AreEqual(2, componentTargetedWorks.Count);
173
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
174
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
175
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
176
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
177
+ Assert.AreEqual(1, broadcastWithoutSourceWorks);
178
+
179
+ // Broadcast
180
+ broadcastMessage.EmitGameObjectBroadcast(nonTest);
181
+ Assert.AreEqual(2, untargetedWorks);
182
+ Assert.AreEqual(3, targetedWorks);
183
+ Assert.AreEqual(1, broadcastWorks);
184
+ Assert.AreEqual(2, componentTargetedWorks.Count);
185
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
186
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
187
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
188
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
189
+ Assert.AreEqual(3, broadcastWithoutSourceWorks);
190
+
191
+ broadcastMessage.EmitGameObjectBroadcast(test);
192
+ Assert.AreEqual(2, untargetedWorks);
193
+ Assert.AreEqual(3, targetedWorks);
194
+ Assert.AreEqual(3, broadcastWorks);
195
+ Assert.AreEqual(2, componentTargetedWorks.Count);
196
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
197
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
198
+ Assert.AreEqual(0, componentBroadcastWorks.Count);
199
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
200
+ Assert.AreEqual(5, broadcastWithoutSourceWorks);
201
+
202
+ // Component Broadcast
203
+ broadcastMessage.EmitComponentBroadcast(firstComponent);
204
+ Assert.AreEqual(2, untargetedWorks);
205
+ Assert.AreEqual(3, targetedWorks);
206
+ Assert.AreEqual(3, broadcastWorks);
207
+ Assert.AreEqual(2, componentTargetedWorks.Count);
208
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
209
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
210
+ Assert.AreEqual(1, componentBroadcastWorks.Count);
211
+ Assert.AreEqual(1, componentBroadcastWorks[firstComponent]);
212
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
213
+ Assert.AreEqual(7, broadcastWithoutSourceWorks);
214
+
215
+ broadcastMessage.EmitComponentBroadcast(secondComponent);
216
+ Assert.AreEqual(2, untargetedWorks);
217
+ Assert.AreEqual(3, targetedWorks);
218
+ Assert.AreEqual(3, broadcastWorks);
219
+ Assert.AreEqual(2, componentTargetedWorks.Count);
220
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
221
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
222
+ Assert.AreEqual(2, componentBroadcastWorks.Count);
223
+ Assert.AreEqual(1, componentBroadcastWorks[firstComponent]);
224
+ Assert.AreEqual(1, componentBroadcastWorks[secondComponent]);
225
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
226
+ Assert.AreEqual(9, broadcastWithoutSourceWorks);
227
+
228
+ broadcastMessage.EmitComponentBroadcast(firstComponent);
229
+ Assert.AreEqual(2, untargetedWorks);
230
+ Assert.AreEqual(3, targetedWorks);
231
+ Assert.AreEqual(3, broadcastWorks);
232
+ Assert.AreEqual(2, componentTargetedWorks.Count);
233
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
234
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
235
+ Assert.AreEqual(2, componentBroadcastWorks.Count);
236
+ Assert.AreEqual(2, componentBroadcastWorks[firstComponent]);
237
+ Assert.AreEqual(1, componentBroadcastWorks[secondComponent]);
238
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
239
+ Assert.AreEqual(11, broadcastWithoutSourceWorks);
240
+
241
+ broadcastMessage.EmitComponentBroadcast(secondComponent);
242
+ Assert.AreEqual(2, untargetedWorks);
243
+ Assert.AreEqual(3, targetedWorks);
244
+ Assert.AreEqual(3, broadcastWorks);
245
+ Assert.AreEqual(2, componentTargetedWorks.Count);
246
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
247
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
248
+ Assert.AreEqual(2, componentBroadcastWorks.Count);
249
+ Assert.AreEqual(2, componentBroadcastWorks[firstComponent]);
250
+ Assert.AreEqual(2, componentBroadcastWorks[secondComponent]);
251
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
252
+ Assert.AreEqual(13, broadcastWithoutSourceWorks);
253
+
254
+ // Finally, re-emit the targeted message - it should be received by both components
255
+ untargetedMessage.EmitUntargeted();
256
+ Assert.AreEqual(4, untargetedWorks);
257
+ Assert.AreEqual(3, targetedWorks);
258
+ Assert.AreEqual(3, broadcastWorks);
259
+ Assert.AreEqual(2, componentTargetedWorks.Count);
260
+ Assert.AreEqual(2, componentTargetedWorks[firstComponent]);
261
+ Assert.AreEqual(2, componentTargetedWorks[secondComponent]);
262
+ Assert.AreEqual(2, componentBroadcastWorks.Count);
263
+ Assert.AreEqual(2, componentBroadcastWorks[firstComponent]);
264
+ Assert.AreEqual(2, componentBroadcastWorks[secondComponent]);
265
+ Assert.AreEqual(13, targetedWithoutTargetingWorks);
266
+ Assert.AreEqual(13, broadcastWithoutSourceWorks);
267
+ }
268
+
269
+ [UnityTest]
270
+ public IEnumerator Lifetime()
271
+ {
272
+ MessageBus messageBus = MessageHandler.MessageBus;
273
+ Assert.IsNotNull(messageBus);
274
+
275
+ GameObject test = new(nameof(Lifetime), typeof(SimpleMessageAwareComponent));
276
+ _spawned.Add(test);
277
+
278
+ SimpleMessageAwareComponent firstComponent = test.GetComponent<SimpleMessageAwareComponent>();
279
+
280
+ // One for the untargeted message, one for the targeted without targeting, one for broadcast without source
281
+ Assert.AreEqual(3, messageBus.RegisteredUntargeted);
282
+ // One for the game object, one for each targeted message type (simple + complex)
283
+ Assert.AreEqual(4, messageBus.RegisteredTargeted);
284
+ Assert.AreEqual(2, messageBus.RegisteredBroadcast);
285
+
286
+ yield return null;
287
+
288
+ SimpleMessageAwareComponent secondComponent = test.AddComponent<SimpleMessageAwareComponent>();
289
+ Assert.AreEqual(3, messageBus.RegisteredUntargeted);
290
+ // One for the game object, one for the first component, one for the second component = 3
291
+ Assert.AreEqual(6, messageBus.RegisteredTargeted);
292
+ Assert.AreEqual(3, messageBus.RegisteredBroadcast);
293
+
294
+ secondComponent.enabled = false;
295
+ yield return null;
296
+
297
+ // 3 - one component (disabled)
298
+ Assert.AreEqual(3, messageBus.RegisteredUntargeted);
299
+ Assert.AreEqual(4, messageBus.RegisteredTargeted);
300
+ Assert.AreEqual(2, messageBus.RegisteredBroadcast);
301
+
302
+ firstComponent.enabled = false;
303
+ yield return null;
304
+
305
+ // No active scripts, no active handlers
306
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
307
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
308
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
309
+
310
+ test.SetActive(false);
311
+ yield return null;
312
+
313
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
314
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
315
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
316
+
317
+ firstComponent.enabled = true;
318
+ yield return null;
319
+
320
+ // Game object is still disabled - shouldn't have active child scripts
321
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
322
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
323
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
324
+
325
+ test.SetActive(true);
326
+ yield return null;
327
+
328
+ Assert.AreEqual(3, messageBus.RegisteredUntargeted);
329
+ Assert.AreEqual(4, messageBus.RegisteredTargeted);
330
+ Assert.AreEqual(2, messageBus.RegisteredBroadcast);
331
+
332
+ Object.Destroy(firstComponent);
333
+ yield return null;
334
+
335
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
336
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
337
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
338
+
339
+ secondComponent.enabled = true;
340
+ yield return null;
341
+
342
+ Assert.AreEqual(3, messageBus.RegisteredUntargeted);
343
+ Assert.AreEqual(4, messageBus.RegisteredTargeted);
344
+ Assert.AreEqual(2, messageBus.RegisteredBroadcast);
345
+
346
+ Object.Destroy(test);
347
+ yield return null;
348
+
349
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
350
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
351
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
352
+ }
353
+
354
+ [UnityTest]
355
+ public IEnumerator NonMessagingObjects()
356
+ {
357
+ MessageBus messageBus = MessageHandler.MessageBus;
358
+ Assert.IsNotNull(messageBus);
359
+
360
+ GameObject test1 = new("NonMessaging1");
361
+ _spawned.Add(test1);
362
+
363
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
364
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
365
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
366
+
367
+ GameObject test2 = new("NonMessaging1", typeof(SpriteRenderer), typeof(MessageHandler));
368
+ _spawned.Add(test2);
369
+
370
+ Assert.AreEqual(0, messageBus.RegisteredUntargeted);
371
+ Assert.AreEqual(0, messageBus.RegisteredTargeted);
372
+ Assert.AreEqual(0, messageBus.RegisteredBroadcast);
373
+ yield break;
374
+ }
375
+
376
+ [UnityTest]
377
+ public IEnumerator DedupedRegistration()
378
+ {
379
+ GameObject test = new(nameof(DedupedRegistration), typeof(SimpleMessageAwareComponent));
380
+ _spawned.Add(test);
381
+
382
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
383
+
384
+ int unTargetedCount = 0;
385
+ int targetedCount = 0;
386
+ int broadcastCount = 0;
387
+ int componentTargetedCount = 0;
388
+ int componentBroadcastCount = 0;
389
+ component.untargetedHandler = () => ++unTargetedCount;
390
+ component.targetedHandler = () => ++targetedCount;
391
+ component.broadcastHandler = () => ++broadcastCount;
392
+ component.componentTargetedHandler = () => ++componentTargetedCount;
393
+ component.componentBroadcastHandler = () => ++componentBroadcastCount;
394
+
395
+ MessageRegistrationToken token = GetToken(component);
396
+ HashSet<MessageRegistrationHandle> handles = new();
397
+ try
398
+ {
399
+ IEnumerator TestLifecycle(Action emitMessage, MessageRegistrationHandle handle, Func<int> count)
400
+ {
401
+ _ = handles.Add(handle);
402
+ emitMessage();
403
+ Assert.AreEqual(1, count());
404
+
405
+ component.enabled = false;
406
+ yield return null;
407
+
408
+ emitMessage();
409
+ Assert.AreEqual(1, count());
410
+ emitMessage();
411
+ Assert.AreEqual(1, count());
412
+ component.enabled = true;
413
+ yield return null;
414
+
415
+ emitMessage();
416
+ Assert.AreEqual(2, count());
417
+
418
+ _ = handles.Remove(handle);
419
+ token.RemoveRegistration(handle);
420
+
421
+ emitMessage();
422
+ // The existing handler should have picked it up
423
+ Assert.AreEqual(3, count());
424
+
425
+ emitMessage();
426
+ // The existing handler should have picked it up
427
+ Assert.AreEqual(4, count());
428
+ }
429
+
430
+ // Untargeted
431
+ SimpleUntargetedMessage untargetedMessage = new();
432
+ MessageRegistrationHandle untargetedHandle =
433
+ token.RegisterUntargeted<SimpleUntargetedMessage>(component.HandleSimpleUntargetedMessage);
434
+ IEnumerator untargetedLifecycle = TestLifecycle(
435
+ () => untargetedMessage.EmitUntargeted(), untargetedHandle, () => unTargetedCount);
436
+ while (untargetedLifecycle.MoveNext())
437
+ {
438
+ yield return untargetedLifecycle.Current;
439
+ }
440
+
441
+ // Targeted
442
+ MessageRegistrationHandle targetedHandle =
443
+ token.RegisterGameObjectTargeted<SimpleTargetedMessage>(
444
+ test, component.HandleSimpleTargetedMessage);
445
+ SimpleTargetedMessage targetedMessage = new();
446
+ IEnumerator targetedLifecycle = TestLifecycle(
447
+ () => targetedMessage.EmitGameObjectTargeted(test), targetedHandle, () => targetedCount);
448
+ while (targetedLifecycle.MoveNext())
449
+ {
450
+ yield return targetedLifecycle.Current;
451
+ }
452
+
453
+ // Broadcast
454
+ MessageRegistrationHandle broadcastHandle =
455
+ token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(
456
+ test, component.HandleSimpleBroadcastMessage);
457
+ SimpleBroadcastMessage broadcastMessage = new();
458
+ IEnumerator broadcastLifecycle = TestLifecycle(
459
+ () => broadcastMessage.EmitGameObjectBroadcast(test), broadcastHandle, () => broadcastCount);
460
+ while (broadcastLifecycle.MoveNext())
461
+ {
462
+ yield return broadcastLifecycle.Current;
463
+ }
464
+
465
+ // Component Targeted
466
+ MessageRegistrationHandle componentTargetedHandle =
467
+ token.RegisterComponentTargeted<SimpleTargetedMessage>(
468
+ component, component.HandleSimpleComponentTargetedMessage);
469
+ IEnumerator componentTargetedLifecycle = TestLifecycle(
470
+ () => targetedMessage.EmitComponentTargeted(component), componentTargetedHandle,
471
+ () => componentTargetedCount);
472
+ while (componentTargetedLifecycle.MoveNext())
473
+ {
474
+ yield return componentTargetedLifecycle.Current;
475
+ }
476
+
477
+ // Component Broadcast
478
+ MessageRegistrationHandle componentBroadcastHandle =
479
+ token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(
480
+ test, component.HandleSimpleBroadcastMessage);
481
+ IEnumerator componentBroadcastLifecycle = TestLifecycle(
482
+ () => broadcastMessage.EmitComponentBroadcast(component), componentBroadcastHandle,
483
+ () => componentBroadcastCount);
484
+ while (componentBroadcastLifecycle.MoveNext())
485
+ {
486
+ yield return componentBroadcastLifecycle.Current;
487
+ }
488
+ }
489
+ finally
490
+ {
491
+ foreach (MessageRegistrationHandle handle in handles)
492
+ {
493
+ token.RemoveRegistration(handle);
494
+ }
495
+ }
496
+ }
497
+
498
+ [UnityTest]
499
+ public IEnumerator Interceptors()
500
+ {
501
+ GameObject test = new(nameof(Interceptors), typeof(SimpleMessageAwareComponent));
502
+ _spawned.Add(test);
503
+
504
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
505
+
506
+ int unTargetedCount = 0;
507
+ int targetedCount = 0;
508
+ int broadcastCount = 0;
509
+ int componentTargetedCount = 0;
510
+ int componentBroadcastCount = 0;
511
+ component.untargetedHandler = () => ++unTargetedCount;
512
+ component.targetedHandler = () => ++targetedCount;
513
+ component.broadcastHandler = () => ++broadcastCount;
514
+ component.componentTargetedHandler = () => ++componentTargetedCount;
515
+ component.componentBroadcastHandler = () => ++componentBroadcastCount;
516
+
517
+ MessageRegistrationToken token = GetToken(component);
518
+ HashSet<MessageRegistrationHandle> handles = new();
519
+ try
520
+ {
521
+ bool allowed = true;
522
+
523
+ bool UntargetedInterceptor(ref SimpleUntargetedMessage message)
524
+ {
525
+ return allowed;
526
+ }
527
+
528
+ bool TargetedInterceptor(ref InstanceId target, ref SimpleTargetedMessage message)
529
+ {
530
+ return allowed;
531
+ }
532
+
533
+ bool BroadcastInterceptor(ref InstanceId source, ref SimpleBroadcastMessage message)
534
+ {
535
+ return allowed;
536
+ }
537
+
538
+ // Double register to ensure no bugs
539
+ MessageRegistrationHandle untargetedInterceptor1 = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptor);
540
+ handles.Add(untargetedInterceptor1);
541
+ MessageRegistrationHandle untargetedInterceptor2 = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptor);
542
+ handles.Add(untargetedInterceptor2);
543
+ MessageRegistrationHandle targetedInterceptor1 = token.RegisterTargetedInterceptor<SimpleTargetedMessage>(TargetedInterceptor);
544
+ handles.Add(targetedInterceptor1);
545
+ MessageRegistrationHandle targetedInterceptor2 = token.RegisterTargetedInterceptor<SimpleTargetedMessage>(TargetedInterceptor);
546
+ handles.Add(targetedInterceptor2);
547
+ MessageRegistrationHandle broadcastInterceptor1 = token.RegisterBroadcastInterceptor<SimpleBroadcastMessage>(BroadcastInterceptor);
548
+ handles.Add(broadcastInterceptor1);
549
+ MessageRegistrationHandle broadcastInterceptor2 = token.RegisterBroadcastInterceptor<SimpleBroadcastMessage>(BroadcastInterceptor);
550
+ handles.Add(broadcastInterceptor2);
551
+
552
+ void RunTest(Action emitMessage, Func<int> count)
553
+ {
554
+ allowed = true;
555
+ emitMessage();
556
+ Assert.AreEqual(1, count());
557
+ allowed = false;
558
+ emitMessage();
559
+ Assert.AreEqual(1, count());
560
+ emitMessage();
561
+ Assert.AreEqual(1, count());
562
+ allowed = true;
563
+ emitMessage();
564
+ Assert.AreEqual(2, count());
565
+ emitMessage();
566
+ Assert.AreEqual(3, count());
567
+ allowed = false;
568
+ emitMessage();
569
+ Assert.AreEqual(3, count());
570
+ }
571
+
572
+ SimpleUntargetedMessage untargetedMessage = new();
573
+ RunTest(() => untargetedMessage.EmitUntargeted(), () => unTargetedCount);
574
+ SimpleTargetedMessage targetedMessage = new();
575
+ RunTest(() => targetedMessage.EmitGameObjectTargeted(test), () => targetedCount);
576
+ RunTest(() => targetedMessage.EmitComponentTargeted(component), () => componentTargetedCount);
577
+ SimpleBroadcastMessage broadcastMessage = new();
578
+ RunTest(() => broadcastMessage.EmitGameObjectBroadcast(test), () => broadcastCount);
579
+ RunTest(() => broadcastMessage.EmitComponentBroadcast(component), () => componentBroadcastCount);
580
+ }
581
+ finally
582
+ {
583
+ foreach (MessageRegistrationHandle handle in handles)
584
+ {
585
+ token.RemoveRegistration(handle);
586
+ }
587
+ }
588
+
589
+ yield break;
590
+ }
591
+
592
+ [UnityTest]
593
+ public IEnumerator PostProcessors()
594
+ {
595
+ GameObject test = new(nameof(PostProcessors), typeof(SimpleMessageAwareComponent));
596
+ _spawned.Add(test);
597
+
598
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
599
+
600
+ int unTargetedCount = 0;
601
+ int targetedCount = 0;
602
+ int broadcastCount = 0;
603
+ int componentTargetedCount = 0;
604
+ int componentBroadcastCount = 0;
605
+ int expectedTargetedWithoutTargetingCount = 0;
606
+ int expectedBroadcastWithoutSourceCount = 0;
607
+ int? lastSeenUntargetedCount = null;
608
+ int? lastSeenTargetedCount = null;
609
+ int? lastSeenComponentTargetedCount = null;
610
+ int? lastSeenBroadcastCount = null;
611
+ int? lastSeenComponentBroadcastCount = null;
612
+ component.untargetedHandler = () => ++unTargetedCount;
613
+ component.targetedHandler = () =>
614
+ {
615
+ ++targetedCount;
616
+ ++expectedTargetedWithoutTargetingCount;
617
+ };
618
+ component.broadcastHandler = () =>
619
+ {
620
+ ++broadcastCount;
621
+ ++expectedBroadcastWithoutSourceCount;
622
+ };
623
+ component.componentTargetedHandler = () =>
624
+ {
625
+ ++componentTargetedCount;
626
+ ++expectedTargetedWithoutTargetingCount;
627
+ };
628
+ component.componentBroadcastHandler = () =>
629
+ {
630
+ ++componentBroadcastCount;
631
+ ++expectedBroadcastWithoutSourceCount;
632
+ };
633
+
634
+ MessageRegistrationToken token = GetToken(component);
635
+ HashSet<MessageRegistrationHandle> handles = new();
636
+ try
637
+ {
638
+ void UntargetedPostProcessor(ref SimpleUntargetedMessage message)
639
+ {
640
+ if (lastSeenUntargetedCount == null)
641
+ {
642
+ lastSeenUntargetedCount = unTargetedCount;
643
+ return;
644
+ }
645
+
646
+ Assert.AreEqual(lastSeenUntargetedCount + 1, unTargetedCount);
647
+ lastSeenUntargetedCount = unTargetedCount;
648
+ }
649
+
650
+ void GameObjectTargetedPostProcessor(ref SimpleTargetedMessage message)
651
+ {
652
+ if (lastSeenTargetedCount == null)
653
+ {
654
+ return;
655
+ }
656
+
657
+ Assert.AreEqual(lastSeenTargetedCount + 1, targetedCount);
658
+ }
659
+
660
+ void ComponentTargetedPostProcessor(ref SimpleTargetedMessage message)
661
+ {
662
+ if (lastSeenComponentTargetedCount == null)
663
+ {
664
+ return;
665
+ }
666
+
667
+ Assert.AreEqual(lastSeenComponentTargetedCount + 1, componentTargetedCount);
668
+ }
669
+
670
+ void TargetedWithoutTargetingPostProcessor(ref InstanceId target, ref SimpleTargetedMessage message)
671
+ {
672
+ switch (target.Object)
673
+ {
674
+ case GameObject _:
675
+ {
676
+ if (lastSeenTargetedCount != null)
677
+ {
678
+ Assert.AreEqual(lastSeenTargetedCount + 1, targetedCount);
679
+ }
680
+ lastSeenTargetedCount = targetedCount;
681
+ break;
682
+ }
683
+ case Component _:
684
+ {
685
+ if (lastSeenComponentTargetedCount != null)
686
+ {
687
+ Assert.AreEqual(lastSeenComponentTargetedCount + 1, componentTargetedCount);
688
+ }
689
+
690
+ lastSeenComponentTargetedCount = componentTargetedCount;
691
+ break;
692
+ }
693
+ default:
694
+ Assert.Fail("Unexpected Object type - {0}.", target.Object?.GetType());
695
+ break;
696
+ }
697
+ Assert.AreEqual(expectedTargetedWithoutTargetingCount, targetedCount + componentTargetedCount);
698
+ }
699
+
700
+ void GameObjectBroadcastPostProcessor(ref SimpleBroadcastMessage message)
701
+ {
702
+ if (lastSeenBroadcastCount == null)
703
+ {
704
+ return;
705
+ }
706
+
707
+ Assert.AreEqual(lastSeenBroadcastCount + 1, broadcastCount);
708
+ }
709
+
710
+ void ComponentBroadcastPostProcessor(ref SimpleBroadcastMessage message)
711
+ {
712
+ if (lastSeenComponentBroadcastCount == null)
713
+ {
714
+ return;
715
+ }
716
+ Assert.AreEqual(lastSeenComponentBroadcastCount + 1, componentBroadcastCount);
717
+ }
718
+
719
+ void BroadcastWithoutSourcePostProcessor(ref InstanceId source, ref SimpleBroadcastMessage message)
720
+ {
721
+ switch (source.Object)
722
+ {
723
+ case GameObject _:
724
+ {
725
+ if (lastSeenBroadcastCount != null)
726
+ {
727
+ Assert.AreEqual(lastSeenBroadcastCount + 1, broadcastCount);
728
+ }
729
+ lastSeenBroadcastCount = broadcastCount;
730
+ break;
731
+ }
732
+ case Component _:
733
+ {
734
+ if (lastSeenComponentBroadcastCount != null)
735
+ {
736
+ Assert.AreEqual(lastSeenComponentBroadcastCount + 1, componentBroadcastCount);
737
+ }
738
+
739
+ lastSeenComponentBroadcastCount = componentBroadcastCount;
740
+ break;
741
+ }
742
+ default:
743
+ Assert.Fail("Unexpected Object type - {0}.", source.Object?.GetType());
744
+ break;
745
+ }
746
+ Assert.AreEqual(expectedBroadcastWithoutSourceCount, broadcastCount + componentBroadcastCount);
747
+ }
748
+
749
+ MessageRegistrationHandle untargetedPostProcessor =
750
+ token.RegisterUntargetedPostProcessor<SimpleUntargetedMessage>(UntargetedPostProcessor);
751
+ handles.Add(untargetedPostProcessor);
752
+ MessageRegistrationHandle gameObjectTargetedPostProcessor =
753
+ token.RegisterGameObjectTargetedPostProcessor<SimpleTargetedMessage>(
754
+ test, GameObjectTargetedPostProcessor);
755
+ handles.Add(gameObjectTargetedPostProcessor);
756
+ MessageRegistrationHandle componentTargetedPostProcessor =
757
+ token.RegisterComponentTargetedPostProcessor<SimpleTargetedMessage>(
758
+ component, ComponentTargetedPostProcessor);
759
+ handles.Add(componentTargetedPostProcessor);
760
+ MessageRegistrationHandle targetedWithoutTargetingPostProcessor =
761
+ token.RegisterTargetedWithoutTargetingPostProcessor<SimpleTargetedMessage>(
762
+ TargetedWithoutTargetingPostProcessor);
763
+ handles.Add(targetedWithoutTargetingPostProcessor);
764
+ MessageRegistrationHandle gameObjectBroadcastPostProcessor =
765
+ token.RegisterGameObjectBroadcastPostProcessor<SimpleBroadcastMessage>(
766
+ test, GameObjectBroadcastPostProcessor);
767
+ handles.Add(gameObjectBroadcastPostProcessor);
768
+ MessageRegistrationHandle componentBroadcastPostProcessor =
769
+ token.RegisterComponentBroadcastPostProcessor<SimpleBroadcastMessage>(
770
+ component, ComponentBroadcastPostProcessor);
771
+ handles.Add(componentBroadcastPostProcessor);
772
+ MessageRegistrationHandle broadcastWithoutSourcePostProcessor =
773
+ token.RegisterBroadcastWithoutSourcePostProcessor<SimpleBroadcastMessage>(
774
+ BroadcastWithoutSourcePostProcessor);
775
+ handles.Add(broadcastWithoutSourcePostProcessor);
776
+
777
+ void RunTest(Action emitMessage, Func<int> count)
778
+ {
779
+ Assert.AreEqual(0, count());
780
+ component.enabled = true;
781
+ emitMessage();
782
+ Assert.AreEqual(1, count());
783
+ component.enabled = false;
784
+ emitMessage();
785
+ Assert.AreEqual(1, count());
786
+ emitMessage();
787
+ Assert.AreEqual(1, count());
788
+ component.enabled = true;
789
+ emitMessage();
790
+ Assert.AreEqual(2, count());
791
+ emitMessage();
792
+ Assert.AreEqual(3, count());
793
+ component.enabled = false;
794
+ emitMessage();
795
+ Assert.AreEqual(3, count());
796
+ }
797
+
798
+ SimpleUntargetedMessage untargetedMessage = new();
799
+ RunTest(() => untargetedMessage.EmitUntargeted(), () => unTargetedCount);
800
+ SimpleTargetedMessage targetedMessage = new();
801
+ RunTest(() => targetedMessage.EmitGameObjectTargeted(test), () => targetedCount);
802
+ RunTest(() => targetedMessage.EmitComponentTargeted(component), () => componentTargetedCount);
803
+ SimpleBroadcastMessage broadcastMessage = new();
804
+ RunTest(() => broadcastMessage.EmitGameObjectBroadcast(test), () => broadcastCount);
805
+ RunTest(() => broadcastMessage.EmitComponentBroadcast(component), () => componentBroadcastCount);
806
+ }
807
+ finally
808
+ {
809
+ foreach (MessageRegistrationHandle handle in handles)
810
+ {
811
+ token.RemoveRegistration(handle);
812
+ }
813
+ }
814
+
815
+ yield break;
816
+ }
817
+
818
+ [UnityTest]
819
+ public IEnumerator InstanceId()
820
+ {
821
+ GameObject test = new(nameof(InstanceId), typeof(SimpleMessageAwareComponent));
822
+ _spawned.Add(test);
823
+
824
+ // Message-aware instance ids
825
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
826
+ Assert.AreEqual((InstanceId)test, (InstanceId)test);
827
+ Assert.AreEqual((InstanceId)component, (InstanceId)component);
828
+ Assert.AreNotEqual((InstanceId)test, (InstanceId)component);
829
+ Assert.AreNotEqual((InstanceId)component, (InstanceId)test);
830
+
831
+ // Non-message-aware instance ids
832
+ GameObject test2 = new(nameof(InstanceId) + " - 2");
833
+ _spawned.Add(test2);
834
+ Assert.AreNotEqual((InstanceId)test2, (InstanceId)test2.transform);
835
+ Assert.AreNotEqual((InstanceId)test2.transform, (InstanceId)test2);
836
+
837
+ // Null checks
838
+ bool caught = false;
839
+ try
840
+ {
841
+ _ = (InstanceId)(GameObject)null;
842
+ }
843
+ catch
844
+ {
845
+ caught = true;
846
+ }
847
+
848
+ Assert.IsTrue(caught);
849
+
850
+ caught = false;
851
+ try
852
+ {
853
+ _ = (InstanceId)(Component)null;
854
+ }
855
+ catch
856
+ {
857
+ caught = true;
858
+ }
859
+
860
+ Assert.IsTrue(caught);
861
+ yield break;
862
+ }
863
+
864
+ [UnityTest]
865
+ public IEnumerator GlobalAcceptAll()
866
+ {
867
+ GameObject test = new(nameof(GlobalAcceptAll), typeof(SimpleMessageAwareComponent));
868
+ _spawned.Add(test);
869
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
870
+
871
+ MessageRegistrationToken token = GetToken(component);
872
+
873
+ int untargetedCount = 0;
874
+ int targetedCount = 0;
875
+ int broadcastCount = 0;
876
+ int fastUntargetedCount = 0;
877
+ int fastTargetedCount = 0;
878
+ int fastBroadcastCount = 0;
879
+
880
+ void HandleUntargeted(IUntargetedMessage message)
881
+ {
882
+ ++untargetedCount;
883
+ }
884
+
885
+ void HandleFastUntargeted(ref IUntargetedMessage message)
886
+ {
887
+ ++fastUntargetedCount;
888
+ }
889
+
890
+ void HandleTargeted(InstanceId target, ITargetedMessage message)
891
+ {
892
+ ++targetedCount;
893
+ }
894
+
895
+ void HandleFastTargeted(ref InstanceId target, ref ITargetedMessage message)
896
+ {
897
+ ++fastTargetedCount;
898
+ }
899
+
900
+ void HandleBroadcast(InstanceId source, IBroadcastMessage message)
901
+ {
902
+ ++broadcastCount;
903
+ }
904
+
905
+ void HandleFastBroadcast(ref InstanceId source, ref IBroadcastMessage message)
906
+ {
907
+ ++fastBroadcastCount;
908
+ }
909
+
910
+ HashSet<MessageRegistrationHandle> handles = new();
911
+ try
912
+ {
913
+ MessageRegistrationHandle firstHandle = token.RegisterGlobalAcceptAll(HandleUntargeted, HandleTargeted, HandleBroadcast);
914
+ _ = handles.Add(firstHandle);
915
+
916
+ // Untargeted
917
+ SimpleUntargetedMessage untargetedMessage = new();
918
+ untargetedMessage.EmitUntargeted();
919
+ Assert.AreEqual(1, untargetedCount);
920
+ Assert.AreEqual(0, targetedCount);
921
+ Assert.AreEqual(0, broadcastCount);
922
+ Assert.AreEqual(0, fastUntargetedCount);
923
+ Assert.AreEqual(0, fastTargetedCount);
924
+ Assert.AreEqual(0, fastBroadcastCount);
925
+ untargetedMessage.EmitUntargeted();
926
+ Assert.AreEqual(2, untargetedCount);
927
+ Assert.AreEqual(0, targetedCount);
928
+ Assert.AreEqual(0, broadcastCount);
929
+ Assert.AreEqual(0, fastUntargetedCount);
930
+ Assert.AreEqual(0, fastTargetedCount);
931
+ Assert.AreEqual(0, fastBroadcastCount);
932
+
933
+ // Targeted
934
+ SimpleTargetedMessage targetedMessage = new();
935
+ targetedMessage.EmitGameObjectTargeted(test);
936
+ Assert.AreEqual(2, untargetedCount);
937
+ Assert.AreEqual(1, targetedCount);
938
+ Assert.AreEqual(0, broadcastCount);
939
+ Assert.AreEqual(0, fastUntargetedCount);
940
+ Assert.AreEqual(0, fastTargetedCount);
941
+ Assert.AreEqual(0, fastBroadcastCount);
942
+ targetedMessage.EmitComponentTargeted(component);
943
+ Assert.AreEqual(2, untargetedCount);
944
+ Assert.AreEqual(2, targetedCount);
945
+ Assert.AreEqual(0, broadcastCount);
946
+ Assert.AreEqual(0, fastUntargetedCount);
947
+ Assert.AreEqual(0, fastTargetedCount);
948
+ Assert.AreEqual(0, fastBroadcastCount);
949
+
950
+ // Broadcast
951
+ SimpleBroadcastMessage broadcastMessage = new();
952
+ broadcastMessage.EmitGameObjectBroadcast(test);
953
+ Assert.AreEqual(2, untargetedCount);
954
+ Assert.AreEqual(2, targetedCount);
955
+ Assert.AreEqual(1, broadcastCount);
956
+ Assert.AreEqual(0, fastUntargetedCount);
957
+ Assert.AreEqual(0, fastTargetedCount);
958
+ Assert.AreEqual(0, fastBroadcastCount);
959
+ broadcastMessage.EmitComponentBroadcast(component);
960
+ Assert.AreEqual(2, untargetedCount);
961
+ Assert.AreEqual(2, targetedCount);
962
+ Assert.AreEqual(2, broadcastCount);
963
+ Assert.AreEqual(0, fastUntargetedCount);
964
+ Assert.AreEqual(0, fastTargetedCount);
965
+ Assert.AreEqual(0, fastBroadcastCount);
966
+
967
+ component.enabled = false;
968
+ int noMatchingCount = 0;
969
+ Action<LogLevel, string> previousLog = MessagingDebug.LogFunction;
970
+ try
971
+ {
972
+ MessagingDebug.LogFunction = (level, logMessage) =>
973
+ {
974
+ if (logMessage.Contains("matching"))
975
+ {
976
+ ++noMatchingCount;
977
+ }
978
+ };
979
+ untargetedMessage.EmitUntargeted();
980
+ Assert.AreEqual(1, noMatchingCount);
981
+ targetedMessage.EmitGameObjectTargeted(test);
982
+ Assert.AreEqual(2, noMatchingCount);
983
+ targetedMessage.EmitComponentTargeted(component);
984
+ Assert.AreEqual(3, noMatchingCount);
985
+ broadcastMessage.EmitGameObjectBroadcast(test);
986
+ Assert.AreEqual(4, noMatchingCount);
987
+ broadcastMessage.EmitComponentBroadcast(component);
988
+ Assert.AreEqual(5, noMatchingCount);
989
+ }
990
+ finally
991
+ {
992
+ MessagingDebug.LogFunction = previousLog;
993
+ }
994
+
995
+ Assert.AreEqual(2, untargetedCount);
996
+ Assert.AreEqual(2, targetedCount);
997
+ Assert.AreEqual(2, broadcastCount);
998
+ Assert.AreEqual(0, fastUntargetedCount);
999
+ Assert.AreEqual(0, fastTargetedCount);
1000
+ Assert.AreEqual(0, fastBroadcastCount);
1001
+
1002
+ component.enabled = true;
1003
+ MessageRegistrationHandle secondHandle = token.RegisterGlobalAcceptAll(HandleUntargeted, HandleTargeted, HandleBroadcast);
1004
+ _ = handles.Add(secondHandle);
1005
+ untargetedMessage.EmitUntargeted();
1006
+ targetedMessage.EmitGameObjectTargeted(test);
1007
+ targetedMessage.EmitComponentTargeted(component);
1008
+ broadcastMessage.EmitGameObjectBroadcast(test);
1009
+ broadcastMessage.EmitComponentBroadcast(component);
1010
+ Assert.AreEqual(3, untargetedCount);
1011
+ Assert.AreEqual(4, targetedCount);
1012
+ Assert.AreEqual(4, broadcastCount);
1013
+ Assert.AreEqual(0, fastUntargetedCount);
1014
+ Assert.AreEqual(0, fastTargetedCount);
1015
+ Assert.AreEqual(0, fastBroadcastCount);
1016
+
1017
+ MessageRegistrationHandle thirdHandle = token.RegisterGlobalAcceptAll(HandleFastUntargeted, HandleFastTargeted, HandleFastBroadcast);
1018
+ _ = handles.Add(thirdHandle);
1019
+ untargetedMessage.EmitUntargeted();
1020
+ targetedMessage.EmitGameObjectTargeted(test);
1021
+ targetedMessage.EmitComponentTargeted(component);
1022
+ broadcastMessage.EmitGameObjectBroadcast(test);
1023
+ broadcastMessage.EmitComponentBroadcast(component);
1024
+ Assert.AreEqual(4, untargetedCount);
1025
+ Assert.AreEqual(6, targetedCount);
1026
+ Assert.AreEqual(6, broadcastCount);
1027
+ Assert.AreEqual(1, fastUntargetedCount);
1028
+ Assert.AreEqual(2, fastTargetedCount);
1029
+ Assert.AreEqual(2, fastBroadcastCount);
1030
+
1031
+ MessageRegistrationHandle fourthHandle = token.RegisterGlobalAcceptAll(HandleFastUntargeted, HandleFastTargeted, HandleFastBroadcast);
1032
+ _ = handles.Add(fourthHandle);
1033
+ untargetedMessage.EmitUntargeted();
1034
+ targetedMessage.EmitGameObjectTargeted(test);
1035
+ targetedMessage.EmitComponentTargeted(component);
1036
+ broadcastMessage.EmitGameObjectBroadcast(test);
1037
+ broadcastMessage.EmitComponentBroadcast(component);
1038
+ Assert.AreEqual(5, untargetedCount);
1039
+ Assert.AreEqual(8, targetedCount);
1040
+ Assert.AreEqual(8, broadcastCount);
1041
+ Assert.AreEqual(2, fastUntargetedCount);
1042
+ Assert.AreEqual(4, fastTargetedCount);
1043
+ Assert.AreEqual(4, fastBroadcastCount);
1044
+ }
1045
+ finally
1046
+ {
1047
+ foreach (MessageRegistrationHandle handle in handles)
1048
+ {
1049
+ token.RemoveRegistration(handle);
1050
+ }
1051
+ }
1052
+
1053
+ yield break;
1054
+ }
1055
+
1056
+ [UnityTest]
1057
+ public IEnumerator InterceptorOrder()
1058
+ {
1059
+ GameObject test = new(nameof(InterceptorOrder), typeof(SimpleMessageAwareComponent));
1060
+ _spawned.Add(test);
1061
+
1062
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
1063
+
1064
+ bool seen = false;
1065
+ component.untargetedHandler = () =>
1066
+ {
1067
+ // ReSharper disable once AccessToModifiedClosure
1068
+ Assert.IsFalse(seen);
1069
+ seen = true;
1070
+ };
1071
+
1072
+ MessageRegistrationToken token = GetToken(component);
1073
+ HashSet<MessageRegistrationHandle> handles = new();
1074
+ try
1075
+ {
1076
+ int seenCount = 0;
1077
+ bool UntargetedInterceptorFirstPriority(ref SimpleUntargetedMessage message)
1078
+ {
1079
+ return seenCount++ % 3 == 0;
1080
+ }
1081
+
1082
+ bool UntargetedInterceptorSecondPriority(ref SimpleUntargetedMessage message)
1083
+ {
1084
+ return seenCount++ % 3 == 1;
1085
+ }
1086
+
1087
+ bool UntargetedInterceptorThirdPriority(ref SimpleUntargetedMessage message)
1088
+ {
1089
+ return seenCount++ % 3 == 2;
1090
+ }
1091
+
1092
+ int interceptorRunCount = 0;
1093
+ bool UntargetedInterceptorFourthPriority(ref SimpleUntargetedMessage message)
1094
+ {
1095
+ // We should be running close to first and last
1096
+ if (++interceptorRunCount % 2 == 0)
1097
+ {
1098
+ return seenCount % 3 == 0;
1099
+ }
1100
+ return true;
1101
+ }
1102
+
1103
+ MessageRegistrationHandle secondInterceptor = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptorSecondPriority, 100);
1104
+ _ = handles.Add(secondInterceptor);
1105
+ MessageRegistrationHandle thirdInterceptor = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptorThirdPriority, 101);
1106
+ _ = handles.Add(thirdInterceptor);
1107
+ MessageRegistrationHandle firstInterceptor = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptorFirstPriority, -1);
1108
+ _ = handles.Add(firstInterceptor);
1109
+ MessageRegistrationHandle fourthInterceptorFirstPriority = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptorFourthPriority, -1);
1110
+ _ = handles.Add(fourthInterceptorFirstPriority);
1111
+ MessageRegistrationHandle fourthInterceptorSecondPriority = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptorFourthPriority, 102);
1112
+ _ = handles.Add(fourthInterceptorSecondPriority);
1113
+
1114
+ SimpleUntargetedMessage message = new();
1115
+ message.EmitUntargeted();
1116
+ Assert.IsTrue(seen);
1117
+ Assert.AreEqual(2, interceptorRunCount);
1118
+ seen = false;
1119
+
1120
+ message.EmitUntargeted();
1121
+ Assert.IsTrue(seen);
1122
+ Assert.AreEqual(4, interceptorRunCount);
1123
+ seen = false;
1124
+
1125
+ MessageRegistrationHandle doubleRegistrationOne = token.RegisterUntargetedInterceptor<SimpleUntargetedMessage>(UntargetedInterceptorFirstPriority, -1);
1126
+ _ = handles.Add(doubleRegistrationOne);
1127
+ message.EmitUntargeted();
1128
+ Assert.IsTrue(seen);
1129
+ Assert.AreEqual(6, interceptorRunCount);
1130
+ seen = false;
1131
+
1132
+ _ = handles.Remove(firstInterceptor);
1133
+ token.RemoveRegistration(firstInterceptor);
1134
+ message.EmitUntargeted();
1135
+ Assert.IsTrue(seen);
1136
+ Assert.AreEqual(8, interceptorRunCount);
1137
+ seen = false;
1138
+
1139
+ // Double remove
1140
+ token.RemoveRegistration(firstInterceptor);
1141
+ token.RemoveRegistration(firstInterceptor);
1142
+ message.EmitUntargeted();
1143
+ Assert.IsTrue(seen);
1144
+ Assert.AreEqual(10, interceptorRunCount);
1145
+ }
1146
+ finally
1147
+ {
1148
+ foreach (MessageRegistrationHandle handle in handles)
1149
+ {
1150
+ token.RemoveRegistration(handle);
1151
+ }
1152
+ }
1153
+
1154
+ yield break;
1155
+ }
1156
+
1157
+ [UnityTest]
1158
+ public IEnumerator UntargetedRemoveOrder()
1159
+ {
1160
+ GameObject test = new(nameof(UntargetedRemoveOrder), typeof(SimpleMessageAwareComponent));
1161
+ _spawned.Add(test);
1162
+
1163
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
1164
+
1165
+ MessageRegistrationToken token = GetToken(component);
1166
+
1167
+ int callCount = 0;
1168
+ int fastCallCount = 0;
1169
+
1170
+ void HandleUntargeted(SimpleUntargetedMessage message)
1171
+ {
1172
+ ++callCount;
1173
+ }
1174
+
1175
+ void HandleFastUntargeted(ref SimpleUntargetedMessage message)
1176
+ {
1177
+ ++fastCallCount;
1178
+ }
1179
+
1180
+ SimpleUntargetedMessage message = new();
1181
+ int expectedCallCount = 0;
1182
+ Run(() => new[] { token.RegisterUntargeted<SimpleUntargetedMessage>(HandleUntargeted) },
1183
+ () => message.EmitUntargeted(),
1184
+ () =>
1185
+ {
1186
+ Assert.AreEqual(++expectedCallCount, callCount);
1187
+ Assert.AreEqual(0, fastCallCount);
1188
+ },
1189
+ () =>
1190
+ {
1191
+ Assert.AreEqual(expectedCallCount, callCount);
1192
+ Assert.AreEqual(0, fastCallCount);
1193
+ },
1194
+ token);
1195
+
1196
+ callCount = 0;
1197
+ expectedCallCount = 0;
1198
+ Run(() => new[] { token.RegisterUntargeted<SimpleUntargetedMessage>(HandleFastUntargeted) },
1199
+ () => message.EmitUntargeted(),
1200
+ () =>
1201
+ {
1202
+ Assert.AreEqual(++expectedCallCount, fastCallCount);
1203
+ Assert.AreEqual(0, callCount);
1204
+ },
1205
+ () =>
1206
+ {
1207
+ Assert.AreEqual(expectedCallCount, fastCallCount);
1208
+ Assert.AreEqual(0, callCount);
1209
+ },
1210
+ token);
1211
+
1212
+ callCount = 0;
1213
+ fastCallCount = 0;
1214
+ Run(() =>
1215
+ {
1216
+ return new[] { token.RegisterUntargeted<SimpleUntargetedMessage>(HandleFastUntargeted), token.RegisterUntargeted<SimpleUntargetedMessage>(HandleUntargeted) };
1217
+ },
1218
+ () => message.EmitUntargeted(),
1219
+ () => { },
1220
+ () =>
1221
+ {
1222
+ Assert.AreNotEqual(callCount, fastCallCount);
1223
+ },
1224
+ token);
1225
+
1226
+ yield break;
1227
+ }
1228
+
1229
+ [UnityTest]
1230
+ public IEnumerator TargetedRemoveOrder()
1231
+ {
1232
+ GameObject test = new(nameof(TargetedRemoveOrder), typeof(SimpleMessageAwareComponent));
1233
+ _spawned.Add(test);
1234
+
1235
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
1236
+
1237
+ MessageRegistrationToken token = GetToken(component);
1238
+
1239
+ int callCount = 0;
1240
+ int fastCallCount = 0;
1241
+
1242
+ void HandleTargeted(SimpleTargetedMessage message)
1243
+ {
1244
+ ++callCount;
1245
+ }
1246
+
1247
+ void HandleFastTargeted(ref SimpleTargetedMessage message)
1248
+ {
1249
+ ++fastCallCount;
1250
+ }
1251
+
1252
+ SimpleTargetedMessage message = new();
1253
+ int expectedCallCount = 0;
1254
+ Run(() => new[] { token.RegisterGameObjectTargeted<SimpleTargetedMessage>(test, HandleTargeted) },
1255
+ () =>
1256
+ {
1257
+ message.EmitComponentTargeted(component);
1258
+ message.EmitGameObjectTargeted(test);
1259
+ },
1260
+ () =>
1261
+ {
1262
+ Assert.AreEqual(++expectedCallCount, callCount);
1263
+ Assert.AreEqual(0, fastCallCount);
1264
+ },
1265
+ () =>
1266
+ {
1267
+ Assert.AreEqual(expectedCallCount, callCount);
1268
+ Assert.AreEqual(0, fastCallCount);
1269
+ },
1270
+ token);
1271
+
1272
+ callCount = 0;
1273
+ expectedCallCount = 0;
1274
+ Run(() => new[] { token.RegisterGameObjectTargeted<SimpleTargetedMessage>(test, HandleFastTargeted) },
1275
+ () =>
1276
+ {
1277
+ message.EmitComponentTargeted(component);
1278
+ message.EmitGameObjectTargeted(test);
1279
+ },
1280
+ () =>
1281
+ {
1282
+ Assert.AreEqual(++expectedCallCount, fastCallCount);
1283
+ Assert.AreEqual(0, callCount);
1284
+ },
1285
+ () =>
1286
+ {
1287
+ Assert.AreEqual(expectedCallCount, fastCallCount);
1288
+ Assert.AreEqual(0, callCount);
1289
+ },
1290
+ token);
1291
+
1292
+ callCount = 0;
1293
+ fastCallCount = 0;
1294
+ Run(() =>
1295
+ {
1296
+ return new[] { token.RegisterGameObjectTargeted<SimpleTargetedMessage>(test, HandleFastTargeted), token.RegisterGameObjectTargeted<SimpleTargetedMessage>(test, HandleTargeted) };
1297
+ },
1298
+ () =>
1299
+ {
1300
+ message.EmitComponentTargeted(component);
1301
+ message.EmitGameObjectTargeted(test);
1302
+ },
1303
+ () => { },
1304
+ () =>
1305
+ {
1306
+ Assert.AreNotEqual(callCount, fastCallCount);
1307
+ },
1308
+ token);
1309
+
1310
+ callCount = 0;
1311
+ fastCallCount = 0;
1312
+ Run(() =>
1313
+ {
1314
+ return new[] { token.RegisterComponentTargeted<SimpleTargetedMessage>(component, HandleFastTargeted), token.RegisterGameObjectTargeted<SimpleTargetedMessage>(test, HandleTargeted) };
1315
+ },
1316
+ () =>
1317
+ {
1318
+ message.EmitComponentTargeted(component);
1319
+ message.EmitGameObjectTargeted(test);
1320
+ },
1321
+ () => { },
1322
+ () =>
1323
+ {
1324
+ Assert.AreNotEqual(callCount, fastCallCount);
1325
+ },
1326
+ token);
1327
+
1328
+ callCount = 0;
1329
+ fastCallCount = 0;
1330
+ Run(() =>
1331
+ {
1332
+ return new[] { token.RegisterComponentTargeted<SimpleTargetedMessage>(component, HandleFastTargeted), token.RegisterComponentTargeted<SimpleTargetedMessage>(component, HandleTargeted) };
1333
+ },
1334
+ () =>
1335
+ {
1336
+ message.EmitComponentTargeted(component);
1337
+ message.EmitGameObjectTargeted(test);
1338
+ },
1339
+ () => { },
1340
+ () =>
1341
+ {
1342
+ Assert.AreNotEqual(callCount, fastCallCount);
1343
+ },
1344
+ token);
1345
+
1346
+ yield break;
1347
+ }
1348
+
1349
+ [UnityTest]
1350
+ public IEnumerator BroadcastRemoveOrder()
1351
+ {
1352
+ GameObject test = new(nameof(BroadcastRemoveOrder), typeof(SimpleMessageAwareComponent));
1353
+ _spawned.Add(test);
1354
+
1355
+ SimpleMessageAwareComponent component = test.GetComponent<SimpleMessageAwareComponent>();
1356
+
1357
+ MessageRegistrationToken token = GetToken(component);
1358
+ int callCount = 0;
1359
+ int fastCallCount = 0;
1360
+
1361
+ void HandleBroadcast(SimpleBroadcastMessage message)
1362
+ {
1363
+ ++callCount;
1364
+ }
1365
+
1366
+ void HandleFastBroadcast(ref SimpleBroadcastMessage message)
1367
+ {
1368
+ ++fastCallCount;
1369
+ }
1370
+
1371
+ SimpleBroadcastMessage message = new();
1372
+ int expectedCallCount = 0;
1373
+ Run(() => new[] { token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleBroadcast) },
1374
+ () =>
1375
+ {
1376
+ message.EmitComponentBroadcast(component);
1377
+ message.EmitGameObjectBroadcast(test);
1378
+ },
1379
+ () =>
1380
+ {
1381
+ Assert.AreEqual(++expectedCallCount, callCount);
1382
+ Assert.AreEqual(0, fastCallCount);
1383
+ },
1384
+ () =>
1385
+ {
1386
+ Assert.AreEqual(expectedCallCount, callCount);
1387
+ Assert.AreEqual(0, fastCallCount);
1388
+ },
1389
+ token);
1390
+
1391
+ callCount = 0;
1392
+ expectedCallCount = 0;
1393
+ Run(() => new[] { token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleFastBroadcast) },
1394
+ () =>
1395
+ {
1396
+ message.EmitComponentBroadcast(component);
1397
+ message.EmitGameObjectBroadcast(test);
1398
+ },
1399
+ () =>
1400
+ {
1401
+ Assert.AreEqual(++expectedCallCount, fastCallCount);
1402
+ Assert.AreEqual(0, callCount);
1403
+ },
1404
+ () =>
1405
+ {
1406
+ Assert.AreEqual(expectedCallCount, fastCallCount);
1407
+ Assert.AreEqual(0, callCount);
1408
+ },
1409
+ token);
1410
+
1411
+ callCount = 0;
1412
+ fastCallCount = 0;
1413
+ Run(() =>
1414
+ {
1415
+ return new[] { token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleFastBroadcast), token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleBroadcast) };
1416
+ },
1417
+ () =>
1418
+ {
1419
+ message.EmitComponentBroadcast(component);
1420
+ message.EmitGameObjectBroadcast(test);
1421
+ },
1422
+ () => { },
1423
+ () =>
1424
+ {
1425
+ Assert.AreNotEqual(callCount, fastCallCount);
1426
+ },
1427
+ token);
1428
+
1429
+ callCount = 0;
1430
+ fastCallCount = 0;
1431
+ Run(() =>
1432
+ {
1433
+ return new[] { token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleFastBroadcast), token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleBroadcast) };
1434
+ },
1435
+ () =>
1436
+ {
1437
+ message.EmitComponentBroadcast(component);
1438
+ message.EmitGameObjectBroadcast(test);
1439
+ },
1440
+ () => { },
1441
+ () =>
1442
+ {
1443
+ Assert.AreNotEqual(callCount, fastCallCount);
1444
+ },
1445
+ token);
1446
+
1447
+ callCount = 0;
1448
+ fastCallCount = 0;
1449
+ Run(() =>
1450
+ {
1451
+ return new[] { token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleFastBroadcast), token.RegisterGameObjectBroadcast<SimpleBroadcastMessage>(test, HandleBroadcast) };
1452
+ },
1453
+ () =>
1454
+ {
1455
+ message.EmitComponentBroadcast(component);
1456
+ message.EmitGameObjectBroadcast(test);
1457
+ },
1458
+ () => { },
1459
+ () =>
1460
+ {
1461
+ Assert.AreNotEqual(callCount, fastCallCount);
1462
+ },
1463
+ token);
1464
+
1465
+ yield break;
1466
+ }
1467
+ }
1468
+ }