Initial Commit

This commit is contained in:
Sebastian Cabrera 2021-08-02 05:44:37 -04:00
parent 53eb92e9af
commit 270ab7d11f
15341 changed files with 700234 additions and 0 deletions

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 61e236e8570a95e4eb754fb291e102e0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,47 @@
using NUnit.Framework;
using NUnit.Framework.Interfaces;
namespace UnityEngine.TestTools.TestRunner.Callbacks
{
[AddComponentMenu("")]
internal class PlayModeRunnerCallback : MonoBehaviour, ITestRunnerListener
{
private TestResultRenderer m_ResultRenderer;
public void RunFinished(ITestResult testResults)
{
Application.logMessageReceivedThreaded -= LogRecieved;
if (Camera.main == null)
{
gameObject.AddComponent<Camera>();
}
m_ResultRenderer = new TestResultRenderer(testResults);
m_ResultRenderer.ShowResults();
}
public void TestFinished(ITestResult result)
{
}
public void OnGUI()
{
if (m_ResultRenderer != null)
m_ResultRenderer.Draw();
}
public void RunStarted(ITest testsToRun)
{
Application.logMessageReceivedThreaded += LogRecieved;
}
public void TestStarted(ITest test)
{
}
private void LogRecieved(string message, string stacktrace, LogType type)
{
if (TestContext.Out != null)
TestContext.Out.WriteLine(message);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3cf5cb9e1ef590c48b1f919f2a7bd895
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,43 @@
using NUnit.Framework.Interfaces;
using UnityEngine.Networking.PlayerConnection;
using UnityEngine.TestRunner.TestLaunchers;
namespace UnityEngine.TestTools.TestRunner.Callbacks
{
internal class PlayerQuitHandler : MonoBehaviour, ITestRunnerListener
{
public void Start()
{
PlayerConnection.instance.Register(PlayerConnectionMessageIds.quitPlayerMessageId, ProcessPlayerQuiteMessage);
}
private void ProcessPlayerQuiteMessage(MessageEventArgs arg0)
{
//Some platforms don't quit, so we need to disconnect to make sure they will not connect to another editor instance automatically.
PlayerConnection.instance.DisconnectAll();
//XBOX has an error when quitting
if (Application.platform == RuntimePlatform.XboxOne)
{
return;
}
Application.Quit();
}
public void RunStarted(ITest testsToRun)
{
}
public void RunFinished(ITestResult testResults)
{
}
public void TestStarted(ITest test)
{
}
public void TestFinished(ITestResult result)
{
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f8ed0b11850145c4995dd76170bb2500
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,132 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework.Interfaces;
using UnityEngine.Networking.PlayerConnection;
using UnityEngine.TestRunner.TestLaunchers;
namespace UnityEngine.TestTools.TestRunner.Callbacks
{
[AddComponentMenu("")]
internal class RemoteTestResultSender : MonoBehaviour, ITestRunnerListener
{
private class QueueData
{
public Guid id { get; set; }
public byte[] data { get; set; }
}
private const int k_aliveMessageFrequency = 120;
private float m_NextliveMessage = k_aliveMessageFrequency;
private readonly Queue<QueueData> m_SendQueue = new Queue<QueueData>();
private readonly object m_LockQueue = new object();
private readonly IRemoteTestResultDataFactory m_TestResultDataFactory = new RemoteTestResultDataFactory();
public void Start()
{
StartCoroutine(SendDataRoutine());
}
private byte[] SerializeObject(object objectToSerialize)
{
return Encoding.UTF8.GetBytes(JsonUtility.ToJson(objectToSerialize));
}
public void RunStarted(ITest testsToRun)
{
var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(testsToRun));
lock (m_LockQueue)
{
m_SendQueue.Enqueue(new QueueData
{
id = PlayerConnectionMessageIds.runStartedMessageId,
data = data
});
}
}
public void RunFinished(ITestResult testResults)
{
var data = SerializeObject(m_TestResultDataFactory.CreateFromTestResult(testResults));
lock (m_LockQueue)
{
m_SendQueue.Enqueue(new QueueData { id = PlayerConnectionMessageIds.runFinishedMessageId, data = data, });
}
}
public void TestStarted(ITest test)
{
var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(test));
lock (m_LockQueue)
{
m_SendQueue.Enqueue(new QueueData
{
id = PlayerConnectionMessageIds.testStartedMessageId,
data = data
});
}
}
public void TestFinished(ITestResult result)
{
var testRunnerResultForApi = m_TestResultDataFactory.CreateFromTestResult(result);
var resultData = SerializeObject(testRunnerResultForApi);
lock (m_LockQueue)
{
m_SendQueue.Enqueue(new QueueData
{
id = PlayerConnectionMessageIds.testFinishedMessageId,
data = resultData,
});
}
}
public IEnumerator SendDataRoutine()
{
while (!PlayerConnection.instance.isConnected)
{
yield return new WaitForSeconds(1);
}
while (true)
{
lock (m_LockQueue)
{
if (PlayerConnection.instance.isConnected && m_SendQueue.Count > 0)
{
ResetNextPlayerAliveMessageTime();
var queueData = m_SendQueue.Dequeue();
PlayerConnection.instance.Send(queueData.id, queueData.data);
yield return null;
}
//This is needed so we dont stall the player totally
if (!m_SendQueue.Any())
{
SendAliveMessageIfNeeded();
yield return new WaitForSeconds(0.02f);
}
}
}
}
private void SendAliveMessageIfNeeded()
{
if (Time.timeSinceLevelLoad < m_NextliveMessage)
{
return;
}
Debug.Log("Sending player alive message back to editor.");
ResetNextPlayerAliveMessageTime();
PlayerConnection.instance.Send(PlayerConnectionMessageIds.playerAliveHeartbeat, new byte[0]);
}
private void ResetNextPlayerAliveMessageTime()
{
m_NextliveMessage = Time.timeSinceLevelLoad + k_aliveMessageFrequency;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 20793418366caf14293b29c55df5e9ec
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,97 @@
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
namespace UnityEngine.TestTools.TestRunner.Callbacks
{
internal class TestResultRenderer
{
private static class Styles
{
public static readonly GUIStyle SucceedLabelStyle;
public static readonly GUIStyle FailedLabelStyle;
public static readonly GUIStyle FailedMessagesStyle;
static Styles()
{
SucceedLabelStyle = new GUIStyle("label");
SucceedLabelStyle.normal.textColor = Color.green;
SucceedLabelStyle.fontSize = 48;
FailedLabelStyle = new GUIStyle("label");
FailedLabelStyle.normal.textColor = Color.red;
FailedLabelStyle.fontSize = 32;
FailedMessagesStyle = new GUIStyle("label");
FailedMessagesStyle.wordWrap = false;
FailedMessagesStyle.richText = true;
}
}
private readonly List<ITestResult> m_FailedTestCollection;
private bool m_ShowResults;
private Vector2 m_ScrollPosition;
public TestResultRenderer(ITestResult testResults)
{
m_FailedTestCollection = new List<ITestResult>();
GetFailedTests(testResults);
}
private void GetFailedTests(ITestResult testResults)
{
if (testResults is TestCaseResult)
{
if (testResults.ResultState.Status == TestStatus.Failed)
m_FailedTestCollection.Add(testResults);
}
else if (testResults.HasChildren)
{
foreach (var testResultsChild in testResults.Children)
{
GetFailedTests(testResultsChild);
}
}
}
private const int k_MaxStringLength = 15000;
public void ShowResults()
{
m_ShowResults = true;
Cursor.visible = true;
}
public void Draw()
{
if (!m_ShowResults) return;
if (m_FailedTestCollection.Count == 0)
{
GUILayout.Label("All test(s) succeeded", Styles.SucceedLabelStyle, GUILayout.Width(600));
}
else
{
int count = m_FailedTestCollection.Count;
GUILayout.Label(count + " tests failed!", Styles.FailedLabelStyle);
m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.ExpandWidth(true));
var text = "";
text += "<b><size=18>Code-based tests</size></b>\n";
text += string.Join("\n", m_FailedTestCollection
.Select(result => result.Name + " " + result.ResultState + "\n" + result.Message)
.ToArray());
if (text.Length > k_MaxStringLength)
text = text.Substring(0, k_MaxStringLength);
GUILayout.TextArea(text, Styles.FailedMessagesStyle);
GUILayout.EndScrollView();
}
if (GUILayout.Button("Close"))
Application.Quit();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5ebb87899ca30b743bb4274bc00c02b4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,36 @@
using NUnit.Framework.Interfaces;
namespace UnityEngine.TestTools.TestRunner.Callbacks
{
internal class TestResultRendererCallback : MonoBehaviour, ITestRunnerListener
{
private TestResultRenderer m_ResultRenderer;
public void RunStarted(ITest testsToRun)
{
}
public void RunFinished(ITestResult testResults)
{
if (Camera.main == null)
{
gameObject.AddComponent<Camera>();
}
m_ResultRenderer = new TestResultRenderer(testResults);
m_ResultRenderer.ShowResults();
}
public void OnGUI()
{
if (m_ResultRenderer != null)
m_ResultRenderer.Draw();
}
public void TestStarted(ITest test)
{
}
public void TestFinished(ITestResult result)
{
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dfc336f10b83bd74eaded16a658275c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,26 @@
using System;
using NUnit.Framework.Interfaces;
using UnityEngine.Events;
namespace UnityEngine.TestTools.TestRunner
{
internal interface ITestRunnerListener
{
void RunStarted(ITest testsToRun);
void RunFinished(ITestResult testResults);
void TestStarted(ITest test);
void TestFinished(ITestResult result);
}
[Serializable]
internal class TestFinishedEvent : UnityEvent<ITestResult> {}
[Serializable]
internal class TestStartedEvent : UnityEvent<ITest> {}
[Serializable]
internal class RunFinishedEvent : UnityEvent<ITestResult> {}
[Serializable]
internal class RunStartedEvent : UnityEvent<ITest> {}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d1b534518943030499685344fd1d476d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 256a0ca37fa972840bce7fca446e75e7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,28 @@
using System.Collections;
namespace UnityEngine.TestTools
{
/// <summary>
/// In an Edit Mode test, you can use `IEditModeTestYieldInstruction` interface to implement your own instruction. There are also a couple of commonly used implementations available:
/// - [EnterPlayMore](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/api/UnityEngine.TestTools.EnterPlayMode.html)
/// - <see cref = "ExitPlayMode"/>
/// - <see cref = "RecompileScripts"/>
/// - <see cref = "WaitForDomainReload"/>
/// </summary>
public interface IEditModeTestYieldInstruction
{
/// <summary>
/// Whether or not the instruction expects a domain reload to occur.
/// </summary>
bool ExpectDomainReload { get; }
/// <summary>
/// Whether or not the instruction expects the Unity Editor to be in **Play Mode**.
/// </summary>
bool ExpectedPlaymodeState { get; }
/// <summary>
/// Used to define multi-frame operations performed when instantiating a yield instruction.
/// </summary>
/// <returns>Enumerable collection of operations to perform.</returns>
IEnumerator Perform();
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 898bc38486fc899428fbe5bd6adfe473
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,129 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.SceneManagement;
using UnityEngine.TestRunner.NUnitExtensions;
using UnityEngine.TestRunner.NUnitExtensions.Runner;
using UnityEngine.TestTools.NUnitExtensions;
using UnityEngine.TestTools.Utils;
namespace UnityEngine.TestTools.TestRunner
{
[Serializable]
[AddComponentMenu("")]
internal class PlaymodeTestsController : MonoBehaviour
{
private IEnumerator m_TestSteps;
[SerializeField]
private List<string> m_AssembliesWithTests;
public List<string> AssembliesWithTests
{
get
{
return m_AssembliesWithTests;
}
set
{
m_AssembliesWithTests = value;
}
}
[SerializeField]
internal TestStartedEvent testStartedEvent = new TestStartedEvent();
[SerializeField]
internal TestFinishedEvent testFinishedEvent = new TestFinishedEvent();
[SerializeField]
internal RunStartedEvent runStartedEvent = new RunStartedEvent();
[SerializeField]
internal RunFinishedEvent runFinishedEvent = new RunFinishedEvent();
internal const string kPlaymodeTestControllerName = "Code-based tests runner";
[SerializeField]
public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings();
internal UnityTestAssemblyRunner m_Runner;
public IEnumerator Start()
{
//Skip 2 frame because Unity.
yield return null;
yield return null;
StartCoroutine(Run());
}
internal static bool IsControllerOnScene()
{
return GameObject.Find(kPlaymodeTestControllerName) != null;
}
internal static PlaymodeTestsController GetController()
{
return GameObject.Find(kPlaymodeTestControllerName).GetComponent<PlaymodeTestsController>();
}
public IEnumerator TestRunnerCoroutine()
{
while (m_TestSteps.MoveNext())
{
yield return m_TestSteps.Current;
}
if (m_Runner.IsTestComplete)
{
runFinishedEvent.Invoke(m_Runner.Result);
Cleanup();
yield return null;
}
}
public IEnumerator Run()
{
CoroutineTestWorkItem.monoBehaviourCoroutineRunner = this;
gameObject.hideFlags |= HideFlags.DontSave;
if (settings.sceneBased)
{
SceneManager.LoadScene(1, LoadSceneMode.Additive);
yield return null;
}
var testListUtil = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), m_AssembliesWithTests);
m_Runner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), new PlaymodeWorkItemFactory());
var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));
loadedTests.ParseForNameDuplicates();
runStartedEvent.Invoke(m_Runner.LoadedTest);
var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent);
m_TestSteps = m_Runner.Run(testListenerWrapper, settings.BuildNUnitFilter()).GetEnumerator();
yield return TestRunnerCoroutine();
}
public void Cleanup()
{
if (m_Runner != null)
{
m_Runner.StopRun();
m_Runner = null;
}
if (Application.isEditor)
{
Destroy(gameObject);
}
}
public static void TryCleanup()
{
var controller = GetController();
if (controller != null)
{
controller.Cleanup();
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 102e512f651ee834f951a2516c1ea3b8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,36 @@
using System;
using System.Linq;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal.Filters;
using UnityEngine.SceneManagement;
using UnityEngine.TestTools.TestRunner.GUI;
namespace UnityEngine.TestTools.TestRunner
{
[Serializable]
internal class PlaymodeTestsControllerSettings
{
[SerializeField]
public RuntimeTestRunnerFilter[] filters;
public bool sceneBased;
public string originalScene;
public string bootstrapScene;
public static PlaymodeTestsControllerSettings CreateRunnerSettings(RuntimeTestRunnerFilter[] filters)
{
var settings = new PlaymodeTestsControllerSettings
{
filters = filters,
sceneBased = false,
originalScene = SceneManager.GetActiveScene().path,
bootstrapScene = null
};
return settings;
}
internal ITestFilter BuildNUnitFilter()
{
return new OrFilter(filters.Select(f => f.BuildNUnitFilter()).ToArray());
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2799eb4c84e72e54092a292cf626936b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 91c20d2c22b8b3a4cb6c816bd225591a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,11 @@
using System;
using NUnit.Framework.Interfaces;
namespace UnityEngine.TestRunner.TestLaunchers
{
internal interface IRemoteTestResultDataFactory
{
RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result);
RemoteTestResultDataWithTestData CreateFromTest(ITest test);
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 874c0713cdc44f549b0161750b48d2c2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,14 @@
using System;
namespace UnityEngine.TestRunner.TestLaunchers
{
internal static class PlayerConnectionMessageIds
{
public static Guid runStartedMessageId { get { return new Guid("6a7f53dd-4672-461d-a7b5-9467e9393fd3"); } }
public static Guid runFinishedMessageId { get { return new Guid("ffb622fc-34ad-4901-8d7b-47fb04b0bdd4"); } }
public static Guid testStartedMessageId { get { return new Guid("b54d241e-d88d-4dba-8c8f-ee415d11c030"); } }
public static Guid testFinishedMessageId { get { return new Guid("72f7b7f4-6829-4cd1-afde-78872b9d5adc"); } }
public static Guid quitPlayerMessageId { get { return new Guid("ab44bfe0-bb50-4ee6-9977-69d2ea6bb3a0"); } }
public static Guid playerAliveHeartbeat { get { return new Guid("8c0c307b-f7fd-4216-8623-35b4b3f55fb6"); } }
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 41d60936b62cc6d4ca7fe628b22b0e40
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,56 @@
using System;
using System.Linq;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
using UnityEngine.TestRunner.NUnitExtensions;
namespace UnityEngine.TestRunner.TestLaunchers
{
[Serializable]
internal class RemoteTestData
{
public string id;
public string name;
public string fullName;
public int testCaseCount;
public int ChildIndex;
public bool hasChildren;
public bool isSuite;
public string[] childrenIds;
public int testCaseTimeout;
public string[] Categories;
public bool IsTestAssembly;
public RunState RunState;
public string Description;
public string SkipReason;
public string ParentId;
public string UniqueName;
public string ParentUniqueName;
public string ParentFullName;
internal RemoteTestData(ITest test)
{
id = test.Id;
name = test.Name;
fullName = test.FullName;
testCaseCount = test.TestCaseCount;
ChildIndex = -1;
if (test.Properties["childIndex"].Count > 0)
{
ChildIndex = (int)test.Properties["childIndex"][0];
}
hasChildren = test.HasChildren;
isSuite = test.IsSuite;
childrenIds = test.Tests.Select(t => t.Id).ToArray();
Categories = test.GetAllCategoriesFromTest().ToArray();
IsTestAssembly = test is TestAssembly;
RunState = (RunState)Enum.Parse(typeof(RunState), test.RunState.ToString());
Description = (string)test.Properties.Get(PropertyNames.Description);
SkipReason = test.GetSkipReason();
ParentId = test.GetParentId();
UniqueName = test.GetUniqueName();
ParentUniqueName = test.GetParentUniqueName();
ParentFullName = test.GetParentFullName();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b135ec222fdcd11468014c90d11d6821
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework.Interfaces;
namespace UnityEngine.TestRunner.TestLaunchers
{
[Serializable]
internal class RemoteTestResultData
{
public string testId;
public string name;
public string fullName;
public string resultState;
public TestStatus testStatus;
public double duration;
public DateTime startTime;
public DateTime endTime;
public string message;
public string stackTrace;
public int assertCount;
public int failCount;
public int passCount;
public int skipCount;
public int inconclusiveCount;
public bool hasChildren;
public string output;
public string xml;
public string[] childrenIds;
internal RemoteTestResultData(ITestResult result)
{
testId = result.Test.Id;
name = result.Name;
fullName = result.FullName;
resultState = result.ResultState.ToString();
testStatus = result.ResultState.Status;
duration = result.Duration;
startTime = result.StartTime;
endTime = result.EndTime;
message = result.Message;
stackTrace = result.StackTrace;
assertCount = result.AssertCount;
failCount = result.FailCount;
passCount = result.PassCount;
skipCount = result.SkipCount;
inconclusiveCount = result.InconclusiveCount;
hasChildren = result.HasChildren;
output = result.Output;
xml = result.ToXml(true).OuterXml;
childrenIds = result.Children.Select(child => child.Test.Id).ToArray();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 03e4d63665d06f04c8a6cf68133c1592
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,51 @@
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework.Interfaces;
using UnityEngine.TestRunner.NUnitExtensions.Runner;
namespace UnityEngine.TestRunner.TestLaunchers
{
internal class RemoteTestResultDataFactory : IRemoteTestResultDataFactory
{
public RemoteTestResultDataWithTestData CreateFromTestResult(ITestResult result)
{
var tests = CreateTestDataList(result.Test);
tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout;
return new RemoteTestResultDataWithTestData()
{
results = CreateTestResultDataList(result),
tests = tests
};
}
public RemoteTestResultDataWithTestData CreateFromTest(ITest test)
{
var tests = CreateTestDataList(test);
if (UnityTestExecutionContext.CurrentContext != null)
{
tests.First().testCaseTimeout = UnityTestExecutionContext.CurrentContext.TestCaseTimeout;
}
return new RemoteTestResultDataWithTestData()
{
tests = tests
};
}
private RemoteTestData[] CreateTestDataList(ITest test)
{
var list = new List<RemoteTestData>();
list.Add(new RemoteTestData(test));
list.AddRange(test.Tests.SelectMany(CreateTestDataList));
return list.ToArray();
}
private static RemoteTestResultData[] CreateTestResultDataList(ITestResult result)
{
var list = new List<RemoteTestResultData>();
list.Add(new RemoteTestResultData(result));
list.AddRange(result.Children.SelectMany(CreateTestResultDataList));
return list.ToArray();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 826b6becaef90fb458eedebe4c2f3664
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework.Interfaces;
using UnityEngine.TestRunner.NUnitExtensions.Runner;
namespace UnityEngine.TestRunner.TestLaunchers
{
[Serializable]
internal class RemoteTestResultDataWithTestData
{
public RemoteTestResultData[] results;
public RemoteTestData[] tests;
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 475e3699f219c854f8581a9838135002
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
using NUnit.Framework.Internal.Filters;
using UnityEngine.TestRunner.NUnitExtensions.Filters;
namespace UnityEngine.TestTools.TestRunner.GUI
{
[Serializable]
internal class RuntimeTestRunnerFilter
{
public string[] assemblyNames;
public string[] groupNames;
public string[] categoryNames;
public string[] testNames;
public bool synchronousOnly = false;
public ITestFilter BuildNUnitFilter()
{
var filters = new List<ITestFilter>();
AddFilters(filters, testNames, (s) => new FullNameFilter(s));
AddFilters(filters, groupNames, OptimizedGroupFilter);
AddFilters(filters, assemblyNames, (s) => new AssemblyNameFilter(s));
AddFilters(filters, categoryNames, (s) => new CategoryFilterExtended(s) {IsRegex = true});
if (synchronousOnly)
{
filters.Add(new SynchronousFilter());
}
return filters.Count == 0 ? TestFilter.Empty : new AndFilter(filters.ToArray());
}
static FullNameFilter OptimizedGroupFilter(string s)
{
if (s.Length >= 2)
{
// A common case is that the regex we are filtering by is of the form
// ^JUST_A_NAME$
// so we have a regex that matches _precisely_ one string. This can be done without a regex, which
// is much much faster.
if (s[0] == '^' && s[s.Length - 1] == '$')
{
var raw = s.Substring(1, s.Length - 2);
var escaped = Regex.Escape(raw);
// if a regex is the same when we escape it, it means that it doesn't contain any characters
// with any meaning in the regex. Hence the regex is just a plain name.
if (raw.Equals(escaped, StringComparison.Ordinal))
return new FullNameFilter(raw);
}
}
return new FullNameFilter(s) { IsRegex = true };
}
private static void AddFilters(List<ITestFilter> filters, string[] values, Func<string, TestFilter> builder)
{
if (values == null || values.Length == 0)
{
return;
}
var inclusionFilters = values.Where(v => !v.StartsWith("!")).Select(v => builder(v) as ITestFilter).ToArray();
var exclusionFilters = values.Where(v => v.StartsWith("!"))
.Select(v => new NotFilter(builder(v.Substring(1))) as ITestFilter)
.ToArray();
if (inclusionFilters.Length > 0 && exclusionFilters.Length > 0)
{
filters.Add(new AndFilter(new OrFilter(inclusionFilters), new AndFilter(exclusionFilters)));
}
else if (inclusionFilters.Length > 0)
{
filters.Add(new OrFilter(inclusionFilters));
}
else // Only exclusionFilters
{
filters.Add(new AndFilter(exclusionFilters));
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a025ba7ee40d0104db8d08b1d9eabb0d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,51 @@
using System.Collections;
using System.Linq;
using System.Reflection;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
namespace UnityEngine.TestTools.TestRunner.GUI
{
class SynchronousFilter : ITestFilter
{
public TNode ToXml(bool recursive)
{
return new TNode("synchronousOnly");
}
public TNode AddToXml(TNode parentNode, bool recursive)
{
return parentNode.AddElement("synchronousOnly");
}
public bool Pass(ITest test)
{
if (test.Method == null)
return true;
if (test.Method.ReturnType.Type == typeof(IEnumerator))
return false;
if (test.Method.GetCustomAttributes<IOuterUnityTestAction>(true).Any())
return false;
if (test.TypeInfo?.Type != null)
{
if (Reflect.GetMethodsWithAttribute(test.TypeInfo.Type, typeof(UnitySetUpAttribute), true)
.Any(mi => mi.ReturnType == typeof(System.Collections.IEnumerator)))
return false;
if (Reflect.GetMethodsWithAttribute(test.TypeInfo.Type, typeof(UnityTearDownAttribute), true)
.Any(mi => mi.ReturnType == typeof(System.Collections.IEnumerator)))
return false;
}
return true;
}
public bool IsExplicitMatch(ITest test)
{
return Pass(test);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b9aec9d3b0a86466ab4647d01e8fc87d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,51 @@
using System;
using System.Collections;
using System.Reflection;
using NUnit.Framework;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
namespace UnityEngine.TestTools.TestRunner
{
internal class TestEnumeratorWrapper
{
private readonly TestMethod m_TestMethod;
public TestEnumeratorWrapper(TestMethod testMethod)
{
m_TestMethod = testMethod;
}
public IEnumerator GetEnumerator(ITestExecutionContext context)
{
if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerator))
{
return HandleEnumerableTest(context);
}
var message = string.Format("Return type {0} of {1} in {2} is not supported.",
m_TestMethod.Method.ReturnType, m_TestMethod.Method.Name, m_TestMethod.Method.TypeInfo.FullName);
if (m_TestMethod.Method.ReturnType.Type == typeof(IEnumerable))
{
message += "\nDid you mean IEnumerator?";
}
throw new InvalidSignatureException(message);
}
private IEnumerator HandleEnumerableTest(ITestExecutionContext context)
{
try
{
return m_TestMethod.Method.MethodInfo.Invoke(context.TestObject, m_TestMethod.parms != null ? m_TestMethod.parms.OriginalArguments : null) as IEnumerator;
}
catch (TargetInvocationException e)
{
if (e.InnerException is IgnoreException)
{
context.CurrentResult.SetResult(ResultState.Ignored, e.InnerException.Message);
return null;
}
throw;
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9ad0b0c865b01af4ca1b414689e71259
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,30 @@
using NUnit.Framework.Interfaces;
namespace UnityEngine.TestTools.TestRunner
{
internal class TestListenerWrapper : ITestListener
{
private readonly TestFinishedEvent m_TestFinishedEvent;
private readonly TestStartedEvent m_TestStartedEvent;
public TestListenerWrapper(TestStartedEvent testStartedEvent, TestFinishedEvent testFinishedEvent)
{
m_TestStartedEvent = testStartedEvent;
m_TestFinishedEvent = testFinishedEvent;
}
public void TestStarted(ITest test)
{
m_TestStartedEvent.Invoke(test);
}
public void TestFinished(ITestResult result)
{
m_TestFinishedEvent.Invoke(result);
}
public void TestOutput(TestOutput output)
{
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 73deb9b8722aa284eab27c4dc90956c6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,33 @@
using System;
namespace UnityEngine.TestTools
{
/// <summary>
/// A flag indicating the targeted test platforms.
/// </summary>
[Flags]
[Serializable]
public enum TestPlatform : byte
{
/// <summary>
/// Both platforms.
/// </summary>
All = 0xFF,
/// <summary>
/// The EditMode test platform.
/// </summary>
EditMode = 1 << 1,
/// <summary>
/// The PlayMode test platform.
/// </summary>
PlayMode = 1 << 2
}
internal static class TestPlatformEnumExtensions
{
public static bool IsFlagIncluded(this TestPlatform flags, TestPlatform flag)
{
return (flags & flag) == flag;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 743879b4db4bc1a4b829aae4386f4acf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: