com.wallstop-studios.dxmessaging 2.0.0-rc27.3.1 → 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 (185) 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 +1352 -141
  10. package/Docs/Compatibility.md +27 -0
  11. package/Docs/DesignAndArchitecture.md +41 -34
  12. package/Docs/EmitShorthands.md +34 -0
  13. package/Docs/GettingStarted.md +84 -17
  14. package/Docs/Helpers.md +1 -1
  15. package/Docs/Index.md +28 -25
  16. package/Docs/Install.md +29 -6
  17. package/Docs/Integrations/Reflex.md +292 -0
  18. package/Docs/Integrations/Reflex.md.meta +7 -0
  19. package/Docs/Integrations/VContainer.md +324 -0
  20. package/Docs/Integrations/VContainer.md.meta +7 -0
  21. package/Docs/Integrations/Zenject.md +333 -0
  22. package/Docs/Integrations/Zenject.md.meta +7 -0
  23. package/{Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.pdb.meta → Docs/Integrations.meta} +2 -1
  24. package/Docs/InterceptorsAndOrdering.md +371 -17
  25. package/Docs/ListeningPatterns.md +206 -0
  26. package/Docs/MessageBusProviders.md +496 -0
  27. package/Docs/MessageBusProviders.md.meta +7 -0
  28. package/Docs/MessageTypes.md +27 -0
  29. package/Docs/MigrationGuide.md +45 -0
  30. package/Docs/Overview.md +114 -20
  31. package/Docs/Patterns.md +327 -2
  32. package/Docs/Performance.md +9 -9
  33. package/Docs/QuickReference.md +31 -0
  34. package/Docs/RuntimeConfiguration.md +407 -0
  35. package/Docs/RuntimeConfiguration.md.meta +7 -0
  36. package/Docs/UnityIntegration.md +3 -1
  37. package/Docs/VisualGuide.md +281 -167
  38. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  39. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +3 -3
  40. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
  41. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +2 -2
  42. package/Editor/Analyzers/System.Collections.Immutable.dll +0 -0
  43. package/Editor/Analyzers/System.Reflection.Metadata.dll +0 -0
  44. package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
  45. package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
  46. package/README.md +388 -67
  47. package/Runtime/AssemblyInfo.cs +4 -0
  48. package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
  49. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
  50. package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
  51. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
  52. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
  53. package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
  54. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
  55. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
  56. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
  57. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
  58. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
  59. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
  60. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
  61. package/Runtime/Core/MessageHandler.cs +198 -27
  62. package/Runtime/Core/MessageRegistrationToken.cs +67 -25
  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 +164 -2
  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 +81 -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 +67 -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 +86 -28
  118. package/Samples~/Mini Combat/Walkthrough.md +41 -25
  119. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
  120. package/Samples~/UI Buttons + Inspector/README.md +55 -12
  121. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
  122. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
  123. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
  124. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
  125. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
  126. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
  127. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
  128. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
  129. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
  130. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
  131. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
  132. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
  133. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
  134. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
  135. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
  136. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
  137. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
  138. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
  139. package/Tests/Runtime/Core/Extensions.meta +8 -0
  140. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
  141. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
  142. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
  143. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
  144. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
  145. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
  146. package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
  147. package/Tests/Runtime/Core/NominalTests.cs +2 -2
  148. package/Tests/Runtime/Core/SourceGeneratorNestedTests.cs +1 -1
  149. package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
  150. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
  151. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
  152. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
  153. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
  154. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
  155. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
  156. package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
  157. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
  158. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
  159. package/Tests/Runtime/Integrations/Reflex.meta +8 -0
  160. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
  161. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
  162. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
  163. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
  164. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  165. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
  166. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
  167. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
  168. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
  169. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  170. package/Tests/Runtime/Integrations.meta +8 -0
  171. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
  172. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
  173. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
  174. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
  175. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
  176. package/Tests/Runtime/TestUtilities.meta +9 -0
  177. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
  178. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
  179. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
  180. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
  181. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
  182. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
  183. package/Tests/Runtime/Unity.meta +9 -0
  184. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
  185. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ namespace DxMessaging.Tests.Runtime.Reflex
