GetViewsUnderLocationForRootTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #nullable enable
  2. namespace UnitTests_Parallelizable.ViewMouseTests;
  3. [Trait ("Category", "Input")]
  4. public class GetViewsUnderLocationForRootTests
  5. {
  6. [Fact]
  7. public void ReturnsRoot_WhenPointInsideRoot_NoSubviews ()
  8. {
  9. Toplevel top = new ()
  10. {
  11. Frame = new (0, 0, 10, 10)
  12. };
  13. List<View?> result = View.GetViewsUnderLocation (top, new (5, 5), ViewportSettingsFlags.TransparentMouse);
  14. Assert.Contains (top, result);
  15. }
  16. [Fact]
  17. public void ReturnsEmpty_WhenPointOutsideRoot ()
  18. {
  19. Toplevel top = new ()
  20. {
  21. Frame = new (0, 0, 10, 10)
  22. };
  23. List<View?> result = View.GetViewsUnderLocation (top, new (20, 20), ViewportSettingsFlags.TransparentMouse);
  24. Assert.Empty (result);
  25. }
  26. [Fact]
  27. public void ReturnsSubview_WhenPointInsideSubview ()
  28. {
  29. Toplevel top = new ()
  30. {
  31. Frame = new (0, 0, 10, 10)
  32. };
  33. View sub = new ()
  34. {
  35. X = 2, Y = 2, Width = 5, Height = 5
  36. };
  37. top.Add (sub);
  38. List<View?> result = View.GetViewsUnderLocation (top, new (3, 3), ViewportSettingsFlags.TransparentMouse);
  39. Assert.Contains (top, result);
  40. Assert.Contains (sub, result);
  41. Assert.Equal (sub, result.Last ());
  42. }
  43. [Fact]
  44. public void ReturnsTop_WhenPointInsideSubview_With_TransparentMouse ()
  45. {
  46. Toplevel top = new ()
  47. {
  48. Frame = new (0, 0, 10, 10)
  49. };
  50. View sub = new ()
  51. {
  52. X = 2, Y = 2, Width = 5, Height = 5,
  53. ViewportSettings = ViewportSettingsFlags.TransparentMouse
  54. };
  55. top.Add (sub);
  56. List<View?> result = View.GetViewsUnderLocation (top, new (3, 3), ViewportSettingsFlags.TransparentMouse);
  57. Assert.Single (result);
  58. Assert.Contains (top, result);
  59. result = View.GetViewsUnderLocation (top, new (3, 3), ViewportSettingsFlags.None);
  60. Assert.Equal (2, result.Count);
  61. Assert.Contains (top, result);
  62. Assert.Contains (sub, result);
  63. }
  64. [Fact]
  65. public void ReturnsAdornment_WhenPointInMargin ()
  66. {
  67. Toplevel top = new ()
  68. {
  69. Frame = new (0, 0, 10, 10)
  70. };
  71. top.Margin!.Thickness = new (1);
  72. top.Margin!.ViewportSettings = ViewportSettingsFlags.None;
  73. List<View?> result = View.GetViewsUnderLocation (top, new (0, 0), ViewportSettingsFlags.TransparentMouse);
  74. Assert.Contains (top, result);
  75. Assert.Contains (top.Margin, result);
  76. }
  77. [Fact]
  78. public void Returns_WhenPointIn_TransparentToMouseMargin_None ()
  79. {
  80. Toplevel top = new ()
  81. {
  82. Frame = new (0, 0, 10, 10)
  83. };
  84. top.Margin!.Thickness = new (1);
  85. top.Margin!.ViewportSettings = ViewportSettingsFlags.TransparentMouse;
  86. List<View?> result = View.GetViewsUnderLocation (top, new (0, 0), ViewportSettingsFlags.TransparentMouse);
  87. Assert.DoesNotContain (top, result);
  88. Assert.DoesNotContain (top.Margin, result);
  89. }
  90. [Fact]
  91. public void Returns_WhenPointIn_NotTransparentToMouseMargin_Top_And_Margin ()
  92. {
  93. Toplevel top = new ()
  94. {
  95. Frame = new (0, 0, 10, 10)
  96. };
  97. top.Margin!.Thickness = new (1);
  98. top.Margin!.ViewportSettings = ViewportSettingsFlags.None;
  99. List<View?> result = View.GetViewsUnderLocation (top, new (0, 0), ViewportSettingsFlags.TransparentMouse);
  100. Assert.Contains (top, result);
  101. Assert.Contains (top.Margin, result);
  102. }
  103. [Fact]
  104. public void ReturnsAdornment_WhenPointInBorder ()
  105. {
  106. Toplevel top = new ()
  107. {
  108. Frame = new (0, 0, 10, 10)
  109. };
  110. top.Border!.Thickness = new (1);
  111. List<View?> result = View.GetViewsUnderLocation (top, new (0, 0), ViewportSettingsFlags.TransparentMouse);
  112. Assert.Contains (top, result);
  113. Assert.Contains (top.Border, result);
  114. }
  115. [Fact]
  116. public void ReturnsAdornment_WhenPointInPadding ()
  117. {
  118. Toplevel top = new ()
  119. {
  120. Frame = new (0, 0, 10, 10)
  121. };
  122. top.Border!.Thickness = new (1);
  123. top.Padding!.Thickness = new (1);
  124. top.Layout ();
  125. List<View?> result = View.GetViewsUnderLocation (top, new (1, 1), ViewportSettingsFlags.TransparentMouse);
  126. Assert.Contains (top, result);
  127. Assert.Contains (top.Padding, result);
  128. }
  129. [Fact]
  130. public void HonorsIgnoreTransparentMouseParam ()
  131. {
  132. Toplevel top = new ()
  133. {
  134. Frame = new (0, 0, 10, 10),
  135. ViewportSettings = ViewportSettingsFlags.TransparentMouse
  136. };
  137. List<View?> result = View.GetViewsUnderLocation (top, new (5, 5), ViewportSettingsFlags.TransparentMouse);
  138. Assert.Empty (result);
  139. result = View.GetViewsUnderLocation (top, new (5, 5), ViewportSettingsFlags.None);
  140. Assert.NotEmpty (result);
  141. }
  142. [Fact]
  143. public void ReturnsDeepestSubview_WhenNested ()
  144. {
  145. Toplevel top = new ()
  146. {
  147. Frame = new (0, 0, 10, 10)
  148. };
  149. View sub1 = new ()
  150. {
  151. X = 1, Y = 1, Width = 8, Height = 8
  152. };
  153. View sub2 = new ()
  154. {
  155. X = 1, Y = 1, Width = 6, Height = 6
  156. };
  157. sub1.Add (sub2);
  158. top.Add (sub1);
  159. List<View?> result = View.GetViewsUnderLocation (top, new (3, 3), ViewportSettingsFlags.TransparentMouse);
  160. Assert.Contains (sub2, result);
  161. Assert.Equal (sub2, result.Last ());
  162. }
  163. [Fact]
  164. public void Returns_Subview_WhenPointIn_TransparentToMouseMargin_Top ()
  165. {
  166. Toplevel top = new ()
  167. {
  168. Frame = new (0, 0, 20, 20)
  169. };
  170. View subView = new ()
  171. {
  172. Frame = new (0, 0, 5, 5)
  173. };
  174. subView.Margin!.Thickness = new (1);
  175. subView.Margin!.ViewportSettings = ViewportSettingsFlags.None;
  176. top.Add (subView);
  177. Assert.True (subView.Contains (new Point (4, 4)));
  178. List<View?> result = View.GetViewsUnderLocation (top, new (4, 4), ViewportSettingsFlags.TransparentMouse);
  179. Assert.Contains (top, result);
  180. Assert.Contains (subView.Margin, result);
  181. Assert.Contains (subView, result);
  182. subView.Margin!.ViewportSettings = ViewportSettingsFlags.TransparentMouse;
  183. result = View.GetViewsUnderLocation (top, new (4, 4), ViewportSettingsFlags.TransparentMouse);
  184. Assert.Contains (top, result);
  185. Assert.DoesNotContain (subView.Margin, result);
  186. Assert.DoesNotContain (subView, result);
  187. }
  188. [Theory]
  189. [InlineData ("Margin")]
  190. [InlineData ("Border")]
  191. [InlineData ("Padding")]
  192. public void Returns_Subview_Of_Adornment (string adornmentType)
  193. {
  194. // Arrange: top -> subView -> subView.[Adornment] -> adornmentSubView
  195. Toplevel top = new ()
  196. {
  197. Frame = new (0, 0, 10, 10)
  198. };
  199. View subView = new ()
  200. {
  201. X = 0, Y = 0, Width = 8, Height = 8
  202. };
  203. top.Add (subView);
  204. View? adornment = null;
  205. switch (adornmentType)
  206. {
  207. case "Margin":
  208. subView.Margin!.Thickness = new (2);
  209. adornment = subView.Margin;
  210. break;
  211. case "Border":
  212. subView.Border!.Thickness = new (2);
  213. adornment = subView.Border;
  214. break;
  215. case "Padding":
  216. subView.Padding!.Thickness = new (2);
  217. adornment = subView.Padding;
  218. break;
  219. }
  220. subView.Layout ();
  221. // Add a child to the adornment
  222. View adornmentSubView = new ()
  223. {
  224. X = 0, Y = 0, Width = 2, Height = 2
  225. };
  226. adornment!.Add (adornmentSubView);
  227. // Set adornment ViewportSettings to None so it doesn't interfere with the test
  228. adornment.ViewportSettings = ViewportSettingsFlags.None;
  229. // Act: Point inside adornmentSubView (which is inside the adornment)
  230. var result = View.GetViewsUnderLocation (top, new (0, 0), ViewportSettingsFlags.TransparentMouse);
  231. // Assert: Should contain top, subView, adornment, and adornmentSubView
  232. Assert.Contains (top, result);
  233. Assert.Contains (subView, result);
  234. Assert.Contains (adornment, result);
  235. Assert.Contains (adornmentSubView, result);
  236. Assert.Equal (top, result [0]);
  237. Assert.Equal (adornmentSubView, result [^1]);
  238. }
  239. [Theory]
  240. [InlineData ("Margin")]
  241. [InlineData ("Border")]
  242. [InlineData ("Padding")]
  243. public void Returns_OnlyParentsSuperView_Of_Adornment_If_TransparentMouse (string adornmentType)
  244. {
  245. // Arrange: top -> subView -> subView.[Adornment] -> adornmentSubView
  246. Toplevel top = new ()
  247. {
  248. Id = "top",
  249. Frame = new (0, 0, 10, 10)
  250. };
  251. View subView = new ()
  252. {
  253. Id = "subView",
  254. X = 0, Y = 0, Width = 8, Height = 8
  255. };
  256. top.Add (subView);
  257. View? adornment = null;
  258. switch (adornmentType)
  259. {
  260. case "Margin":
  261. subView.Margin!.Thickness = new (2);
  262. adornment = subView.Margin;
  263. break;
  264. case "Border":
  265. subView.Border!.Thickness = new (2);
  266. adornment = subView.Border;
  267. break;
  268. case "Padding":
  269. subView.Padding!.Thickness = new (2);
  270. adornment = subView.Padding;
  271. break;
  272. }
  273. subView.Layout ();
  274. // Add a child to the adornment
  275. View adornmentSubView = new ()
  276. {
  277. Id = "adornmentSubView",
  278. X = 0, Y = 0, Width = 2, Height = 2
  279. };
  280. adornment!.Add (adornmentSubView);
  281. adornment.ViewportSettings = ViewportSettingsFlags.TransparentMouse;
  282. // Act: Point inside adornmentSubView (which is inside the adornment)
  283. var result = View.GetViewsUnderLocation (top, new (0, 0), ViewportSettingsFlags.TransparentMouse);
  284. // Assert: Should contain top, subView, adornment, and adornmentSubView
  285. Assert.Contains (top, result);
  286. Assert.DoesNotContain (adornment, result);
  287. Assert.Contains (adornmentSubView, result);
  288. Assert.DoesNotContain (subView, result);
  289. Assert.Equal (top, result [0]);
  290. Assert.Equal (adornmentSubView, result [^1]);
  291. }
  292. }