Initial Commit
This commit is contained in:
parent
53eb92e9af
commit
270ab7d11f
15341 changed files with 700234 additions and 0 deletions
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 96c503bf059df984c86eecf572370347
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b88caca58e05ee74486d86fb404c48e2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6d2f47eae5f447748892c46848956d5f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: dd57b1176859fc84e93586103d3b5f73
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 124533853216377448d786fd7c725701
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Add table
Add a link
Reference in a new issue