com.wallstop-studios.dxmessaging 2.0.0 → 2.1.1

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 (183) 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 +91 -76
  14. package/Docs/Index.md +28 -25
  15. package/Docs/Install.md +29 -6
  16. package/Docs/Integrations/Reflex.md +292 -0
  17. package/{package-lock.json.meta → Docs/Integrations/Reflex.md.meta} +1 -1
  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/QuickStart.md +1 -2
  33. package/Docs/RuntimeConfiguration.md +407 -0
  34. package/Docs/RuntimeConfiguration.md.meta +7 -0
  35. package/Docs/UnityIntegration.md +3 -1
  36. package/Docs/VisualGuide.md +206 -157
  37. package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
  38. package/README.md +148 -26
  39. package/Runtime/AssemblyInfo.cs +4 -0
  40. package/Runtime/Core/Attributes/DxAutoConstructorAttribute.cs +1 -1
  41. package/Runtime/Core/Attributes/DxBroadcastMessageAttribute.cs +1 -1
  42. package/Runtime/Core/Attributes/DxOptionalParameterAttribute.cs +1 -1
  43. package/Runtime/Core/Attributes/DxTargetedMessageAttribute.cs +1 -1
  44. package/Runtime/Core/Attributes/DxUntargetedMessageAttribute.cs +1 -1
  45. package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
  46. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
  47. package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
  48. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
  49. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
  50. package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
  51. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
  52. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
  53. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
  54. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
  55. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
  56. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
  57. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
  58. package/Runtime/Core/MessageHandler.cs +198 -27
  59. package/Runtime/Core/MessageRegistrationToken.cs +67 -25
  60. package/Runtime/Core/Messages/IBroadcastMessage.cs +1 -1
  61. package/Runtime/Core/Messages/ITargetedMessage.cs +1 -1
  62. package/Runtime/Core/Messages/IUntargetedMessage.cs +1 -1
  63. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
  64. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
  65. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
  66. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
  67. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
  68. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
  69. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
  70. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
  71. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
  72. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
  73. package/Runtime/Unity/Integrations/Reflex.meta +8 -0
  74. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
  75. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
  76. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
  77. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
  78. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
  79. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
  80. package/Runtime/Unity/Integrations/VContainer.meta +8 -0
  81. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
  82. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
  83. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
  84. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
  85. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
  86. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
  87. package/Runtime/Unity/Integrations/Zenject.meta +8 -0
  88. package/Runtime/Unity/Integrations.meta +8 -0
  89. package/Runtime/Unity/MessageAwareComponent.cs +102 -0
  90. package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
  91. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
  92. package/Runtime/Unity/MessagingComponent.cs +175 -9
  93. package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
  94. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
  95. package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
  96. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
  97. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
  98. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
  99. package/Samples~/DI/Prefabs.meta +8 -0
  100. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
  101. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
  102. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
  103. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
  104. package/Samples~/DI/Providers.meta +8 -0
  105. package/Samples~/DI/README.md +51 -0
  106. package/Samples~/DI/README.md.meta +7 -0
  107. package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
  108. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
  109. package/Samples~/DI/Reflex.meta +8 -0
  110. package/Samples~/DI/VContainer/SampleLifetimeScope.cs +79 -0
  111. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
  112. package/Samples~/DI/VContainer.meta +8 -0
  113. package/Samples~/DI/Zenject/SampleInstaller.cs +65 -0
  114. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
  115. package/Samples~/DI/Zenject.meta +8 -0
  116. package/Samples~/DI.meta +8 -0
  117. package/Samples~/Mini Combat/README.md +5 -7
  118. package/Samples~/Mini Combat/Walkthrough.md +18 -24
  119. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
  120. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
  121. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
  122. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
  123. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
  124. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
  125. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
  126. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
  127. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
  128. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
  129. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
  130. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
  131. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
  132. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
  133. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
  134. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
  135. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
  136. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
  137. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
  138. package/Tests/Runtime/Core/Extensions.meta +8 -0
  139. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
  140. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
  141. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
  142. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
  143. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
  144. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
  145. package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
  146. package/Tests/Runtime/Core/NominalTests.cs +2 -2
  147. package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
  148. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
  149. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
  150. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
  151. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
  152. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
  153. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
  154. package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
  155. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
  156. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
  157. package/Tests/Runtime/Integrations/Reflex.meta +8 -0
  158. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
  159. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
  160. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
  161. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
  162. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  163. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
  164. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
  165. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
  166. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
  167. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  168. package/Tests/Runtime/Integrations.meta +8 -0
  169. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
  170. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
  171. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
  172. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
  173. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
  174. package/Tests/Runtime/TestUtilities.meta +9 -0
  175. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
  176. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
  177. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
  178. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
  179. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
  180. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
  181. package/Tests/Runtime/Unity.meta +9 -0
  182. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
  183. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  namespace DxMessaging.Tests.Runtime.Scripts.Components
