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.
- package/.gitattributes +63 -0
- package/CHANGELOG.md +0 -0
- package/CHANGELOG.md.meta +7 -0
- package/Editor.meta +8 -0
- package/LICENSE.md +7 -0
- package/LICENSE.md.meta +7 -0
- package/README.md +76 -0
- package/README.md.meta +7 -0
- package/Runtime/Core/Extensions/MessageExtensions.cs +275 -0
- package/Runtime/Core/Extensions/MessageExtensions.cs.meta +11 -0
- package/Runtime/Core/Extensions.meta +8 -0
- package/Runtime/Core/IMessage.cs +12 -0
- package/Runtime/Core/IMessage.cs.meta +11 -0
- package/Runtime/Core/InstanceId.cs +117 -0
- package/Runtime/Core/InstanceId.cs.meta +11 -0
- package/Runtime/Core/MessageBus/IMessageBus.cs +249 -0
- package/Runtime/Core/MessageBus/IMessageBus.cs.meta +11 -0
- package/Runtime/Core/MessageBus/MessageBus.cs +961 -0
- package/Runtime/Core/MessageBus/MessageBus.cs.meta +11 -0
- package/Runtime/Core/MessageBus/MessagingRegistration.cs +100 -0
- package/Runtime/Core/MessageBus/MessagingRegistration.cs.meta +11 -0
- package/Runtime/Core/MessageBus/RegistrationLog.cs +111 -0
- package/Runtime/Core/MessageBus/RegistrationLog.cs.meta +11 -0
- package/Runtime/Core/MessageBus.meta +8 -0
- package/Runtime/Core/MessageHandler.cs +1589 -0
- package/Runtime/Core/MessageHandler.cs.meta +11 -0
- package/Runtime/Core/MessageRegistrationHandle.cs +55 -0
- package/Runtime/Core/MessageRegistrationHandle.cs.meta +11 -0
- package/Runtime/Core/MessageRegistrationToken.cs +885 -0
- package/Runtime/Core/MessageRegistrationToken.cs.meta +11 -0
- package/Runtime/Core/Messages/IBroadcastMessage.cs +27 -0
- package/Runtime/Core/Messages/IBroadcastMessage.cs.meta +11 -0
- package/Runtime/Core/Messages/ITargetedMessage.cs +26 -0
- package/Runtime/Core/Messages/ITargetedMessage.cs.meta +11 -0
- package/Runtime/Core/Messages/IUntargetedMessage.cs +26 -0
- package/Runtime/Core/Messages/IUntargetedMessage.cs.meta +11 -0
- package/Runtime/Core/Messages.meta +8 -0
- package/Runtime/Core/MessagingDebug.cs +71 -0
- package/Runtime/Core/MessagingDebug.cs.meta +11 -0
- package/Runtime/Core.meta +8 -0
- package/Runtime/Unity/MessageAwareComponent.cs +77 -0
- package/Runtime/Unity/MessageAwareComponent.cs.meta +11 -0
- package/Runtime/Unity/MessagingComponent.cs +73 -0
- package/Runtime/Unity/MessagingComponent.cs.meta +11 -0
- package/Runtime/Unity.meta +8 -0
- package/Runtime/WallstopStudios.DxMessaging.asmdef +18 -0
- package/Runtime/WallstopStudios.DxMessaging.asmdef.meta +7 -0
- package/Runtime.meta +8 -0
- package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef +23 -0
- package/Tests/Editor/WallstopStudios.DxMessaging.Tests.Editor.asmdef.meta +7 -0
- package/Tests/Editor.meta +8 -0
- package/Tests/Runtime/Benchmarks/PerformanceTests.cs +196 -0
- package/Tests/Runtime/Benchmarks/PerformanceTests.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks.meta +8 -0
- package/Tests/Runtime/Core/BroadcastTests.cs +600 -0
- package/Tests/Runtime/Core/BroadcastTests.cs.meta +11 -0
- package/Tests/Runtime/Core/GlobalAcceptAllTests.cs +169 -0
- package/Tests/Runtime/Core/GlobalAcceptAllTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessagingTestBase.cs +164 -0
- package/Tests/Runtime/Core/MessagingTestBase.cs.meta +11 -0
- package/Tests/Runtime/Core/NominalTests.cs +1468 -0
- package/Tests/Runtime/Core/NominalTests.cs.meta +11 -0
- package/Tests/Runtime/Core/PostProcessorTests.cs +849 -0
- package/Tests/Runtime/Core/PostProcessorTests.cs.meta +11 -0
- package/Tests/Runtime/Core/RegistrationTests.cs +1045 -0
- package/Tests/Runtime/Core/RegistrationTests.cs.meta +11 -0
- package/Tests/Runtime/Core/TargetedTests.cs +596 -0
- package/Tests/Runtime/Core/TargetedTests.cs.meta +11 -0
- package/Tests/Runtime/Core/UntargetedTests.cs +149 -0
- package/Tests/Runtime/Core/UntargetedTests.cs.meta +11 -0
- package/Tests/Runtime/Core.meta +8 -0
- package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +9 -0
- package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +140 -0
- package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Components.meta +8 -0
- package/Tests/Runtime/Scripts/Messages/ComplexTargetedMessage.cs +28 -0
- package/Tests/Runtime/Scripts/Messages/ComplexTargetedMessage.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Messages/SimpleBroadcastMessage.cs +8 -0
- package/Tests/Runtime/Scripts/Messages/SimpleBroadcastMessage.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Messages/SimpleTargetedMessage.cs +8 -0
- package/Tests/Runtime/Scripts/Messages/SimpleTargetedMessage.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Messages/SimpleUntargetedMessage.cs +8 -0
- package/Tests/Runtime/Scripts/Messages/SimpleUntargetedMessage.cs.meta +11 -0
- package/Tests/Runtime/Scripts/Messages.meta +8 -0
- package/Tests/Runtime/Scripts.meta +8 -0
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +22 -0
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef.meta +7 -0
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj +1 -0
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.csproj.meta +7 -0
- package/Tests/Runtime.meta +8 -0
- package/Tests.meta +8 -0
- package/Third Party Notices.md +1 -0
- package/Third Party Notices.md.meta +7 -0
- package/package.json +36 -0
- package/package.json.meta +7 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
namespace DxMessaging.Core.Messages
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
|
|
5
|
+
/// <summary>
|
|
6
|
+
/// Message from a specific entity but for any listener.
|
|
7
|
+
/// </summary>
|
|
8
|
+
/// <note>
|
|
9
|
+
/// BroadcastMessages should be thought of as reactionary. Things like "EntityX has died", "EntityX has picked up ItemZ",
|
|
10
|
+
/// or "EntityX has lost 1 health".
|
|
11
|
+
/// Inheritance should be completely flat. Ie, IBroadcastMessage should be the direct parent of every implementer.
|
|
12
|
+
/// </note>
|
|
13
|
+
public interface IBroadcastMessage : IMessage { }
|
|
14
|
+
|
|
15
|
+
/// <summary>
|
|
16
|
+
/// No-alloc BroadcastMessages. Derive from this type to not have your messages boxed (if they are structs).
|
|
17
|
+
/// <code>
|
|
18
|
+
/// public readonly MyCoolStruct : IBroadCastMessage{MyCoolStruct}
|
|
19
|
+
/// </code>
|
|
20
|
+
/// </summary>
|
|
21
|
+
/// <typeparam name="T">Concrete type of the derived. Should be the derived type and nothing else.</typeparam>
|
|
22
|
+
public interface IBroadcastMessage<T> : IBroadcastMessage where T: IBroadcastMessage
|
|
23
|
+
{
|
|
24
|
+
Type IMessage.MessageType => typeof(T);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
namespace DxMessaging.Core.Messages
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
|
|
5
|
+
/// <summary>
|
|
6
|
+
/// Used to specify general-purposes messages that are meant to be sent to a specific entity.
|
|
7
|
+
/// </summary>
|
|
8
|
+
/// <note>
|
|
9
|
+
/// TargetedMessages should be thought of as commands. Things like "EntityX, pick up this rock" or
|
|
10
|
+
/// "EntityX, you successfully completed an active reload".
|
|
11
|
+
/// Inheritance should be completely flat. Ie, TargetedMessages should be the direct parent of every implementer.
|
|
12
|
+
/// </note>
|
|
13
|
+
public interface ITargetedMessage : IMessage { }
|
|
14
|
+
|
|
15
|
+
/// <summary>
|
|
16
|
+
/// No-alloc TargetedMessages. Derive from this type to not have your messages boxed (if they are structs).
|
|
17
|
+
/// <code>
|
|
18
|
+
/// public readonly MyCoolStruct : ITargetedMessage{MyCoolStruct}
|
|
19
|
+
/// </code>
|
|
20
|
+
/// </summary>
|
|
21
|
+
/// <typeparam name="T">Concrete type of the derived. Should be the derived type and nothing else.</typeparam>
|
|
22
|
+
public interface ITargetedMessage<T> : ITargetedMessage where T: ITargetedMessage
|
|
23
|
+
{
|
|
24
|
+
Type IMessage.MessageType => typeof(T);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
namespace DxMessaging.Core.Messages
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
|
|
5
|
+
/// <summary>
|
|
6
|
+
/// Used to specify general-purposes messages that aren't meant to be sent to specific entity.
|
|
7
|
+
/// </summary>
|
|
8
|
+
/// <note>
|
|
9
|
+
/// UntargetedMessages should be thought of as game-wide, global information. Things like
|
|
10
|
+
/// "The world has been regenerated." or "The video settings have been updated to this resolution".
|
|
11
|
+
/// Inheritance should be completely flat. Ie, UntargetedMessages should be the direct parent of every implementer.
|
|
12
|
+
/// </note>
|
|
13
|
+
public interface IUntargetedMessage : IMessage { }
|
|
14
|
+
|
|
15
|
+
/// <summary>
|
|
16
|
+
/// No-alloc UntargetedMessages. Derive from this type to not have your messages boxed (if they are structs).
|
|
17
|
+
/// <code>
|
|
18
|
+
/// public readonly MyCoolStruct : IUntargetedMessage{MyCoolStruct}
|
|
19
|
+
/// </code>
|
|
20
|
+
/// </summary>
|
|
21
|
+
/// <typeparam name="T">Concrete type of the derived. Should be the derived type and nothing else.</typeparam>
|
|
22
|
+
public interface IUntargetedMessage<T> : IUntargetedMessage where T : IUntargetedMessage
|
|
23
|
+
{
|
|
24
|
+
Type IMessage.MessageType => typeof(T);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
namespace DxMessaging.Core
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
|
|
5
|
+
/// <summary>
|
|
6
|
+
/// Severity of the log message
|
|
7
|
+
/// </summary>
|
|
8
|
+
public enum LogLevel
|
|
9
|
+
{
|
|
10
|
+
Debug = 0,
|
|
11
|
+
Info = 1,
|
|
12
|
+
Warn = 2,
|
|
13
|
+
Error = 3,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/// <summary>
|
|
17
|
+
/// Debug functionality for all of the Messaging Components.
|
|
18
|
+
/// </summary>
|
|
19
|
+
public static class MessagingDebug
|
|
20
|
+
{
|
|
21
|
+
|
|
22
|
+
/// <summary>
|
|
23
|
+
/// Custom log function to use.
|
|
24
|
+
/// </summary>
|
|
25
|
+
/// <note>
|
|
26
|
+
/// For Unity, you could do LogFunction = Debug.Log;
|
|
27
|
+
/// </note>
|
|
28
|
+
public static Action<LogLevel, string> LogFunction = null;
|
|
29
|
+
|
|
30
|
+
/// <summary>
|
|
31
|
+
/// Logs a message to the debug log function, if it's not null.
|
|
32
|
+
/// </summary>
|
|
33
|
+
/// <param name="logLevel">Severity of the message.</param>
|
|
34
|
+
/// <param name="message">Message to log.</param>
|
|
35
|
+
public static void Log(LogLevel logLevel, string message)
|
|
36
|
+
{
|
|
37
|
+
LogFunction?.Invoke(logLevel, message);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// <summary>
|
|
41
|
+
/// Logs a format string + args to the debug log function, if it's not null.
|
|
42
|
+
/// </summary>
|
|
43
|
+
/// <note>
|
|
44
|
+
/// Will call string.Format(message, args)
|
|
45
|
+
/// </note>
|
|
46
|
+
/// <param name="logLevel">Severity of the message.</param>
|
|
47
|
+
/// <param name="message">Format string.</param>
|
|
48
|
+
/// <param name="args">Args to populate format string with.</param>
|
|
49
|
+
public static void Log(LogLevel logLevel, string message, params object[] args)
|
|
50
|
+
{
|
|
51
|
+
Action<LogLevel, string> logFunction = LogFunction;
|
|
52
|
+
/*
|
|
53
|
+
We can potentially avoid an unnecessary string.Format call if the LogFunction is null,
|
|
54
|
+
which is why the null check is outside the InternalLog function.
|
|
55
|
+
*/
|
|
56
|
+
if (logFunction == null)
|
|
57
|
+
{
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (args.Length <= 0)
|
|
62
|
+
{
|
|
63
|
+
logFunction.Invoke(logLevel, message);
|
|
64
|
+
}
|
|
65
|
+
else
|
|
66
|
+
{
|
|
67
|
+
logFunction.Invoke(logLevel, string.Format(message, args));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
namespace DxMessaging.Unity
|
|
2
|
+
{
|
|
3
|
+
using Core;
|
|
4
|
+
using UnityEngine;
|
|
5
|
+
|
|
6
|
+
[RequireComponent(typeof(MessagingComponent))]
|
|
7
|
+
public abstract class MessageAwareComponent : MonoBehaviour
|
|
8
|
+
{
|
|
9
|
+
protected MessageRegistrationToken _messageRegistrationToken;
|
|
10
|
+
|
|
11
|
+
/// <summary>
|
|
12
|
+
/// If true, will register/un-register handles when the component is enabled or disabled.
|
|
13
|
+
/// </summary>
|
|
14
|
+
protected virtual bool MessageRegistrationTiedToEnableStatus => true;
|
|
15
|
+
|
|
16
|
+
protected bool _isQuitting;
|
|
17
|
+
|
|
18
|
+
protected virtual void Awake()
|
|
19
|
+
{
|
|
20
|
+
SetupMessageHandlers();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected void SetupMessageHandlers()
|
|
24
|
+
{
|
|
25
|
+
if (_messageRegistrationToken == null)
|
|
26
|
+
{
|
|
27
|
+
MessagingComponent messenger = GetComponent<MessagingComponent>();
|
|
28
|
+
_messageRegistrationToken = messenger.Create(this);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
RegisterMessageHandlers();
|
|
32
|
+
_messageRegistrationToken.Enable();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
protected virtual void RegisterMessageHandlers()
|
|
36
|
+
{
|
|
37
|
+
// No-op, expectation is that implementations implement their own logic here
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected virtual void OnEnable()
|
|
41
|
+
{
|
|
42
|
+
if (MessageRegistrationTiedToEnableStatus)
|
|
43
|
+
{
|
|
44
|
+
_messageRegistrationToken?.Enable();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected virtual void OnDisable()
|
|
49
|
+
{
|
|
50
|
+
if (_isQuitting)
|
|
51
|
+
{
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (MessageRegistrationTiedToEnableStatus)
|
|
56
|
+
{
|
|
57
|
+
_messageRegistrationToken?.Disable();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected virtual void OnDestroy()
|
|
62
|
+
{
|
|
63
|
+
if (_isQuitting)
|
|
64
|
+
{
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
_messageRegistrationToken?.Disable();
|
|
69
|
+
_messageRegistrationToken = null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected virtual void OnApplicationQuit()
|
|
73
|
+
{
|
|
74
|
+
_isQuitting = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
namespace DxMessaging.Unity
|
|
2
|
+
{
|
|
3
|
+
using Core;
|
|
4
|
+
using System;
|
|
5
|
+
using System.Collections.Generic;
|
|
6
|
+
using UnityEngine;
|
|
7
|
+
|
|
8
|
+
[DisallowMultipleComponent]
|
|
9
|
+
public sealed class MessagingComponent : MonoBehaviour
|
|
10
|
+
{
|
|
11
|
+
private MessageHandler _messageHandler;
|
|
12
|
+
private readonly Dictionary<MonoBehaviour, MessageRegistrationToken> _registeredListeners = new Dictionary<MonoBehaviour, MessageRegistrationToken>();
|
|
13
|
+
|
|
14
|
+
public MessageRegistrationToken Create(MonoBehaviour listener)
|
|
15
|
+
{
|
|
16
|
+
if (listener == null)
|
|
17
|
+
{
|
|
18
|
+
throw new ArgumentNullException(nameof(listener));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (gameObject.GetInstanceID() != listener.gameObject.GetInstanceID())
|
|
22
|
+
{
|
|
23
|
+
throw new ArgumentException(string.Format(
|
|
24
|
+
"Cannot create a RegistrationToken without an valid owner. {0}.",
|
|
25
|
+
listener.gameObject.GetInstanceID()));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (_registeredListeners.TryGetValue(listener, out MessageRegistrationToken createdToken))
|
|
29
|
+
{
|
|
30
|
+
MessagingDebug.Log(LogLevel.Warn, "Ignoring double RegistrationToken request for {0}.", listener);
|
|
31
|
+
return createdToken;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (_messageHandler == null)
|
|
35
|
+
{
|
|
36
|
+
_messageHandler = new MessageHandler(gameObject)
|
|
37
|
+
{
|
|
38
|
+
active = true
|
|
39
|
+
};
|
|
40
|
+
MessagingDebug.Log(LogLevel.Debug, "Creating MessageHandler for componentType {0}, GameObject name: {1}, InstanceId: {2}.",
|
|
41
|
+
listener.GetType(), listener.gameObject.name, (InstanceId) gameObject);
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
{
|
|
45
|
+
MessagingDebug.Log(LogLevel.Debug,
|
|
46
|
+
"Using existing MessageHandler for componentType {0}, GameObject name: {1}, InstanceId: {2}.",
|
|
47
|
+
listener.GetType(), listener.gameObject.name, (InstanceId) gameObject);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
createdToken = MessageRegistrationToken.Create(_messageHandler);
|
|
51
|
+
_registeredListeners[listener] = createdToken;
|
|
52
|
+
return createdToken;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private void OnEnable()
|
|
56
|
+
{
|
|
57
|
+
ToggleMessageHandler(true);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private void OnDisable()
|
|
61
|
+
{
|
|
62
|
+
ToggleMessageHandler(false);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private void ToggleMessageHandler(bool newActive)
|
|
66
|
+
{
|
|
67
|
+
if (_messageHandler != null && _messageHandler.active != newActive)
|
|
68
|
+
{
|
|
69
|
+
_messageHandler.active = newActive;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "WallstopStudios.DxMessaging",
|
|
3
|
+
"rootNamespace": "DxMessaging",
|
|
4
|
+
"references": [],
|
|
5
|
+
"includePlatforms": [],
|
|
6
|
+
"excludePlatforms": [],
|
|
7
|
+
"allowUnsafeCode": false,
|
|
8
|
+
"overrideReferences": true,
|
|
9
|
+
"precompiledReferences": [
|
|
10
|
+
"System.Runtime.CompilerServices.Unsafe.dll"
|
|
11
|
+
],
|
|
12
|
+
"autoReferenced": true,
|
|
13
|
+
"defineConstraints": [
|
|
14
|
+
"UNITY_2017_1_OR_NEWER"
|
|
15
|
+
],
|
|
16
|
+
"versionDefines": [],
|
|
17
|
+
"noEngineReferences": false
|
|
18
|
+
}
|
package/Runtime.meta
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "WallstopStudios.DxMessaging.Tests.Editor",
|
|
3
|
+
"rootNamespace": "DxMessaging.Tests.Editor",
|
|
4
|
+
"references": [
|
|
5
|
+
"UnityEngine.TestRunner",
|
|
6
|
+
"UnityEditor.TestRunner"
|
|
7
|
+
],
|
|
8
|
+
"includePlatforms": [
|
|
9
|
+
"Editor"
|
|
10
|
+
],
|
|
11
|
+
"excludePlatforms": [],
|
|
12
|
+
"allowUnsafeCode": false,
|
|
13
|
+
"overrideReferences": true,
|
|
14
|
+
"precompiledReferences": [
|
|
15
|
+
"nunit.framework.dll"
|
|
16
|
+
],
|
|
17
|
+
"autoReferenced": false,
|
|
18
|
+
"defineConstraints": [
|
|
19
|
+
"UNITY_INCLUDE_TESTS"
|
|
20
|
+
],
|
|
21
|
+
"versionDefines": [],
|
|
22
|
+
"noEngineReferences": false
|
|
23
|
+
}
|