2
+ {
3
+ #if REFLEX_PRESENT
4
+ using DxMessaging.Core;
5
+ using DxMessaging.Core.Extensions;
6
+ using DxMessaging.Core.MessageBus;
7
+ using DxMessaging.Tests.Runtime;
8
+ using DxMessaging.Tests.Runtime.Scripts.Messages;
9
+ using DxMessaging.Unity;
10
+ using DxMessaging.Unity.Integrations.Reflex;
11
+ using global::Reflex.Core;
12
+ using global::Reflex.Injectors;
13
+ using NUnit.Framework;
14
+ using UnityEngine;
15
+
16
+ public sealed class ReflexIntegrationTests : UnityFixtureBase
17
+ {
18
+ [Test]
19
+ public void InstallerRegistersMessageBusAndConfiguratorAppliesIt()
20
+ {
21
+ ContainerBuilder builder = new();
22
+ DxMessagingInstaller installer = new();
23
+ installer.InstallBindings(builder);
24
+
25
+ Container container = TrackDisposable(builder.Build());
26
+ IMessageBus bus = container.Resolve<IMessageBus>();
27
+ Assert.NotNull(bus, "Reflex installer should bind IMessageBus.");
28
+
29
+ GameObject go = Track(
30
+ new GameObject(
31
+ nameof(InstallerRegistersMessageBusAndConfiguratorAppliesIt),
32
+ typeof(MessagingComponent),
33
+ typeof(ReflexConfiguredListener)
34
+ )
35
+ );
36
+
37
+ ReflexConfiguredListener listener = go.GetComponent<ReflexConfiguredListener>();
38
+ AttributeInjector.Inject(listener, container);
39
+ listener.Initialize(bus);
40
+
41
+ SimpleUntargetedMessage message = new();
42
+ message.EmitUntargeted(bus);
43
+
44
+ Assert.AreEqual(
45
+ 1,
46
+ listener.ReceivedCount,
47
+ "Listener should observe messages emitted through the Reflex container's bus."
48
+ );
49
+ }
50
+
51
+ [Test]
52
+ public void RegistrationInstallerBindsBuilderAgainstContainerBus()
53
+ {
54
+ ContainerBuilder builder = new();
55
+ DxMessagingInstaller coreInstaller = new();
56
+ coreInstaller.InstallBindings(builder);
57
+
58
+ builder.AddSingleton(
59
+ typeof(StaticMessageBusProvider),
60
+ typeof(StaticMessageBusProvider),
61
+ typeof(IMessageBusProvider)
62
+ );
63
+
64
+ DxMessagingRegistrationInstaller registrationInstaller = new();
65
+ registrationInstaller.InstallBindings(builder);
66
+
67
+ Container container = TrackDisposable(builder.Build());
68
+
69
+ StaticMessageBusProvider provider = container.Resolve<StaticMessageBusProvider>();
70
+
71
+ IMessageRegistrationBuilder registrationBuilder =
72
+ container.Resolve<IMessageRegistrationBuilder>();
73
+ using MessageRegistrationLease lease = registrationBuilder.Build(
74
+ new MessageRegistrationBuildOptions()
75
+ );
76
+
77
+ Assert.AreSame(
78
+ provider.Bus,
79
+ lease.MessageBus,
80
+ "Reflex registration installer should prefer the registered IMessageBusProvider."
81
+ );
82
+ }
83
+
84
+ [Test]
85
+ public void RegistrationInstallerExposesConcreteBuilder()
86
+ {
87
+ ContainerBuilder builder = new();
88
+ DxMessagingInstaller coreInstaller = new();
89
+ coreInstaller.InstallBindings(builder);
90
+
91
+ DxMessagingRegistrationInstaller registrationInstaller = new();
92
+ registrationInstaller.InstallBindings(builder);
93
+
94
+ Container container = TrackDisposable(builder.Build());
95
+
96
+ var concrete =
97
+ container.Resolve<DxMessagingRegistrationInstaller.ContainerMessageRegistrationBuilder>();
98
+ Assert.IsNotNull(
99
+ concrete,
100
+ "Container should resolve the concrete registration builder type."
101
+ );
102
+
103
+ IMessageRegistrationBuilder builderInterface =
104
+ container.Resolve<IMessageRegistrationBuilder>();
105
+ Assert.IsTrue(
106
+ ReferenceEquals(concrete, builderInterface),
107
+ "Container should return the same instance for concrete and interface resolutions."
108
+ );
109
+ }
110
+
111
+ private sealed class DxMessagingInstaller : IInstaller
112
+ {
113
+ public void InstallBindings(ContainerBuilder containerBuilder)
114
+ {
115
+ containerBuilder.AddSingleton(
116
+ typeof(MessageBus),
117
+ typeof(MessageBus),
118
+ typeof(IMessageBus)
119
+ );
120
+ }
121
+ }
122
+
123
+ private sealed class ReflexConfiguredListener : MonoBehaviour
124
+ {
125
+ private IMessageBus _messageBus;
126
+ private MessageRegistrationToken _token;
127
+
128
+ internal int ReceivedCount { get; private set; }
129
+
130
+ internal void Initialize(IMessageBus messageBus)
131
+ {
132
+ _messageBus = messageBus;
133
+ MessagingComponent messagingComponent = GetComponent<MessagingComponent>();
134
+ messagingComponent.Configure(_messageBus, MessageBusRebindMode.RebindActive);
135
+
136
+ _token = messagingComponent.Create(this);
137
+ _ = _token.RegisterUntargeted<SimpleUntargetedMessage>(_ => ++ReceivedCount);
138
+ _token.Enable();
139
+ }
140
+
141
+ private void OnDestroy()
142
+ {
143
+ _token?.Disable();
144
+ _token = null;
145
+ _messageBus = null;
146
+ }
147
+ }
148
+
149
+ private sealed class StaticMessageBusProvider : IMessageBusProvider
150
+ {
151
+ private readonly IMessageBus _bus = new MessageBus();
152
+
153
+ public IMessageBus Bus => _bus;
154
+
155
+ public IMessageBus Resolve()
156
+ {
157
+ return _bus;
158
+ }
159
+ }
160
+ }
161
+ #endif
162
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: fb6234c6b35e0514ab3d9a3d718363bb
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,16 @@
1
+ %YAML 1.1
2
+ %TAG !u! tag:unity3d.com,2011:
3
+ --- !u!114 &11400000
4
+ MonoBehaviour:
5
+ m_ObjectHideFlags: 0
6
+ m_CorrespondingSourceObject: {fileID: 0}
7
+ m_PrefabInstance: {fileID: 0}
8
+ m_PrefabAsset: {fileID: 0}
9
+ m_GameObject: {fileID: 0}
10
+ m_Enabled: 1
11
+ m_EditorHideFlags: 0
12
+ m_Script: {fileID: 11500000, guid: f50e4916e4924f2788a73057a16764c0, type: 3}
13
+ m_Name: ReflexSettings
14
+ m_EditorClassIdentifier:
15
+ <LogLevel>k__BackingField: 0
16
+ <ProjectScopes>k__BackingField: []
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 30c811c802a94b5da26f5961a509179b
3
+ NativeFormatImporter:
4
+ externalObjects: {}
5
+ mainObjectFileID: 11400000
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 5d1779047c8d408693a711f35e4b7812
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.Tests.Runtime.Reflex",
3
+ "rootNamespace": "DxMessaging.Tests.Runtime.Reflex",
4
+ "references": [
5
+ "UnityEngine.TestRunner",
6
+ "UnityEditor.TestRunner",
7
+ "WallstopStudios.DxMessaging",
8
+ "WallstopStudios.DxMessaging.Tests.Runtime",
9
+ "Reflex",
10
+ "WallstopStudios.DxMessaging.Reflex"
11
+ ],
12
+ "includePlatforms": [],
13
+ "excludePlatforms": [],
14
+ "allowUnsafeCode": false,
15
+ "overrideReferences": true,
16
+ "precompiledReferences": ["nunit.framework.dll"],
17
+ "autoReferenced": true,
18
+ "defineConstraints": ["UNITY_INCLUDE_TESTS", "REFLEX_PRESENT"],
19
+ "versionDefines": [
20
+ {
21
+ "name": "com.gustavopsantos.reflex",
22
+ "expression": "0.0.1",
23
+ "define": "REFLEX_PRESENT"
24
+ }
25
+ ],
26
+ "noEngineReferences": false
27
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: cc7a6eb5360b4f5c896d3b54cfc07738
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 9326a2dd5b2745bcaef12640add3525a
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,140 @@
1
+ namespace DxMessaging.Tests.Runtime.VContainer
2
+ {
3
+ #if VCONTAINER_PRESENT
4
+ using System;
5
+ using DxMessaging.Core;
6
+ using DxMessaging.Core.Extensions;
7
+ using DxMessaging.Core.MessageBus;
8
+ using DxMessaging.Tests.Runtime;
9
+ using DxMessaging.Tests.Runtime.Scripts.Messages;
10
+ using DxMessaging.Unity;
11
+ using DxMessaging.Unity.Integrations.VContainer;
12
+ using global::VContainer;
13
+ using global::VContainer.Unity;
14
+ using NUnit.Framework;
15
+ using UnityEngine;
16
+
17
+ public sealed class VContainerIntegrationTests : UnityFixtureBase
18
+ {
19
+ [Test]
20
+ public void ContainerInjectsMessagingComponentWithCustomBus()
21
+ {
22
+ ContainerBuilder builder = new();
23
+ builder.Register<MessageBus>(Lifetime.Singleton).As<IMessageBus>();
24
+
25
+ IObjectResolver resolver = TrackDisposable(builder.Build());
26
+ IMessageBus bus = resolver.Resolve<IMessageBus>();
27
+ Assert.NotNull(bus);
28
+
29
+ GameObject go = Track(
30
+ new GameObject(
31
+ nameof(ContainerInjectsMessagingComponentWithCustomBus),
32
+ typeof(MessagingComponent),
33
+ typeof(VContainerConfiguredListener)
34
+ )
35
+ );
36
+
37
+ resolver.InjectGameObject(go);
38
+ VContainerConfiguredListener listener = go.GetComponent<VContainerConfiguredListener>();
39
+ listener.Initialize(bus);
40
+
41
+ SimpleUntargetedMessage message = new();
42
+ message.EmitUntargeted(bus);
43
+
44
+ Assert.AreEqual(
45
+ 1,
46
+ listener.ReceivedCount,
47
+ "Listener should receive messages emitted via the VContainer-resolved bus."
48
+ );
49
+ }
50
+
51
+ [Test]
52
+ public void RegistrationExtensionsExposeBuilder()
53
+ {
54
+ ContainerBuilder builder = new();
55
+ builder.Register<MessageBus>(Lifetime.Singleton).As<IMessageBus>();
56
+ builder.RegisterMessageRegistrationBuilder();
57
+
58
+ IObjectResolver resolver = TrackDisposable(builder.Build());
59
+ IMessageRegistrationBuilder registrationBuilder =
60
+ resolver.Resolve<IMessageRegistrationBuilder>();
61
+ using MessageRegistrationLease lease = registrationBuilder.Build(
62
+ new MessageRegistrationBuildOptions()
63
+ );
64
+
65
+ Assert.AreSame(
66
+ resolver.Resolve<IMessageBus>(),
67
+ lease.MessageBus,
68
+ "Registration extension should resolve a builder backed by the container bus."
69
+ );
70
+ }
71
+
72
+ [Test]
73
+ public void RegistrationExtensionsPreferResolvedProvider()
74
+ {
75
+ ContainerBuilder builder = new();
76
+ builder.Register<MessageBus>(Lifetime.Singleton).As<IMessageBus>();
77
+
78
+ MessageBus providerBus = new MessageBus();
79
+ builder
80
+ .RegisterInstance<IMessageBusProvider>(new StaticMessageBusProvider(providerBus))
81
+ .As<IMessageBusProvider>();
82
+ builder.RegisterMessageRegistrationBuilder();
83
+
84
+ IObjectResolver resolver = TrackDisposable(builder.Build());
85
+ IMessageRegistrationBuilder registrationBuilder =
86
+ resolver.Resolve<IMessageRegistrationBuilder>();
87
+ using MessageRegistrationLease lease = registrationBuilder.Build(
88
+ new MessageRegistrationBuildOptions()
89
+ );
90
+
91
+ Assert.AreSame(
92
+ providerBus,
93
+ lease.MessageBus,
94
+ "Registration extensions should prefer an explicitly registered IMessageBusProvider."
95
+ );
96
+ }
97
+
98
+ private sealed class VContainerConfiguredListener : MonoBehaviour, IDisposable
99
+ {
100
+ private IMessageBus _messageBus;
101
+ private MessageRegistrationToken _token;
102
+
103
+ internal int ReceivedCount { get; private set; }
104
+
105
+ internal void Initialize(IMessageBus messageBus)
106
+ {
107
+ _messageBus = messageBus;
108
+ MessagingComponent messagingComponent = GetComponent<MessagingComponent>();
109
+ messagingComponent.Configure(_messageBus, MessageBusRebindMode.RebindActive);
110
+
111
+ _token = messagingComponent.Create(this);
112
+ _ = _token.RegisterUntargeted<SimpleUntargetedMessage>(_ => ++ReceivedCount);
113
+ _token.Enable();
114
+ }
115
+
116
+ public void Dispose()
117
+ {
118
+ _token?.Disable();
119
+ _token = null;
120
+ _messageBus = null;
121
+ }
122
+ }
123
+
124
+ private sealed class StaticMessageBusProvider : IMessageBusProvider
125
+ {
126
+ private readonly IMessageBus _bus;
127
+
128
+ public StaticMessageBusProvider(IMessageBus bus)
129
+ {
130
+ _bus = bus;
131
+ }
132
+
133
+ public IMessageBus Resolve()
134
+ {
135
+ return _bus;
136
+ }
137
+ }
138
+ }
139
+ #endif
140
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 8760e4ffd88dc2f40b809d0b9b60a01f
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,37 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.Tests.Runtime.VContainer",
3
+ "rootNamespace": "DxMessaging.Tests.Runtime.VContainer",
4
+ "references": [
5
+ "UnityEngine.TestRunner",
6
+ "UnityEditor.TestRunner",
7
+ "WallstopStudios.DxMessaging",
8
+ "WallstopStudios.DxMessaging.Tests.Runtime",
9
+ "VContainer",
10
+ "WallstopStudios.DxMessaging.VContainer"
11
+ ],
12
+ "includePlatforms": [],
13
+ "excludePlatforms": [],
14
+ "allowUnsafeCode": false,
15
+ "overrideReferences": true,
16
+ "precompiledReferences": ["nunit.framework.dll"],
17
+ "autoReferenced": true,
18
+ "defineConstraints": ["UNITY_INCLUDE_TESTS", "VCONTAINER_PRESENT"],
19
+ "versionDefines": [
20
+ {
21
+ "name": "jp.cysharp.vcontainer",
22
+ "expression": "0.0.1",
23
+ "define": "VCONTAINER_PRESENT"
24
+ },
25
+ {
26
+ "name": "jp.hadashikick.vcontainer",
27
+ "expression": "0.0.1",
28
+ "define": "VCONTAINER_PRESENT"
29
+ },
30
+ {
31
+ "name": "VContainer",
32
+ "expression": "0.0.1",
33
+ "define": "VCONTAINER_PRESENT"
34
+ }
35
+ ],
36
+ "noEngineReferences": false
37
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 5f7445560b0b4cbd9209d399362c2cb1
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 6ec0c3c7cce7411da18c57b6e1f998c7
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.Tests.Runtime.Zenject",
3
+ "rootNamespace": "DxMessaging.Tests.Runtime.Zenject",
4
+ "references": [
5
+ "UnityEngine.TestRunner",
6
+ "UnityEditor.TestRunner",
7
+ "WallstopStudios.DxMessaging",
8
+ "WallstopStudios.DxMessaging.Tests.Runtime",
9
+ "Zenject",
10
+ "WallstopStudios.DxMessaging.Zenject"
11
+ ],
12
+ "includePlatforms": [],
13
+ "excludePlatforms": [],
14
+ "allowUnsafeCode": false,
15
+ "overrideReferences": true,
16
+ "precompiledReferences": ["nunit.framework.dll"],
17
+ "autoReferenced": true,
18
+ "defineConstraints": ["UNITY_INCLUDE_TESTS", "ZENJECT_PRESENT"],
19
+ "versionDefines": [
20
+ {
21
+ "name": "com.extenject.zenject",
22
+ "expression": "0.0.1",
23
+ "define": "ZENJECT_PRESENT"
24
+ },
25
+ {
26
+ "name": "com.modesttree.zenject",
27
+ "expression": "0.0.1",
28
+ "define": "ZENJECT_PRESENT"
29
+ },
30
+ {
31
+ "name": "com.svermeulen.extenject",
32
+ "expression": "0.0.1",
33
+ "define": "ZENJECT_PRESENT"
34
+ }
35
+ ],
36
+ "noEngineReferences": false
37
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 9f1b23c34d3045cc9b15e0985e52c2bf
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,140 @@
1
+ namespace DxMessaging.Tests.Runtime.Zenject
2
+ {
3
+ #if ZENJECT_PRESENT
4
+ using DxMessaging.Core;
5
+ using System.Reflection;
6
+ using DxMessaging.Core.Extensions;
7
+ using DxMessaging.Core.MessageBus;
8
+ using DxMessaging.Tests.Runtime;
9
+ using DxMessaging.Tests.Runtime.Scripts.Messages;
10
+ using DxMessaging.Unity;
11
+ using DxMessaging.Unity.Integrations.Zenject;
12
+ using global::Zenject;
13
+ using NUnit.Framework;
14
+ using UnityEngine;
15
+
16
+ public sealed class ZenjectIntegrationTests : UnityFixtureBase
17
+ {
18
+ [Test]
19
+ public void InstallerBindsMessageBusAndConfiguratorAppliesIt()
20
+ {
21
+ DiContainer container = new();
22
+ container.BindInterfacesAndSelfTo<MessageBus>().AsSingle();
23
+
24
+ IMessageBus resolvedBus = container.Resolve<IMessageBus>();
25
+ Assert.IsNotNull(resolvedBus, "Zenject installer should bind IMessageBus.");
26
+
27
+ GameObject go = Track(
28
+ new GameObject(
29
+ nameof(InstallerBindsMessageBusAndConfiguratorAppliesIt),
30
+ typeof(MessagingComponent),
31
+ typeof(ZenjectConfiguredListener)
32
+ )
33
+ );
34
+
35
+ ZenjectConfiguredListener listener = go.GetComponent<ZenjectConfiguredListener>();
36
+ listener.Initialize(resolvedBus);
37
+
38
+ SimpleUntargetedMessage message = new();
39
+ message.EmitUntargeted(resolvedBus);
40
+
41
+ Assert.AreEqual(
42
+ 1,
43
+ listener.ReceivedCount,
44
+ "Listener should observe messages emitted through the container-provided bus."
45
+ );
46
+ }
47
+
48
+ [Test]
49
+ public void RegistrationInstallerProvidesBuilderBoundToContainerBus()
50
+ {
51
+ DiContainer container = new();
52
+ container.BindInterfacesAndSelfTo<MessageBus>().AsSingle();
53
+
54
+ DxMessagingRegistrationInstaller installer = new DxMessagingRegistrationInstaller();
55
+ installer.RunInstallBindings(container);
56
+
57
+ IMessageRegistrationBuilder registrationBuilder =
58
+ container.Resolve<IMessageRegistrationBuilder>();
59
+ Assert.NotNull(registrationBuilder);
60
+
61
+ using MessageRegistrationLease lease = registrationBuilder.Build(
62
+ new MessageRegistrationBuildOptions()
63
+ );
64
+ Assert.AreSame(
65
+ container.Resolve<IMessageBus>(),
66
+ lease.MessageBus,
67
+ "Builder resolved by the installer should default to the container-provided bus."
68
+ );
69
+ }
70
+
71
+ [Test]
72
+ public void RegistrationInstallerPrefersBoundProvider()
73
+ {
74
+ DiContainer container = new();
75
+ MessageBus providerBus = new();
76
+ container
77
+ .Bind<IMessageBusProvider>()
78
+ .FromInstance(new FixedMessageBusProvider(providerBus))
79
+ .AsSingle();
80
+ container.BindInterfacesAndSelfTo<MessageBus>().AsSingle();
81
+
82
+ DxMessagingRegistrationInstaller installer = new DxMessagingRegistrationInstaller();
83
+ installer.RunInstallBindings(container);
84
+
85
+ IMessageRegistrationBuilder registrationBuilder =
86
+ container.Resolve<IMessageRegistrationBuilder>();
87
+ using MessageRegistrationLease lease = registrationBuilder.Build(
88
+ new MessageRegistrationBuildOptions()
89
+ );
90
+
91
+ Assert.AreSame(
92
+ providerBus,
93
+ lease.MessageBus,
94
+ "Builder should prefer the container-provided IMessageBusProvider when available."
95
+ );
96
+ }
97
+
98
+ private sealed class ZenjectConfiguredListener : MonoBehaviour
99
+ {
100
+ private IMessageBus _messageBus;
101
+ private MessageRegistrationToken _token;
102
+
103
+ internal int ReceivedCount { get; private set; }
104
+
105
+ internal void Initialize(IMessageBus messageBus)
106
+ {
107
+ _messageBus = messageBus;
108
+ MessagingComponent messagingComponent = GetComponent<MessagingComponent>();
109
+ messagingComponent.Configure(_messageBus, MessageBusRebindMode.RebindActive);
110
+
111
+ _token = messagingComponent.Create(this);
112
+ _ = _token.RegisterUntargeted<SimpleUntargetedMessage>(_ => ++ReceivedCount);
113
+ _token.Enable();
114
+ }
115
+
116
+ private void OnDestroy()
117
+ {
118
+ _token?.Disable();
119
+ _token = null;
120
+ _messageBus = null;
121
+ }
122
+ }
123
+
124
+ private sealed class FixedMessageBusProvider : IMessageBusProvider
125
+ {
126
+ private readonly IMessageBus _bus;
127
+
128
+ public FixedMessageBusProvider(IMessageBus bus)
129
+ {
130
+ _bus = bus;
131
+ }
132
+
133
+ public IMessageBus Resolve()
134
+ {
135
+ return _bus;
136
+ }
137
+ }
138
+ }
139
+ #endif
140
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 704b5cc1be728b0448acd22be9e255ef
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,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 3b182b8e1e904128a628c9a4c53d3db1
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 68dfb5c77c6e4d35a3ffca90d6be9f6d
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant: