com.wallstop-studios.dxmessaging 2.0.0-rc12 → 2.0.0-rc13

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