123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Text;
- using UnityEngine;
- using UnityEngine.TestRunner.NUnitExtensions.Runner;
- using UnityEngine.TestTools.Logging;
- using UnityEngine.TestTools.NUnitExtensions;
-
- 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;
- }
- }
- }
- }
|