com.wallstop-studios.dxmessaging 2.0.0 → 2.1.0

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 (174) hide show
  1. package/.github/workflows/format-on-demand.yml +2 -2
  2. package/.github/workflows/json-format-check.yml +1 -1
  3. package/.github/workflows/markdown-json.yml +1 -1
  4. package/.github/workflows/markdownlint.yml +1 -1
  5. package/.github/workflows/npm-publish.yml +1 -1
  6. package/.github/workflows/prettier-autofix.yml +2 -2
  7. package/.github/workflows/yaml-format-lint.yml +1 -1
  8. package/Docs/Advanced.md +26 -1
  9. package/Docs/Comparisons.md +1229 -146
  10. package/Docs/Compatibility.md +27 -0
  11. package/Docs/DesignAndArchitecture.md +41 -34
  12. package/Docs/EmitShorthands.md +34 -0
  13. package/Docs/Helpers.md +1 -1
  14. package/Docs/Index.md +28 -25
  15. package/Docs/Install.md +29 -6
  16. package/Docs/Integrations/Reflex.md +292 -0
  17. package/Docs/Integrations/Reflex.md.meta +7 -0
  18. package/Docs/Integrations/VContainer.md +324 -0
  19. package/Docs/Integrations/VContainer.md.meta +7 -0
  20. package/Docs/Integrations/Zenject.md +333 -0
  21. package/Docs/Integrations/Zenject.md.meta +7 -0
  22. package/{Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.pdb.meta → Docs/Integrations.meta} +2 -1
  23. package/Docs/InterceptorsAndOrdering.md +371 -17
  24. package/Docs/ListeningPatterns.md +206 -0
  25. package/Docs/MessageBusProviders.md +496 -0
  26. package/Docs/MessageBusProviders.md.meta +7 -0
  27. package/Docs/MessageTypes.md +27 -0
  28. package/Docs/MigrationGuide.md +45 -0
  29. package/Docs/Patterns.md +286 -0
  30. package/Docs/Performance.md +9 -9
  31. package/Docs/QuickReference.md +31 -0
  32. package/Docs/RuntimeConfiguration.md +407 -0
  33. package/Docs/RuntimeConfiguration.md.meta +7 -0
  34. package/Docs/UnityIntegration.md +3 -1
  35. package/Docs/VisualGuide.md +206 -157
  36. package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
  37. package/README.md +148 -26
  38. package/Runtime/AssemblyInfo.cs +4 -0
  39. package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
  40. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
  41. package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
  42. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
  43. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
  44. package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
  45. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
  46. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
  47. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
  48. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
  49. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
  50. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
  51. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
  52. package/Runtime/Core/MessageHandler.cs +198 -27
  53. package/Runtime/Core/MessageRegistrationToken.cs +67 -25
  54. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
  55. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
  56. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
  57. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
  58. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
  59. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
  60. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
  61. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
  62. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
  63. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
  64. package/Runtime/Unity/Integrations/Reflex.meta +8 -0
  65. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
  66. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
  67. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
  68. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
  69. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
  70. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
  71. package/Runtime/Unity/Integrations/VContainer.meta +8 -0
  72. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
  73. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
  74. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
  75. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
  76. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
  77. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
  78. package/Runtime/Unity/Integrations/Zenject.meta +8 -0
  79. package/Runtime/Unity/Integrations.meta +8 -0
  80. package/Runtime/Unity/MessageAwareComponent.cs +102 -0
  81. package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
  82. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
  83. package/Runtime/Unity/MessagingComponent.cs +164 -2
  84. package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
  85. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
  86. package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
  87. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
  88. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
  89. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
  90. package/Samples~/DI/Prefabs.meta +8 -0
  91. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
  92. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
  93. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
  94. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
  95. package/Samples~/DI/Providers.meta +8 -0
  96. package/Samples~/DI/README.md +51 -0
  97. package/Samples~/DI/README.md.meta +7 -0
  98. package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
  99. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
  100. package/Samples~/DI/Reflex.meta +8 -0
  101. package/Samples~/DI/VContainer/SampleLifetimeScope.cs +81 -0
  102. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
  103. package/Samples~/DI/VContainer.meta +8 -0
  104. package/Samples~/DI/Zenject/SampleInstaller.cs +67 -0
  105. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
  106. package/Samples~/DI/Zenject.meta +8 -0
  107. package/Samples~/DI.meta +8 -0
  108. package/Samples~/Mini Combat/README.md +5 -7
  109. package/Samples~/Mini Combat/Walkthrough.md +18 -24
  110. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
  111. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
  112. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
  113. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
  114. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
  115. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
  116. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
  117. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
  118. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
  119. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
  120. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
  121. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
  122. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
  123. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
  124. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
  125. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
  126. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
  127. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
  128. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
  129. package/Tests/Runtime/Core/Extensions.meta +8 -0
  130. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
  131. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
  132. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
  133. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
  134. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
  135. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
  136. package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
  137. package/Tests/Runtime/Core/NominalTests.cs +2 -2
  138. package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
  139. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
  140. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
  141. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
  142. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
  143. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
  144. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
  145. package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
  146. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
  147. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
  148. package/Tests/Runtime/Integrations/Reflex.meta +8 -0
  149. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
  150. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
  151. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
  152. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
  153. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  154. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
  155. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
  156. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
  157. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
  158. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  159. package/Tests/Runtime/Integrations.meta +8 -0
  160. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
  161. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
  162. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
  163. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
  164. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
  165. package/Tests/Runtime/TestUtilities.meta +9 -0
  166. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
  167. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
  168. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
  169. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
  170. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
  171. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
  172. package/Tests/Runtime/Unity.meta +9 -0
  173. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
  174. package/package.json +1 -1
