FrameTimeGraphSelectionTests.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. using NUnit.Framework;
  2. using System.Collections.Generic;
  3. using UnityEditor.Performance.ProfileAnalyzer;
  4. using UnityEngine;
  5. using System.Text;
  6. public class FrameTimeGraphSelectionTests
  7. {
  8. static readonly MoveTestConfiguration[] k_MoveTestConfigurations =
  9. {
  10. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  11. {
  12. new TestConfiguration.SelectionRange(0, 10)
  13. }, 10), // range[0-9] + 10
  14. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  15. {
  16. new TestConfiguration.SelectionRange(20, 10)
  17. }, -10), // range[20-29] - 10
  18. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  19. {
  20. new TestConfiguration.SelectionRange(50, 10),
  21. new TestConfiguration.SelectionRange(100, 10)
  22. }, 10), // multi-select range[50-59][100-109] + 10
  23. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  24. {
  25. new TestConfiguration.SelectionRange(50, 10),
  26. new TestConfiguration.SelectionRange(100, 10)
  27. }, -10), // multi-select range[50-59][100-109] - 10
  28. };
  29. // Expects a 300 frame capture.
  30. static readonly MoveTestConfiguration[] k_MoveClampToBoundsTestConfigurations =
  31. {
  32. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  33. {
  34. new TestConfiguration.SelectionRange(0, 10)
  35. }, -10), // range[0-9] - 10
  36. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  37. {
  38. new TestConfiguration.SelectionRange(290, 10)
  39. }, 10), // range[290-299] + 10
  40. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  41. {
  42. new TestConfiguration.SelectionRange(0, 10),
  43. new TestConfiguration.SelectionRange(50, 10)
  44. }, -10), // multi-select range[0-9][50-59] - 10
  45. new MoveTestConfiguration(new TestConfiguration.SelectionRange[]
  46. {
  47. new TestConfiguration.SelectionRange(0, 10),
  48. new TestConfiguration.SelectionRange(290, 10)
  49. }, 10), // multi-select range[0-9][290-299] + 10
  50. };
  51. static readonly ResizeTestConfiguration[] k_ResizeTestConfigurations =
  52. {
  53. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  54. {
  55. new TestConfiguration.SelectionRange(100, 100)
  56. }, -10, 10), // range[100-199] grow [-10, 10]
  57. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  58. {
  59. new TestConfiguration.SelectionRange(100, 100)
  60. }, 10, -10), // range[100-199] shrink [10, -10]
  61. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  62. {
  63. new TestConfiguration.SelectionRange(50, 50),
  64. new TestConfiguration.SelectionRange(200, 50)
  65. }, -10, 10), // multi-select range[50-99][200-249] grow [-10, 10]
  66. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  67. {
  68. new TestConfiguration.SelectionRange(50, 50),
  69. new TestConfiguration.SelectionRange(200, 50)
  70. }, 10, -10), // multi-select range[50-99][200-249] shrink [10, -10]
  71. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  72. {
  73. new TestConfiguration.SelectionRange(50, 50),
  74. new TestConfiguration.SelectionRange(200, 50)
  75. }, -10, 0), // multi-select range[50-99][200-249] grow left [-10, 0]
  76. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  77. {
  78. new TestConfiguration.SelectionRange(50, 50),
  79. new TestConfiguration.SelectionRange(200, 50)
  80. }, 0, 10), // multi-select range[50-99][200-249] grow right [0, 10]
  81. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  82. {
  83. new TestConfiguration.SelectionRange(50, 50),
  84. new TestConfiguration.SelectionRange(200, 50)
  85. }, 10, 0), // multi-select range[50-99][200-249] shrink left [10, 0]
  86. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  87. {
  88. new TestConfiguration.SelectionRange(50, 50),
  89. new TestConfiguration.SelectionRange(200, 50)
  90. }, 0, -10), // multi-select range[50-99][200-249] shrink right [0, -10]
  91. };
  92. // Expects a 300 frame capture.
  93. static readonly ResizeTestConfiguration[] k_ResizeClampToBoundsTestConfigurations =
  94. {
  95. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  96. {
  97. new TestConfiguration.SelectionRange(0, 10)
  98. }, -10, 0), // range[0-9] grow left [-10, 0]
  99. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  100. {
  101. new TestConfiguration.SelectionRange(290, 10)
  102. }, 0, 10), // range[290-299] grow right [0, 10]
  103. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  104. {
  105. new TestConfiguration.SelectionRange(0, 10),
  106. new TestConfiguration.SelectionRange(50, 10)
  107. }, -10, 0), // range[0-9][50-59] grow left [-10, 0]
  108. new ResizeTestConfiguration(new TestConfiguration.SelectionRange[]
  109. {
  110. new TestConfiguration.SelectionRange(0, 10),
  111. new TestConfiguration.SelectionRange(290, 10)
  112. }, 0, 10), // range[0-9][290-299] grow right [0, 10]
  113. };
  114. FrameTimeGraph m_FrameTimeGraph;
  115. List<int> m_ReportedSelection;
  116. [OneTimeSetUp]
  117. public void OneTimeSetUp()
  118. {
  119. var data = GenerateFrameTimeGraphData();
  120. m_FrameTimeGraph = NewFrameTimeGraph();
  121. m_FrameTimeGraph.SetData(data);
  122. m_FrameTimeGraph.SetRangeCallback(OnFrameTimeGraphDidSetRange);
  123. }
  124. [SetUp]
  125. public void SetUp()
  126. {
  127. m_ReportedSelection = new List<int>();
  128. }
  129. [Test]
  130. public void FrameTimeGraph_MoveSelectedRange([ValueSource("k_MoveTestConfigurations")] MoveTestConfiguration configuration)
  131. {
  132. List<int> expectedSelection = ExpectedSelectedFramesForMoveTestConfiguration(configuration);
  133. FrameTimeGraph_MoveSelectedRange(configuration, expectedSelection);
  134. }
  135. [Test]
  136. public void FrameTimeGraph_MoveSelectedRange_DoesNotMovePastGraphBounds([ValueSource("k_MoveClampToBoundsTestConfigurations")] MoveTestConfiguration configuration)
  137. {
  138. List<int> expectedSelection = InitialSelectedFramesForTestConfiguration(configuration);
  139. FrameTimeGraph_MoveSelectedRange(configuration, expectedSelection);
  140. }
  141. void FrameTimeGraph_MoveSelectedRange(MoveTestConfiguration configuration, List<int> expectedSelection)
  142. {
  143. var offset = configuration.offset;
  144. int clickCount = 1;
  145. bool singleClickAction = true;
  146. var currentSelectionState = SelectedRangeStateFromTestConfiguration(configuration);
  147. m_FrameTimeGraph.MoveSelectedRange(offset, clickCount, singleClickAction, FrameTimeGraph.State.None, currentSelectionState);
  148. CollectionAssert.AreEqual(expectedSelection, m_ReportedSelection);
  149. }
  150. [Test]
  151. public void FrameTimeGraph_ResizeSelectedRange([ValueSource("k_ResizeTestConfigurations")] ResizeTestConfiguration configuration)
  152. {
  153. List<int> expectedSelection = ExpectedSelectedFramesForResizeTestConfiguration(configuration);
  154. FrameTimeGraph_ResizeSelectedRange(configuration, expectedSelection);
  155. }
  156. [Test]
  157. public void FrameTimeGraph_ResizeSelectedRange_DoesNotMovePastGraphBounds([ValueSource("k_ResizeClampToBoundsTestConfigurations")] ResizeTestConfiguration configuration)
  158. {
  159. List<int> expectedSelection = InitialSelectedFramesForTestConfiguration(configuration);
  160. FrameTimeGraph_ResizeSelectedRange(configuration, expectedSelection);
  161. }
  162. void FrameTimeGraph_ResizeSelectedRange(ResizeTestConfiguration configuration, List<int> expectedSelection)
  163. {
  164. var leftOffset = configuration.leftOffset;
  165. var rightOffset = configuration.rightOffset;
  166. int clickCount = 1;
  167. bool singleClickAction = true;
  168. var currentSelectionState = SelectedRangeStateFromTestConfiguration(configuration);
  169. m_FrameTimeGraph.ResizeSelectedRange(leftOffset, rightOffset, clickCount, singleClickAction, FrameTimeGraph.State.None, currentSelectionState);
  170. CollectionAssert.AreEqual(expectedSelection, m_ReportedSelection);
  171. }
  172. FrameTimeGraph NewFrameTimeGraph()
  173. {
  174. var draw2D = new Draw2D("Unlit/ProfileAnalyzerShader");
  175. DisplayUnits displayUnits = new DisplayUnits(Units.Milliseconds);
  176. return new FrameTimeGraph(0, draw2D, displayUnits.Units, ProfileAnalyzerWindow.UIColor.barBackground, ProfileAnalyzerWindow.UIColor.barBackgroundSelected, ProfileAnalyzerWindow.UIColor.bar, ProfileAnalyzerWindow.UIColor.barSelected, ProfileAnalyzerWindow.UIColor.marker, ProfileAnalyzerWindow.UIColor.markerSelected, ProfileAnalyzerWindow.UIColor.thread, ProfileAnalyzerWindow.UIColor.threadSelected, ProfileAnalyzerWindow.UIColor.gridLines);
  177. }
  178. List<FrameTimeGraph.Data> GenerateFrameTimeGraphData()
  179. {
  180. const int k_DataLength = 300;
  181. var data = new List<FrameTimeGraph.Data>(k_DataLength);
  182. int i = 0;
  183. while (i < k_DataLength)
  184. {
  185. var frameData = new FrameTimeGraph.Data(Random.value * 16, i);
  186. data.Add(frameData);
  187. i++;
  188. }
  189. return data;
  190. }
  191. void OnFrameTimeGraphDidSetRange(List<int> selected, int clickCount, FrameTimeGraph.State inputStatus)
  192. {
  193. m_ReportedSelection = selected;
  194. }
  195. FrameTimeGraph.SelectedRangeState SelectedRangeStateFromTestConfiguration(TestConfiguration configuration)
  196. {
  197. List<int> selectedFrames = InitialSelectedFramesForTestConfiguration(configuration);
  198. int currentSelectionFirstDataOffset;
  199. int currentSelectionLastDataOffset;
  200. int firstFrameOffset;
  201. int lastFrameOffset;
  202. m_FrameTimeGraph.GetSelectedRange(selectedFrames, out currentSelectionFirstDataOffset, out currentSelectionLastDataOffset, out firstFrameOffset, out lastFrameOffset);
  203. return new FrameTimeGraph.SelectedRangeState()
  204. {
  205. currentSelectionFirstDataOffset = currentSelectionFirstDataOffset,
  206. currentSelectionLastDataOffset = currentSelectionLastDataOffset,
  207. lastSelectedFrameOffsets = selectedFrames,
  208. };
  209. }
  210. List<int> InitialSelectedFramesForTestConfiguration(TestConfiguration configuration)
  211. {
  212. List<int> selectedFrames = new List<int>();
  213. foreach (var selectionRange in configuration.selections)
  214. {
  215. var selectionFrames = GenerateListOfFrames(selectionRange.origin, selectionRange.length);
  216. selectedFrames.AddRange(selectionFrames);
  217. }
  218. return selectedFrames;
  219. }
  220. List<int> ExpectedSelectedFramesForMoveTestConfiguration(MoveTestConfiguration configuration)
  221. {
  222. List<int> selectedFrames = new List<int>();
  223. var offset = configuration.offset;
  224. foreach (var selectionRange in configuration.selections)
  225. {
  226. var selectionFrames = GenerateListOfFrames(selectionRange.origin + offset, selectionRange.length);
  227. selectedFrames.AddRange(selectionFrames);
  228. }
  229. return selectedFrames;
  230. }
  231. List<int> ExpectedSelectedFramesForResizeTestConfiguration(ResizeTestConfiguration configuration)
  232. {
  233. List<int> selectedFrames = new List<int>();
  234. var leftOffset = configuration.leftOffset;
  235. var rightOffset = configuration.rightOffset;
  236. foreach (var selectionRange in configuration.selections)
  237. {
  238. var leftIndex = selectionRange.origin + leftOffset;
  239. var rightIndex = selectionRange.LastIndex + rightOffset;
  240. var selectionLength = rightIndex - leftIndex + 1;
  241. var selectionFrames = GenerateListOfFrames(selectionRange.origin + leftOffset, selectionLength);
  242. selectedFrames.AddRange(selectionFrames);
  243. }
  244. return selectedFrames;
  245. }
  246. List<int> GenerateListOfFrames(int origin, int count)
  247. {
  248. var frames = new List<int>();
  249. int i = 0;
  250. while (i < count)
  251. {
  252. frames.Add(origin + i);
  253. ++i;
  254. }
  255. return frames;
  256. }
  257. public class TestConfiguration
  258. {
  259. public SelectionRange[] selections;
  260. public TestConfiguration(SelectionRange[] selections)
  261. {
  262. this.selections = selections;
  263. }
  264. protected string SelectionsToString()
  265. {
  266. var stringBuilder = new StringBuilder();
  267. for (int i = 0; i < selections.Length; ++i)
  268. {
  269. var selection = selections[i];
  270. stringBuilder.AppendFormat("[{0}-{1}]", selection.origin, selection.LastIndex);
  271. }
  272. return stringBuilder.ToString();
  273. }
  274. public struct SelectionRange
  275. {
  276. public int origin;
  277. public int length;
  278. public SelectionRange(int origin, int length)
  279. {
  280. this.origin = origin;
  281. this.length = length;
  282. }
  283. public int LastIndex
  284. {
  285. get
  286. {
  287. return origin + length - 1;
  288. }
  289. }
  290. }
  291. }
  292. public class MoveTestConfiguration : TestConfiguration
  293. {
  294. public int offset;
  295. public MoveTestConfiguration(SelectionRange[] selections, int offset) : base(selections)
  296. {
  297. this.offset = offset;
  298. }
  299. public override string ToString()
  300. {
  301. var stringBuilder = new StringBuilder();
  302. if (selections.Length > 1)
  303. {
  304. stringBuilder.Append("multi-range");
  305. }
  306. else
  307. {
  308. stringBuilder.Append("range");
  309. }
  310. stringBuilder.Append(SelectionsToString());
  311. stringBuilder.Append(" | ");
  312. stringBuilder.AppendFormat("{0}[{1}]", (offset > 0) ? "right" : "left", offset);
  313. return stringBuilder.ToString();
  314. }
  315. }
  316. public class ResizeTestConfiguration : TestConfiguration
  317. {
  318. public int leftOffset;
  319. public int rightOffset;
  320. public ResizeTestConfiguration(SelectionRange[] selections, int leftOffset, int rightOffset) : base(selections)
  321. {
  322. this.leftOffset = leftOffset;
  323. this.rightOffset = rightOffset;
  324. }
  325. public override string ToString()
  326. {
  327. var stringBuilder = new StringBuilder();
  328. if (selections.Length > 1)
  329. {
  330. stringBuilder.Append("multi-range");
  331. }
  332. else
  333. {
  334. stringBuilder.Append("range");
  335. }
  336. stringBuilder.Append(SelectionsToString());
  337. stringBuilder.Append(" | ");
  338. bool hasLeftOffset = leftOffset != 0;
  339. if (hasLeftOffset)
  340. {
  341. var leftAction = (leftOffset < 0) ? "grow-left" : "shrink-left";
  342. stringBuilder.AppendFormat("{0}[{1}]", leftAction, leftOffset);
  343. }
  344. if (rightOffset != 0)
  345. {
  346. if (hasLeftOffset)
  347. {
  348. stringBuilder.Append(" ");
  349. }
  350. var rightAction = (rightOffset > 0) ? "grow-right" : "shrink-right";
  351. stringBuilder.AppendFormat("{0}[{1}]", rightAction, rightOffset);
  352. }
  353. return stringBuilder.ToString();
  354. }
  355. }
  356. }