com.wallstop-studios.dxmessaging 1.0.0-rc10

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 (96) hide show
  1. package/.gitattributes +63 -0
  2. package/CHANGELOG.md +0 -0
  3. package/CHANGELOG.md.meta +7 -0
  4. package/Editor.meta +8 -0
  5. package/LICENSE.md +7 -0
  6. package/LICENSE.md.meta +7 -0
  7. package/README.md +76 -0
  8. package/README.md.meta +7 -0
  9. package/Runtime/Core/Extensions/MessageExtensions.cs +275 -0
  10. package/Runtime/Core/Extensions/MessageExtensions.cs.meta +11 -0
  11. package/Runtime/Core/Extensions.meta +8 -0
  12. package/Runtime/Core/IMessage.cs +12 -0
  13. package/Runtime/Core/IMessage.cs.meta +11 -0
  14. package/Runtime/Core/InstanceId.cs +117 -0
  15. package/Runtime/Core/InstanceId.cs.meta +11 -0
  16. package/Runtime/Core/MessageBus/IMessageBus.cs +249 -0
  17. package/Runtime/Core/MessageBus/IMessageBus.cs.meta +11 -0
  18. package/Runtime/Core/MessageBus/MessageBus.cs +961 -0
  19. package/Runtime/Core/MessageBus/MessageBus.cs.meta +11 -0
  20. package/Runtime/Core/MessageBus/MessagingRegistration.cs +100 -0
  21. package/Runtime/Core/MessageBus/MessagingRegistration.cs.meta +11 -0
  22. package/Runtime/Core/MessageBus/RegistrationLog.cs +111 -0
  23. package/Runtime/Core/MessageBus/RegistrationLog.cs.meta +11 -0
  24. package/Runtime/Core/MessageBus.meta +8 -0
  25. package/Runtime/Core/MessageHandler.cs +1589 -0
  26. package/Runtime/Core/MessageHandler.cs.meta +11 -0
  27. package/Runtime/Core/MessageRegistrationHandle.cs +55 -0
  28. package/Runtime/Core/MessageRegistrationHandle.cs.meta +11 -0
  29. package/Runtime/Core/MessageRegistrationToken.cs +885 -0
  30. package/Runtime/Core/MessageRegistrationToken.cs.meta +11 -0
  31. package/Runtime/Core/Messages/IBroadcastMessage.cs +27 -0
  32. package/Runtime/Core/Messages/IBroadcastMessage.cs.meta +11 -0
  33. package/Runtime/Core/Messages/ITargetedMessage.cs +26 -0
  34. package/Runtime/Core/Messages/ITargetedMessage.cs.meta +11 -0
  35. package/Runtime/Core/Messages/IUntargetedMessage.cs +26 -0
  36. package/Runtime/Core/Messages/IUntargetedMessage.cs.meta +11 -0
  37. package/Runtime/Core/Messages.meta +8 -0
  38. package/Runtime/Core/MessagingDebug.cs +71 -0
  39. package/Runtime/Core/MessagingDebug.cs.meta +11 -0
  40. package/Runtime/Core.meta +8 -0
  41. package/Runtime/Unity/MessageAwareComponent.cs +77 -0
  42. package/Runtime/Unity/MessageAwareComponent.cs.meta +11 -0
  43. package/Runtime/Unity/MessagingComponent.cs +73 -0
  44. package/Runtime/Unity/MessagingComponent.cs.meta +11 -0
  45. package/Runtime/Unity.meta +8 -0
  46. package/Runtime/WallstopStudios.DxMessaging.asmdef +18 -0
  47. package/Runtime/WallstopStudios.DxMessaging.asmdef.meta +7 -0
  48. package/Runtime.meta +8 -0
  49. package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef +23 -0
  50. package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef.meta +7 -0
  51. package/Tests/Editor.meta +8 -0
  52. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +196 -0
  53. package/Tests/Runtime/Benchmarks/PerformanceTests.cs.meta +11 -0
  54. package/Tests/Runtime/Benchmarks.meta +8 -0
  55. package/Tests/Runtime/Core/BroadcastTests.cs +600 -0
  56. package/Tests/Runtime/Core/BroadcastTests.cs.meta +11 -0
  57. package/Tests/Runtime/Core/GlobalAcceptAllTests.cs +169 -0
  58. package/Tests/Runtime/Core/GlobalAcceptAllTests.cs.meta +11 -0
  59. package/Tests/Runtime/Core/MessagingTestBase.cs +164 -0
  60. package/Tests/Runtime/Core/MessagingTestBase.cs.meta +11 -0
  61. package/Tests/Runtime/Core/NominalTests.cs +1468 -0
  62. package/Tests/Runtime/Core/NominalTests.cs.meta +11 -0
  63. package/Tests/Runtime/Core/PostProcessorTests.cs +849 -0
  64. package/Tests/Runtime/Core/PostProcessorTests.cs.meta +11 -0
  65. package/Tests/Runtime/Core/RegistrationTests.cs +1045 -0
  66. package/Tests/Runtime/Core/RegistrationTests.cs.meta +11 -0
  67. package/Tests/Runtime/Core/TargetedTests.cs +596 -0
  68. package/Tests/Runtime/Core/TargetedTests.cs.meta +11 -0
  69. package/Tests/Runtime/Core/UntargetedTests.cs +149 -0
  70. package/Tests/Runtime/Core/UntargetedTests.cs.meta +11 -0
  71. package/Tests/Runtime/Core.meta +8 -0
  72. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +9 -0
  73. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs.meta +11 -0
  74. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +140 -0
  75. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs.meta +11 -0
  76. package/Tests/Runtime/Scripts/Components.meta +8 -0
  77. package/Tests/Runtime/Scripts/Messages/ComplexTargetedMessage.cs +28 -0
  78. package/Tests/Runtime/Scripts/Messages/ComplexTargetedMessage.cs.meta +11 -0
  79. package/Tests/Runtime/Scripts/Messages/SimpleBroadcastMessage.cs +8 -0
  80. package/Tests/Runtime/Scripts/Messages/SimpleBroadcastMessage.cs.meta +11 -0
  81. package/Tests/Runtime/Scripts/Messages/SimpleTargetedMessage.cs +8 -0
  82. package/Tests/Runtime/Scripts/Messages/SimpleTargetedMessage.cs.meta +11 -0
  83. package/Tests/Runtime/Scripts/Messages/SimpleUntargetedMessage.cs +8 -0
  84. package/Tests/Runtime/Scripts/Messages/SimpleUntargetedMessage.cs.meta +11 -0
  85. package/Tests/Runtime/Scripts/Messages.meta +8 -0
  86. package/Tests/Runtime/Scripts.meta +8 -0
  87. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +22 -0
  88. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef.meta +7 -0
  89. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj +1 -0
  90. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj.meta +7 -0
  91. package/Tests/Runtime.meta +8 -0
  92. package/Tests.meta +8 -0
  93. package/Third Party Notices.md +1 -0
  94. package/Third Party Notices.md.meta +7 -0
  95. package/package.json +36 -0
  96. package/package.json.meta +7 -0