@@ -0,0 +1,219 @@
1
+ namespace DxMessaging.Tests.Runtime.Core
2
+ {
3
+ using System;
4
+ using DxMessaging.Core;
5
+ using DxMessaging.Core.MessageBus;
6
+ using DxMessaging.Core.Messages;
7
+ using NUnit.Framework;
8
+ using GlobalMessageBus = DxMessaging.Core.MessageBus.MessageBus;
9
+
10
+ [TestFixture]
11
+ public sealed class MessageHandlerGlobalBusTests
12
+ {
13
+ private IMessageBus _originalBus;
14
+
15
+ [SetUp]
16
+ public void CaptureOriginalBus()
17
+ {
18
+ _originalBus = MessageHandler.MessageBus;
19
+ }
20
+
21
+ [TearDown]
22
+ public void RestoreOriginalBus()
23
+ {
24
+ MessageHandler.SetGlobalMessageBus(_originalBus);
25
+ }
26
+
27
+ [Test]
28
+ public void SetGlobalMessageBusReplacesGlobalInstance()
29
+ {
30
+ GlobalMessageBus customBus = new GlobalMessageBus();
31
+ MessageHandler.SetGlobalMessageBus(customBus);
32
+
33
+ Assert.AreSame(customBus, MessageHandler.MessageBus);
34
+ }
35
+
36
+ [Test]
37
+ public void ResetGlobalMessageBusRestoresDefaultInstance()
38
+ {
39
+ MessageHandler.ResetGlobalMessageBus();
40
+ IMessageBus expectedDefault = MessageHandler.MessageBus;
41
+
42
+ GlobalMessageBus customBus = new GlobalMessageBus();
43
+ MessageHandler.SetGlobalMessageBus(customBus);
44
+ Assert.AreSame(customBus, MessageHandler.MessageBus);
45
+
46
+ MessageHandler.ResetGlobalMessageBus();
47
+ Assert.AreSame(expectedDefault, MessageHandler.MessageBus);
48
+ }
49
+
50
+ [Test]
51
+ public void SetGlobalMessageBusAcceptsInterfaceImplementation()
52
+ {
53
+ WrapperMessageBus wrapper = new WrapperMessageBus(new GlobalMessageBus());
54
+ MessageHandler.SetGlobalMessageBus(wrapper);
55
+ Assert.AreSame(wrapper, MessageHandler.MessageBus);
56
+ }
57
+
58
+ [Test]
59
+ public void OverrideGlobalMessageBusScopeRestoresPreviousBus()
60
+ {
61
+ GlobalMessageBus primary = new GlobalMessageBus();
62
+ MessageHandler.SetGlobalMessageBus(primary);
63
+ WrapperMessageBus secondary = new WrapperMessageBus(new GlobalMessageBus());
64
+
65
+ using (MessageHandler.OverrideGlobalMessageBus(secondary))
66
+ {
67
+ Assert.AreSame(secondary, MessageHandler.MessageBus);
68
+ }
69
+
70
+ Assert.AreSame(primary, MessageHandler.MessageBus);
71
+ }
72
+
73
+ private sealed class WrapperMessageBus : IMessageBus
74
+ {
75
+ private readonly IMessageBus _inner;
76
+
77
+ public WrapperMessageBus(IMessageBus inner)
78
+ {
79
+ _inner = inner ?? throw new ArgumentNullException(nameof(inner));
80
+ }
81
+
82
+ public bool DiagnosticsMode => _inner.DiagnosticsMode;
83
+
84
+ public int RegisteredGlobalSequentialIndex => _inner.RegisteredGlobalSequentialIndex;
85
+
86
+ public int RegisteredBroadcast => _inner.RegisteredBroadcast;
87
+
88
+ public int RegisteredTargeted => _inner.RegisteredTargeted;
89
+
90
+ public int RegisteredUntargeted => _inner.RegisteredUntargeted;
91
+
92
+ public RegistrationLog Log => _inner.Log;
93
+
94
+ public long EmissionId => _inner.EmissionId;
95
+
96
+ public Action RegisterUntargeted<T>(MessageHandler messageHandler, int priority = 0)
97
+ where T : IUntargetedMessage =>
98
+ _inner.RegisterUntargeted<T>(messageHandler, priority);
99
+
100
+ public Action RegisterUntargetedPostProcessor<T>(
101
+ MessageHandler messageHandler,
102
+ int priority = 0
103
+ )
104
+ where T : IUntargetedMessage =>
105
+ _inner.RegisterUntargetedPostProcessor<T>(messageHandler, priority);
106
+
107
+ public Action RegisterTargeted<T>(
108
+ InstanceId target,
109
+ MessageHandler messageHandler,
110
+ int priority = 0
111
+ )
112
+ where T : ITargetedMessage =>
113
+ _inner.RegisterTargeted<T>(target, messageHandler, priority);
114
+
115
+ public Action RegisterTargetedPostProcessor<T>(
116
+ InstanceId target,
117
+ MessageHandler messageHandler,
118
+ int priority = 0
119
+ )
120
+ where T : ITargetedMessage =>
121
+ _inner.RegisterTargetedPostProcessor<T>(target, messageHandler, priority);
122
+
123
+ public Action RegisterTargetedWithoutTargeting<T>(
124
+ MessageHandler messageHandler,
125
+ int priority = 0
126
+ )
127
+ where T : ITargetedMessage =>
128
+ _inner.RegisterTargetedWithoutTargeting<T>(messageHandler, priority);
129
+
130
+ public Action RegisterTargetedWithoutTargetingPostProcessor<T>(
131
+ MessageHandler messageHandler,
132
+ int priority = 0
133
+ )
134
+ where T : ITargetedMessage =>
135
+ _inner.RegisterTargetedWithoutTargetingPostProcessor<T>(messageHandler, priority);
136
+
137
+ public Action RegisterBroadcastPostProcessor<T>(
138
+ InstanceId source,
139
+ MessageHandler messageHandler,
140
+ int priority = 0
141
+ )
142
+ where T : IBroadcastMessage =>
143
+ _inner.RegisterBroadcastPostProcessor<T>(source, messageHandler, priority);
144
+
145
+ public Action RegisterBroadcastWithoutSourcePostProcessor<T>(
146
+ MessageHandler messageHandler,
147
+ int priority = 0
148
+ )
149
+ where T : IBroadcastMessage =>
150
+ _inner.RegisterBroadcastWithoutSourcePostProcessor<T>(messageHandler, priority);
151
+
152
+ public Action RegisterSourcedBroadcast<T>(
153
+ InstanceId source,
154
+ MessageHandler messageHandler,
155
+ int priority = 0
156
+ )
157
+ where T : IBroadcastMessage =>
158
+ _inner.RegisterSourcedBroadcast<T>(source, messageHandler, priority);
159
+
160
+ public Action RegisterSourcedBroadcastWithoutSource<T>(
161
+ MessageHandler messageHandler,
162
+ int priority = 0
163
+ )
164
+ where T : IBroadcastMessage =>
165
+ _inner.RegisterSourcedBroadcastWithoutSource<T>(messageHandler, priority);
166
+
167
+ public Action RegisterGlobalAcceptAll(MessageHandler messageHandler) =>
168
+ _inner.RegisterGlobalAcceptAll(messageHandler);
169
+
170
+ public Action RegisterUntargetedInterceptor<T>(
171
+ IMessageBus.UntargetedInterceptor<T> interceptor,
172
+ int priority = 0
173
+ )
174
+ where T : IUntargetedMessage =>
175
+ _inner.RegisterUntargetedInterceptor(interceptor, priority);
176
+
177
+ public Action RegisterTargetedInterceptor<T>(
178
+ IMessageBus.TargetedInterceptor<T> interceptor,
179
+ int priority = 0
180
+ )
181
+ where T : ITargetedMessage =>
182
+ _inner.RegisterTargetedInterceptor(interceptor, priority);
183
+
184
+ public Action RegisterBroadcastInterceptor<T>(
185
+ IMessageBus.BroadcastInterceptor<T> interceptor,
186
+ int priority = 0
187
+ )
188
+ where T : IBroadcastMessage =>
189
+ _inner.RegisterBroadcastInterceptor(interceptor, priority);
190
+
191
+ public void UntypedUntargetedBroadcast(IUntargetedMessage typedMessage) =>
192
+ _inner.UntypedUntargetedBroadcast(typedMessage);
193
+
194
+ public void UntargetedBroadcast<TMessage>(ref TMessage typedMessage)
195
+ where TMessage : IUntargetedMessage => _inner.UntargetedBroadcast(ref typedMessage);
196
+
197
+ public void UntypedTargetedBroadcast(
198
+ InstanceId target,
199
+ ITargetedMessage typedMessage
200
+ ) => _inner.UntypedTargetedBroadcast(target, typedMessage);
201
+
202
+ public void TargetedBroadcast<TMessage>(
203
+ ref InstanceId target,
204
+ ref TMessage typedMessage
205
+ )
206
+ where TMessage : ITargetedMessage =>
207
+ _inner.TargetedBroadcast(ref target, ref typedMessage);
208
+
209
+ public void UntypedSourcedBroadcast(
210
+ InstanceId source,
211
+ IBroadcastMessage typedMessage
212
+ ) => _inner.UntypedSourcedBroadcast(source, typedMessage);
213
+
214
+ public void SourcedBroadcast<TMessage>(ref InstanceId source, ref TMessage typedMessage)
215
+ where TMessage : IBroadcastMessage =>
216
+ _inner.SourcedBroadcast(ref source, ref typedMessage);
217
+ }
218
+ }
219
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: cf4853a491e46be419f8b833c55bbf7e
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,204 @@
1
+ namespace DxMessaging.Tests.Runtime.Core
2
+ {
3
+ using System;
4
+ using DxMessaging.Core;
5
+ using DxMessaging.Core.MessageBus;
6
+ using DxMessaging.Tests.Runtime.Scripts.Messages;
7
+ using NUnit.Framework;
8
+
9
+ public sealed class MessageRegistrationBuilderTests
10
+ {
11
+ private sealed class PassthroughMessageBusProvider : IMessageBusProvider
12
+ {
13
+ private readonly IMessageBus _messageBus;
14
+
15
+ public PassthroughMessageBusProvider(IMessageBus messageBus)
16
+ {
17
+ _messageBus = messageBus ?? throw new ArgumentNullException(nameof(messageBus));
18
+ }
19
+
20
+ public IMessageBus Resolve()
21
+ {
22
+ return _messageBus;
23
+ }
24
+ }
25
+
26
+ private MessageRegistrationBuilder _builder;
27
+ private IMessageBus _defaultBus;
28
+
29
+ [SetUp]
30
+ public void SetUp()
31
+ {
32
+ _defaultBus = new MessageBus();
33
+ IMessageBusProvider provider = new PassthroughMessageBusProvider(_defaultBus);
34
+ _builder = new MessageRegistrationBuilder(provider);
35
+ }
36
+
37
+ [TearDown]
38
+ public void TearDown()
39
+ {
40
+ _builder = null;
41
+ _defaultBus = null;
42
+ }
43
+
44
+ [Test]
45
+ public void BuildUsesResolvedBusWhenNoOverrideProvided()
46
+ {
47
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions();
48
+ using MessageRegistrationLease lease = _builder.Build(options);
49
+
50
+ Assert.AreSame(_defaultBus, lease.MessageBus);
51
+ Assert.IsNotNull(lease.Token);
52
+ Assert.IsFalse(lease.Token.Enabled);
53
+ }
54
+
55
+ [Test]
56
+ public void ActivateOnBuildEnablesTokenAndLifecycle()
57
+ {
58
+ bool buildInvoked = false;
59
+ bool activateInvoked = false;
60
+ bool deactivateInvoked = false;
61
+ bool disposeInvoked = false;
62
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions
63
+ {
64
+ ActivateOnBuild = true,
65
+ Configure = token =>
66
+ {
67
+ _ = token.RegisterUntargeted<SimpleUntargetedMessage>(OnSimpleMessage);
68
+ },
69
+ Lifecycle = new MessageRegistrationLifecycle(
70
+ token =>
71
+ {
72
+ buildInvoked = true;
73
+ },
74
+ token =>
75
+ {
76
+ activateInvoked = true;
77
+ },
78
+ token =>
79
+ {
80
+ deactivateInvoked = true;
81
+ },
82
+ token =>
83
+ {
84
+ disposeInvoked = true;
85
+ }
86
+ ),
87
+ };
88
+
89
+ using (MessageRegistrationLease lease = _builder.Build(options))
90
+ {
91
+ Assert.IsTrue(buildInvoked);
92
+ Assert.IsTrue(lease.Token.Enabled);
93
+ Assert.IsTrue(lease.IsActive);
94
+ Assert.IsTrue(activateInvoked);
95
+
96
+ lease.Deactivate();
97
+ Assert.IsFalse(lease.IsActive);
98
+ Assert.IsTrue(deactivateInvoked);
99
+ }
100
+
101
+ Assert.IsTrue(disposeInvoked);
102
+ }
103
+
104
+ [Test]
105
+ public void PreferredMessageBusOverridesProvider()
106
+ {
107
+ MessageBus preferredBus = new MessageBus();
108
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions
109
+ {
110
+ PreferredMessageBus = preferredBus,
111
+ };
112
+
113
+ using MessageRegistrationLease lease = _builder.Build(options);
114
+ Assert.AreSame(preferredBus, lease.MessageBus);
115
+ }
116
+
117
+ [Test]
118
+ public void MessageBusProviderOptionOverridesBuilderDefault()
119
+ {
120
+ MessageBus providerBus = new MessageBus();
121
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions
122
+ {
123
+ MessageBusProvider = new PassthroughMessageBusProvider(providerBus),
124
+ };
125
+
126
+ using MessageRegistrationLease lease = _builder.Build(options);
127
+ Assert.AreSame(providerBus, lease.MessageBus);
128
+ }
129
+
130
+ [Test]
131
+ public void SyntheticOwnerGeneratedWhenOwnerMissing()
132
+ {
133
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions();
134
+ using MessageRegistrationLease lease = _builder.Build(options);
135
+ Assert.AreNotEqual(InstanceId.EmptyId, lease.Owner);
136
+ }
137
+
138
+ [Test]
139
+ public void HandlerStartsInactiveWhenConfigured()
140
+ {
141
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions
142
+ {
143
+ HandlerStartsActive = false,
144
+ };
145
+
146
+ using MessageRegistrationLease lease = _builder.Build(options);
147
+
148
+ Assert.IsFalse(lease.Handler.active);
149
+ lease.Activate();
150
+ Assert.IsTrue(lease.IsActive);
151
+ Assert.IsTrue(lease.Handler.active);
152
+ }
153
+
154
+ [Test]
155
+ public void DiagnosticsModeRespectedWhenEnabled()
156
+ {
157
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions
158
+ {
159
+ EnableDiagnostics = true,
160
+ Configure = token =>
161
+ {
162
+ _ = token.RegisterUntargeted<SimpleUntargetedMessage>(OnSimpleMessage);
163
+ },
164
+ };
165
+
166
+ using MessageRegistrationLease lease = _builder.Build(options);
167
+ Assert.IsTrue(
168
+ lease.Token.DiagnosticMode,
169
+ "Diagnostics flag should propagate to the token."
170
+ );
171
+ }
172
+
173
+ [Test]
174
+ public void DisposingActiveLeaseInvokesDeactivateLifecycle()
175
+ {
176
+ bool deactivateInvoked = false;
177
+ bool disposeInvoked = false;
178
+
179
+ MessageRegistrationBuildOptions options = new MessageRegistrationBuildOptions
180
+ {
181
+ ActivateOnBuild = true,
182
+ Lifecycle = new MessageRegistrationLifecycle(
183
+ null,
184
+ null,
185
+ token => deactivateInvoked = true,
186
+ token => disposeInvoked = true
187
+ ),
188
+ };
189
+
190
+ using (MessageRegistrationLease lease = _builder.Build(options))
191
+ {
192
+ // No-op
193
+ }
194
+
195
+ Assert.IsTrue(
196
+ deactivateInvoked,
197
+ "Disposing an active lease should trigger OnDeactivate before tear-down."
198
+ );
199
+ Assert.IsTrue(disposeInvoked, "Disposing a lease should trigger OnDispose callbacks.");
200
+ }
201
+
202
+ private static void OnSimpleMessage(ref SimpleUntargetedMessage message) { }
203
+ }
204
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: d58cfc67dec6f734dac4db4554d9fefa
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -7,8 +7,8 @@ namespace DxMessaging.Tests.Runtime.Core
7
7
  using System.Linq;
8
8
  using DxMessaging.Core;
9
9
  using DxMessaging.Core.MessageBus;
10
+ using DxMessaging.Unity;
10
11
  using NUnit.Framework;
11
- using Unity;
12
12
  using UnityEngine;
13
13
  using UnityEngine.TestTools;
14
14
  using Debug = UnityEngine.Debug;
@@ -43,7 +43,7 @@ namespace DxMessaging.Tests.Runtime.Core
43
43
  return;
44
44
  }
45
45
  };
