You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
9.1 KiB
266 lines
9.1 KiB
using System; |
|
using UnityEditor.Callbacks; |
|
using UnityEditor.TestTools.TestRunner.Api; |
|
using UnityEditor.TestTools.TestRunner.GUI; |
|
using UnityEngine; |
|
|
|
namespace UnityEditor.TestTools.TestRunner |
|
{ |
|
/// <summary> |
|
/// The TestRunnerWindow class is repsonsible for drawing the Test Runner window. |
|
/// </summary> |
|
[Serializable] |
|
public class TestRunnerWindow : EditorWindow, IHasCustomMenu |
|
{ |
|
internal static class Styles |
|
{ |
|
public static GUIStyle info; |
|
public static GUIStyle testList; |
|
|
|
static Styles() |
|
{ |
|
info = new GUIStyle(EditorStyles.wordWrappedLabel); |
|
info.wordWrap = false; |
|
info.stretchHeight = true; |
|
info.margin.right = 15; |
|
|
|
testList = new GUIStyle("CN Box"); |
|
testList.margin.top = 0; |
|
testList.padding.left = 3; |
|
} |
|
} |
|
|
|
private readonly GUIContent m_GUIHorizontalSplit = EditorGUIUtility.TrTextContent("Horizontal layout"); |
|
private readonly GUIContent m_GUIVerticalSplit = EditorGUIUtility.TrTextContent("Vertical layout"); |
|
private readonly GUIContent m_GUIDisablePlaymodeTestsRunner = EditorGUIUtility.TrTextContent("Disable playmode tests for all assemblies"); |
|
private readonly GUIContent m_GUIRunPlayModeTestAsEditModeTests = EditorGUIUtility.TrTextContent("Run playmode tests as editmode tests"); |
|
|
|
internal static TestRunnerWindow s_Instance; |
|
private bool m_IsBuilding; |
|
[NonSerialized] |
|
private bool m_Enabled; |
|
internal TestFilterSettings filterSettings; |
|
|
|
[SerializeField] |
|
private SplitterState m_Spl = new SplitterState(new float[] { 75, 25 }, new[] { 32, 32 }, null); |
|
|
|
private TestRunnerWindowSettings m_Settings; |
|
|
|
private enum TestRunnerMenuLabels |
|
{ |
|
PlayMode = 0, |
|
EditMode = 1 |
|
} |
|
[SerializeField] |
|
private int m_TestTypeToolbarIndex = (int)TestRunnerMenuLabels.EditMode; |
|
[SerializeField] |
|
private PlayModeTestListGUI m_PlayModeTestListGUI; |
|
[SerializeField] |
|
private EditModeTestListGUI m_EditModeTestListGUI; |
|
|
|
internal TestListGUI m_SelectedTestTypes; |
|
|
|
private ITestRunnerApi m_testRunnerApi; |
|
|
|
private WindowResultUpdater m_WindowResultUpdater; |
|
|
|
/// <summary> |
|
/// Launches the Test Runner window. |
|
/// </summary> |
|
[MenuItem("Window/General/Test Runner", false, 201, false)] |
|
public static void ShowWindow() |
|
{ |
|
s_Instance = GetWindow<TestRunnerWindow>("Test Runner"); |
|
s_Instance.Show(); |
|
} |
|
|
|
static TestRunnerWindow() |
|
{ |
|
InitBackgroundRunners(); |
|
} |
|
|
|
private static void InitBackgroundRunners() |
|
{ |
|
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; |
|
EditorApplication.playModeStateChanged += OnPlayModeStateChanged; |
|
} |
|
|
|
[DidReloadScripts] |
|
private static void CompilationCallback() |
|
{ |
|
UpdateWindow(); |
|
} |
|
|
|
private static void OnPlayModeStateChanged(PlayModeStateChange state) |
|
{ |
|
if (s_Instance && state == PlayModeStateChange.EnteredEditMode && s_Instance.m_SelectedTestTypes.HasTreeData()) |
|
{ |
|
//repaint message details after exit playmode |
|
s_Instance.m_SelectedTestTypes.TestSelectionCallback(s_Instance.m_SelectedTestTypes.m_TestListState.selectedIDs.ToArray()); |
|
s_Instance.Repaint(); |
|
} |
|
} |
|
|
|
internal void OnDestroy() |
|
{ |
|
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; |
|
} |
|
|
|
private void OnEnable() |
|
{ |
|
s_Instance = this; |
|
SelectTestListGUI(m_TestTypeToolbarIndex); |
|
|
|
m_testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>(); |
|
m_WindowResultUpdater = new WindowResultUpdater(); |
|
m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater); |
|
} |
|
|
|
private void Enable() |
|
{ |
|
m_Settings = new TestRunnerWindowSettings("UnityEditor.PlaymodeTestsRunnerWindow"); |
|
filterSettings = new TestFilterSettings("UnityTest.IntegrationTestsRunnerWindow"); |
|
|
|
if (m_SelectedTestTypes == null) |
|
{ |
|
SelectTestListGUI(m_TestTypeToolbarIndex); |
|
} |
|
|
|
StartRetrieveTestList(); |
|
m_SelectedTestTypes.Reload(); |
|
m_Enabled = true; |
|
} |
|
|
|
private void SelectTestListGUI(int testTypeToolbarIndex) |
|
{ |
|
if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.PlayMode) |
|
{ |
|
if (m_PlayModeTestListGUI == null) |
|
{ |
|
m_PlayModeTestListGUI = new PlayModeTestListGUI(); |
|
} |
|
m_SelectedTestTypes = m_PlayModeTestListGUI; |
|
} |
|
else if (testTypeToolbarIndex == (int)TestRunnerMenuLabels.EditMode) |
|
{ |
|
if (m_EditModeTestListGUI == null) |
|
{ |
|
m_EditModeTestListGUI = new EditModeTestListGUI(); |
|
} |
|
m_SelectedTestTypes = m_EditModeTestListGUI; |
|
} |
|
} |
|
|
|
private void StartRetrieveTestList() |
|
{ |
|
if (!m_SelectedTestTypes.HasTreeData()) |
|
{ |
|
var listToInit = m_SelectedTestTypes; |
|
m_testRunnerApi.RetrieveTestList(m_SelectedTestTypes.TestMode, (rootTest) => |
|
{ |
|
listToInit.Init(this, rootTest); |
|
listToInit.Reload(); |
|
}); |
|
} |
|
} |
|
|
|
internal void OnGUI() |
|
{ |
|
if (!m_Enabled) |
|
{ |
|
Enable(); |
|
} |
|
|
|
if (BuildPipeline.isBuildingPlayer) |
|
{ |
|
m_IsBuilding = true; |
|
} |
|
else if (m_IsBuilding) |
|
{ |
|
m_IsBuilding = false; |
|
Repaint(); |
|
} |
|
|
|
EditorGUILayout.BeginHorizontal(); |
|
GUILayout.FlexibleSpace(); |
|
var selectedIndex = m_TestTypeToolbarIndex; |
|
m_TestTypeToolbarIndex = GUILayout.Toolbar(m_TestTypeToolbarIndex, Enum.GetNames(typeof(TestRunnerMenuLabels)), "LargeButton", UnityEngine.GUI.ToolbarButtonSize.FitToContents); |
|
GUILayout.FlexibleSpace(); |
|
EditorGUILayout.EndHorizontal(); |
|
|
|
if (selectedIndex != m_TestTypeToolbarIndex) |
|
{ |
|
SelectTestListGUI(m_TestTypeToolbarIndex); |
|
StartRetrieveTestList(); |
|
} |
|
|
|
EditorGUILayout.BeginVertical(); |
|
using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode)) |
|
{ |
|
m_SelectedTestTypes.PrintHeadPanel(); |
|
} |
|
EditorGUILayout.EndVertical(); |
|
|
|
if (m_Settings.verticalSplit) |
|
SplitterGUILayout.BeginVerticalSplit(m_Spl); |
|
else |
|
SplitterGUILayout.BeginHorizontalSplit(m_Spl); |
|
|
|
EditorGUILayout.BeginVertical(); |
|
EditorGUILayout.BeginVertical(Styles.testList); |
|
m_SelectedTestTypes.RenderTestList(); |
|
EditorGUILayout.EndVertical(); |
|
EditorGUILayout.EndVertical(); |
|
|
|
m_SelectedTestTypes.RenderDetails(); |
|
|
|
if (m_Settings.verticalSplit) |
|
SplitterGUILayout.EndVerticalSplit(); |
|
else |
|
SplitterGUILayout.EndHorizontalSplit(); |
|
} |
|
|
|
/// <summary> |
|
/// Adds additional menu items to the Test Runner window. |
|
/// </summary> |
|
/// <param name="menu">The <see cref="GenericMenu"/></param> |
|
public void AddItemsToMenu(GenericMenu menu) |
|
{ |
|
menu.AddItem(m_GUIVerticalSplit, m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); |
|
menu.AddItem(m_GUIHorizontalSplit, !m_Settings.verticalSplit, m_Settings.ToggleVerticalSplit); |
|
|
|
menu.AddSeparator(null); |
|
|
|
if (EditorPrefs.GetBool("InternalMode", false)) |
|
{ |
|
menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () => |
|
{ |
|
PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest; |
|
}); |
|
} |
|
|
|
if (PlayerSettings.playModeTestRunnerEnabled) |
|
{ |
|
PlayerSettings.playModeTestRunnerEnabled = false; |
|
EditorUtility.DisplayDialog(m_GUIDisablePlaymodeTestsRunner.text, "You need to restart the editor now", "Ok"); |
|
} |
|
} |
|
|
|
internal void RebuildUIFilter() |
|
{ |
|
if (m_SelectedTestTypes != null && m_SelectedTestTypes.HasTreeData()) |
|
{ |
|
m_SelectedTestTypes.RebuildUIFilter(); |
|
} |
|
} |
|
|
|
internal static void UpdateWindow() |
|
{ |
|
if (s_Instance != null && s_Instance.m_SelectedTestTypes != null) |
|
{ |
|
s_Instance.m_SelectedTestTypes.Repaint(); |
|
s_Instance.Repaint(); |
|
} |
|
} |
|
} |
|
}
|
|
|