TestRunnerUIFilter.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.TestTools.TestRunner.GUI;
  6. namespace UnityEditor.TestTools.TestRunner.GUI
  7. {
  8. [Serializable]
  9. internal class TestRunnerUIFilter
  10. {
  11. private int m_PassedCount;
  12. private int m_FailedCount;
  13. private int m_NotRunCount;
  14. private int m_InconclusiveCount;
  15. private int m_SkippedCount;
  16. public int PassedCount { get { return m_PassedCount; } }
  17. public int FailedCount { get { return m_FailedCount + m_InconclusiveCount; } }
  18. public int NotRunCount { get { return m_NotRunCount + m_SkippedCount; } }
  19. [SerializeField]
  20. public bool PassedHidden;
  21. [SerializeField]
  22. public bool FailedHidden;
  23. [SerializeField]
  24. public bool NotRunHidden;
  25. [SerializeField]
  26. private string m_SearchString;
  27. [SerializeField]
  28. private int selectedCategoryMask;
  29. public string[] availableCategories = new string[0];
  30. private GUIContent m_SucceededBtn;
  31. private GUIContent m_FailedBtn;
  32. private GUIContent m_NotRunBtn;
  33. public Action RebuildTestList;
  34. public Action<string> SearchStringChanged;
  35. public Action SearchStringCleared;
  36. public bool IsFiltering
  37. {
  38. get
  39. {
  40. return !string.IsNullOrEmpty(m_SearchString) || PassedHidden || FailedHidden || NotRunHidden ||
  41. selectedCategoryMask != 0;
  42. }
  43. }
  44. public string[] CategoryFilter
  45. {
  46. get
  47. {
  48. var list = new List<string>();
  49. for (int i = 0; i < availableCategories.Length; i++)
  50. {
  51. if ((selectedCategoryMask & (1 << i)) != 0)
  52. {
  53. list.Add(availableCategories[i]);
  54. }
  55. }
  56. return list.ToArray();
  57. }
  58. }
  59. public void UpdateCounters(List<TestRunnerResult> resultList)
  60. {
  61. m_PassedCount = m_FailedCount = m_NotRunCount = m_InconclusiveCount = m_SkippedCount = 0;
  62. foreach (var result in resultList)
  63. {
  64. if (result.isSuite)
  65. continue;
  66. switch (result.resultStatus)
  67. {
  68. case TestRunnerResult.ResultStatus.Passed:
  69. m_PassedCount++;
  70. break;
  71. case TestRunnerResult.ResultStatus.Failed:
  72. m_FailedCount++;
  73. break;
  74. case TestRunnerResult.ResultStatus.Inconclusive:
  75. m_InconclusiveCount++;
  76. break;
  77. case TestRunnerResult.ResultStatus.Skipped:
  78. m_SkippedCount++;
  79. break;
  80. case TestRunnerResult.ResultStatus.NotRun:
  81. default:
  82. m_NotRunCount++;
  83. break;
  84. }
  85. }
  86. var succeededTooltip = string.Format("Show tests that succeeded\n{0} succeeded", m_PassedCount);
  87. m_SucceededBtn = new GUIContent(PassedCount.ToString(), Icons.s_SuccessImg, succeededTooltip);
  88. var failedTooltip = string.Format("Show tests that failed\n{0} failed\n{1} inconclusive", m_FailedCount, m_InconclusiveCount);
  89. m_FailedBtn = new GUIContent(FailedCount.ToString(), Icons.s_FailImg, failedTooltip);
  90. var notRunTooltip = string.Format("Show tests that didn't run\n{0} didn't run\n{1} skipped or ignored", m_NotRunCount, m_SkippedCount);
  91. m_NotRunBtn = new GUIContent(NotRunCount.ToString(), Icons.s_UnknownImg, notRunTooltip);
  92. }
  93. public void Draw()
  94. {
  95. EditorGUI.BeginChangeCheck();
  96. if (m_SearchString == null)
  97. {
  98. m_SearchString = "";
  99. }
  100. m_SearchString = EditorGUILayout.ToolbarSearchField(m_SearchString);
  101. if (EditorGUI.EndChangeCheck() && SearchStringChanged != null)
  102. {
  103. SearchStringChanged(m_SearchString);
  104. if (String.IsNullOrEmpty(m_SearchString))
  105. SearchStringCleared();
  106. }
  107. if (availableCategories != null && availableCategories.Any())
  108. {
  109. EditorGUI.BeginChangeCheck();
  110. selectedCategoryMask = EditorGUILayout.MaskField(selectedCategoryMask, availableCategories, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150));
  111. if (EditorGUI.EndChangeCheck() && RebuildTestList != null)
  112. {
  113. RebuildTestList();
  114. }
  115. }
  116. else
  117. {
  118. EditorGUILayout.Popup(0, new[] { "<No categories available>" }, EditorStyles.toolbarDropDown, GUILayout.MaxWidth(150));
  119. }
  120. EditorGUI.BeginChangeCheck();
  121. if (m_SucceededBtn != null)
  122. {
  123. PassedHidden = !GUILayout.Toggle(!PassedHidden, m_SucceededBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(PassedCount)));
  124. }
  125. if (m_FailedBtn != null)
  126. {
  127. FailedHidden = !GUILayout.Toggle(!FailedHidden, m_FailedBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(FailedCount)));
  128. }
  129. if (m_NotRunBtn != null)
  130. {
  131. NotRunHidden = !GUILayout.Toggle(!NotRunHidden, m_NotRunBtn, EditorStyles.toolbarButton, GUILayout.MaxWidth(GetMaxWidth(NotRunCount)));
  132. }
  133. if (EditorGUI.EndChangeCheck() && RebuildTestList != null)
  134. {
  135. RebuildTestList();
  136. }
  137. }
  138. private static int GetMaxWidth(int count)
  139. {
  140. if (count < 10)
  141. return 33;
  142. return count < 100 ? 40 : 47;
  143. }
  144. public void Clear()
  145. {
  146. PassedHidden = false;
  147. FailedHidden = false;
  148. NotRunHidden = false;
  149. selectedCategoryMask = 0;
  150. m_SearchString = "";
  151. if (SearchStringChanged != null)
  152. {
  153. SearchStringChanged(m_SearchString);
  154. }
  155. if (SearchStringCleared != null)
  156. {
  157. SearchStringCleared();
  158. }
  159. }
  160. }
  161. }