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.
Files changed (32) hide show
  1. package/Docs/Comparisons.md +194 -66
  2. package/Docs/GettingStarted.md +84 -17
  3. package/Docs/Overview.md +114 -20
  4. package/Docs/Patterns.md +41 -2
  5. package/Docs/Performance.md +9 -9
  6. package/Docs/VisualGuide.md +75 -10
  7. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  8. package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +3 -3
  9. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
  10. package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +2 -2
  11. package/Editor/Analyzers/System.Collections.Immutable.dll +0 -0
  12. package/Editor/Analyzers/System.Reflection.Metadata.dll +0 -0
  13. package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
  14. package/README.md +262 -63
  15. package/Runtime/Core/MessageBus/MessageBus.cs +13 -0
  16. package/Runtime/Core/MessageHandler.cs +27 -33
  17. package/Runtime/Core/MessageRegistrationToken.cs +12 -21
  18. package/Runtime/Unity/MessageAwareComponent.cs +6 -0
  19. package/Runtime/Unity/MessagingComponent.cs +24 -0
  20. package/Samples~/Mini Combat/README.md +81 -21
  21. package/Samples~/Mini Combat/Walkthrough.md +23 -1
  22. package/Samples~/UI Buttons + Inspector/README.md +55 -12
  23. package/Tests/Runtime/Core/MessagingComponentLifecycleTests.cs +89 -0
  24. package/Tests/Runtime/Core/MessagingComponentLifecycleTests.cs.meta +11 -0
  25. package/Tests/Runtime/Core/ReflexiveMessageWarningTests.cs +86 -0
  26. package/Tests/Runtime/Core/ReflexiveMessageWarningTests.cs.meta +11 -0
  27. package/Tests/Runtime/Core/SourceGeneratorNestedTests.cs +1 -1
  28. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +116 -0
  29. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs.meta +11 -0
  30. package/Tests/Runtime/Scripts/Components/ReflexiveReceiverComponent.cs +14 -0
  31. package/Tests/Runtime/Scripts/Components/ReflexiveReceiverComponent.cs.meta +11 -0
  32. 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,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 9a36705993094444a95042994d092fc3
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,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
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: d7c3fab9fe20b6944814c031134be8e6
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.dxmessaging",
3
- "version": "2.0.0-rc27.3",
3
+ "version": "2.0.0",
4
4
  "displayName": "DxMessaging",
5
5
  "description": "Synchronous Event Bus for Unity",
6
6
  "unity": "2021.3",