ToScreenTests.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewTests;
  3. /// <summary>
  4. /// Test the <see cref="Adornment.FrameToScreen"/> and <see cref="View.ViewportToScreen"/> methods.
  5. /// DOES NOT TEST View.xxxToScreen methods. Those are in ./View/Layout/ToScreenTests.cs
  6. /// </summary>
  7. /// <param name="output"></param>
  8. public class AdornmentToScreenTests (ITestOutputHelper output)
  9. {
  10. private readonly ITestOutputHelper _output = output;
  11. [Theory]
  12. [InlineData (0, 0)]
  13. [InlineData (1, 1)]
  14. [InlineData (-1, -1)]
  15. [InlineData (11, 11)]
  16. public void FrameToScreen_NoSuperView_WithoutAdornments (int x, int expectedX)
  17. {
  18. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  19. // Arrange
  20. var frame = new Rectangle (x, 0, 10, 10);
  21. var view = new View ();
  22. view.Frame = frame;
  23. // Act
  24. var marginScreen = view.Margin.FrameToScreen();
  25. var borderScreen = view.Border.FrameToScreen ();
  26. var paddingScreen = view.Padding.FrameToScreen ();
  27. // Assert
  28. Assert.Equal(expectedX, marginScreen.X);
  29. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  30. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  31. }
  32. [Theory]
  33. [InlineData (0, 0)]
  34. [InlineData (1, 1)]
  35. [InlineData (-1, -1)]
  36. [InlineData (11, 11)]
  37. public void FrameToScreen_NoSuperView_WithAdornments (int x, int expectedX)
  38. {
  39. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  40. // Arrange
  41. var frame = new Rectangle (x, 0, 10, 10);
  42. var view = new View ();
  43. view.Border.Thickness = new (1);
  44. view.Frame = frame;
  45. // Act
  46. var marginScreen = view.Margin.FrameToScreen ();
  47. var borderScreen = view.Border.FrameToScreen ();
  48. var paddingScreen = view.Padding.FrameToScreen ();
  49. // Assert
  50. Assert.Equal (expectedX, marginScreen.X);
  51. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  52. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  53. }
  54. [Theory]
  55. [InlineData (0, 0)]
  56. [InlineData (1, 1)]
  57. [InlineData (-1, -1)]
  58. [InlineData (11, 11)]
  59. public void FrameToScreen_SuperView_WithoutAdornments (int x, int expectedX)
  60. {
  61. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  62. // Arrange
  63. var frame = new Rectangle (x, 0, 10, 10);
  64. var superView = new View ()
  65. {
  66. X = 0,
  67. Y = 0,
  68. Height = Dim.Fill (),
  69. Width = Dim.Fill ()
  70. };
  71. var view = new View ();
  72. view.Frame = frame;
  73. superView.Add (view);
  74. superView.LayoutSubviews ();
  75. // Act
  76. var marginScreen = view.Margin.FrameToScreen ();
  77. var borderScreen = view.Border.FrameToScreen ();
  78. var paddingScreen = view.Padding.FrameToScreen ();
  79. // Assert
  80. Assert.Equal (expectedX, marginScreen.X);
  81. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  82. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  83. }
  84. [Theory]
  85. [InlineData (0, 3)]
  86. [InlineData (1, 4)]
  87. [InlineData (-1, 2)]
  88. [InlineData (11, 14)]
  89. public void FrameToScreen_SuperView_WithAdornments (int x, int expectedX)
  90. {
  91. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  92. // Arrange
  93. var frame = new Rectangle (x, 0, 10, 10);
  94. var superView = new View ()
  95. {
  96. X = 0,
  97. Y = 0,
  98. Height = Dim.Fill (),
  99. Width = Dim.Fill ()
  100. };
  101. superView.Margin.Thickness = new (1);
  102. superView.Border.Thickness = new (1);
  103. superView.Padding.Thickness = new (1);
  104. var view = new View ();
  105. view.Frame = frame;
  106. superView.Add (view);
  107. superView.LayoutSubviews ();
  108. // Act
  109. var marginScreen = view.Margin.FrameToScreen ();
  110. var borderScreen = view.Border.FrameToScreen ();
  111. var paddingScreen = view.Padding.FrameToScreen ();
  112. // Assert
  113. Assert.Equal (expectedX, marginScreen.X);
  114. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  115. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  116. }
  117. [Theory]
  118. [InlineData (0, 0)]
  119. [InlineData (1, 1)]
  120. [InlineData (-1, -1)]
  121. [InlineData (11, 11)]
  122. public void FrameToScreen_NestedSuperView_WithoutAdornments (int x, int expectedX)
  123. {
  124. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  125. // Arrange
  126. var frame = new Rectangle (x, 0, 10, 10);
  127. var superSuperView = new View ()
  128. {
  129. X = 0,
  130. Y = 0,
  131. Height = Dim.Fill (),
  132. Width = Dim.Fill ()
  133. };
  134. var superView = new View ()
  135. {
  136. X = 0,
  137. Y = 0,
  138. Height = Dim.Fill (),
  139. Width = Dim.Fill ()
  140. };
  141. superSuperView.Add (superView);
  142. var view = new View ();
  143. view.Frame = frame;
  144. superView.Add (view);
  145. superView.LayoutSubviews ();
  146. // Act
  147. var marginScreen = view.Margin.FrameToScreen ();
  148. var borderScreen = view.Border.FrameToScreen ();
  149. var paddingScreen = view.Padding.FrameToScreen ();
  150. // Assert
  151. Assert.Equal (expectedX, marginScreen.X);
  152. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  153. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  154. }
  155. [Theory]
  156. [InlineData (0, 6)]
  157. [InlineData (1, 7)]
  158. [InlineData (-1, 5)]
  159. [InlineData (11, 17)]
  160. public void FrameToScreen_NestedSuperView_WithAdornments (int x, int expectedX)
  161. {
  162. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  163. // Arrange
  164. var frame = new Rectangle (x, 0, 10, 10);
  165. var superSuperView = new View ()
  166. {
  167. X = 0,
  168. Y = 0,
  169. Height = Dim.Fill (),
  170. Width = Dim.Fill ()
  171. };
  172. superSuperView.Margin.Thickness = new (1);
  173. superSuperView.Border.Thickness = new (1);
  174. superSuperView.Padding.Thickness = new (1);
  175. var superView = new View ()
  176. {
  177. X = 0,
  178. Y = 0,
  179. Height = Dim.Fill (),
  180. Width = Dim.Fill ()
  181. };
  182. superView.Margin.Thickness = new (1);
  183. superView.Border.Thickness = new (1);
  184. superView.Padding.Thickness = new (1);
  185. superSuperView.Add (superView);
  186. var view = new View ();
  187. view.Frame = frame;
  188. superView.Add (view);
  189. superView.LayoutSubviews ();
  190. // Act
  191. var marginScreen = view.Margin.FrameToScreen ();
  192. var borderScreen = view.Border.FrameToScreen ();
  193. var paddingScreen = view.Padding.FrameToScreen ();
  194. // Assert
  195. Assert.Equal (expectedX, marginScreen.X);
  196. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  197. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  198. }
  199. // Adornment.ViewportToScreen tests ============================
  200. [Theory]
  201. [InlineData (0, 0, 0)]
  202. [InlineData (1, 0, 1)]
  203. [InlineData (-1, 0, -1)]
  204. [InlineData (11, 0, 11)]
  205. public void ViewportToScreen_NoSuperView_WithoutAdornments (int frameX, int testX, int expectedX)
  206. {
  207. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  208. // Arrange
  209. var frame = new Rectangle (frameX, 0, 10, 10);
  210. var view = new View ();
  211. view.Frame = frame;
  212. // Act
  213. var marginScreen = view.Margin.ViewportToScreen (new Point (testX, 0));
  214. var borderScreen = view.Border.ViewportToScreen (new Point (testX, 0));
  215. var paddingScreen = view.Padding.ViewportToScreen (new Point (testX, 0));
  216. // Assert
  217. Assert.Equal (expectedX, marginScreen.X);
  218. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  219. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  220. }
  221. [Theory]
  222. [InlineData (0, 0, 0)]
  223. [InlineData (1, 0, 1)]
  224. [InlineData (-1, 0, -1)]
  225. [InlineData (11, 0, 11)]
  226. [InlineData (0, 1, 1)]
  227. [InlineData (1, 1, 2)]
  228. [InlineData (-1, 1, 0)]
  229. [InlineData (11, 1, 12)]
  230. [InlineData (0, -1, -1)]
  231. [InlineData (1, -1, 0)]
  232. [InlineData (-1, -1, -2)]
  233. [InlineData (11, -1, 10)]
  234. public void ViewportToScreen_NoSuperView_WithAdornments (int frameX, int testX, int expectedX)
  235. {
  236. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  237. // Arrange
  238. var frame = new Rectangle (frameX, 0, 10, 10);
  239. var view = new View ();
  240. view.Margin.Thickness = new (1);
  241. view.Border.Thickness = new (1);
  242. view.Padding.Thickness = new (1);
  243. // Total thickness is 3 (view.Viewport will be Frame.Width - 6)
  244. view.Frame = frame;
  245. Assert.Equal(4, view.Viewport.Width);
  246. // Act
  247. var marginScreen = view.Margin.ViewportToScreen (new Point (testX, 0));
  248. var borderScreen = view.Border.ViewportToScreen (new Point (testX, 0));
  249. var paddingScreen = view.Padding.ViewportToScreen (new Point (testX, 0));
  250. // Assert
  251. Assert.Equal (expectedX, marginScreen.X);
  252. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  253. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  254. }
  255. [Theory]
  256. [InlineData (0, 0, 0)]
  257. [InlineData (1, 0, 1)]
  258. [InlineData (-1, 0, -1)]
  259. [InlineData (11, 0, 11)]
  260. [InlineData (0, 1, 1)]
  261. [InlineData (1, 1, 2)]
  262. [InlineData (-1, 1, 0)]
  263. [InlineData (11, 1, 12)]
  264. [InlineData (0, -1, -1)]
  265. [InlineData (1, -1, 0)]
  266. [InlineData (-1, -1, -2)]
  267. [InlineData (11, -1, 10)]
  268. public void ViewportToScreen_SuperView_WithoutAdornments (int frameX, int testX, int expectedX)
  269. {
  270. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  271. // Arrange
  272. var frame = new Rectangle (frameX, 0, 10, 10);
  273. var superView = new View ()
  274. {
  275. X = 0,
  276. Y = 0,
  277. Height = Dim.Fill (),
  278. Width = Dim.Fill ()
  279. };
  280. var view = new View ();
  281. view.Frame = frame;
  282. superView.Add (view);
  283. superView.LayoutSubviews ();
  284. // Act
  285. var marginScreen = view.Margin.ViewportToScreen (new Point (testX, 0));
  286. var borderScreen = view.Border.ViewportToScreen (new Point (testX, 0));
  287. var paddingScreen = view.Padding.ViewportToScreen (new Point (testX, 0));
  288. // Assert
  289. Assert.Equal (expectedX, marginScreen.X);
  290. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  291. Assert.Equal (expectedX + view.Border.Thickness.Left, paddingScreen.X);
  292. }
  293. [Theory]
  294. [InlineData (0, 0, 1)]
  295. [InlineData (1, 0, 2)]
  296. [InlineData (-1, 0, 0)]
  297. [InlineData (11, 0, 12)]
  298. [InlineData (0, 1, 2)]
  299. [InlineData (1, 1, 3)]
  300. [InlineData (-1, 1, 1)]
  301. [InlineData (11, 1, 13)]
  302. [InlineData (0, -1, 0)]
  303. [InlineData (1, -1, 1)]
  304. [InlineData (-1, -1, -1)]
  305. [InlineData (11, -1, 11)]
  306. public void ViewportToScreen_SuperView_WithAdornments (int frameX, int testX, int expectedX)
  307. {
  308. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  309. // Arrange
  310. var frame = new Rectangle (frameX, 0, 10, 10);
  311. var superView = new View ()
  312. {
  313. X = 0,
  314. Y = 0,
  315. Height = Dim.Fill (),
  316. Width = Dim.Fill ()
  317. };
  318. superView.Border.Thickness = new (1);
  319. var view = new View ();
  320. view.Frame = frame;
  321. superView.Add (view);
  322. superView.LayoutSubviews ();
  323. // Act
  324. var marginScreen = view.Margin.ViewportToScreen (new Point (testX, 0));
  325. var borderScreen = view.Border.ViewportToScreen (new Point (testX, 0));
  326. var paddingScreen = view.Padding.ViewportToScreen (new Point (testX, 0));
  327. // Assert
  328. Assert.Equal (expectedX, marginScreen.X);
  329. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  330. Assert.Equal (expectedX + view.Border.Thickness.Left, paddingScreen.X);
  331. }
  332. [Theory]
  333. [InlineData (0, 0, 0)]
  334. [InlineData (1, 0, 1)]
  335. [InlineData (-1, 0, -1)]
  336. [InlineData (11, 0, 11)]
  337. [InlineData (0, 1, 1)]
  338. [InlineData (1, 1, 2)]
  339. [InlineData (-1, 1, 0)]
  340. [InlineData (11, 1, 12)]
  341. [InlineData (0, -1, -1)]
  342. [InlineData (1, -1, 0)]
  343. [InlineData (-1, -1, -2)]
  344. [InlineData (11, -1, 10)]
  345. public void ViewportToScreen_NestedSuperView_WithoutAdornments (int frameX, int testX, int expectedX)
  346. {
  347. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  348. // Arrange
  349. var frame = new Rectangle (frameX, 0, 10, 10);
  350. var superSuperView = new View ()
  351. {
  352. X = 0,
  353. Y = 0,
  354. Height = Dim.Fill (),
  355. Width = Dim.Fill ()
  356. };
  357. var superView = new View ()
  358. {
  359. X = 0,
  360. Y = 0,
  361. Height = Dim.Fill (),
  362. Width = Dim.Fill ()
  363. };
  364. superSuperView.Add (superView);
  365. var view = new View ();
  366. view.Frame = frame;
  367. superView.Add (view);
  368. superView.LayoutSubviews ();
  369. // Act
  370. var marginScreen = view.Margin.ViewportToScreen (new Point (testX, 0));
  371. var borderScreen = view.Border.ViewportToScreen (new Point (testX, 0));
  372. var paddingScreen = view.Padding.ViewportToScreen (new Point (testX, 0));
  373. // Assert
  374. Assert.Equal (expectedX, marginScreen.X);
  375. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  376. Assert.Equal (expectedX + view.Border.Thickness.Left, paddingScreen.X);
  377. }
  378. [Theory]
  379. [InlineData (0, 0, 6)]
  380. [InlineData (1, 0, 7)]
  381. [InlineData (-1, 0, 5)]
  382. [InlineData (11, 0, 17)]
  383. [InlineData (0, 1, 7)]
  384. [InlineData (1, 1, 8)]
  385. [InlineData (-1, 1, 6)]
  386. [InlineData (11, 1, 18)]
  387. [InlineData (0, -1, 5)]
  388. [InlineData (1, -1, 6)]
  389. [InlineData (-1, -1, 4)]
  390. [InlineData (11, -1, 16)]
  391. public void ViewportToScreen_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX)
  392. {
  393. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  394. // Arrange
  395. var frame = new Rectangle (frameX, 0, 10, 10);
  396. var superSuperView = new View ()
  397. {
  398. X = 0,
  399. Y = 0,
  400. Height = Dim.Fill (),
  401. Width = Dim.Fill ()
  402. };
  403. superSuperView.Margin.Thickness = new (1);
  404. superSuperView.Border.Thickness = new (1);
  405. superSuperView.Padding.Thickness = new (1);
  406. var superView = new View ()
  407. {
  408. X = 0,
  409. Y = 0,
  410. Height = Dim.Fill (),
  411. Width = Dim.Fill ()
  412. };
  413. superView.Margin.Thickness = new (1);
  414. superView.Border.Thickness = new (1);
  415. superView.Padding.Thickness = new (1);
  416. superSuperView.Add (superView);
  417. var view = new View ();
  418. view.Frame = frame;
  419. superView.Add (view);
  420. superView.LayoutSubviews ();
  421. // Act
  422. var marginScreen = view.Margin.ViewportToScreen (new Point (testX, 0));
  423. var borderScreen = view.Border.ViewportToScreen (new Point (testX, 0));
  424. var paddingScreen = view.Padding.ViewportToScreen (new Point (testX, 0));
  425. // Assert
  426. Assert.Equal (expectedX, marginScreen.X);
  427. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  428. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  429. }
  430. }