291 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Linq;
 | |
| using UnityEditor.Callbacks;
 | |
| using UnityEditor.Scripting.ScriptCompilation;
 | |
| 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
 | |
|     {
 | |
|         private const string WindowTitle = "Test Runner";
 | |
| 
 | |
|         internal static class Styles
 | |
|         {
 | |
|             public static GUIStyle info;
 | |
|             public static GUIStyle testList;
 | |
| 
 | |
|             static Styles()
 | |
|             {
 | |
|                 info = new GUIStyle("CN Message");
 | |
|                 info.wordWrap = true;
 | |
|                 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
 | |
|         {
 | |
|             EditMode = 0,
 | |
|             PlayMode,
 | |
|             Player
 | |
|         }
 | |
|         [SerializeField]
 | |
|         private TestRunnerMenuLabels m_TestTypeToolbarIndex = TestRunnerMenuLabels.EditMode;
 | |
|         internal TestListGUI m_SelectedTestTypes;
 | |
|         [SerializeField]
 | |
|         private TestListGUI[] m_TestListGUIs;
 | |
| 
 | |
|         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>(WindowTitle);
 | |
|             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)
 | |
|             {
 | |
|                 var testListGUI = s_Instance.m_SelectedTestTypes;
 | |
|                 if (testListGUI.HasTreeData())
 | |
|                 {
 | |
|                     //repaint message details after exit playmode
 | |
|                     testListGUI.TestSelectionCallback(testListGUI.m_TestListState.selectedIDs.ToArray());
 | |
|                     s_Instance.Repaint();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         internal void OnDestroy()
 | |
|         {
 | |
|             EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
 | |
|         }
 | |
| 
 | |
|         private void OnEnable()
 | |
|         {
 | |
|             s_Instance = this;
 | |
|             titleContent = new GUIContent(WindowTitle, "Test framework for running Edit mode and Play mode tests in Unity. Part of the com.unity.test-framework package.");
 | |
|             SelectTestListGUI(m_TestTypeToolbarIndex);
 | |
| 
 | |
|             m_testRunnerApi = CreateInstance<TestRunnerApi>();
 | |
|             m_WindowResultUpdater = new WindowResultUpdater();
 | |
|             m_testRunnerApi.RegisterCallbacks(m_WindowResultUpdater);
 | |
|         }
 | |
| 
 | |
|         private void Enable()
 | |
|         {
 | |
|             m_Settings = new TestRunnerWindowSettings("UnityEditor.PlaymodeTestsRunnerWindow");
 | |
| 
 | |
|             if (m_SelectedTestTypes == null)
 | |
|             {
 | |
|                 SelectTestListGUI(m_TestTypeToolbarIndex);
 | |
|             }
 | |
| 
 | |
|             StartRetrieveTestList();
 | |
|             m_SelectedTestTypes.Reload();
 | |
|             m_Enabled = true;
 | |
|         }
 | |
| 
 | |
|         private void SelectTestListGUI(TestRunnerMenuLabels testTypeToolbarIndex)
 | |
|         {
 | |
|             if (m_TestListGUIs == null)
 | |
|             {
 | |
|                 m_TestListGUIs = new TestListGUI[]
 | |
|                 {
 | |
|                     new TestListGUI()
 | |
|                     {
 | |
|                         m_TestMode = TestMode.EditMode,
 | |
|                     },
 | |
|                     new TestListGUI()
 | |
|                     {
 | |
|                         m_TestMode = TestMode.PlayMode,
 | |
|                     },
 | |
|                     new TestListGUI()
 | |
|                     {
 | |
|                         m_TestMode = TestMode.PlayMode,
 | |
|                         m_RunOnPlatform = true
 | |
|                     }
 | |
|                 };
 | |
|             }
 | |
| 
 | |
|             m_TestListGUIs[0].m_TestMode = TestMode.EditMode;
 | |
|             m_TestListGUIs[0].m_RunOnPlatform = false;
 | |
|             m_TestListGUIs[1].m_TestMode = TestMode.PlayMode;
 | |
|             m_TestListGUIs[1].m_RunOnPlatform = false;
 | |
|             m_TestListGUIs[2].m_TestMode = TestMode.PlayMode;
 | |
|             m_TestListGUIs[2].m_RunOnPlatform = true;
 | |
| 
 | |
|             m_SelectedTestTypes = m_TestListGUIs[(int)testTypeToolbarIndex];
 | |
|         }
 | |
| 
 | |
|         private void StartRetrieveTestList()
 | |
|         {
 | |
|             var listToInit = m_SelectedTestTypes;
 | |
|             m_testRunnerApi.RetrieveTestList(listToInit.m_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 = (TestRunnerMenuLabels)GUILayout.Toolbar((int)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(position.width);
 | |
| 
 | |
|             if (m_Settings.verticalSplit)
 | |
|                 SplitterGUILayout.EndVerticalSplit();
 | |
|             else
 | |
|                 SplitterGUILayout.EndHorizontalSplit();
 | |
| 
 | |
|             m_SelectedTestTypes.PrintProgressBar(position);
 | |
| 
 | |
|             EditorGUILayout.BeginVertical();
 | |
|             using (new EditorGUI.DisabledScope(EditorApplication.isPlayingOrWillChangePlaymode))
 | |
|             {
 | |
|                 m_SelectedTestTypes.PrintBottomPanel();
 | |
|             }
 | |
|             EditorGUILayout.EndVertical();
 | |
|         }
 | |
| 
 | |
|         /// <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();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |