com.wallstop-studios.dxmessaging 2.1.1 → 2.1.2
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.
- package/.github/workflows/dotnet-tests.yml +72 -0
- package/.lychee.toml +4 -2
- package/AGENTS.md +1 -0
- package/Docs/Comparisons.md +4 -4
- package/Docs/Install.md +2 -1
- package/Docs/Performance.md +13 -11
- package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
- package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +13 -2
- package/Editor/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
- package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +11 -0
- package/Editor/Analyzers/System.Collections.Immutable.dll +0 -0
- package/Editor/Analyzers/System.Collections.Immutable.dll.meta +11 -0
- package/Editor/Analyzers/System.Reflection.Metadata.dll +0 -0
- package/Editor/Analyzers/System.Reflection.Metadata.dll.meta +13 -2
- package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
- package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll.meta +11 -0
- package/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll +0 -0
- package/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll.meta +3 -2
- package/Editor/AssemblyInfo.cs +3 -0
- package/Editor/AssemblyInfo.cs.meta +3 -0
- package/Editor/CustomEditors/MessagingComponentEditor.cs +21 -0
- package/Editor/SetupCscRsp.cs +133 -53
- package/Editor/Testing/MessagingComponentEditorHarness.cs +218 -0
- package/Editor/Testing/MessagingComponentEditorHarness.cs.meta +3 -0
- package/Editor/Testing.meta +3 -0
- package/README.md +9 -3
- package/Runtime/AssemblyInfo.cs +1 -0
- package/Runtime/Core/Diagnostics/MessageEmissionData.cs +26 -11
- package/Runtime/Core/Extensions/MessageBusExtensions.cs +2 -2
- package/Runtime/Core/Extensions/MessageExtensions.cs +2 -2
- package/Runtime/Core/InstanceId.cs +5 -3
- package/Runtime/Core/MessageBus/MessageBus.cs +4 -4
- package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +2 -2
- package/Runtime/Core/MessageBus/MessagingRegistration.cs +3 -3
- package/Runtime/Core/MessageHandler.cs +34 -2
- package/Runtime/Core/MessageRegistrationToken.cs +2 -2
- package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +2 -0
- package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +2 -0
- package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +2 -0
- package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +2 -0
- package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +2 -0
- package/Runtime/Unity/MessageAwareComponent.cs +2 -0
- package/Runtime/Unity/MessageBusProviderHandle.cs +4 -0
- package/Runtime/Unity/MessagingComponent.cs +16 -0
- package/Runtime/Unity/MessagingComponentInstaller.cs +2 -0
- package/Runtime/Unity/ScriptableMessageBusProvider.cs +2 -0
- package/SourceGenerators/Directory.Build.props +9 -0
- package/SourceGenerators/Directory.Build.props.meta +7 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxAutoConstructorGenerator.cs +19 -24
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxMessageIdGenerator.cs +87 -27
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj +24 -4
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DocsSnippetCompilationTests.cs +193 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DocsSnippetCompilationTests.cs.meta +11 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxAutoConstructorGeneratorDiagnosticsTests.cs +69 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxAutoConstructorGeneratorDiagnosticsTests.cs.meta +11 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxMessageIdGeneratorDiagnosticsTests.cs +66 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/DxMessageIdGeneratorDiagnosticsTests.cs.meta +11 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/GeneratorTestUtilities.cs +155 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/GeneratorTestUtilities.cs.meta +11 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj +20 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.meta +7 -0
- package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests.meta +8 -0
- package/Tests/Editor/MessagingComponentEditorHarnessTests.cs +243 -0
- package/Tests/Editor/MessagingComponentEditorHarnessTests.cs.meta +3 -0
- package/Tests/Editor/MessagingComponentSerializationTests.cs +129 -0
- package/Tests/Editor/MessagingComponentSerializationTests.cs.meta +3 -0
- package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef +19 -0
- package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef.meta +3 -0
- package/Tests/Editor.meta +3 -0
- package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +3 -0
- package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +3 -0
- package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +3 -0
- package/Tests/Runtime/Benchmarks/PerformanceTests.cs +137 -0
- package/Tests/Runtime/Core/AlternateBusTests.cs +3 -0
- package/Tests/Runtime/Core/BroadcastTests.cs +3 -0
- package/Tests/Runtime/Core/CyclicBufferTests.cs +3 -0
- package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +5 -2
- package/Tests/Runtime/Core/DiagnosticsTests.cs +3 -0
- package/Tests/Runtime/Core/EdgeCaseTests.cs +3 -0
- package/Tests/Runtime/Core/EnablementTests.cs +3 -0
- package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +2 -2
- package/Tests/Runtime/Core/GenericMessageTests.cs +3 -0
- package/Tests/Runtime/Core/GlobalAcceptAllTests.cs +3 -0
- package/Tests/Runtime/Core/InterceptorCancellationTests.cs +3 -0
- package/Tests/Runtime/Core/LifecycleTests.cs +3 -0
- package/Tests/Runtime/Core/MessageEmissionDataTests.cs +70 -0
- package/Tests/Runtime/Core/MessageEmissionDataTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessagingComponentLifecycleTests.cs +3 -0
- package/Tests/Runtime/Core/MessagingTestBase.cs +3 -0
- package/Tests/Runtime/Core/MutationDedupeTests.cs +3 -0
- package/Tests/Runtime/Core/MutationDestructionTests.cs +3 -0
- package/Tests/Runtime/Core/MutationDuringEmissionTests.cs +3 -0
- package/Tests/Runtime/Core/MutationGlobalAddTests.cs +3 -0
- package/Tests/Runtime/Core/MutationInterceptorTests.cs +3 -0
- package/Tests/Runtime/Core/MutationPostProcessorAcrossHandlersTests.cs +3 -0
- package/Tests/Runtime/Core/MutationPostProcessorMoreTests.cs +3 -0
- package/Tests/Runtime/Core/MutationPriorityTests.cs +3 -0
- package/Tests/Runtime/Core/NominalTests.cs +3 -0
- package/Tests/Runtime/Core/OrderingTests.cs +3 -0
- package/Tests/Runtime/Core/OverDeregistrationTests.cs +3 -0
- package/Tests/Runtime/Core/PostProcessorTests.cs +3 -0
- package/Tests/Runtime/Core/ReflexiveErrorTests.cs +3 -0
- package/Tests/Runtime/Core/ReflexiveMessageWarningTests.cs +4 -1
- package/Tests/Runtime/Core/ReflexiveTests.cs +3 -0
- package/Tests/Runtime/Core/RegistrationTests.cs +3 -0
- package/Tests/Runtime/Core/StringShorthandTests.cs +3 -0
- package/Tests/Runtime/Core/TargetedTests.cs +3 -0
- package/Tests/Runtime/Core/TypedShorthandTests.cs +3 -0
- package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +3 -0
- package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +14 -78
- package/Tests/Runtime/Core/UntargetedTests.cs +3 -0
- package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +4 -1
- package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +3 -0
- package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +3 -0
- package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +3 -0
- package/Tests/Runtime/Scripts/Components/ManualListenerComponent.cs +3 -0
- package/Tests/Runtime/Scripts/Components/ReflexiveReceiverComponent.cs +3 -0
- package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +3 -0
- package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +3 -0
- package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +87 -3
- package/Tests/Runtime/Unity/MessagingComponentInstallerSceneTests.cs +109 -0
- package/Tests/Runtime/Unity/MessagingComponentInstallerSceneTests.cs.meta +11 -0
- package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +159 -17
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj +20 -7
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#if UNITY_2021_3_OR_NEWER
|
|
1
2
|
namespace DxMessaging.Tests.Runtime.Core
|
|
2
3
|
{
|
|
3
4
|
using System;
|
|
@@ -18,7 +19,7 @@ namespace DxMessaging.Tests.Runtime.Core
|
|
|
18
19
|
public IEnumerator LogsWarningOncePerBus()
|
|
19
20
|
{
|
|
20
21
|
List<(LogLevel level, string message)> logs = new();
|
|
21
|
-
|
|
22
|
+
Action<LogLevel, string> previousLogFunction = MessagingDebug.LogFunction;
|
|
22
23
|
try
|
|
23
24
|
{
|
|
24
25
|
MessagingDebug.LogFunction = (level, message) => logs.Add((level, message));
|
|
@@ -84,3 +85,5 @@ namespace DxMessaging.Tests.Runtime.Core
|
|
|
84
85
|
}
|
|
85
86
|
}
|
|
86
87
|
}
|
|
88
|
+
|
|
89
|
+
#endif
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
namespace DxMessaging.Tests.Runtime.Core
|
|
2
2
|
{
|
|
3
|
-
using System;
|
|
4
|
-
using System.Collections.Generic;
|
|
5
|
-
using System.Reflection;
|
|
6
3
|
using DxMessaging.Core;
|
|
7
|
-
using DxMessaging.Core.Helper;
|
|
8
4
|
using DxMessaging.Core.MessageBus;
|
|
9
5
|
using DxMessaging.Tests.Runtime.Scripts.Messages;
|
|
10
6
|
using NUnit.Framework;
|
|
@@ -27,88 +23,28 @@ namespace DxMessaging.Tests.Runtime.Core
|
|
|
27
23
|
|
|
28
24
|
token.Enable();
|
|
29
25
|
|
|
30
|
-
object cache = GetUntargetedPostProcessingFastCache(
|
|
31
|
-
handler,
|
|
32
|
-
messageBus,
|
|
33
|
-
typeof(SimpleUntargetedMessage),
|
|
34
|
-
priority: 0
|
|
35
|
-
);
|
|
36
|
-
|
|
37
26
|
SimpleUntargetedMessage message = new();
|
|
38
27
|
messageBus.UntargetedBroadcast(ref message);
|
|
39
28
|
Assert.AreEqual(1, postProcessCount);
|
|
40
|
-
Assert.AreEqual(
|
|
29
|
+
Assert.AreEqual(
|
|
30
|
+
1,
|
|
31
|
+
handler.GetUntargetedPostProcessingPrefreezeCount<SimpleUntargetedMessage>(
|
|
32
|
+
messageBus,
|
|
33
|
+
priority: 0
|
|
34
|
+
)
|
|
35
|
+
);
|
|
41
36
|
|
|
42
37
|
messageBus.UntargetedBroadcast(ref message);
|
|
43
38
|
Assert.AreEqual(2, postProcessCount);
|
|
44
|
-
Assert.AreEqual(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
MessageHandler handler,
|
|
51
|
-
MessageBus messageBus,
|
|
52
|
-
Type messageType,
|
|
53
|
-
int priority
|
|
54
|
-
)
|
|
55
|
-
{
|
|
56
|
-
FieldInfo handlersField = typeof(MessageHandler).GetField(
|
|
57
|
-
"_handlersByTypeByMessageBus",
|
|
58
|
-
BindingFlags.NonPublic | BindingFlags.Instance
|
|
39
|
+
Assert.AreEqual(
|
|
40
|
+
2,
|
|
41
|
+
handler.GetUntargetedPostProcessingPrefreezeCount<SimpleUntargetedMessage>(
|
|
42
|
+
messageBus,
|
|
43
|
+
priority: 0
|
|
44
|
+
)
|
|
59
45
|
);
|
|
60
|
-
Assert.IsNotNull(handlersField);
|
|
61
|
-
var handlersByBus = (List<MessageCache<object>>)handlersField.GetValue(handler);
|
|
62
|
-
Assert.IsNotNull(handlersByBus);
|
|
63
|
-
|
|
64
|
-
MessageCache<object> cacheByType = handlersByBus[
|
|
65
|
-
messageBus.RegisteredGlobalSequentialIndex
|
|
66
|
-
];
|
|
67
|
-
MethodInfo getOrAddMethod = typeof(MessageCache<object>)
|
|
68
|
-
.GetMethod(nameof(MessageCache<object>.GetOrAdd))
|
|
69
|
-
?.MakeGenericMethod(messageType);
|
|
70
|
-
Assert.IsNotNull(getOrAddMethod);
|
|
71
|
-
|
|
72
|
-
object typedHandler = getOrAddMethod.Invoke(cacheByType, null);
|
|
73
|
-
Assert.IsNotNull(typedHandler);
|
|
74
46
|
|
|
75
|
-
|
|
76
|
-
.GetType()
|
|
77
|
-
.GetField(
|
|
78
|
-
"_untargetedPostProcessingFastHandlers",
|
|
79
|
-
BindingFlags.NonPublic | BindingFlags.Instance
|
|
80
|
-
);
|
|
81
|
-
Assert.IsNotNull(fastHandlersField);
|
|
82
|
-
|
|
83
|
-
object fastHandlers = fastHandlersField.GetValue(typedHandler);
|
|
84
|
-
Assert.IsNotNull(fastHandlers);
|
|
85
|
-
|
|
86
|
-
return GetDictionaryValue(fastHandlers, priority);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
private static object GetDictionaryValue(object dictionary, int key)
|
|
90
|
-
{
|
|
91
|
-
MethodInfo tryGetValue = dictionary
|
|
92
|
-
.GetType()
|
|
93
|
-
.GetMethod("TryGetValue", BindingFlags.Public | BindingFlags.Instance);
|
|
94
|
-
Assert.IsNotNull(tryGetValue);
|
|
95
|
-
|
|
96
|
-
object[] args = { key, null };
|
|
97
|
-
bool found = (bool)tryGetValue.Invoke(dictionary, args);
|
|
98
|
-
Assert.IsTrue(found, $"Failed to locate cache for priority {key}.");
|
|
99
|
-
return args[1];
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
private static int GetPrefreezeInvocationCount(object handlerCache)
|
|
103
|
-
{
|
|
104
|
-
FieldInfo countField = handlerCache
|
|
105
|
-
.GetType()
|
|
106
|
-
.GetField(
|
|
107
|
-
"prefreezeInvocationCount",
|
|
108
|
-
BindingFlags.NonPublic | BindingFlags.Instance
|
|
109
|
-
);
|
|
110
|
-
Assert.IsNotNull(countField);
|
|
111
|
-
return (int)countField.GetValue(handlerCache);
|
|
47
|
+
token.Disable();
|
|
112
48
|
}
|
|
113
49
|
}
|
|
114
50
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#if UNITY_2021_3_OR_NEWER
|
|
1
2
|
namespace DxMessaging.Tests.Runtime.Reflex
|
|
2
3
|
{
|
|
3
4
|
#if REFLEX_PRESENT
|
|
@@ -93,7 +94,7 @@ namespace DxMessaging.Tests.Runtime.Reflex
|
|
|
93
94
|
|
|
94
95
|
Container container = TrackDisposable(builder.Build());
|
|
95
96
|
|
|
96
|
-
|
|
97
|
+
DxMessagingRegistrationInstaller.ContainerMessageRegistrationBuilder concrete =
|
|
97
98
|
container.Resolve<DxMessagingRegistrationInstaller.ContainerMessageRegistrationBuilder>();
|
|
98
99
|
Assert.IsNotNull(
|
|
99
100
|
concrete,
|
|
@@ -160,3 +161,5 @@ namespace DxMessaging.Tests.Runtime.Reflex
|
|
|
160
161
|
}
|
|
161
162
|
#endif
|
|
162
163
|
}
|
|
164
|
+
|
|
165
|
+
#endif
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
#if UNITY_2021_3_OR_NEWER
|
|
1
2
|
namespace DxMessaging.Tests.Runtime.Unity
|
|
2
3
|
{
|
|
4
|
+
using System.Collections.Generic;
|
|
3
5
|
using DxMessaging.Core.MessageBus;
|
|
4
6
|
using DxMessaging.Unity;
|
|
5
7
|
using NUnit.Framework;
|
|
@@ -8,6 +10,29 @@ namespace DxMessaging.Tests.Runtime.Unity
|
|
|
8
10
|
[TestFixture]
|
|
9
11
|
public sealed class MessageBusProviderHandleTests
|
|
10
12
|
{
|
|
13
|
+
private readonly List<Object> _objectsToDestroy = new();
|
|
14
|
+
|
|
15
|
+
[SetUp]
|
|
16
|
+
public void SetUp()
|
|
17
|
+
{
|
|
18
|
+
_objectsToDestroy.Clear();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
[TearDown]
|
|
22
|
+
public void TearDown()
|
|
23
|
+
{
|
|
24
|
+
for (int i = 0; i < _objectsToDestroy.Count; ++i)
|
|
25
|
+
{
|
|
26
|
+
Object obj = _objectsToDestroy[i];
|
|
27
|
+
if (obj != null)
|
|
28
|
+
{
|
|
29
|
+
Object.DestroyImmediate(obj);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_objectsToDestroy.Clear();
|
|
34
|
+
}
|
|
35
|
+
|
|
11
36
|
[Test]
|
|
12
37
|
public void TryGetProviderReturnsRuntimeProvider()
|
|
13
38
|
{
|
|
@@ -29,13 +54,12 @@ namespace DxMessaging.Tests.Runtime.Unity
|
|
|
29
54
|
ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
|
|
30
55
|
providerAsset.Configure(new MessageBus());
|
|
31
56
|
MessageBusProviderHandle handle = new(providerAsset);
|
|
57
|
+
TrackForCleanup(providerAsset);
|
|
32
58
|
|
|
33
59
|
bool resolved = handle.TryGetProvider(out IMessageBusProvider provider);
|
|
34
60
|
|
|
35
61
|
Assert.IsTrue(resolved);
|
|
36
62
|
Assert.AreSame(providerAsset, provider);
|
|
37
|
-
|
|
38
|
-
Object.DestroyImmediate(providerAsset);
|
|
39
63
|
}
|
|
40
64
|
|
|
41
65
|
[Test]
|
|
@@ -55,6 +79,7 @@ namespace DxMessaging.Tests.Runtime.Unity
|
|
|
55
79
|
ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
|
|
56
80
|
providerAsset.Configure(new MessageBus());
|
|
57
81
|
MessageBusProviderHandle handle = new(providerAsset);
|
|
82
|
+
TrackForCleanup(providerAsset);
|
|
58
83
|
|
|
59
84
|
HandleWrapper wrapper = new() { Handle = handle };
|
|
60
85
|
string json = JsonUtility.ToJson(wrapper);
|
|
@@ -64,8 +89,57 @@ namespace DxMessaging.Tests.Runtime.Unity
|
|
|
64
89
|
|
|
65
90
|
Assert.IsTrue(resolved);
|
|
66
91
|
Assert.AreSame(providerAsset, provider);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
[Test]
|
|
95
|
+
public void WithRuntimeProviderOverridesSerializedProvider()
|
|
96
|
+
{
|
|
97
|
+
MessageBus serializedBus = new();
|
|
98
|
+
TestScriptableMessageBusProvider providerAsset =
|
|
99
|
+
ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
|
|
100
|
+
providerAsset.Configure(serializedBus);
|
|
101
|
+
MessageBusProviderHandle handle = new(providerAsset);
|
|
102
|
+
TrackForCleanup(providerAsset);
|
|
103
|
+
|
|
104
|
+
MessageBus runtimeBus = new();
|
|
105
|
+
TestMessageBusProvider runtimeProvider = new(runtimeBus);
|
|
106
|
+
MessageBusProviderHandle runtimeHandle = handle.WithRuntimeProvider(runtimeProvider);
|
|
107
|
+
|
|
108
|
+
Assert.IsTrue(runtimeHandle.TryGetProvider(out IMessageBusProvider provider));
|
|
109
|
+
Assert.AreSame(runtimeProvider, provider);
|
|
110
|
+
Assert.AreSame(runtimeBus, runtimeHandle.ResolveBus());
|
|
67
111
|
|
|
68
|
-
|
|
112
|
+
// Original handle should remain associated with the serialized provider asset.
|
|
113
|
+
Assert.IsTrue(handle.TryGetProvider(out IMessageBusProvider serializedProvider));
|
|
114
|
+
Assert.AreSame(providerAsset, serializedProvider);
|
|
115
|
+
Assert.AreSame(serializedBus, handle.ResolveBus());
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
[Test]
|
|
119
|
+
public void RuntimeProviderIsNotSerialized()
|
|
120
|
+
{
|
|
121
|
+
MessageBus serializedBus = new();
|
|
122
|
+
TestScriptableMessageBusProvider providerAsset =
|
|
123
|
+
ScriptableObject.CreateInstance<TestScriptableMessageBusProvider>();
|
|
124
|
+
providerAsset.Configure(serializedBus);
|
|
125
|
+
MessageBusProviderHandle handle = new(providerAsset);
|
|
126
|
+
TrackForCleanup(providerAsset);
|
|
127
|
+
|
|
128
|
+
MessageBus runtimeBus = new();
|
|
129
|
+
TestMessageBusProvider runtimeProvider = new(runtimeBus);
|
|
130
|
+
handle = handle.WithRuntimeProvider(runtimeProvider);
|
|
131
|
+
|
|
132
|
+
HandleWrapper wrapper = new() { Handle = handle };
|
|
133
|
+
string json = JsonUtility.ToJson(wrapper);
|
|
134
|
+
HandleWrapper deserialized = JsonUtility.FromJson<HandleWrapper>(json);
|
|
135
|
+
|
|
136
|
+
Assert.IsTrue(deserialized.Handle.TryGetProvider(out IMessageBusProvider provider));
|
|
137
|
+
Assert.AreSame(
|
|
138
|
+
providerAsset,
|
|
139
|
+
provider,
|
|
140
|
+
"Serialized handle should resolve the asset provider."
|
|
141
|
+
);
|
|
142
|
+
Assert.AreSame(serializedBus, deserialized.Handle.ResolveBus());
|
|
69
143
|
}
|
|
70
144
|
|
|
71
145
|
private sealed class TestMessageBusProvider : IMessageBusProvider
|
|
@@ -83,6 +157,14 @@ namespace DxMessaging.Tests.Runtime.Unity
|
|
|
83
157
|
}
|
|
84
158
|
}
|
|
85
159
|
|
|
160
|
+
private void TrackForCleanup(Object unityObject)
|
|
161
|
+
{
|
|
162
|
+
if (unityObject != null)
|
|
163
|
+
{
|
|
164
|
+
_objectsToDestroy.Add(unityObject);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
86
168
|
[System.Serializable]
|
|
87
169
|
private struct HandleWrapper
|
|
88
170
|
{
|
|
@@ -105,3 +187,5 @@ namespace DxMessaging.Tests.Runtime.Unity
|
|
|
105
187
|
}
|
|
106
188
|
}
|
|
107
189
|
}
|
|
190
|
+
|
|
191
|
+
#endif
|
|
@@ -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
|