46
- MessageBus messageBus = MessageHandler.MessageBus;
46
+ IMessageBus messageBus = MessageHandler.MessageBus;
47
47
  Assert.IsNotNull(messageBus);
48
48
  messageBus.Log.Enabled = true;
49
49
  _numRegistrations = 150;
@@ -53,7 +53,7 @@ namespace DxMessaging.Tests.Runtime.Core
53
53
 
54
54
  protected void LogMessageBusStatus()
55
55
  {
56
- MessageBus messageBus = MessageHandler.MessageBus;
56
+ IMessageBus messageBus = MessageHandler.MessageBus;
57
57
  Debug.Log(
58
58
  $"Untargeted registrations: {messageBus.RegisteredUntargeted}, "
59
59
  + $"targeted registrations: {messageBus.RegisteredTargeted}, "
@@ -177,7 +177,7 @@ namespace DxMessaging.Tests.Runtime.Core
177
177
 
178
178
  protected static IEnumerator WaitUntilMessageHandlerIsFresh()
179
179
  {
180
- MessageBus messageBus = MessageHandler.MessageBus;
180
+ IMessageBus messageBus = MessageHandler.MessageBus;
181
181
  Assert.IsNotNull(messageBus);
182
182
 
183
183
  Stopwatch timer = Stopwatch.StartNew();
@@ -265,7 +265,7 @@ namespace DxMessaging.Tests.Runtime.Core
265
265
  [UnityTest]
266
266
  public IEnumerator Lifetime()
267
267
  {
268
- MessageBus messageBus = MessageHandler.MessageBus;
268
+ IMessageBus messageBus = MessageHandler.MessageBus;
269
269
  Assert.IsNotNull(messageBus);
270
270
 
271
271
  GameObject test = new(nameof(Lifetime), typeof(SimpleMessageAwareComponent));
@@ -352,7 +352,7 @@ namespace DxMessaging.Tests.Runtime.Core
352
352
  [UnityTest]
353
353
  public IEnumerator NonMessagingObjects()
354
354
  {
355
- MessageBus messageBus = MessageHandler.MessageBus;
355
+ IMessageBus messageBus = MessageHandler.MessageBus;
356
356
  Assert.IsNotNull(messageBus);
357
357
 
358
358
  GameObject test1 = new("NonMessaging1");
@@ -168,7 +168,7 @@ namespace DxMessaging.Tests.Runtime.Core
168
168
  ShorthandTargetedBroadcastComponent comp =
169
169
  go.GetComponent<ShorthandTargetedBroadcastComponent>();
170
170
 
171
- MessageBus bus = MessageHandler.MessageBus;
171
+ IMessageBus bus = MessageHandler.MessageBus;
172
172
  bool cancel = true;
173
173
  Action dereg = bus.RegisterTargetedInterceptor(
174
174
  (ref InstanceId t, ref SimpleTargetedMessage m) => !cancel
@@ -203,7 +203,7 @@ namespace DxMessaging.Tests.Runtime.Core
203
203
  ShorthandTargetedBroadcastComponent comp =
204
204
  go.GetComponent<ShorthandTargetedBroadcastComponent>();
205
205
 
206
- MessageBus bus = MessageHandler.MessageBus;
206
+ IMessageBus bus = MessageHandler.MessageBus;
207
207
  bool cancel = true;
208
208
  Action dereg = bus.RegisterBroadcastInterceptor(
209
209
  (ref InstanceId s, ref SimpleBroadcastMessage m) => !cancel
@@ -43,7 +43,7 @@ namespace DxMessaging.Tests.Runtime.Core
43
43
  _spawned.Add(go);
44
44
  UntargetedReceiverComponent comp = go.GetComponent<UntargetedReceiverComponent>();
45
45
 
46
- MessageBus bus = MessageHandler.MessageBus;
46
+ IMessageBus bus = MessageHandler.MessageBus;
47
47
  bool cancel = true;
48
48
  Action dereg = bus.RegisterUntargetedInterceptor(
49
49
  (ref SimpleUntargetedMessage _) => !cancel
@@ -19,10 +19,8 @@ namespace DxMessaging.Tests.Runtime.Core
19
19
  MessageRegistrationToken token = MessageRegistrationToken.Create(handler, messageBus);
20
20
 
21
21
  int postProcessCount = 0;
22
- _ = token.RegisterUntargeted<SimpleUntargetedMessage>(
23
- (ref SimpleUntargetedMessage _) => { }
24
- );
25
- _ = token.RegisterUntargetedPostProcessor<SimpleUntargetedMessage>(
22
+ _ = token.RegisterUntargeted((ref SimpleUntargetedMessage _) => { });
23
+ _ = token.RegisterUntargetedPostProcessor(
26
24
  (ref SimpleUntargetedMessage _) => postProcessCount++,
27
25
  priority: 0
28
26
  );