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: 96c503bf059df984c86eecf572370347
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,63 @@
using System;
using NUnit.Framework;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
namespace UnityEditor.TestTools
{
/// <summary>
/// Ignore attributes dedicated to Asset Import Pipeline backend version handling.
/// </summary>
internal static class AssetPipelineIgnore
{
internal enum AssetPipelineBackend
{
V1,
V2
}
/// <summary>
/// Ignore the test when running with the legacy Asset Import Pipeline V1 backend.
/// </summary>
internal class IgnoreInV1 : AssetPipelineIgnoreAttribute
{
public IgnoreInV1(string ignoreReason) : base(AssetPipelineBackend.V1, ignoreReason) {}
}
/// <summary>
/// Ignore the test when running with the latest Asset Import Pipeline V2 backend.
/// </summary>
internal class IgnoreInV2 : AssetPipelineIgnoreAttribute
{
public IgnoreInV2(string ignoreReason) : base(AssetPipelineBackend.V2, ignoreReason) {}
}
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
internal class AssetPipelineIgnoreAttribute : NUnitAttribute, IApplyToTest
{
readonly string m_IgnoreReason;
readonly AssetPipelineBackend m_IgnoredBackend;
static readonly AssetPipelineBackend k_ActiveBackend = AssetDatabase.IsV2Enabled()
? AssetPipelineBackend.V2
: AssetPipelineBackend.V1;
static string ActiveBackendName = Enum.GetName(typeof(AssetPipelineBackend), k_ActiveBackend);
public AssetPipelineIgnoreAttribute(AssetPipelineBackend backend, string ignoreReason)
{
m_IgnoredBackend = backend;
m_IgnoreReason = ignoreReason;
}
public void ApplyToTest(Test test)
{
if (k_ActiveBackend == m_IgnoredBackend)
{
test.RunState = RunState.Ignored;
var skipReason = string.Format("Not supported by asset pipeline {0} backend {1}", ActiveBackendName, m_IgnoreReason);
test.Properties.Add(PropertyNames.SkipReason, skipReason);
}
}
}
}
}

View file

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

View file

@ -0,0 +1,15 @@
namespace UnityEditor.TestTools
{
/// <summary>
/// An interface for a callback modifying the <see cref="BuildPlayerOptions"/> when building a player for running tests in the runtime.
/// </summary>
public interface ITestPlayerBuildModifier
{
/// <summary>
/// A callback to modify the <see cref="BuildPlayerOptions"/> when building a player for test run. Return the modified version of the provided build options.
/// </summary>
/// <param name="playerOptions">The unmodified BuildPlayerOptions.</param>
/// <returns>The modified BuildPlayerOptions.</returns>
BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions);
}
}

View file

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

View file

@ -0,0 +1,33 @@
using System;
namespace UnityEditor.TestTools
{
/// <summary>
/// The `TestPlayerBuildModifierAttribute` attribute can be applied to test assemblies (will affect every test in the assembly).
/// </summary>
[AttributeUsage(AttributeTargets.Assembly)]
public class TestPlayerBuildModifierAttribute : Attribute
{
private Type m_Type;
/// <summary>
/// Initializes and returns an instance of TestPlayerBuildModifierAttribute or throws an <see cref="ArgumentException"/>.
/// </summary>
/// <param name="type"></param>
/// <exception cref="ArgumentException">Throws a <see cref="ArgumentException"/> if the type provided does not implemented the `ITestPlayerBuildModifier` interface. </exception>
public TestPlayerBuildModifierAttribute(Type type)
{
var interfaceType = typeof(ITestPlayerBuildModifier);
if (!interfaceType.IsAssignableFrom(type))
{
throw new ArgumentException(string.Format("Type provided to {0} does not implement {1}", this.GetType().Name, interfaceType.Name));
}
m_Type = type;
}
internal ITestPlayerBuildModifier ConstructModifier()
{
return Activator.CreateInstance(m_Type) as ITestPlayerBuildModifier;
}
}
}

View file

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

View file

