com.wallstop-studios.dxmessaging 2.0.0-rc27.3 → 2.0.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.
- package/Docs/Comparisons.md +194 -66
- package/Docs/GettingStarted.md +84 -17
- package/Docs/Overview.md +114 -20
- package/Docs/Patterns.md +41 -2
- package/Docs/Performance.md +9 -9
- package/Docs/VisualGuide.md +75 -10
- package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
- package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +3 -3
- package/Editor/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
- package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +2 -2
- package/Editor/Analyzers/System.Collections.Immutable.dll +0 -0
- package/Editor/Analyzers/System.Reflection.Metadata.dll +0 -0
- package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
- package/README.md +262 -63
- package/Runtime/Core/MessageBus/MessageBus.cs +13 -0
- package/Runtime/Core/MessageHandler.cs +27 -33
- package/Runtime/Core/MessageRegistrationToken.cs +12 -21
- package/Runtime/Unity/MessageAwareComponent.cs +6 -0
- package/Runtime/Unity/MessagingComponent.cs +24 -0
- package/Samples~/Mini Combat/README.md +81 -21
- package/Samples~/Mini Combat/Walkthrough.md +23 -1
- package/Samples~/UI Buttons + Inspector/README.md +55 -12
- package/Tests/Runtime/Core/MessagingComponentLifecycleTests.cs +89 -0
- package/Tests/Runtime/Core/MessagingComponentLifecycleTests.cs.meta +11 -0
- package/Tests/Runtime/Core/ReflexiveMessageWarningTests.cs +86 -0
- package/Tests/Runtime/Core/ReflexiveMessageWarningTests.cs.meta +11 -0
- package/Tests/Runtime/Core/SourceGeneratorNestedTests.cs +1 -1
- package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +116 -0
- package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Components/ReflexiveReceiverComponent.cs +14 -0
- package/Tests/Runtime/Scripts/Components/ReflexiveReceiverComponent.cs.meta +11 -0
- package/package.json +1 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
namespace DxMessaging.Tests.Runtime.Core
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
using System.Collections.Generic;
|
|
5
|
+
using System.Reflection;
|
|
6
|
+
using DxMessaging.Core;
|
|
7
|
+
using DxMessaging.Core.Helper;
|
|
8
|
+
using DxMessaging.Core.MessageBus;
|
|
9
|
+
using DxMessaging.Tests.Runtime.Scripts.Messages;
|
|
10
|
+
using NUnit.Framework;
|
|
11
|
+
|
|
12
|
+
public sealed class UntargetedPrefreezeTests
|
|
13
|
+
{
|
|
14
|
+
[Test]
|
|
15
|
+
public void PrefreezeRunsOncePerEmission()
|
|
16
|
+
{
|
|
17
|
+
MessageHandler handler = new(new InstanceId(123)) { active = true };
|
|
18
|
+
MessageBus messageBus = new();
|
|
19
|
+
MessageRegistrationToken token = MessageRegistrationToken.Create(handler, messageBus);
|
|
20
|
+
|
|
21
|
+
int postProcessCount = 0;
|
|
22
|
+
_ = token.RegisterUntargeted<SimpleUntargetedMessage>(
|
|
23
|
+
(ref SimpleUntargetedMessage _) => { }
|
|
24
|
+
);
|
|
25
|
+
_ = token.RegisterUntargetedPostProcessor<SimpleUntargetedMessage>(
|
|
26
|
+
(ref SimpleUntargetedMessage _) => postProcessCount++,
|
|
27
|
+
priority: 0
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
token.Enable();
|
|
31
|
+
|
|
32
|
+
object cache = GetUntargetedPostProcessingFastCache(
|
|
33
|
+
handler,
|
|
34
|
+
messageBus,
|
|
35
|
+
typeof(SimpleUntargetedMessage),
|
|
36
|
+
priority: 0
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
SimpleUntargetedMessage message = new();
|
|
40
|
+
messageBus.UntargetedBroadcast(ref message);
|
|
41
|
+
Assert.AreEqual(1, postProcessCount);
|
|
42
|
+
Assert.AreEqual(1, GetPrefreezeInvocationCount(cache));
|
|
43
|
+
|
|
44
|
+
messageBus.UntargetedBroadcast(ref message);
|
|
45
|
+
Assert.AreEqual(2, postProcessCount);
|
|
46
|
+
Assert.AreEqual(2, GetPrefreezeInvocationCount(cache));
|
|
47
|
+
|
|
48
|
+
token.Disable();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private static object GetUntargetedPostProcessingFastCache(
|
|
52
|
+
MessageHandler handler,
|
|
53
|
+
MessageBus messageBus,
|
|
54
|
+
Type messageType,
|
|
55
|
+
int priority
|
|
56
|
+
)
|
|
57
|
+
{
|
|
58
|
+
FieldInfo handlersField = typeof(MessageHandler).GetField(
|
|
59
|
+
"_handlersByTypeByMessageBus",
|
|
60
|
+
BindingFlags.NonPublic | BindingFlags.Instance
|
|
61
|
+
);
|
|
62
|
+
Assert.IsNotNull(handlersField);
|
|
63
|
+
var handlersByBus = (List<MessageCache<object>>)handlersField.GetValue(handler);
|
|
64
|
+
Assert.IsNotNull(handlersByBus);
|
|
65
|
+
|
|
66
|
+
MessageCache<object> cacheByType = handlersByBus[
|
|
67
|
+
messageBus.RegisteredGlobalSequentialIndex
|
|
68
|
+
];
|
|
69
|
+
MethodInfo getOrAddMethod = typeof(MessageCache<object>)
|
|
70
|
+
.GetMethod(nameof(MessageCache<object>.GetOrAdd))
|
|
71
|
+
?.MakeGenericMethod(messageType);
|
|
72
|
+
Assert.IsNotNull(getOrAddMethod);
|
|
73
|
+
|
|
74
|
+
object typedHandler = getOrAddMethod.Invoke(cacheByType, null);
|
|
75
|
+
Assert.IsNotNull(typedHandler);
|
|
76
|
+
|
|
77
|
+
FieldInfo fastHandlersField = typedHandler
|
|
78
|
+
.GetType()
|
|
79
|
+
.GetField(
|
|
80
|
+
"_untargetedPostProcessingFastHandlers",
|
|
81
|
+
BindingFlags.NonPublic | BindingFlags.Instance
|
|
82
|
+
);
|
|
83
|
+
Assert.IsNotNull(fastHandlersField);
|
|
84
|
+
|
|
85
|
+
object fastHandlers = fastHandlersField.GetValue(typedHandler);
|
|
86
|
+
Assert.IsNotNull(fastHandlers);
|
|
87
|
+
|
|
88
|
+
return GetDictionaryValue(fastHandlers, priority);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private static object GetDictionaryValue(object dictionary, int key)
|
|
92
|
+
{
|
|
93
|
+
MethodInfo tryGetValue = dictionary
|
|
94
|
+
.GetType()
|
|
95
|
+
.GetMethod("TryGetValue", BindingFlags.Public | BindingFlags.Instance);
|
|
96
|
+
Assert.IsNotNull(tryGetValue);
|
|
97
|
+
|
|
98
|
+
object[] args = { key, null };
|
|
99
|
+
bool found = (bool)tryGetValue.Invoke(dictionary, args);
|
|
100
|
+
Assert.IsTrue(found, $"Failed to locate cache for priority {key}.");
|
|
101
|
+
return args[1];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private static int GetPrefreezeInvocationCount(object handlerCache)
|
|
105
|
+
{
|
|
106
|
+
FieldInfo countField = handlerCache
|
|
107
|
+
.GetType()
|
|
108
|
+
.GetField(
|
|
109
|
+
"prefreezeInvocationCount",
|
|
110
|
+
BindingFlags.NonPublic | BindingFlags.Instance
|
|
111
|
+
);
|
|
112
|
+
Assert.IsNotNull(countField);
|
|
113
|
+
return (int)countField.GetValue(handlerCache);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
namespace DxMessaging.Tests.Runtime.Scripts.Components
|
|
2
|
+
{
|
|
3
|
+
using UnityEngine;
|
|
4
|
+
|
|
5
|
+
public sealed class ReflexiveReceiverComponent : MonoBehaviour
|
|
6
|
+
{
|
|
7
|
+
public int InvocationCount { get; private set; }
|
|
8
|
+
|
|
9
|
+
public void OnReflexive()
|
|
10
|
+
{
|
|
11
|
+
InvocationCount++;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|