GetViewsAtLocationTests.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. #nullable enable
  2. namespace UnitTests_Parallelizable.ViewMouseTests;
  3. [Trait ("Category", "Layout")]
  4. public class GetViewsAtLocationTests
  5. {
  6. private class TestView : View
  7. {
  8. public TestView (int x, int y, int w, int h, bool visible = true)
  9. {
  10. X = x;
  11. Y = y;
  12. Width = w;
  13. Height = h;
  14. base.Visible = visible;
  15. }
  16. }
  17. [Fact]
  18. public void ReturnsEmpty_WhenRootIsNull ()
  19. {
  20. var result = View.GetViewsAtLocation (null, new Point (0, 0));
  21. Assert.Empty (result);
  22. }
  23. [Fact]
  24. public void ReturnsEmpty_WhenRootIsNotVisible ()
  25. {
  26. TestView root = new (0, 0, 10, 10, visible: false);
  27. var result = View.GetViewsAtLocation (root, new Point (5, 5));
  28. Assert.Empty (result);
  29. }
  30. [Fact]
  31. public void ReturnsEmpty_WhenPointOutsideRoot ()
  32. {
  33. TestView root = new (0, 0, 10, 10);
  34. var result = View.GetViewsAtLocation (root, new Point (20, 20));
  35. Assert.Empty (result);
  36. }
  37. [Fact]
  38. public void ReturnsEmpty_WhenPointOutsideRoot_AndSubview ()
  39. {
  40. TestView root = new (0, 0, 10, 10);
  41. TestView sub = new (5, 5, 2, 2);
  42. root.Add (sub);
  43. var result = View.GetViewsAtLocation (root, new Point (20, 20));
  44. Assert.Empty (result);
  45. }
  46. [Fact]
  47. public void ReturnsRoot_WhenPointInsideRoot_NoSubviews ()
  48. {
  49. TestView root = new (0, 0, 10, 10);
  50. var result = View.GetViewsAtLocation (root, new Point (5, 5));
  51. Assert.Single (result);
  52. Assert.Equal (root, result [0]);
  53. }
  54. [Fact]
  55. public void ReturnsRoot_And_Subview_WhenPointInsideRootMargin ()
  56. {
  57. TestView root = new (0, 0, 10, 10);
  58. root.Margin!.Thickness = new (1);
  59. TestView sub = new (2, 2, 5, 5);
  60. root.Add (sub);
  61. var result = View.GetViewsAtLocation (root, new Point (3, 3));
  62. Assert.Equal (2, result.Count);
  63. Assert.Equal (root, result [0]);
  64. Assert.Equal (sub, result [1]);
  65. }
  66. [Fact]
  67. public void ReturnsRoot_And_Subview_Border_WhenPointInsideRootMargin ()
  68. {
  69. TestView root = new (0, 0, 10, 10);
  70. root.Margin!.Thickness = new (1);
  71. TestView sub = new (2, 2, 5, 5);
  72. sub.BorderStyle = LineStyle.Dotted;
  73. root.Add (sub);
  74. var result = View.GetViewsAtLocation (root, new Point (3, 3));
  75. Assert.Equal (3, result.Count);
  76. Assert.Equal (root, result [0]);
  77. Assert.Equal (sub, result [1]);
  78. Assert.Equal (sub.Border, result [2]);
  79. }
  80. [Fact]
  81. public void ReturnsRoot_And_Margin_WhenPointInside_With_Margin ()
  82. {
  83. TestView root = new (0, 0, 10, 10);
  84. root.Margin!.Thickness = new (1);
  85. var result = View.GetViewsAtLocation (root, new Point (0, 0));
  86. Assert.Equal (2, result.Count);
  87. Assert.Equal (root, result [0]);
  88. Assert.Equal (root.Margin, result [1]);
  89. }
  90. [Fact]
  91. public void ReturnsRoot_WhenPointOutsideSubview_With_Margin ()
  92. {
  93. TestView root = new (0, 0, 10, 10);
  94. root.Margin!.Thickness = new (1);
  95. TestView sub = new (2, 2, 5, 5);
  96. root.Add (sub);
  97. List<View?> result = View.GetViewsAtLocation (root, new Point (2, 2));
  98. Assert.Single (result);
  99. Assert.Equal (root, result [0]);
  100. result = View.GetViewsAtLocation (root, new Point (0, 0));
  101. Assert.Equal (2, result.Count);
  102. Assert.Equal (root, result [0]);
  103. Assert.Equal (root.Margin, result [1]);
  104. result = View.GetViewsAtLocation (root, new Point (1, 1));
  105. Assert.Single (result);
  106. Assert.Equal (root, result [0]);
  107. result = View.GetViewsAtLocation (root, new Point (8, 8));
  108. Assert.Single (result);
  109. Assert.Equal (root, result [0]);
  110. }
  111. [Fact]
  112. public void ReturnsRoot_And_Border_WhenPointInside_With_Border ()
  113. {
  114. TestView root = new (0, 0, 10, 10);
  115. root.Border!.Thickness = new (1);
  116. var result = View.GetViewsAtLocation (root, new Point (0, 0));
  117. Assert.Equal (2, result.Count);
  118. Assert.Equal (root, result [0]);
  119. Assert.Equal (root.Border, result [1]);
  120. }
  121. [Fact]
  122. public void ReturnsRoot_WhenPointOutsideSubview_With_Border ()
  123. {
  124. TestView root = new (0, 0, 10, 10);
  125. root.Border!.Thickness = new (1);
  126. TestView sub = new (2, 2, 5, 5);
  127. root.Add (sub);
  128. var result = View.GetViewsAtLocation (root, new Point (2, 2));
  129. Assert.Single (result);
  130. Assert.Equal (root, result [0]);
  131. result = View.GetViewsAtLocation (root, new Point (0, 0));
  132. Assert.Equal (2, result.Count);
  133. Assert.Equal (root, result [0]);
  134. Assert.Equal (root.Border, result [1]);
  135. result = View.GetViewsAtLocation (root, new Point (1, 1));
  136. Assert.Single (result);
  137. Assert.Equal (root, result [0]);
  138. result = View.GetViewsAtLocation (root, new Point (8, 8));
  139. Assert.Single (result);
  140. Assert.Equal (root, result [0]);
  141. }
  142. [Fact]
  143. public void ReturnsRoot_And_Border_WhenPointInsideRootBorder ()
  144. {
  145. TestView root = new (0, 0, 10, 10);
  146. root.Border!.Thickness = new (1);
  147. var result = View.GetViewsAtLocation (root, new Point (0, 0));
  148. Assert.Equal (2, result.Count);
  149. Assert.Equal (root, result [0]);
  150. Assert.Equal (root.Border, result [1]);
  151. }
  152. [Fact]
  153. public void ReturnsRoot_And_Padding_WhenPointInsideRootPadding ()
  154. {
  155. TestView root = new (0, 0, 10, 10);
  156. root.Padding!.Thickness = new (1);
  157. var result = View.GetViewsAtLocation (root, new Point (0, 0));
  158. Assert.Equal (2, result.Count);
  159. Assert.Equal (root, result [0]);
  160. Assert.Equal (root.Padding, result [1]);
  161. }
  162. [Fact]
  163. public void ReturnsRootAndSubview_WhenPointInsideSubview ()
  164. {
  165. TestView root = new (0, 0, 10, 10);
  166. TestView sub = new (2, 2, 5, 5);
  167. root.Add (sub);
  168. var result = View.GetViewsAtLocation (root, new Point (3, 3));
  169. Assert.Equal (2, result.Count);
  170. Assert.Equal (root, result [0]);
  171. Assert.Equal (sub, result [1]);
  172. }
  173. [Fact]
  174. public void ReturnsRootAndSubviewAndMargin_WhenPointInsideSubviewMargin ()
  175. {
  176. TestView root = new (0, 0, 10, 10);
  177. TestView sub = new (2, 2, 5, 5);
  178. sub.Margin!.Thickness = new (1);
  179. root.Add (sub);
  180. var result = View.GetViewsAtLocation (root, new Point (6, 6));
  181. Assert.Equal (3, result.Count);
  182. Assert.Equal (root, result [0]);
  183. Assert.Equal (sub, result [1]);
  184. Assert.Equal (sub.Margin, result [2]);
  185. }
  186. [Fact]
  187. public void ReturnsRootAndSubviewAndBorder_WhenPointInsideSubviewBorder ()
  188. {
  189. TestView root = new (0, 0, 10, 10);
  190. TestView sub = new (2, 2, 5, 5);
  191. sub.Border!.Thickness = new (1);
  192. root.Add (sub);
  193. var result = View.GetViewsAtLocation (root, new Point (2, 2));
  194. Assert.Equal (3, result.Count);
  195. Assert.Equal (root, result [0]);
  196. Assert.Equal (sub, result [1]);
  197. Assert.Equal (sub.Border, result [2]);
  198. }
  199. [Fact]
  200. public void ReturnsRootAndSubviewAndSubviewAndBorder_WhenPointInsideSubviewBorder ()
  201. {
  202. TestView root = new (2, 2, 10, 10);
  203. TestView sub = new (2, 2, 5, 5);
  204. sub.Border!.Thickness = new (1);
  205. root.Add (sub);
  206. var result = View.GetViewsAtLocation (root, new Point (4, 4));
  207. Assert.Equal (3, result.Count);
  208. Assert.Equal (root, result [0]);
  209. Assert.Equal (sub, result [1]);
  210. Assert.Equal (sub.Border, result [2]);
  211. }
  212. [Fact]
  213. public void ReturnsRootAndSubviewAndBorder_WhenPointInsideSubviewPadding ()
  214. {
  215. TestView root = new (0, 0, 10, 10);
  216. TestView sub = new (2, 2, 5, 5);
  217. sub.Padding!.Thickness = new (1);
  218. root.Add (sub);
  219. var result = View.GetViewsAtLocation (root, new Point (2, 2));
  220. Assert.Equal (3, result.Count);
  221. Assert.Equal (root, result [0]);
  222. Assert.Equal (sub, result [1]);
  223. Assert.Equal (sub.Padding, result [2]);
  224. }
  225. [Fact]
  226. public void ReturnsRootAndSubviewAndMarginAndShadowView_WhenPointInsideSubviewMargin ()
  227. {
  228. TestView root = new (0, 0, 10, 10);
  229. TestView sub = new (2, 2, 5, 5);
  230. sub.ShadowStyle = ShadowStyle.Opaque;
  231. root.Add (sub);
  232. root.Layout ();
  233. var result = View.GetViewsAtLocation (root, new Point (6, 6));
  234. Assert.Equal (5, result.Count);
  235. Assert.Equal (root, result [0]);
  236. Assert.Equal (sub, result [1]);
  237. Assert.Equal (sub.Margin, result [2]);
  238. Assert.Equal (sub.Margin!.SubViews.ElementAt (0), result [3]);
  239. Assert.Equal (sub.Margin!.SubViews.ElementAt (1), result [4]);
  240. }
  241. [Fact]
  242. public void ReturnsRootAndSubviewAndBorderAndButton_WhenPointInsideSubviewBorder ()
  243. {
  244. TestView root = new (0, 0, 10, 10);
  245. TestView sub = new (2, 2, 5, 5);
  246. sub.Border!.Thickness = new (1);
  247. Button closeButton = new Button ()
  248. {
  249. NoDecorations = true,
  250. NoPadding = true,
  251. Title = "X",
  252. Width = 1,
  253. Height = 1,
  254. X = Pos.AnchorEnd (),
  255. Y= 0,
  256. ShadowStyle = ShadowStyle.None
  257. };
  258. sub.Border!.Add (closeButton);
  259. root.Add (sub);
  260. root.Layout ();
  261. var result = View.GetViewsAtLocation (root, new Point (6, 2));
  262. Assert.Equal (4, result.Count);
  263. Assert.Equal (root, result [0]);
  264. Assert.Equal (sub, result [1]);
  265. Assert.Equal (sub.Border, result [2]);
  266. Assert.Equal (closeButton, result [3]);
  267. }
  268. [Fact]
  269. public void ReturnsDeepestSubview_WhenNested ()
  270. {
  271. TestView root = new (0, 0, 20, 20);
  272. var sub1 = new TestView (2, 2, 16, 16);
  273. var sub2 = new TestView (3, 3, 10, 10);
  274. var sub3 = new TestView (1, 1, 5, 5);
  275. root.Add (sub1);
  276. sub1.Add (sub2);
  277. sub2.Add (sub3);
  278. // Point inside all
  279. var result = View.GetViewsAtLocation (root, new Point (7, 7));
  280. Assert.Equal (4, result.Count);
  281. Assert.Equal (root, result [0]);
  282. Assert.Equal (sub1, result [1]);
  283. Assert.Equal (sub2, result [2]);
  284. Assert.Equal (sub3, result [3]);
  285. }
  286. [Fact]
  287. public void ReturnsTopmostSubview_WhenOverlapping ()
  288. {
  289. TestView root = new (0, 0, 10, 10);
  290. var sub1 = new TestView (2, 2, 6, 6);
  291. var sub2 = new TestView (4, 4, 6, 6);
  292. root.Add (sub1);
  293. root.Add (sub2); // sub2 is on top
  294. var result = View.GetViewsAtLocation (root, new Point (5, 5));
  295. Assert.Equal (3, result.Count);
  296. Assert.Equal (root, result [0]);
  297. Assert.Equal (sub1, result [1]);
  298. Assert.Equal (sub2, result [2]);
  299. }
  300. [Fact]
  301. public void ReturnsTopmostSubview_WhenNotOverlapping ()
  302. {
  303. TestView root = new (0, 0, 10, 10);// under 5,5,
  304. var sub1 = new TestView (10, 10, 6, 6); // not under location 5,5
  305. var sub2 = new TestView (4, 4, 6, 6); // under 5,5,
  306. root.Add (sub1);
  307. root.Add (sub2); // sub2 is on top
  308. var result = View.GetViewsAtLocation (root, new Point (5, 5));
  309. Assert.Equal (2, result.Count);
  310. Assert.Equal (root, result [0]);
  311. Assert.Equal (sub2, result [1]);
  312. }
  313. [Fact]
  314. public void SkipsInvisibleSubviews ()
  315. {
  316. TestView root = new (0, 0, 10, 10);
  317. var sub1 = new TestView (2, 2, 6, 6, visible: false);
  318. var sub2 = new TestView (4, 4, 6, 6);
  319. root.Add (sub1);
  320. root.Add (sub2);
  321. var result = View.GetViewsAtLocation (root, new Point (5, 5));
  322. Assert.Equal (2, result.Count);
  323. Assert.Equal (root, result [0]);
  324. Assert.Equal (sub2, result [1]);
  325. }
  326. [Fact]
  327. public void ReturnsRoot_WhenPointOnEdge ()
  328. {
  329. TestView root = new (0, 0, 10, 10);
  330. var result = View.GetViewsAtLocation (root, new Point (0, 0));
  331. Assert.Single (result);
  332. Assert.Equal (root, result [0]);
  333. }
  334. [Fact]
  335. public void ReturnsRoot_WhenPointOnBottomRightCorner ()
  336. {
  337. TestView root = new (0, 0, 10, 10);
  338. var result = View.GetViewsAtLocation (root, new Point (9, 9));
  339. Assert.Single (result);
  340. Assert.Equal (root, result [0]);
  341. }
  342. [Fact]
  343. public void ReturnsEmpty_WhenAllSubviewsInvisible ()
  344. {
  345. TestView root = new (0, 0, 10, 10);
  346. var sub1 = new TestView (2, 2, 6, 6, visible: false);
  347. root.Add (sub1);
  348. var result = View.GetViewsAtLocation (root, new Point (3, 3));
  349. Assert.Single (result);
  350. Assert.Equal (root, result [0]);
  351. }
  352. }