com.wallstop-studios.dxmessaging 2.1.1 → 2.1.3

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 (158) hide show
  1. package/.github/workflows/dotnet-tests.yml +72 -0
  2. package/.lychee.toml +4 -2
  3. package/AGENTS.md +13 -12
  4. package/Docs/Comparisons.md +5 -5
  5. package/Docs/Install.md +2 -1
  6. package/Docs/InterceptorsAndOrdering.md +1 -1
  7. package/Docs/Performance.md +15 -13
  8. package/Docs/QuickReference.md +1 -1
  9. package/Docs/Reference.md +5 -5
  10. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  11. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +13 -2
  12. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
  13. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +11 -0
  14. package/Editor/Analyzers/System.Collections.Immutable.dll +0 -0
  15. package/Editor/Analyzers/System.Collections.Immutable.dll.meta +11 -0
  16. package/Editor/Analyzers/System.Reflection.Metadata.dll +0 -0
  17. package/Editor/Analyzers/System.Reflection.Metadata.dll.meta +13 -2
  18. package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
  19. package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll.meta +11 -0
  20. package/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll +0 -0
  21. package/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll.meta +3 -2
  22. package/Editor/AssemblyInfo.cs +3 -0
  23. package/Editor/AssemblyInfo.cs.meta +3 -0
  24. package/Editor/CustomEditors/MessagingComponentEditor.cs +24 -0
  25. package/Editor/DxMessagingEditorInitializer.cs +58 -1
  26. package/Editor/DxMessagingMenu.cs +38 -0
  27. package/Editor/DxMessagingMenu.cs.meta +11 -0
  28. package/Editor/DxMessagingSceneBuildProcessor.cs +81 -0
  29. package/Editor/DxMessagingSceneBuildProcessor.cs.meta +11 -0
  30. package/Editor/Settings/DxMessagingSettings.cs +37 -6
  31. package/Editor/Settings/DxMessagingSettingsProvider.cs +45 -7
  32. package/Editor/SetupCscRsp.cs +133 -53
  33. package/Editor/Testing/MessagingComponentEditorHarness.cs +218 -0
  34. package/Editor/Testing/MessagingComponentEditorHarness.cs.meta +3 -0
  35. package/Editor/Testing.meta +3 -0
  36. package/README.md +10 -4
  37. package/Runtime/AssemblyInfo.cs +1 -0
  38. package/Runtime/Core/Attributes/DxOptionalParameterAttribute.cs +52 -0
  39. package/Runtime/Core/DataStructure/CyclicBuffer.cs +16 -0
  40. package/Runtime/Core/Diagnostics/MessageEmissionData.cs +27 -12
  41. package/Runtime/Core/Diagnostics/MessageRegistrationType.cs +62 -0
  42. package/Runtime/Core/DxMessagingStaticState.cs +108 -0
  43. package/Runtime/Core/DxMessagingStaticState.cs.meta +11 -0
  44. package/Runtime/Core/Extensions/IListExtensions.cs +24 -0
  45. package/Runtime/Core/Extensions/MessageBusExtensions.cs +144 -2
  46. package/Runtime/Core/Extensions/MessageExtensions.cs +2 -2
  47. package/Runtime/Core/Helper/MessageCache.cs +16 -0
  48. package/Runtime/Core/Helper/MessageHelperIndexer.cs +77 -0
  49. package/Runtime/Core/InstanceId.cs +91 -3
  50. package/Runtime/Core/MessageBus/DiagnosticsTarget.cs +31 -0
  51. package/Runtime/Core/MessageBus/DiagnosticsTarget.cs.meta +11 -0
  52. package/Runtime/Core/MessageBus/IMessageBus.cs +44 -16
  53. package/Runtime/Core/MessageBus/MessageBus.cs +96 -25
  54. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +46 -2
  55. package/Runtime/Core/MessageBus/MessagingRegistration.cs +63 -5
  56. package/Runtime/Core/MessageBus/RegistrationLog.cs +10 -0
  57. package/Runtime/Core/MessageHandler.cs +141 -8
  58. package/Runtime/Core/MessageRegistrationHandle.cs +59 -0
  59. package/Runtime/Core/MessageRegistrationToken.cs +20 -4
  60. package/Runtime/Core/Messages/ReflexiveMessage.cs +38 -0
  61. package/Runtime/Core/MessagingDebug.cs +16 -1
  62. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +6 -0
  63. package/Runtime/Unity/DxMessagingRuntimeInitializer.cs +19 -0
  64. package/Runtime/Unity/DxMessagingRuntimeInitializer.cs.meta +11 -0
  65. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +6 -0
  66. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +19 -0
  67. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +10 -0
  68. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +14 -0
  69. package/Runtime/Unity/MessageAwareComponent.cs +2 -0
  70. package/Runtime/Unity/MessageBusProviderHandle.cs +4 -0
  71. package/Runtime/Unity/MessagingComponent.cs +109 -0
  72. package/Runtime/Unity/MessagingComponentInstaller.cs +2 -0
  73. package/Runtime/Unity/ScriptableMessageBusProvider.cs +2 -0
  74. package/Samples~/DI/README.md +13 -13
  75. package/Samples~/Mini Combat/README.md +15 -15
  76. package/Samples~/Mini Combat/Walkthrough.md +12 -12
  77. package/Samples~/UI Buttons + Inspector/README.md +4 -4
  78. package/SourceGenerators/Directory.Build.props +9 -0
  79. package/{Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj.meta → SourceGenerators/Directory.Build.props.meta} +1 -1
  80. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxAutoConstructorGenerator.cs +23 -24
  81. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxMessageIdGenerator.cs +91 -27
  82. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj +24 -4
  83. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DocsSnippetCompilationTests.cs +193 -0
  84. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DocsSnippetCompilationTests.cs.meta +11 -0
  85. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxAutoConstructorGeneratorDiagnosticsTests.cs +69 -0
  86. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxAutoConstructorGeneratorDiagnosticsTests.cs.meta +11 -0
  87. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxMessageIdGeneratorDiagnosticsTests.cs +66 -0
  88. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxMessageIdGeneratorDiagnosticsTests.cs.meta +11 -0
  89. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/GeneratorTestUtilities.cs +155 -0
  90. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/GeneratorTestUtilities.cs.meta +11 -0
  91. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj +20 -0
  92. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.meta +7 -0
  93. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests.meta +8 -0
  94. package/Tests/Editor/MessagingComponentEditorHarnessTests.cs +243 -0
  95. package/Tests/Editor/MessagingComponentEditorHarnessTests.cs.meta +3 -0
  96. package/Tests/Editor/MessagingComponentSerializationTests.cs +129 -0
  97. package/Tests/Editor/MessagingComponentSerializationTests.cs.meta +3 -0
  98. package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef +19 -0
  99. package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef.meta +3 -0
  100. package/Tests/Editor.meta +3 -0
  101. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +3 -0
  102. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +3 -0
  103. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +3 -0
  104. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +137 -0
  105. package/Tests/Runtime/Core/AlternateBusTests.cs +3 -0
  106. package/Tests/Runtime/Core/BroadcastTests.cs +3 -0
  107. package/Tests/Runtime/Core/CyclicBufferTests.cs +3 -0
  108. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +5 -2
  109. package/Tests/Runtime/Core/DiagnosticsTests.cs +6 -3
  110. package/Tests/Runtime/Core/DxMessagingStaticStateTests.cs +69 -0
  111. package/Tests/Runtime/Core/DxMessagingStaticStateTests.cs.meta +11 -0
  112. package/Tests/Runtime/Core/EdgeCaseTests.cs +3 -0
  113. package/Tests/Runtime/Core/EnablementTests.cs +3 -0
  114. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +2 -2
  115. package/Tests/Runtime/Core/GenericMessageTests.cs +3 -0
  116. package/Tests/Runtime/Core/GlobalAcceptAllTests.cs +3 -0
  117. package/Tests/Runtime/Core/InterceptorCancellationTests.cs +3 -0
  118. package/Tests/Runtime/Core/LifecycleTests.cs +3 -0
  119. package/Tests/Runtime/Core/MessageEmissionDataTests.cs +70 -0
  120. package/Tests/Runtime/Core/MessageEmissionDataTests.cs.meta +11 -0
  121. package/Tests/Runtime/Core/MessagingComponentLifecycleTests.cs +3 -0
  122. package/Tests/Runtime/Core/MessagingTestBase.cs +3 -0
  123. package/Tests/Runtime/Core/MutationDedupeTests.cs +3 -0
  124. package/Tests/Runtime/Core/MutationDestructionTests.cs +3 -0
  125. package/Tests/Runtime/Core/MutationDuringEmissionTests.cs +3 -0
  126. package/Tests/Runtime/Core/MutationGlobalAddTests.cs +3 -0
  127. package/Tests/Runtime/Core/MutationInterceptorTests.cs +3 -0
  128. package/Tests/Runtime/Core/MutationPostProcessorAcrossHandlersTests.cs +3 -0
  129. package/Tests/Runtime/Core/MutationPostProcessorMoreTests.cs +3 -0
  130. package/Tests/Runtime/Core/MutationPriorityTests.cs +3 -0
  131. package/Tests/Runtime/Core/NominalTests.cs +3 -0
  132. package/Tests/Runtime/Core/OrderingTests.cs +3 -0
  133. package/Tests/Runtime/Core/OverDeregistrationTests.cs +3 -0
  134. package/Tests/Runtime/Core/PostProcessorTests.cs +3 -0
  135. package/Tests/Runtime/Core/ReflexiveErrorTests.cs +3 -0
  136. package/Tests/Runtime/Core/ReflexiveMessageWarningTests.cs +4 -1
  137. package/Tests/Runtime/Core/ReflexiveTests.cs +3 -0
  138. package/Tests/Runtime/Core/RegistrationTests.cs +3 -0
  139. package/Tests/Runtime/Core/StringShorthandTests.cs +3 -0
  140. package/Tests/Runtime/Core/TargetedTests.cs +3 -0
  141. package/Tests/Runtime/Core/TypedShorthandTests.cs +3 -0
  142. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +3 -0
  143. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +14 -78
  144. package/Tests/Runtime/Core/UntargetedTests.cs +3 -0
  145. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +4 -1
  146. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +3 -0
  147. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +3 -0
  148. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +3 -0
  149. package/Tests/Runtime/Scripts/Components/ManualListenerComponent.cs +3 -0
  150. package/Tests/Runtime/Scripts/Components/ReflexiveReceiverComponent.cs +3 -0
  151. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +3 -0
  152. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +3 -0
  153. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +87 -3
  154. package/Tests/Runtime/Unity/MessagingComponentInstallerSceneTests.cs +109 -0
  155. package/Tests/Runtime/Unity/MessagingComponentInstallerSceneTests.cs.meta +11 -0
  156. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +159 -17
  157. package/package.json +1 -1
  158. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj +0 -7
