TestRunnerUIFilter.cs 6.3 KB

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