ToScreenTests.cs 13 KB

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