@@ -0,0 +1,169 @@
1
+ namespace DxMessaging.Tests.Runtime.Core
2
+ {
3
+ using DxMessaging.Core;
4
+ using Scripts.Components;
5
+ using System;
6
+ using System.Collections;
7
+ using DxMessaging.Core.Extensions;
8
+ using DxMessaging.Core.Messages;
9
+ using NUnit.Framework;
10
+ using Scripts.Messages;
11
+ using UnityEngine;
12
+ using UnityEngine.TestTools;
13
+
14
+ public sealed class GlobalAcceptAllTests : MessagingTestBase
15
+ {
16
+ private GameObject _test;
17
+
18
+ [UnitySetUp]
19
+ public override IEnumerator UnitySetup()
20
+ {
21
+ IEnumerator baseSetup = base.UnitySetup();
22
+ while (baseSetup.MoveNext())
23
+ {
24
+ yield return baseSetup.Current;
25
+ }
26
+
27
+ _test = new(nameof(GlobalAcceptAllTests), typeof(EmptyMessageAwareComponent));
28
+ _spawned.Add(_test);
29
+ }
30
+
31
+ [UnityTest]
32
+ public IEnumerator SimpleNormal()
33
+ {
34
+ int untargetedCount = 0;
35
+ int targetedCount = 0;
36
+ int broadcastCount = 0;
37
+
38
+ void HandleUntargeted(IUntargetedMessage message)
39
+ {
40
+ ++untargetedCount;
41
+ }
42
+
43
+ void HandleTargeted(InstanceId target, ITargetedMessage message)
44
+ {
45
+ ++targetedCount;
46
+ }
47
+
48
+ void HandleBroadcast(InstanceId source, IBroadcastMessage message)
49
+ {
50
+ ++broadcastCount;
51
+ }
52
+
53
+ SimpleUntargetedMessage untargetedMessage = new();
54
+ SimpleTargetedMessage targetedMessage = new();
55
+ SimpleBroadcastMessage broadcastMessage = new();
56
+ RunGlobalAcceptAllTest(
57
+ token => token.RegisterGlobalAcceptAll(HandleUntargeted, HandleTargeted, HandleBroadcast),
58
+ i =>
59
+ {
60
+ Assert.AreEqual(i, untargetedCount);
61
+ untargetedMessage.EmitUntargeted();
62
+ Assert.AreEqual(i + 1, untargetedCount);
63
+ }, i =>
64
+ {
65
+ Assert.AreEqual(i, targetedCount);
66
+ if (_random.Next() % 2 == 0)
67
+ {
68
+ targetedMessage.EmitGameObjectTargeted(_test);
69
+ }
70
+ else
71
+ {
72
+ targetedMessage.EmitComponentTargeted(_test.transform);
73
+ }
74
+
75
+ Assert.AreEqual(i + 1, targetedCount);
76
+ }, i =>
77
+ {
78
+ Assert.AreEqual(i, broadcastCount);
79
+ if (_random.Next() % 2 == 0)
80
+ {
81
+ broadcastMessage.EmitGameObjectBroadcast(_test);
82
+ }
83
+ else
84
+ {
85
+ broadcastMessage.EmitComponentBroadcast(_test.transform);
86
+ }
87
+
88
+ Assert.AreEqual(i + 1, broadcastCount);
89
+ });
90
+ yield break;
91
+ }
92
+
93
+ [UnityTest]
94
+ public IEnumerator SimpleNoCopy()
95
+ {
96
+ int untargetedCount = 0;
97
+ int targetedCount = 0;
98
+ int broadcastCount = 0;
99
+
100
+ void HandleUntargeted(ref IUntargetedMessage message)
101
+ {
102
+ ++untargetedCount;
103
+ }
104
+
105
+ void HandleTargeted(ref InstanceId target, ref ITargetedMessage message)
106
+ {
107
+ ++targetedCount;
108
+ }
109
+
110
+ void HandleBroadcast(ref InstanceId source, ref IBroadcastMessage message)
111
+ {
112
+ ++broadcastCount;
113
+ }
114
+
115
+ SimpleUntargetedMessage untargetedMessage = new();
116
+ SimpleTargetedMessage targetedMessage = new();
117
+ SimpleBroadcastMessage broadcastMessage = new();
118
+ RunGlobalAcceptAllTest(
119
+ token => token.RegisterGlobalAcceptAll(HandleUntargeted, HandleTargeted, HandleBroadcast),
120
+ i =>
121
+ {
122
+ Assert.AreEqual(i, untargetedCount);
123
+ untargetedMessage.EmitUntargeted();
124
+ Assert.AreEqual(i + 1, untargetedCount);
125
+ }, i =>
126
+ {
127
+ Assert.AreEqual(i, targetedCount);
128
+ if (_random.Next() % 2 == 0)
129
+ {
130
+ targetedMessage.EmitGameObjectTargeted(_test);
131
+ }
132
+ else
133
+ {
134
+ targetedMessage.EmitComponentTargeted(_test.transform);
135
+ }
136
+
137
+ Assert.AreEqual(i + 1, targetedCount);
138
+ }, i =>
139
+ {
140
+ Assert.AreEqual(i, broadcastCount);
141
+ if (_random.Next() % 2 == 0)
142
+ {
143
+ broadcastMessage.EmitGameObjectBroadcast(_test);
144
+ }
145
+ else
146
+ {
147
+ broadcastMessage.EmitComponentBroadcast(_test.transform);
148
+ }
149
+
150
+ Assert.AreEqual(i + 1, broadcastCount);
151
+ });
152
+ yield break;
153
+ }
154
+
155
+ private void RunGlobalAcceptAllTest(Action<MessageRegistrationToken> register, Action<int> untargeted, Action<int> targeted, Action<int> broadcast)
156
+ {
157
+ EmptyMessageAwareComponent component = _test.GetComponent<EmptyMessageAwareComponent>();
158
+ MessageRegistrationToken token = GetToken(component);
159
+
160
+ register(token);
161
+ for (int i = 0; i < 100; ++i)
162
+ {
163
+ untargeted(i);
164
+ targeted(i);
165
+ broadcast(i);
166
+ }
167
+ }
168
+ }
169
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: bb71a31296155514799b53b4cb57f60f
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,164 @@
1
+ namespace DxMessaging.Tests.Runtime.Core
2
+ {
3
+ using DxMessaging.Core.MessageBus;
4
+ using DxMessaging.Core;
5
+ using NUnit.Framework;
6
+ using System.Collections.Generic;
7
+ using UnityEngine;
8
+ using Unity;
9
+ using System.Collections;
10
+ using System.Diagnostics;
11
+ using System.Linq;
12
+ using System.Reflection;
13
+ using System;
14
+ using UnityEngine.TestTools;
15
+ using Debug = UnityEngine.Debug;
16
+ using Object = UnityEngine.Object;
17
+ using Random = System.Random;
18
+
19
+ public abstract class MessagingTestBase
20
+ {
21
+ protected int _numRegistrations;
22
+ protected readonly List<GameObject> _spawned = new();
23
+ protected readonly Random _random = new();
24
+
25
+ [SetUp]
26
+ public virtual void Setup()
27
+ {
28
+ MessagingDebug.LogFunction = (level, message) =>
29
+ {
30
+ switch (level)
31
+ {
32
+ case LogLevel.Debug:
33
+ case LogLevel.Info:
34
+ Debug.Log(message);
35
+ return;
36
+ case LogLevel.Warn:
37
+ Debug.LogWarning(message);
38
+ return;
39
+ case LogLevel.Error:
40
+ Debug.LogError(message);
41
+ return;
42
+ }
43
+ };
44
+ MessageBus messageBus = MessageHandler.MessageBus;
45
+ Assert.IsNotNull(messageBus);
46
+ messageBus.Log.Enabled = true;
47
+ _numRegistrations = 150;
48
+ }
49
+
50
+ [TearDown]
51
+ public virtual void Cleanup()
52
+ {
53
+ foreach (GameObject spawned in _spawned)
54
+ {
55
+ if (spawned == null)
56
+ {
57
+ continue;
58
+ }
59
+
60
+ Object.Destroy(spawned);
61
+ }
62
+
63
+ _spawned.Clear();
64
+ }
65
+
66
+ [UnitySetUp]
67
+ public virtual IEnumerator UnitySetup()
68
+ {
69
+ return WaitUntilMessageHandlerIsFresh();
70
+ }
71
+
72
+ protected void Run(Func<IEnumerable<MessageRegistrationHandle>> register, Action emit, Action assert, Action finalAssert, MessageRegistrationToken token, bool synchronizeDeregistrations = false)
73
+ {
74
+ HashSet<MessageRegistrationHandle> handles = new();
75
+ try
76
+ {
77
+ List<List<MessageRegistrationHandle>> indexedRegistrations = new(_numRegistrations);
78
+ for (int i = 0; i < _numRegistrations; ++i)
79
+ {
80
+ List<MessageRegistrationHandle> registrations = register().ToList();
81
+ foreach (MessageRegistrationHandle handle in registrations)
82
+ {
83
+ handles.Add(handle);
84
+ }
85
+
86
+ indexedRegistrations.Add(registrations);
87
+ }
88
+
89
+ if (synchronizeDeregistrations)
90
+ {
91
+ foreach (int index in Enumerable.Range(0, indexedRegistrations.Count).OrderBy(_ => _random.Next()))
92
+ {
93
+ emit();
94
+ assert();
95
+ foreach (MessageRegistrationHandle handle in indexedRegistrations[index])
96
+ {
97
+ handles.Remove(handle);
98
+ token.RemoveRegistration(handle);
99
+ }
100
+ }
101
+ }
102
+ else
103
+ {
104
+ foreach (MessageRegistrationHandle handle in handles.OrderBy(_ => _random.Next()).ToList())
105
+ {
106
+ emit();
107
+ assert();
108
+ handles.Remove(handle);
109
+ token.RemoveRegistration(handle);
110
+ }
111
+ }
112
+
113
+ emit();
114
+ finalAssert();
115
+ emit();
116
+ finalAssert();
117
+ }
118
+ finally
119
+ {
120
+ foreach (MessageRegistrationHandle handle in handles)
121
+ {
122
+ token.RemoveRegistration(handle);
123
+ }
124
+ }
125
+ }
126
+
127
+ protected MessageRegistrationToken GetToken(MessageAwareComponent component)
128
+ {
129
+ // Reach inside and grab the token
130
+ FieldInfo field = typeof(MessageAwareComponent).GetField(
131
+ "_messageRegistrationToken", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
132
+ Assert.IsNotNull(field);
133
+ MessageRegistrationToken token = field.GetValue(component) as MessageRegistrationToken;
134
+ Assert.IsNotNull(token);
135
+ return token;
136
+ }
137
+
138
+ protected IEnumerator WaitUntilMessageHandlerIsFresh()
139
+ {
140
+ Setup();
141
+ MessageBus messageBus = MessageHandler.MessageBus;
142
+ Assert.IsNotNull(messageBus);
143
+
144
+ Stopwatch timer = Stopwatch.StartNew();
145
+
146
+ bool IsStale()
147
+ {
148
+ return messageBus.RegisteredUntargeted != 0 || messageBus.RegisteredTargeted != 0 ||
149
+ messageBus.RegisteredBroadcast != 0;
150
+ }
151
+
152
+ while (IsStale() && timer.Elapsed < TimeSpan.FromSeconds(2.5))
153
+ {
154
+ yield return null;
155
+ }
156
+
157
+ Assert.IsFalse(
158
+ IsStale(),
159
+ "MessageHandler had {0} Untargeted registrations, {1} Targeted registrations, {2} Broadcast registrations. Registration log: {3}.",
160
+ messageBus.RegisteredUntargeted, messageBus.RegisteredTargeted, messageBus.RegisteredBroadcast,
161
+ messageBus.Log);
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 7535cc8753fc96548b025f5407a513eb
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant: