ToScreenTests.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewTests;
  3. /// <summary>
  4. /// Test the <see cref="Adornment.FrameToScreen"/> and <see cref="Adornment.BoundsToScreen"/> 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. [Theory]
  200. [InlineData (0, 0, 0)]
  201. [InlineData (1, 0, 1)]
  202. [InlineData (-1, 0, -1)]
  203. [InlineData (11, 0, 11)]
  204. public void BoundsToScreen_NoSuperView_WithoutAdornments (int frameX, int boundsX, int expectedX)
  205. {
  206. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  207. // Arrange
  208. var frame = new Rectangle (frameX, 0, 10, 10);
  209. var view = new View ();
  210. view.Frame = frame;
  211. // Act
  212. var marginScreen = view.Margin.BoundsToScreen (new (boundsX, 0, 0, 0));
  213. var borderScreen = view.Border.BoundsToScreen (new (boundsX, 0, 0, 0));
  214. var paddingScreen = view.Padding.BoundsToScreen (new (boundsX, 0, 0, 0));
  215. // Assert
  216. Assert.Equal (expectedX, marginScreen.X);
  217. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  218. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  219. }
  220. [Theory]
  221. [InlineData (0, 0, 0)]
  222. [InlineData (1, 0, 1)]
  223. [InlineData (-1, 0, -1)]
  224. [InlineData (11, 0, 11)]
  225. [InlineData (0, 1, 1)]
  226. [InlineData (1, 1, 2)]
  227. [InlineData (-1, 1, 0)]
  228. [InlineData (11, 1, 12)]
  229. [InlineData (0, -1, -1)]
  230. [InlineData (1, -1, 0)]
  231. [InlineData (-1, -1, -2)]
  232. [InlineData (11, -1, 10)]
  233. public void BoundsToScreen_NoSuperView_WithAdornments (int frameX, int boundsX, int expectedX)
  234. {
  235. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  236. // Arrange
  237. var frame = new Rectangle (frameX, 0, 10, 10);
  238. var view = new View ();
  239. view.Margin.Thickness = new (1);
  240. view.Border.Thickness = new (1);
  241. view.Padding.Thickness = new (1);
  242. // Total thickness is 3 (view.Bounds will be Frame.Width - 6)
  243. view.Frame = frame;
  244. Assert.Equal(4, view.Bounds.Width);
  245. // Act
  246. var marginScreen = view.Margin.BoundsToScreen (new (boundsX, 0, 0, 0));
  247. var borderScreen = view.Border.BoundsToScreen (new (boundsX, 0, 0, 0));
  248. var paddingScreen = view.Padding.BoundsToScreen (new (boundsX, 0, 0, 0));
  249. // Assert
  250. Assert.Equal (expectedX, marginScreen.X);
  251. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  252. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  253. }
  254. [Theory]
  255. [InlineData (0, 0, 0)]
  256. [InlineData (1, 0, 1)]
  257. [InlineData (-1, 0, -1)]
  258. [InlineData (11, 0, 11)]
  259. [InlineData (0, 1, 1)]
  260. [InlineData (1, 1, 2)]
  261. [InlineData (-1, 1, 0)]
  262. [InlineData (11, 1, 12)]
  263. [InlineData (0, -1, -1)]
  264. [InlineData (1, -1, 0)]
  265. [InlineData (-1, -1, -2)]
  266. [InlineData (11, -1, 10)]
  267. public void BoundsToScreen_SuperView_WithoutAdornments (int frameX, int boundsX, int expectedX)
  268. {
  269. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  270. // Arrange
  271. var frame = new Rectangle (frameX, 0, 10, 10);
  272. var superView = new View ()
  273. {
  274. X = 0,
  275. Y = 0,
  276. Height = Dim.Fill (),
  277. Width = Dim.Fill ()
  278. };
  279. var view = new View ();
  280. view.Frame = frame;
  281. superView.Add (view);
  282. superView.LayoutSubviews ();
  283. // Act
  284. var marginScreen = view.Margin.BoundsToScreen (new (boundsX, 0, 0, 0));
  285. var borderScreen = view.Border.BoundsToScreen (new (boundsX, 0, 0, 0));
  286. var paddingScreen = view.Padding.BoundsToScreen (new (boundsX, 0, 0, 0));
  287. // Assert
  288. Assert.Equal (expectedX, marginScreen.X);
  289. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  290. Assert.Equal (expectedX + view.Border.Thickness.Left, paddingScreen.X);
  291. }
  292. [Theory]
  293. [InlineData (0, 0, 1)]
  294. [InlineData (1, 0, 2)]
  295. [InlineData (-1, 0, 0)]
  296. [InlineData (11, 0, 12)]
  297. [InlineData (0, 1, 2)]
  298. [InlineData (1, 1, 3)]
  299. [InlineData (-1, 1, 1)]
  300. [InlineData (11, 1, 13)]
  301. [InlineData (0, -1, 0)]
  302. [InlineData (1, -1, 1)]
  303. [InlineData (-1, -1, -1)]
  304. [InlineData (11, -1, 11)]
  305. public void BoundsToScreen_SuperView_WithAdornments (int frameX, int boundsX, int expectedX)
  306. {
  307. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  308. // Arrange
  309. var frame = new Rectangle (frameX, 0, 10, 10);
  310. var superView = new View ()
  311. {
  312. X = 0,
  313. Y = 0,
  314. Height = Dim.Fill (),
  315. Width = Dim.Fill ()
  316. };
  317. superView.Border.Thickness = new (1);
  318. var view = new View ();
  319. view.Frame = frame;
  320. superView.Add (view);
  321. superView.LayoutSubviews ();
  322. // Act
  323. var marginScreen = view.Margin.BoundsToScreen (new (boundsX, 0, 0, 0));
  324. var borderScreen = view.Border.BoundsToScreen (new (boundsX, 0, 0, 0));
  325. var paddingScreen = view.Padding.BoundsToScreen (new (boundsX, 0, 0, 0));
  326. // Assert
  327. Assert.Equal (expectedX, marginScreen.X);
  328. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  329. Assert.Equal (expectedX + view.Border.Thickness.Left, paddingScreen.X);
  330. }
  331. [Theory]
  332. [InlineData (0, 0, 0)]
  333. [InlineData (1, 0, 1)]
  334. [InlineData (-1, 0, -1)]
  335. [InlineData (11, 0, 11)]
  336. [InlineData (0, 1, 1)]
  337. [InlineData (1, 1, 2)]
  338. [InlineData (-1, 1, 0)]
  339. [InlineData (11, 1, 12)]
  340. [InlineData (0, -1, -1)]
  341. [InlineData (1, -1, 0)]
  342. [InlineData (-1, -1, -2)]
  343. [InlineData (11, -1, 10)]
  344. public void BoundsToScreen_NestedSuperView_WithoutAdornments (int frameX, int boundsX, int expectedX)
  345. {
  346. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  347. // Arrange
  348. var frame = new Rectangle (frameX, 0, 10, 10);
  349. var superSuperView = new View ()
  350. {
  351. X = 0,
  352. Y = 0,
  353. Height = Dim.Fill (),
  354. Width = Dim.Fill ()
  355. };
  356. var superView = new View ()
  357. {
  358. X = 0,
  359. Y = 0,
  360. Height = Dim.Fill (),
  361. Width = Dim.Fill ()
  362. };
  363. superSuperView.Add (superView);
  364. var view = new View ();
  365. view.Frame = frame;
  366. superView.Add (view);
  367. superView.LayoutSubviews ();
  368. // Act
  369. var marginScreen = view.Margin.BoundsToScreen (new (boundsX, 0, 0, 0));
  370. var borderScreen = view.Border.BoundsToScreen (new (boundsX, 0, 0, 0));
  371. var paddingScreen = view.Padding.BoundsToScreen (new (boundsX, 0, 0, 0));
  372. // Assert
  373. Assert.Equal (expectedX, marginScreen.X);
  374. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  375. Assert.Equal (expectedX + view.Border.Thickness.Left, paddingScreen.X);
  376. }
  377. [Theory]
  378. [InlineData (0, 0, 6)]
  379. [InlineData (1, 0, 7)]
  380. [InlineData (-1, 0, 5)]
  381. [InlineData (11, 0, 17)]
  382. [InlineData (0, 1, 7)]
  383. [InlineData (1, 1, 8)]
  384. [InlineData (-1, 1, 6)]
  385. [InlineData (11, 1, 18)]
  386. [InlineData (0, -1, 5)]
  387. [InlineData (1, -1, 6)]
  388. [InlineData (-1, -1, 4)]
  389. [InlineData (11, -1, 16)]
  390. public void BoundsToScreen_NestedSuperView_WithAdornments (int frameX, int boundsX, int expectedX)
  391. {
  392. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  393. // Arrange
  394. var frame = new Rectangle (frameX, 0, 10, 10);
  395. var superSuperView = new View ()
  396. {
  397. X = 0,
  398. Y = 0,
  399. Height = Dim.Fill (),
  400. Width = Dim.Fill ()
  401. };
  402. superSuperView.Margin.Thickness = new (1);
  403. superSuperView.Border.Thickness = new (1);
  404. superSuperView.Padding.Thickness = new (1);
  405. var superView = new View ()
  406. {
  407. X = 0,
  408. Y = 0,
  409. Height = Dim.Fill (),
  410. Width = Dim.Fill ()
  411. };
  412. superView.Margin.Thickness = new (1);
  413. superView.Border.Thickness = new (1);
  414. superView.Padding.Thickness = new (1);
  415. superSuperView.Add (superView);
  416. var view = new View ();
  417. view.Frame = frame;
  418. superView.Add (view);
  419. superView.LayoutSubviews ();
  420. // Act
  421. var marginScreen = view.Margin.BoundsToScreen (new (boundsX, 0, 0, 0));
  422. var borderScreen = view.Border.BoundsToScreen (new (boundsX, 0, 0, 0));
  423. var paddingScreen = view.Padding.BoundsToScreen (new (boundsX, 0, 0, 0));
  424. // Assert
  425. Assert.Equal (expectedX, marginScreen.X);
  426. Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X);
  427. Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X);
  428. }
  429. }