ToScreenTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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. [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 screen = view.FrameToScreen();
  25. // Assert
  26. Assert.Equal(expectedX, screen.X);
  27. }
  28. [Theory]
  29. [InlineData (0, 0)]
  30. [InlineData (1, 1)]
  31. [InlineData (-1, -1)]
  32. [InlineData (11, 11)]
  33. public void FrameToScreen_NoSuperView_WithAdornments (int x, int expectedX)
  34. {
  35. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  36. // Arrange
  37. var frame = new Rectangle (x, 0, 10, 10);
  38. var view = new View ();
  39. view.BorderStyle = LineStyle.Single;
  40. view.Frame = frame;
  41. // Act
  42. var screen = view.FrameToScreen ();
  43. // Assert
  44. Assert.Equal (expectedX, screen.X);
  45. }
  46. [Theory]
  47. [InlineData (0, 0)]
  48. [InlineData (1, 1)]
  49. [InlineData (-1, -1)]
  50. [InlineData (11, 11)]
  51. public void FrameToScreen_SuperView_WithoutAdornments (int x, int expectedX)
  52. {
  53. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  54. // Arrange
  55. var frame = new Rectangle (x, 0, 10, 10);
  56. var superView = new View ()
  57. {
  58. X = 0,
  59. Y = 0,
  60. Height = Dim.Fill (),
  61. Width = Dim.Fill ()
  62. };
  63. var view = new View ();
  64. view.Frame = frame;
  65. superView.Add (view);
  66. superView.LayoutSubviews ();
  67. // Act
  68. var screen = view.FrameToScreen ();
  69. // Assert
  70. Assert.Equal (expectedX, screen.X);
  71. }
  72. [Theory]
  73. [InlineData (0, 1)]
  74. [InlineData (1, 2)]
  75. [InlineData (-1, 0)]
  76. [InlineData (11, 12)]
  77. public void FrameToScreen_SuperView_WithAdornments (int x, int expectedX)
  78. {
  79. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  80. // Arrange
  81. var frame = new Rectangle (x, 0, 10, 10);
  82. var superView = new View ()
  83. {
  84. X = 0,
  85. Y = 0,
  86. Height = Dim.Fill (),
  87. Width = Dim.Fill ()
  88. };
  89. superView.BorderStyle = LineStyle.Single;
  90. var view = new View ();
  91. view.Frame = frame;
  92. superView.Add (view);
  93. superView.LayoutSubviews ();
  94. // Act
  95. var screen = view.FrameToScreen ();
  96. // Assert
  97. Assert.Equal (expectedX, screen.X);
  98. }
  99. [Theory]
  100. [InlineData (0, 0)]
  101. [InlineData (1, 1)]
  102. [InlineData (-1, -1)]
  103. [InlineData (11, 11)]
  104. public void FrameToScreen_NestedSuperView_WithoutAdornments (int x, int expectedX)
  105. {
  106. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  107. // Arrange
  108. var frame = new Rectangle (x, 0, 10, 10);
  109. var superSuperView = new View ()
  110. {
  111. X = 0,
  112. Y = 0,
  113. Height = Dim.Fill (),
  114. Width = Dim.Fill ()
  115. };
  116. var superView = new View ()
  117. {
  118. X = 0,
  119. Y = 0,
  120. Height = Dim.Fill (),
  121. Width = Dim.Fill ()
  122. };
  123. superSuperView.Add (superView);
  124. var view = new View ();
  125. view.Frame = frame;
  126. superView.Add (view);
  127. superView.LayoutSubviews ();
  128. // Act
  129. var screen = view.FrameToScreen ();
  130. // Assert
  131. Assert.Equal (expectedX, screen.X);
  132. }
  133. [Theory]
  134. [InlineData (0, 2)]
  135. [InlineData (1, 3)]
  136. [InlineData (-1, 1)]
  137. [InlineData (11, 13)]
  138. public void FrameToScreen_NestedSuperView_WithAdornments (int x, int expectedX)
  139. {
  140. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  141. // Arrange
  142. var frame = new Rectangle (x, 0, 10, 10);
  143. var superSuperView = new View ()
  144. {
  145. X = 0,
  146. Y = 0,
  147. Height = Dim.Fill (),
  148. Width = Dim.Fill ()
  149. };
  150. superSuperView.BorderStyle = LineStyle.Single;
  151. var superView = new View ()
  152. {
  153. X = 0,
  154. Y = 0,
  155. Height = Dim.Fill (),
  156. Width = Dim.Fill ()
  157. };
  158. superSuperView.Add (superView);
  159. superView.BorderStyle = LineStyle.Single;
  160. var view = new View ();
  161. view.Frame = frame;
  162. superView.Add (view);
  163. superView.LayoutSubviews ();
  164. // Act
  165. var screen = view.FrameToScreen ();
  166. // Assert
  167. Assert.Equal (expectedX, screen.X);
  168. }
  169. [Theory]
  170. [InlineData (0, 0, 0)]
  171. [InlineData (1, 0, 1)]
  172. [InlineData (-1, 0, -1)]
  173. [InlineData (11, 0, 11)]
  174. public void BoundsToScreen_NoSuperView_WithoutAdornments (int frameX, int boundsX, int expectedX)
  175. {
  176. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  177. // Arrange
  178. var frame = new Rectangle (frameX, 0, 10, 10);
  179. var view = new View ();
  180. view.Frame = frame;
  181. // Act
  182. var screen = view.ViewportToScreen (new (boundsX, 0, 0, 0));
  183. // Assert
  184. Assert.Equal (expectedX, screen.X);
  185. }
  186. [Theory]
  187. [InlineData (0, 0, 1)]
  188. [InlineData (1, 0, 2)]
  189. [InlineData (-1, 0, 0)]
  190. [InlineData (11, 0, 12)]
  191. [InlineData (0, 1, 2)]
  192. [InlineData (1, 1, 3)]
  193. [InlineData (-1, 1, 1)]
  194. [InlineData (11, 1, 13)]
  195. [InlineData (0, -1, 0)]
  196. [InlineData (1, -1, 1)]
  197. [InlineData (-1, -1, -1)]
  198. [InlineData (11, -1, 11)]
  199. public void BoundsToScreen_NoSuperView_WithAdornments (int frameX, int boundsX, int expectedX)
  200. {
  201. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  202. // Arrange
  203. var frame = new Rectangle (frameX, 0, 10, 10);
  204. var view = new View ();
  205. view.BorderStyle = LineStyle.Single;
  206. view.Frame = frame;
  207. // Act
  208. var screen = view.ViewportToScreen (new (boundsX, 0, 0, 0));
  209. // Assert
  210. Assert.Equal (expectedX, screen.X);
  211. }
  212. [Theory]
  213. [InlineData (0, 0, 0)]
  214. [InlineData (1, 0, 1)]
  215. [InlineData (-1, 0, -1)]
  216. [InlineData (11, 0, 11)]
  217. [InlineData (0, 1, 1)]
  218. [InlineData (1, 1, 2)]
  219. [InlineData (-1, 1, 0)]
  220. [InlineData (11, 1, 12)]
  221. [InlineData (0, -1, -1)]
  222. [InlineData (1, -1, 0)]
  223. [InlineData (-1, -1, -2)]
  224. [InlineData (11, -1, 10)]
  225. public void BoundsToScreen_SuperView_WithoutAdornments (int frameX, int boundsX, int expectedX)
  226. {
  227. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  228. // Arrange
  229. var frame = new Rectangle (frameX, 0, 10, 10);
  230. var superView = new View ()
  231. {
  232. X = 0,
  233. Y = 0,
  234. Height = Dim.Fill (),
  235. Width = Dim.Fill ()
  236. };
  237. var view = new View ();
  238. view.Frame = frame;
  239. superView.Add (view);
  240. superView.LayoutSubviews ();
  241. // Act
  242. var screen = view.ViewportToScreen (new (boundsX, 0, 0, 0));
  243. // Assert
  244. Assert.Equal (expectedX, screen.X);
  245. }
  246. [Theory]
  247. [InlineData (0, 0, 1)]
  248. [InlineData (1, 0, 2)]
  249. [InlineData (-1, 0, 0)]
  250. [InlineData (11, 0, 12)]
  251. [InlineData (0, 1, 2)]
  252. [InlineData (1, 1, 3)]
  253. [InlineData (-1, 1, 1)]
  254. [InlineData (11, 1, 13)]
  255. [InlineData (0, -1, 0)]
  256. [InlineData (1, -1, 1)]
  257. [InlineData (-1, -1, -1)]
  258. [InlineData (11, -1, 11)]
  259. public void BoundsToScreen_SuperView_WithAdornments (int frameX, int boundsX, int expectedX)
  260. {
  261. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  262. // Arrange
  263. var frame = new Rectangle (frameX, 0, 10, 10);
  264. var superView = new View ()
  265. {
  266. X = 0,
  267. Y = 0,
  268. Height = Dim.Fill (),
  269. Width = Dim.Fill ()
  270. };
  271. superView.BorderStyle = LineStyle.Single;
  272. var view = new View ();
  273. view.Frame = frame;
  274. superView.Add (view);
  275. superView.LayoutSubviews ();
  276. // Act
  277. var screen = view.ViewportToScreen (new (boundsX, 0, 0, 0));
  278. // Assert
  279. Assert.Equal (expectedX, screen.X);
  280. }
  281. [Theory]
  282. [InlineData (0, 0, 0)]
  283. [InlineData (1, 0, 1)]
  284. [InlineData (-1, 0, -1)]
  285. [InlineData (11, 0, 11)]
  286. [InlineData (0, 1, 1)]
  287. [InlineData (1, 1, 2)]
  288. [InlineData (-1, 1, 0)]
  289. [InlineData (11, 1, 12)]
  290. [InlineData (0, -1, -1)]
  291. [InlineData (1, -1, 0)]
  292. [InlineData (-1, -1, -2)]
  293. [InlineData (11, -1, 10)]
  294. public void BoundsToScreen_NestedSuperView_WithoutAdornments (int frameX, int boundsX, int expectedX)
  295. {
  296. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  297. // Arrange
  298. var frame = new Rectangle (frameX, 0, 10, 10);
  299. var superSuperView = new View ()
  300. {
  301. X = 0,
  302. Y = 0,
  303. Height = Dim.Fill (),
  304. Width = Dim.Fill ()
  305. };
  306. var superView = new View ()
  307. {
  308. X = 0,
  309. Y = 0,
  310. Height = Dim.Fill (),
  311. Width = Dim.Fill ()
  312. };
  313. superSuperView.Add (superView);
  314. var view = new View ();
  315. view.Frame = frame;
  316. superView.Add (view);
  317. superView.LayoutSubviews ();
  318. // Act
  319. var screen = view.ViewportToScreen (new (boundsX, 0, 0, 0));
  320. // Assert
  321. Assert.Equal (expectedX, screen.X);
  322. }
  323. [Theory]
  324. [InlineData (0, 0, 2)]
  325. [InlineData (1, 0, 3)]
  326. [InlineData (-1, 0, 1)]
  327. [InlineData (11, 0, 13)]
  328. [InlineData (0, 1, 3)]
  329. [InlineData (1, 1, 4)]
  330. [InlineData (-1, 1, 2)]
  331. [InlineData (11, 1, 14)]
  332. [InlineData (0, -1, 1)]
  333. [InlineData (1, -1, 2)]
  334. [InlineData (-1, -1, 0)]
  335. [InlineData (11, -1, 12)]
  336. public void BoundsToScreen_NestedSuperView_WithAdornments (int frameX, int boundsX, int expectedX)
  337. {
  338. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  339. // Arrange
  340. var frame = new Rectangle (frameX, 0, 10, 10);
  341. var superSuperView = new View ()
  342. {
  343. X = 0,
  344. Y = 0,
  345. Height = Dim.Fill (),
  346. Width = Dim.Fill ()
  347. };
  348. superSuperView.BorderStyle = LineStyle.Single;
  349. var superView = new View ()
  350. {
  351. X = 0,
  352. Y = 0,
  353. Height = Dim.Fill (),
  354. Width = Dim.Fill ()
  355. };
  356. superSuperView.Add (superView);
  357. superView.BorderStyle = LineStyle.Single;
  358. var view = new View ();
  359. view.Frame = frame;
  360. superView.Add (view);
  361. superView.LayoutSubviews ();
  362. // Act
  363. var screen = view.ViewportToScreen (new (boundsX, 0, 0, 0));
  364. // Assert
  365. Assert.Equal (expectedX, screen.X);
  366. }
  367. }