2
2
  {
3
- using Unity;
3
+ using DxMessaging.Unity;
4
4
 
5
5
  public sealed class EmptyMessageAwareComponent : MessageAwareComponent
6
6
  {
@@ -1,7 +1,7 @@
1
1
  namespace DxMessaging.Tests.Runtime.Scripts.Components
2
2
  {
3
+ using DxMessaging.Unity;
3
4
  using Messages;
4
- using Unity;
5
5
  using UnityEngine;
6
6
 
7
7
  [DisallowMultipleComponent]
@@ -2,8 +2,8 @@ namespace DxMessaging.Tests.Runtime.Scripts.Components
2
2
  {
3
3
  using System;
4
4
  using DxMessaging.Core;
5
+ using DxMessaging.Unity;
5
6
  using Messages;
6
- using Unity;
7
7
 
8
8
  public sealed class SimpleMessageAwareComponent : MessageAwareComponent
9
9
  {
@@ -0,0 +1,64 @@
1
+ namespace DxMessaging.Tests.Runtime
2
+ {
3
+ using System;
4
+ using System.Collections.Generic;
5
+ using NUnit.Framework;
6
+
7
+ /// <summary>
8
+ /// Provides cleanup helpers for tests that instantiate Unity objects or disposable resources.
9
+ /// </summary>
10
+ public abstract class UnityFixtureBase
11
+ {
12
+ private readonly List<IDisposable> _disposables = new();
13
+ private readonly List<UnityEngine.Object> _unityObjects = new();
14
+
15
+ protected T Track<T>(T unityObject)
16
+ where T : UnityEngine.Object
17
+ {
18
+ if (unityObject != null)
19
+ {
20
+ _unityObjects.Add(unityObject);
21
+ }
22
+
23
+ return unityObject;
24
+ }
25
+
26
+ protected T TrackDisposable<T>(T disposable)
27
+ where T : IDisposable
28
+ {
29
+ if (disposable != null)
30
+ {
31
+ _disposables.Add(disposable);
32
+ }
33
+
34
+ return disposable;
35
+ }
36
+
37
+ [TearDown]
38
+ public virtual void TearDownManagedResources()
39
+ {
40
+ for (int i = _disposables.Count - 1; i >= 0; i--)
41
+ {
42
+ try
43
+ {
44
+ _disposables[i]?.Dispose();
45
+ }
46
+ catch
47
+ {
48
+ // Ignore teardown exceptions to avoid masking test failures.
49
+ }
50
+ }
51
+ _disposables.Clear();
52
+
53
+ for (int i = _unityObjects.Count - 1; i >= 0; i--)
54
+ {
55
+ UnityEngine.Object instance = _unityObjects[i];
56
+ if (instance != null)
57
+ {
58
+ UnityEngine.Object.DestroyImmediate(instance);
59
+ }
60
+ }
61
+ _unityObjects.Clear();
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,12 @@
1
+ fileFormatVersion: 2
2
+ guid: 0a72ca18f8f74b0c98aa87aee311e302
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
12
+
@@ -0,0 +1,9 @@
1
+ fileFormatVersion: 2
2
+ guid: 9e845c7a4bcb4d84b1be9b8fba64a2fc
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
9
+
@@ -0,0 +1,57 @@
1
+ namespace DxMessaging.Tests.Runtime.Unity
2
+ {
3
+ using DxMessaging.Core;
4
+ using DxMessaging.Core.MessageBus;
5
+ using DxMessaging.Tests.Runtime;
6
+ using DxMessaging.Unity;
7
+ using NUnit.Framework;
8
+ using UnityEngine;
9
+
10
+ [TestFixture]
11
+ public sealed class MessageBusProviderAssetTests : UnityFixtureBase
12
+ {
13
+ [Test]
14
+ public void GlobalProviderRespectsCurrentGlobalBus()
15
+ {
16
+ CurrentGlobalMessageBusProvider provider = Track(
17
+ ScriptableObject.CreateInstance<CurrentGlobalMessageBusProvider>()
18
+ );
19
+
20
+ MessageBus overrideBus = new();
21
+ using (MessageHandler.OverrideGlobalMessageBus(overrideBus))
22
+ {
23
+ IMessageBus resolved = provider.Resolve();
24
+ Assert.AreSame(
25
+ overrideBus,
26
+ resolved,
27
+ "Global provider should resolve the currently configured global bus."
28
+ );
29
+ }
30
+ }
31
+
32
+ [Test]
33
+ public void InitialProviderAlwaysReturnsStartupBus()
34
+ {
35
+ InitialGlobalMessageBusProvider provider = Track(
36
+ ScriptableObject.CreateInstance<InitialGlobalMessageBusProvider>()
37
+ );
38
+
39
+ IMessageBus startupBus = provider.Resolve();
40
+ Assert.AreSame(
41
+ MessageHandler.InitialGlobalMessageBus,
42
+ startupBus,
43
+ "Initial provider should resolve the startup global bus."
44
+ );
45
+
46
+ using (MessageHandler.OverrideGlobalMessageBus(new MessageBus()))
47
+ {
48
+ IMessageBus resolvedDuringOverride = provider.Resolve();
49
+ Assert.AreSame(
50
+ startupBus,
51
+ resolvedDuringOverride,
52
+ "Initial provider should ignore overrides and continue returning the startup bus."
53
+ );
54
+ }
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: db6736f08584483a8594e73a85b0df5e
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,107 @@
1
+ namespace DxMessaging.Tests.Runtime.Unity
2
+ {
3
+ using DxMessaging.Core.MessageBus;
4
+ using DxMessaging.Unity;
5
+ using NUnit.Framework;
6
+ using UnityEngine;
7
+
8
+ [TestFixture]
9
+ public sealed class MessageBusProviderHandleTests
10
+ {
11
+ [Test]
12
+ public void TryGetProviderReturnsRuntimeProvider()
13
+ {
14
+ TestMessageBusProvider runtimeProvider = new(new MessageBus());
15
+ MessageBusProviderHandle handle = MessageBusProviderHandle.FromProvider(
16
+ runtimeProvider
17
+ );
18
+
19
+ bool resolved = handle.TryGetProvider(out IMessageBusProvider provider);
20
+
21
+ Assert.IsTrue(resolved);
22
+ Assert.AreSame(runtimeProvider, provider);
23
+ }
24
+
25
+ [Test]
26
+ public void TryGetProviderReturnsAssetProvider()
27
+ {
28
+ TestScriptableMessageBusProvider providerAsset =
29
+ ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
30
+ providerAsset.Configure(new MessageBus());
31
+ MessageBusProviderHandle handle = new(providerAsset);
32
+
33
+ bool resolved = handle.TryGetProvider(out IMessageBusProvider provider);
34
+
35
+ Assert.IsTrue(resolved);
36
+ Assert.AreSame(providerAsset, provider);
37
+
38
+ Object.DestroyImmediate(providerAsset);
39
+ }
40
+
41
+ [Test]
42
+ public void ResolveBusReturnsNullWhenUnassigned()
43
+ {
44
+ MessageBusProviderHandle handle = MessageBusProviderHandle.Empty;
45
+
46
+ IMessageBus bus = handle.ResolveBus();
47
+
48
+ Assert.IsNull(bus);
49
+ }
50
+
51
+ [Test]
52
+ public void HandleSurvivesSerializationCycle()
53
+ {
54
+ TestScriptableMessageBusProvider providerAsset =
55
+ ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
56
+ providerAsset.Configure(new MessageBus());
57
+ MessageBusProviderHandle handle = new(providerAsset);
58
+
59
+ HandleWrapper wrapper = new() { Handle = handle };
60
+ string json = JsonUtility.ToJson(wrapper);
61
+ HandleWrapper deserialized = JsonUtility.FromJson<HandleWrapper>(json);
62
+
63
+ bool resolved = deserialized.Handle.TryGetProvider(out IMessageBusProvider provider);
64
+
65
+ Assert.IsTrue(resolved);
66
+ Assert.AreSame(providerAsset, provider);
67
+
68
+ Object.DestroyImmediate(providerAsset);
69
+ }
70
+
71
+ private sealed class TestMessageBusProvider : IMessageBusProvider
72
+ {
73
+ private readonly IMessageBus _bus;
74
+
75
+ public TestMessageBusProvider(IMessageBus bus)
76
+ {
77
+ _bus = bus;
78
+ }
79
+
80
+ public IMessageBus Resolve()
81
+ {
82
+ return _bus;
83
+ }
84
+ }
85
+
86
+ [System.Serializable]
87
+ private struct HandleWrapper
88
+ {
89
+ public MessageBusProviderHandle Handle;
90
+ }
91
+
92
+ private sealed class TestScriptableMessageBusProvider : ScriptableMessageBusProvider
93
+ {
94
+ private IMessageBus _bus;
95
+
96
+ public void Configure(IMessageBus bus)
97
+ {
98
+ _bus = bus;
99
+ }
100
+
101
+ public override IMessageBus Resolve()
102
+ {
103
+ return _bus;
104
+ }
105
+ }
106
+ }
107
+ }
@@ -0,0 +1,12 @@
1
+ fileFormatVersion: 2
2
+ guid: 1c3e71f6721de7248a3f1181217ecd69
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
12
+
@@ -0,0 +1,210 @@
1
+ namespace DxMessaging.Tests.Runtime.Unity
2
+ {
3
+ using System.Collections;
4
+ using System.Text.RegularExpressions;
5
+ using DxMessaging.Core;
6
+ using DxMessaging.Core.MessageBus;
7
+ using DxMessaging.Core.Messages;
8
+ using DxMessaging.Unity;
9
+ using NUnit.Framework;
10
+ using UnityEngine;
11
+ using UnityEngine.TestTools;
12
+
13
+ public sealed class MessagingComponentProviderIntegrationTests
14
+ {
15
+ [UnityTest]
16
+ public IEnumerator ConfigureWithProviderHandleRoutesThroughProviderBus()
17
+ {
18
+ MessageBus messageBus = new();
19
+ TestScriptableMessageBusProvider provider =
20
+ ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
21
+ provider.Configure(messageBus);
22
+ MessageBusProviderHandle handle = new(provider);
23
+
24
+ GameObject owner = new("MessagingComponentOwner");
25
+ MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
26
+ messagingComponent.Configure(handle, MessageBusRebindMode.RebindActive);
27
+
28
+ TestListener listener = owner.AddComponent<TestListener>();
29
+ listener.Initialize(messagingComponent);
30
+
31
+ yield return null;
32
+
33
+ TestUntargetedMessage message = new(42);
34
+ messageBus.UntargetedBroadcast(ref message);
35
+
36
+ Assert.AreEqual(1, listener.ReceivedCount);
37
+
38
+ Object.DestroyImmediate(owner);
39
+ Object.DestroyImmediate(provider);
40
+ }
41
+
42
+ [UnityTest]
43
+ public IEnumerator InstallerAppliesConfigurationToChildren()
44
+ {
45
+ MessageBus messageBus = new();
46
+ TestScriptableMessageBusProvider provider =
47
+ ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
48
+ provider.Configure(messageBus);
49
+ MessageBusProviderHandle handle = new(provider);
50
+
51
+ GameObject root = new("InstallerRoot");
52
+ MessagingComponentInstaller installer =
53
+ root.AddComponent<MessagingComponentInstaller>();
54
+ installer.SetProvider(handle);
55
+
56
+ GameObject child = new("InstallerListener");
57
+ child.transform.SetParent(root.transform);
58
+ MessagingComponent messagingComponent = child.AddComponent<MessagingComponent>();
59
+
60
+ installer.ApplyConfiguration();
61
+
62
+ TestListener listener = child.AddComponent<TestListener>();
63
+ listener.Initialize(messagingComponent);
64
+
65
+ yield return null;
66
+
67
+ TestUntargetedMessage message = new(19);
68
+ messageBus.UntargetedBroadcast(ref message);
69
+
70
+ Assert.AreEqual(1, listener.ReceivedCount);
71
+
72
+ Object.DestroyImmediate(root);
73
+ Object.DestroyImmediate(provider);
74
+ }
75
+
76
+ [UnityTest]
77
+ public IEnumerator CreateRegistrationBuilderUsesConfiguredProviderBus()
78
+ {
79
+ MessageBus messageBus = new();
80
+ TestProvider provider = new(messageBus);
81
+
82
+ GameObject owner = new("BuilderOwner");
83
+ MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
84
+ messagingComponent.Configure(provider, MessageBusRebindMode.RebindActive);
85
+
86
+ IMessageRegistrationBuilder builder = messagingComponent.CreateRegistrationBuilder();
87
+ using (
88
+ MessageRegistrationLease lease = builder.Build(
89
+ new MessageRegistrationBuildOptions()
90
+ )
91
+ )
92
+ {
93
+ Assert.AreSame(messageBus, lease.MessageBus);
94
+ Assert.IsFalse(lease.Token.Enabled);
95
+ }
96
+
97
+ Object.DestroyImmediate(owner);
98
+ yield break;
99
+ }
100
+
101
+ [UnityTest]
102
+ public IEnumerator CreateRegistrationBuilderUsesOverrideBusWhenNoProvider()
103
+ {
104
+ MessageBus messageBus = new();
105
+
106
+ GameObject owner = new("OverrideOwner");
107
+ MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
108
+ messagingComponent.Configure(messageBus, MessageBusRebindMode.RebindActive);
109
+
110
+ IMessageRegistrationBuilder builder = messagingComponent.CreateRegistrationBuilder();
111
+ using (
112
+ MessageRegistrationLease lease = builder.Build(
113
+ new MessageRegistrationBuildOptions()
114
+ )
115
+ )
116
+ {
117
+ Assert.AreSame(messageBus, lease.MessageBus);
118
+ }
119
+ Object.DestroyImmediate(owner);
120
+ yield break;
121
+ }
122
+
123
+ [UnityTest]
124
+ public IEnumerator InstallerWithoutConfigurationLogsWarning()
125
+ {
126
+ GameObject root = new("InstallerWarningRoot");
127
+ MessagingComponentInstaller installer =
128
+ root.AddComponent<MessagingComponentInstaller>();
129
+
130
+ GameObject child = new("InstallerWarningChild");
131
+ child.transform.SetParent(root.transform);
132
+ _ = child.AddComponent<MessagingComponent>();
133
+
134
+ LogAssert.Expect(
135
+ LogType.Warning,
136
+ new Regex(
137
+ "MessagingComponentInstaller.+has no provider or explicit message bus configured"
138
+ )
139
+ );
140
+
141
+ installer.ApplyConfiguration();
142
+ yield return null;
143
+
144
+ Object.DestroyImmediate(root);
145
+ }
146
+
147
+ private sealed class TestListener : MonoBehaviour
148
+ {
149
+ private MessageRegistrationToken _token;
150
+ public int ReceivedCount { get; private set; }
151
+
152
+ public void Initialize(MessagingComponent messagingComponent)
153
+ {
154
+ _token = messagingComponent.Create(this);
155
+ _ = _token.RegisterUntargeted<TestUntargetedMessage>(OnUntargetedMessage);
156
+ _token.Enable();
157
+ }
158
+
159
+ private void OnUntargetedMessage(ref TestUntargetedMessage message)
160
+ {
161
+ ReceivedCount++;
162
+ }
163
+
164
+ private void OnDestroy()
165
+ {
166
+ _token?.Disable();
167
+ }
168
+ }
169
+
170
+ private sealed class TestScriptableMessageBusProvider : ScriptableMessageBusProvider
171
+ {
172
+ private IMessageBus _bus;
173
+
174
+ public void Configure(IMessageBus bus)
175
+ {
176
+ _bus = bus;
177
+ }
178
+
179
+ public override IMessageBus Resolve()
180
+ {
181
+ return _bus;
182
+ }
183
+ }
184
+
185
+ private sealed class TestProvider : IMessageBusProvider
186
+ {
187
+ private readonly IMessageBus _messageBus;
188
+
189
+ public TestProvider(IMessageBus messageBus)
190
+ {
191
+ _messageBus = messageBus;
192
+ }
193
+
194
+ public IMessageBus Resolve()
195
+ {
196
+ return _messageBus;
197
+ }
198
+ }
199
+
200
+ private readonly struct TestUntargetedMessage : IUntargetedMessage
201
+ {
202
+ public TestUntargetedMessage(int value)
203
+ {
204
+ Value = value;
205
+ }
206
+
207
+ public int Value { get; }
208
+ }
209
+ }
210
+ }
@@ -0,0 +1,12 @@
1
+ fileFormatVersion: 2
2
+ guid: 4ced3de5b1a9c5c47a9c91f30d7f673a
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
12
+
@@ -0,0 +1,9 @@
1
+ fileFormatVersion: 2
2
+ guid: e1576d59050e4b7cbc1b55ce49963cf0
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
9
+
@@ -5,7 +5,9 @@
5
5
  "UnityEngine.TestRunner",
6
6
  "UnityEditor.TestRunner",
7
7
  "WallstopStudios.DxMessaging",
8
- "Unity.PerformanceTesting"
8
+ "WallstopStudios.DxMessaging.Reflex",
9
+ "WallstopStudios.DxMessaging.VContainer",
10
+ "WallstopStudios.DxMessaging.Zenject"
9
11
  ],
10
12
  "includePlatforms": [],
11
13
  "excludePlatforms": [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.dxmessaging",
3
- "version": "2.0.0",
3
+ "version": "2.1.1",
4
4
  "displayName": "DxMessaging",
5
5
  "description": "Synchronous Event Bus for Unity",
6
6
  "unity": "2021.3",