@@ -0,0 +1,109 @@
1
+ #if UNITY_2021_3_OR_NEWER
2
+ namespace DxMessaging.Tests.Runtime.Unity
3
+ {
4
+ using System.Collections;
5
+ using System.Collections.Generic;
6
+ using DxMessaging.Core.MessageBus;
7
+ using DxMessaging.Unity;
8
+ using NUnit.Framework;
9
+ using UnityEditor;
10
+ using UnityEngine;
11
+ using UnityEngine.TestTools;
12
+
13
+ public sealed class MessagingComponentInstallerSceneTests
14
+ {
15
+ private readonly List<Object> _createdObjects = new();
16
+
17
+ [TearDown]
18
+ public void TearDown()
19
+ {
20
+ foreach (Object instance in _createdObjects)
21
+ {
22
+ if (instance != null)
23
+ {
24
+ Object.DestroyImmediate(instance);
25
+ }
26
+ }
27
+ _createdObjects.Clear();
28
+ }
29
+
30
+ [UnityTest]
31
+ public IEnumerator InstallerAppliesSerializedProviderToChildren()
32
+ {
33
+ MessageBus messageBus = new();
34
+ TestScriptableMessageBusProvider provider = Track(
35
+ ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>()
36
+ );
37
+ provider.Configure(messageBus);
38
+
39
+ GameObject root = Track(new GameObject("InstallerRoot"));
40
+ MessagingComponentInstaller installer =
41
+ root.AddComponent<MessagingComponentInstaller>();
42
+ installer.SetProvider(new MessageBusProviderHandle(provider));
43
+
44
+ GameObject child = Track(new GameObject("InstallerChild"));
45
+ child.transform.SetParent(root.transform);
46
+ MessagingComponent component = child.AddComponent<MessagingComponent>();
47
+
48
+ SerializedObject serializedComponent = new(component);
49
+ SerializedProperty autoConfigureProperty = serializedComponent.FindProperty(
50
+ "autoConfigureSerializedProviderOnAwake"
51
+ );
52
+ Assert.That(autoConfigureProperty, Is.Not.Null, "Expected auto configure property.");
53
+ autoConfigureProperty.boolValue = true;
54
+ serializedComponent.ApplyModifiedPropertiesWithoutUndo();
55
+
56
+ installer.ApplyConfiguration();
57
+
58
+ yield return null;
59
+
60
+ Assert.That(
61
+ component.SerializedProviderHandle.SerializedProvider,
62
+ Is.EqualTo(provider),
63
+ "Serialized provider handle should reference the installer provider."
64
+ );
65
+ Assert.That(
66
+ component.SerializedProviderHandle.ResolveBus(),
67
+ Is.EqualTo(messageBus),
68
+ "Serialized provider should resolve to the configured bus."
69
+ );
70
+
71
+ component.enabled = false;
72
+ yield return null;
73
+ component.enabled = true;
74
+ yield return null;
75
+
76
+ Assert.That(
77
+ component.SerializedProviderHandle.ResolveBus(),
78
+ Is.EqualTo(messageBus),
79
+ "Provider resolution should persist after enable/disable cycles."
80
+ );
81
+ }
82
+
83
+ private T Track<T>(T unityObject)
84
+ where T : Object
85
+ {
86
+ if (unityObject != null)
87
+ {
88
+ _createdObjects.Add(unityObject);
89
+ }
90
+ return unityObject;
91
+ }
92
+
93
+ private sealed class TestScriptableMessageBusProvider : ScriptableMessageBusProvider
94
+ {
95
+ private IMessageBus _bus;
96
+
97
+ internal void Configure(IMessageBus bus)
98
+ {
99
+ _bus = bus;
100
+ }
101
+
102
+ public override IMessageBus Resolve()
103
+ {
104
+ return _bus;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ #endif
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 5e88a989b92afcd4a9738e3f472bb0e2
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -1,6 +1,8 @@
1
+ #if UNITY_2021_3_OR_NEWER
1
2
  namespace DxMessaging.Tests.Runtime.Unity
2
3
  {
3
4
  using System.Collections;
5
+ using System.Collections.Generic;
4
6
  using System.Text.RegularExpressions;
5
7
  using DxMessaging.Core;
6
8
  using DxMessaging.Core.MessageBus;
@@ -12,6 +14,29 @@ namespace DxMessaging.Tests.Runtime.Unity
12
14
 
13
15
  public sealed class MessagingComponentProviderIntegrationTests
14
16
  {
17
+ private readonly List<Object> _objectsToDestroy = new();
18
+
19
+ [SetUp]
20
+ public void SetUp()
21
+ {
22
+ _objectsToDestroy.Clear();
23
+ }
24
+
25
+ [TearDown]
26
+ public void TearDown()
27
+ {
28
+ for (int i = 0; i < _objectsToDestroy.Count; ++i)
29
+ {
30
+ Object obj = _objectsToDestroy[i];
31
+ if (obj != null)
32
+ {
33
+ Object.DestroyImmediate(obj);
34
+ }
35
+ }
36
+
37
+ _objectsToDestroy.Clear();
38
+ }
39
+
15
40
  [UnityTest]
16
41
  public IEnumerator ConfigureWithProviderHandleRoutesThroughProviderBus()
17
42
  {
@@ -19,9 +44,10 @@ namespace DxMessaging.Tests.Runtime.Unity
19
44
  TestScriptableMessageBusProvider provider =
20
45
  ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
21
46
  provider.Configure(messageBus);
47
+ Track(provider);
22
48
  MessageBusProviderHandle handle = new(provider);
23
49
 
24
- GameObject owner = new("MessagingComponentOwner");
50
+ GameObject owner = Track(new GameObject("MessagingComponentOwner"));
25
51
  MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
26
52
  messagingComponent.Configure(handle, MessageBusRebindMode.RebindActive);
27
53
 
@@ -34,9 +60,6 @@ namespace DxMessaging.Tests.Runtime.Unity
34
60
  messageBus.UntargetedBroadcast(ref message);
35
61
 
36
62
  Assert.AreEqual(1, listener.ReceivedCount);
37
-
38
- Object.DestroyImmediate(owner);
39
- Object.DestroyImmediate(provider);
40
63
  }
41
64
 
42
65
  [UnityTest]
@@ -46,14 +69,15 @@ namespace DxMessaging.Tests.Runtime.Unity
46
69
  TestScriptableMessageBusProvider provider =
47
70
  ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
48
71
  provider.Configure(messageBus);
72
+ Track(provider);
49
73
  MessageBusProviderHandle handle = new(provider);
50
74
 
51
- GameObject root = new("InstallerRoot");
75
+ GameObject root = Track(new GameObject("InstallerRoot"));
52
76
  MessagingComponentInstaller installer =
53
77
  root.AddComponent<MessagingComponentInstaller>();
54
78
  installer.SetProvider(handle);
55
79
 
56
- GameObject child = new("InstallerListener");
80
+ GameObject child = Track(new GameObject("InstallerListener"));
57
81
  child.transform.SetParent(root.transform);
58
82
  MessagingComponent messagingComponent = child.AddComponent<MessagingComponent>();
59
83
 
@@ -68,9 +92,6 @@ namespace DxMessaging.Tests.Runtime.Unity
68
92
  messageBus.UntargetedBroadcast(ref message);
69
93
 
70
94
  Assert.AreEqual(1, listener.ReceivedCount);
71
-
72
- Object.DestroyImmediate(root);
73
- Object.DestroyImmediate(provider);
74
95
  }
75
96
 
76
97
  [UnityTest]
@@ -79,7 +100,7 @@ namespace DxMessaging.Tests.Runtime.Unity
79
100
  MessageBus messageBus = new();
80
101
  TestProvider provider = new(messageBus);
81
102
 
82
- GameObject owner = new("BuilderOwner");
103
+ GameObject owner = Track(new GameObject("BuilderOwner"));
83
104
  MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
84
105
  messagingComponent.Configure(provider, MessageBusRebindMode.RebindActive);
85
106
 
@@ -93,8 +114,6 @@ namespace DxMessaging.Tests.Runtime.Unity
93
114
  Assert.AreSame(messageBus, lease.MessageBus);
94
115
  Assert.IsFalse(lease.Token.Enabled);
95
116
  }
96
-
97
- Object.DestroyImmediate(owner);
98
117
  yield break;
99
118
  }
100
119
 
@@ -103,7 +122,7 @@ namespace DxMessaging.Tests.Runtime.Unity
103
122
  {
104
123
  MessageBus messageBus = new();
105
124
 
106
- GameObject owner = new("OverrideOwner");
125
+ GameObject owner = Track(new GameObject("OverrideOwner"));
107
126
  MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
108
127
  messagingComponent.Configure(messageBus, MessageBusRebindMode.RebindActive);
109
128
 
@@ -116,18 +135,17 @@ namespace DxMessaging.Tests.Runtime.Unity
116
135
  {
117
136
  Assert.AreSame(messageBus, lease.MessageBus);
118
137
  }
119
- Object.DestroyImmediate(owner);
120
138
  yield break;
121
139
  }
122
140
 
123
141
  [UnityTest]
124
142
  public IEnumerator InstallerWithoutConfigurationLogsWarning()
125
143
  {
126
- GameObject root = new("InstallerWarningRoot");
144
+ GameObject root = Track(new GameObject("InstallerWarningRoot"));
127
145
  MessagingComponentInstaller installer =
128
146
  root.AddComponent<MessagingComponentInstaller>();
129
147
 
130
- GameObject child = new("InstallerWarningChild");
148
+ GameObject child = Track(new GameObject("InstallerWarningChild"));
131
149
  child.transform.SetParent(root.transform);
132
150
  _ = child.AddComponent<MessagingComponent>();
133
151
 
@@ -141,7 +159,129 @@ namespace DxMessaging.Tests.Runtime.Unity
141
159
  installer.ApplyConfiguration();
142
160
  yield return null;
143
161
 
144
- Object.DestroyImmediate(root);
162
+ yield break;
163
+ }
164
+
165
+ [UnityTest]
166
+ public IEnumerator PreserveRegistrationsKeepsExistingHandlersOnOriginalBus()
167
+ {
168
+ MessageBus originalBus = new();
169
+ MessageBus newBus = new();
170
+
171
+ GameObject owner = Track(new GameObject("PreserveOwner"));
172
+ MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
173
+ messagingComponent.Configure(originalBus, MessageBusRebindMode.RebindActive);
174
+
175
+ TestListener originalListener = owner.AddComponent<TestListener>();
176
+ originalListener.Initialize(messagingComponent);
177
+
178
+ yield return null;
179
+
180
+ TestUntargetedMessage message = new(1);
181
+ originalBus.UntargetedBroadcast(ref message);
182
+ Assert.AreEqual(
183
+ 1,
184
+ originalListener.ReceivedCount,
185
+ "Original listener should observe messages on the initial bus."
186
+ );
187
+
188
+ messagingComponent.Configure(newBus, MessageBusRebindMode.PreserveRegistrations);
189
+
190
+ message = new TestUntargetedMessage(2);
191
+ originalBus.UntargetedBroadcast(ref message);
192
+ Assert.AreEqual(
193
+ 2,
194
+ originalListener.ReceivedCount,
195
+ "Existing listener should remain bound to the original bus when preserving registrations."
196
+ );
197
+
198
+ message = new TestUntargetedMessage(3);
199
+ newBus.UntargetedBroadcast(ref message);
200
+ Assert.AreEqual(
201
+ 2,
202
+ originalListener.ReceivedCount,
203
+ "Existing listener should not observe messages on the new bus when preserving registrations."
204
+ );
205
+
206
+ TestListener newListener = owner.AddComponent<TestListener>();
207
+ newListener.Initialize(messagingComponent);
208
+
209
+ yield return null;
210
+
211
+ message = new TestUntargetedMessage(4);
212
+ newBus.UntargetedBroadcast(ref message);
213
+ Assert.AreEqual(
214
+ 1,
215
+ newListener.ReceivedCount,
216
+ "New listener should bind to the new bus after preservation."
217
+ );
218
+ Assert.AreEqual(2, originalListener.ReceivedCount);
219
+
220
+ message = new TestUntargetedMessage(5);
221
+ originalBus.UntargetedBroadcast(ref message);
222
+ Assert.AreEqual(
223
+ 1,
224
+ newListener.ReceivedCount,
225
+ "New listener should not observe messages sent on the original bus."
226
+ );
227
+ Assert.AreEqual(3, originalListener.ReceivedCount);
228
+
229
+ yield break;
230
+ }
231
+
232
+ [UnityTest]
233
+ public IEnumerator RebindActiveMovesExistingHandlersToNewBus()
234
+ {
235
+ MessageBus originalBus = new();
236
+ MessageBus newBus = new();
237
+
238
+ GameObject owner = Track(new GameObject("RebindOwner"));
239
+ MessagingComponent messagingComponent = owner.AddComponent<MessagingComponent>();
240
+ messagingComponent.Configure(originalBus, MessageBusRebindMode.RebindActive);
241
+
242
+ TestListener listener = owner.AddComponent<TestListener>();
243
+ listener.Initialize(messagingComponent);
244
+
245
+ yield return null;
246
+
247
+ TestUntargetedMessage message = new(1);
248
+ originalBus.UntargetedBroadcast(ref message);
249
+ Assert.AreEqual(
250
+ 1,
251
+ listener.ReceivedCount,
252
+ "Listener should observe messages on the initial bus prior to rebind."
253
+ );
254
+
255
+ messagingComponent.Configure(newBus, MessageBusRebindMode.RebindActive);
256
+
257
+ message = new TestUntargetedMessage(2);
258
+ originalBus.UntargetedBroadcast(ref message);
259
+ Assert.AreEqual(
260
+ 1,
261
+ listener.ReceivedCount,
262
+ "Listener should no longer receive messages on the original bus after rebinding."
263
+ );
264
+
265
+ message = new TestUntargetedMessage(3);
266
+ newBus.UntargetedBroadcast(ref message);
267
+ Assert.AreEqual(
268
+ 2,
269
+ listener.ReceivedCount,
270
+ "Listener should observe messages on the new bus after rebinding."
271
+ );
272
+
273
+ yield break;
274
+ }
275
+
276
+ private T Track<T>(T unityObject)
277
+ where T : Object
278
+ {
279
+ if (unityObject != null)
280
+ {
281
+ _objectsToDestroy.Add(unityObject);
282
+ }
283
+
284
+ return unityObject;
145
285
  }
146
286
 
147
287
  private sealed class TestListener : MonoBehaviour
@@ -208,3 +348,5 @@ namespace DxMessaging.Tests.Runtime.Unity
208
348
  }
209
349
  }
210
350
  }
351
+
352
+ #endif
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.dxmessaging",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "displayName": "DxMessaging",
5
5
  "description": "Synchronous Event Bus for Unity",
6
6
  "unity": "2021.3",
@@ -1,7 +0,0 @@
1
- <wpf:ResourceDictionary
2
- xml:space="preserve"
3
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4
- xmlns:s="clr-namespace:System;assembly=mscorlib"
5
- xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml"
6
- xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
7
- />