@ -0,0 +1,162 @@
using System;
using System.Reflection;
using System.Text;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.TestRunner.NUnitExtensions.Runner;
using UnityEngine.TestTools.NUnitExtensions;
using UnityEngine.TestTools.Logging;
namespace UnityEditor.TestTools.TestRunner
{
[Serializable]
internal class TestRunnerStateSerializer : IStateSerializer
{
private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy;
[SerializeField]
private HideFlags m_OriginalHideFlags;
[SerializeField]
private bool m_ShouldRestore;
[SerializeField]
private string m_TestObjectTypeName;
[SerializeField]
private ScriptableObject m_TestObject;
[SerializeField]
private string m_TestObjectTxt;
[SerializeField]
private long StartTicks;
[SerializeField]
private double StartTimeOA;
[SerializeField]
private string output;
[SerializeField]
private LogMatch[] m_ExpectedLogs;
public bool ShouldRestore()
{
return m_ShouldRestore;
}
public void SaveContext()
{
var currentContext = UnityTestExecutionContext.CurrentContext;
if (currentContext.TestObject != null)
{
m_TestObjectTypeName = currentContext.TestObject.GetType().AssemblyQualifiedName;
m_TestObject = null;
m_TestObjectTxt = null;
if (currentContext.TestObject is ScriptableObject)
{
m_TestObject = currentContext.TestObject as ScriptableObject;
m_OriginalHideFlags = m_TestObject.hideFlags;
m_TestObject.hideFlags |= HideFlags.DontSave;
}
else
{
m_TestObjectTxt = JsonUtility.ToJson(currentContext.TestObject);
}
}
output = currentContext.CurrentResult.Output;
StartTicks = currentContext.StartTicks;
StartTimeOA = currentContext.StartTime.ToOADate();
if (LogScope.HasCurrentLogScope())
{
m_ExpectedLogs = LogScope.Current.ExpectedLogs.ToArray();
}
m_ShouldRestore = true;
}
public void RestoreContext()
{
var currentContext = UnityTestExecutionContext.CurrentContext;
var outputProp = currentContext.CurrentResult.GetType().BaseType.GetField("_output", Flags);
(outputProp.GetValue(currentContext.CurrentResult) as StringBuilder).Append(output);
currentContext.StartTicks = StartTicks;
currentContext.StartTime = DateTime.FromOADate(StartTimeOA);
if (LogScope.HasCurrentLogScope())
{
LogScope.Current.ExpectedLogs = new Queue<LogMatch>(m_ExpectedLogs);
}
m_ShouldRestore = false;
}
public bool CanRestoreFromScriptableObject(Type requestedType)
{
if (m_TestObject == null)
{
return false;
}
return m_TestObjectTypeName == requestedType.AssemblyQualifiedName;
}
public ScriptableObject RestoreScriptableObjectInstance()
{
if (m_TestObject == null)
{
Debug.LogError("No object to restore");
return null;
}
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
var temp = m_TestObject;
m_TestObject = null;
m_TestObjectTypeName = null;
return temp;
}
public bool CanRestoreFromJson(Type requestedType)
{
if (string.IsNullOrEmpty(m_TestObjectTxt))
{
return false;
}
return m_TestObjectTypeName == requestedType.AssemblyQualifiedName;
}
public void RestoreClassFromJson(ref object instance)
{
if (string.IsNullOrEmpty(m_TestObjectTxt))
{
Debug.LogWarning("No JSON representation to restore");
return;
}
JsonUtility.FromJsonOverwrite(m_TestObjectTxt, instance);
m_TestObjectTxt = null;
m_TestObjectTypeName = null;
}
private void OnPlayModeStateChanged(PlayModeStateChange state)
{
if (m_TestObject == null)
{
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
return;
}
//We set the DontSave flag here because the ScriptableObject would be nulled right before entering EditMode
if (state == PlayModeStateChange.ExitingPlayMode)
{
m_TestObject.hideFlags |= HideFlags.DontSave;
}
else if (state == PlayModeStateChange.EnteredEditMode)
{
m_TestObject.hideFlags = m_OriginalHideFlags;
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
}
}
}
}

View file

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