ToScreenTests.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  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. // ContentToScreen tests ----------------------
  207. [Fact]
  208. public void ContentToScreen_With_Positive_Content_Location ()
  209. {
  210. View view = new ()
  211. {
  212. X = 1,
  213. Y = 1,
  214. Width = 10,
  215. Height = 10,
  216. ContentSize = new (20, 20)
  217. };
  218. Point testPoint = new ( 0, 0);
  219. Assert.Equal (new Point (1, 1), view.ContentToScreen (testPoint));
  220. }
  221. [Theory]
  222. [InlineData (0, 0, 1)]
  223. [InlineData (1, 0, 2)]
  224. [InlineData (-1, 0, 0)]
  225. [InlineData (0, 1, 2)]
  226. [InlineData (1, 1, 3)]
  227. [InlineData (-1, 1, 1)]
  228. [InlineData (0, -1, 0)]
  229. [InlineData (1, -1, 1)]
  230. [InlineData (-1, -1, -1)]
  231. public void ContentToScreen_NoSuperView_WithAdornments (int frameX, int contentX, int expectedX)
  232. {
  233. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  234. // Arrange
  235. var frame = new Rectangle (frameX, 0, 10, 10);
  236. var view = new View ();
  237. view.Frame = frame;
  238. view.ContentSize = new (20, 20);
  239. view.BorderStyle = LineStyle.Single;
  240. // Act
  241. var screen = view.ContentToScreen (new (contentX, 0));
  242. // Assert
  243. Assert.Equal (expectedX, screen.X);
  244. }
  245. [Theory]
  246. [InlineData (0, 0, 0)]
  247. [InlineData (1, 0, 1)]
  248. [InlineData (-1, 0, -1)]
  249. [InlineData (11, 0, 11)]
  250. [InlineData (0, 1, 1)]
  251. [InlineData (1, 1, 2)]
  252. [InlineData (-1, 1, 0)]
  253. [InlineData (11, 1, 12)]
  254. [InlineData (0, -1, -1)]
  255. [InlineData (1, -1, 0)]
  256. [InlineData (-1, -1, -2)]
  257. [InlineData (11, -1, 10)]
  258. public void ContentToScreen_SuperView_WithoutAdornments (int frameX, int contentX, int expectedX)
  259. {
  260. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  261. // Arrange
  262. var frame = new Rectangle (frameX, 0, 10, 10);
  263. var superView = new View ()
  264. {
  265. X = 0,
  266. Y = 0,
  267. Height = Dim.Fill (),
  268. Width = Dim.Fill ()
  269. };
  270. var view = new View ();
  271. view.Frame = frame;
  272. view.ContentSize = new (20, 20);
  273. superView.Add (view);
  274. superView.LayoutSubviews ();
  275. // Act
  276. var screen = view.ContentToScreen (new (contentX, 0));
  277. // Assert
  278. Assert.Equal (expectedX, screen.X);
  279. }
  280. //[Theory]
  281. //[InlineData (0, 0, 1)]
  282. //[InlineData (1, 0, 2)]
  283. //[InlineData (-1, 0, 0)]
  284. //[InlineData (11, 0, 12)]
  285. //[InlineData (0, 1, 2)]
  286. //[InlineData (1, 1, 3)]
  287. //[InlineData (-1, 1, 1)]
  288. //[InlineData (11, 1, 13)]
  289. //[InlineData (0, -1, 0)]
  290. //[InlineData (1, -1, 1)]
  291. //[InlineData (-1, -1, -1)]
  292. //[InlineData (11, -1, 11)]
  293. //public void ContentToScreen_SuperView_WithAdornments (int frameX, int ContentX, int expectedX)
  294. //{
  295. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  296. // // Arrange
  297. // var frame = new Rectangle (frameX, 0, 10, 10);
  298. // var superView = new View ()
  299. // {
  300. // X = 0,
  301. // Y = 0,
  302. // Height = Dim.Fill (),
  303. // Width = Dim.Fill ()
  304. // };
  305. // superView.BorderStyle = LineStyle.Single;
  306. // var view = new View ();
  307. // view.Frame = frame;
  308. // superView.Add (view);
  309. // superView.LayoutSubviews ();
  310. // // Act
  311. // var screen = view.ContentToScreen (new (ContentX, 0, 0, 0));
  312. // // Assert
  313. // Assert.Equal (expectedX, screen.X);
  314. //}
  315. //[Theory]
  316. //[InlineData (0, 0, 0)]
  317. //[InlineData (1, 0, 1)]
  318. //[InlineData (-1, 0, -1)]
  319. //[InlineData (11, 0, 11)]
  320. //[InlineData (0, 1, 1)]
  321. //[InlineData (1, 1, 2)]
  322. //[InlineData (-1, 1, 0)]
  323. //[InlineData (11, 1, 12)]
  324. //[InlineData (0, -1, -1)]
  325. //[InlineData (1, -1, 0)]
  326. //[InlineData (-1, -1, -2)]
  327. //[InlineData (11, -1, 10)]
  328. //public void ContentToScreen_NestedSuperView_WithoutAdornments (int frameX, int ContentX, int expectedX)
  329. //{
  330. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  331. // // Arrange
  332. // var frame = new Rectangle (frameX, 0, 10, 10);
  333. // var superSuperView = new View ()
  334. // {
  335. // X = 0,
  336. // Y = 0,
  337. // Height = Dim.Fill (),
  338. // Width = Dim.Fill ()
  339. // };
  340. // var superView = new View ()
  341. // {
  342. // X = 0,
  343. // Y = 0,
  344. // Height = Dim.Fill (),
  345. // Width = Dim.Fill ()
  346. // };
  347. // superSuperView.Add (superView);
  348. // var view = new View ();
  349. // view.Frame = frame;
  350. // superView.Add (view);
  351. // superView.LayoutSubviews ();
  352. // // Act
  353. // var screen = view.ContentToScreen (new (ContentX, 0, 0, 0));
  354. // // Assert
  355. // Assert.Equal (expectedX, screen.X);
  356. //}
  357. //[Theory]
  358. //[InlineData (0, 0, 2)]
  359. //[InlineData (1, 0, 3)]
  360. //[InlineData (-1, 0, 1)]
  361. //[InlineData (11, 0, 13)]
  362. //[InlineData (0, 1, 3)]
  363. //[InlineData (1, 1, 4)]
  364. //[InlineData (-1, 1, 2)]
  365. //[InlineData (11, 1, 14)]
  366. //[InlineData (0, -1, 1)]
  367. //[InlineData (1, -1, 2)]
  368. //[InlineData (-1, -1, 0)]
  369. //[InlineData (11, -1, 12)]
  370. //public void ContentToScreen_NestedSuperView_WithAdornments (int frameX, int ContentX, int expectedX)
  371. //{
  372. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  373. // // Arrange
  374. // var frame = new Rectangle (frameX, 0, 10, 10);
  375. // var superSuperView = new View ()
  376. // {
  377. // X = 0,
  378. // Y = 0,
  379. // Height = Dim.Fill (),
  380. // Width = Dim.Fill ()
  381. // };
  382. // superSuperView.BorderStyle = LineStyle.Single;
  383. // var superView = new View ()
  384. // {
  385. // X = 0,
  386. // Y = 0,
  387. // Height = Dim.Fill (),
  388. // Width = Dim.Fill ()
  389. // };
  390. // superSuperView.Add (superView);
  391. // superView.BorderStyle = LineStyle.Single;
  392. // var view = new View ();
  393. // view.Frame = frame;
  394. // superView.Add (view);
  395. // superView.LayoutSubviews ();
  396. // // Act
  397. // var screen = view.ContentToScreen (new (ContentX, 0, 0, 0));
  398. // // Assert
  399. // Assert.Equal (expectedX, screen.X);
  400. //}
  401. //[Theory]
  402. //[InlineData (0, 0, 3)]
  403. //[InlineData (1, 0, 4)]
  404. //[InlineData (-1, 0, 2)]
  405. //[InlineData (11, 0, 14)]
  406. //[InlineData (0, 1, 4)]
  407. //[InlineData (1, 1, 5)]
  408. //[InlineData (-1, 1, 3)]
  409. //[InlineData (11, 1, 15)]
  410. //[InlineData (0, -1, 2)]
  411. //[InlineData (1, -1, 3)]
  412. //[InlineData (-1, -1, 1)]
  413. //[InlineData (11, -1, 13)]
  414. //public void ContentToScreen_Positive_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX)
  415. //{
  416. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  417. // // Arrange
  418. // var frame = new Rectangle (frameX, 0, 10, 10);
  419. // var superSuperView = new View ()
  420. // {
  421. // X = 0,
  422. // Y = 0,
  423. // Height = Dim.Fill (),
  424. // Width = Dim.Fill ()
  425. // };
  426. // superSuperView.BorderStyle = LineStyle.Single;
  427. // var superView = new View ()
  428. // {
  429. // X = 0,
  430. // Y = 0,
  431. // Height = Dim.Fill (),
  432. // Width = Dim.Fill ()
  433. // };
  434. // superSuperView.Add (superView);
  435. // superView.BorderStyle = LineStyle.Single;
  436. // var view = new View ();
  437. // view.Frame = frame;
  438. // view.ContentSize = new (11, 11);
  439. // view.Content = view.Content with { Location = new (1, 1) };
  440. // superView.Add (view);
  441. // superView.LayoutSubviews ();
  442. // // Act
  443. // var screen = view.ContentToScreen (new (testX, 0, 0, 0));
  444. // // Assert
  445. // Assert.Equal (expectedX, screen.X);
  446. //}
  447. // ViewportToScreen tests ----------------------
  448. [Fact]
  449. public void ViewportToScreen_With_Positive_Viewport_Location ()
  450. {
  451. View view = new ()
  452. {
  453. Width = 10,
  454. Height = 10,
  455. ScrollSettings = ScrollSettings.NoRestrict
  456. };
  457. Rectangle testRect = new Rectangle (0, 0, 1, 1);
  458. Assert.Equal (new Point (0, 0), view.ViewportToScreen (testRect).Location);
  459. view.Viewport = view.Viewport with { Location = new Point (1, 1) };
  460. Assert.Equal (new Rectangle (1, 1, 10, 10), view.Viewport);
  461. Assert.Equal (new Point (0, 0), view.ViewportToScreen (testRect).Location);
  462. }
  463. [Theory]
  464. [InlineData (0, 0, 0)]
  465. [InlineData (1, 0, 1)]
  466. [InlineData (-1, 0, -1)]
  467. [InlineData (11, 0, 11)]
  468. public void ViewportToScreen_NoSuperView_WithoutAdornments (int frameX, int viewportX, int expectedX)
  469. {
  470. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  471. // Arrange
  472. var frame = new Rectangle (frameX, 0, 10, 10);
  473. var view = new View ();
  474. view.Frame = frame;
  475. // Act
  476. var screen = view.ViewportToScreen (new (viewportX, 0, 0, 0));
  477. // Assert
  478. Assert.Equal (expectedX, screen.X);
  479. }
  480. [Theory]
  481. [InlineData (0, 0, 1)]
  482. [InlineData (1, 0, 2)]
  483. [InlineData (-1, 0, 0)]
  484. [InlineData (11, 0, 12)]
  485. [InlineData (0, 1, 2)]
  486. [InlineData (1, 1, 3)]
  487. [InlineData (-1, 1, 1)]
  488. [InlineData (11, 1, 13)]
  489. [InlineData (0, -1, 0)]
  490. [InlineData (1, -1, 1)]
  491. [InlineData (-1, -1, -1)]
  492. [InlineData (11, -1, 11)]
  493. public void ViewportToScreen_NoSuperView_WithAdornments (int frameX, int viewportX, int expectedX)
  494. {
  495. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  496. // Arrange
  497. var frame = new Rectangle (frameX, 0, 10, 10);
  498. var view = new View ();
  499. view.BorderStyle = LineStyle.Single;
  500. view.Frame = frame;
  501. // Act
  502. var screen = view.ViewportToScreen (new (viewportX, 0, 0, 0));
  503. // Assert
  504. Assert.Equal (expectedX, screen.X);
  505. }
  506. [Theory]
  507. [InlineData (0, 0, 0)]
  508. [InlineData (1, 0, 1)]
  509. [InlineData (-1, 0, -1)]
  510. [InlineData (11, 0, 11)]
  511. [InlineData (0, 1, 1)]
  512. [InlineData (1, 1, 2)]
  513. [InlineData (-1, 1, 0)]
  514. [InlineData (11, 1, 12)]
  515. [InlineData (0, -1, -1)]
  516. [InlineData (1, -1, 0)]
  517. [InlineData (-1, -1, -2)]
  518. [InlineData (11, -1, 10)]
  519. public void ViewportToScreen_SuperView_WithoutAdornments (int frameX, int viewportX, int expectedX)
  520. {
  521. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  522. // Arrange
  523. var frame = new Rectangle (frameX, 0, 10, 10);
  524. var superView = new View ()
  525. {
  526. X = 0,
  527. Y = 0,
  528. Height = Dim.Fill (),
  529. Width = Dim.Fill ()
  530. };
  531. var view = new View ();
  532. view.Frame = frame;
  533. superView.Add (view);
  534. superView.LayoutSubviews ();
  535. // Act
  536. var screen = view.ViewportToScreen (new (viewportX, 0, 0, 0));
  537. // Assert
  538. Assert.Equal (expectedX, screen.X);
  539. }
  540. [Theory]
  541. [InlineData (0, 0, 1)]
  542. [InlineData (1, 0, 2)]
  543. [InlineData (-1, 0, 0)]
  544. [InlineData (11, 0, 12)]
  545. [InlineData (0, 1, 2)]
  546. [InlineData (1, 1, 3)]
  547. [InlineData (-1, 1, 1)]
  548. [InlineData (11, 1, 13)]
  549. [InlineData (0, -1, 0)]
  550. [InlineData (1, -1, 1)]
  551. [InlineData (-1, -1, -1)]
  552. [InlineData (11, -1, 11)]
  553. public void ViewportToScreen_SuperView_WithAdornments (int frameX, int viewportX, int expectedX)
  554. {
  555. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  556. // Arrange
  557. var frame = new Rectangle (frameX, 0, 10, 10);
  558. var superView = new View ()
  559. {
  560. X = 0,
  561. Y = 0,
  562. Height = Dim.Fill (),
  563. Width = Dim.Fill ()
  564. };
  565. superView.BorderStyle = LineStyle.Single;
  566. var view = new View ();
  567. view.Frame = frame;
  568. superView.Add (view);
  569. superView.LayoutSubviews ();
  570. // Act
  571. var screen = view.ViewportToScreen (new (viewportX, 0, 0, 0));
  572. // Assert
  573. Assert.Equal (expectedX, screen.X);
  574. }
  575. [Theory]
  576. [InlineData (0, 0, 0)]
  577. [InlineData (1, 0, 1)]
  578. [InlineData (-1, 0, -1)]
  579. [InlineData (11, 0, 11)]
  580. [InlineData (0, 1, 1)]
  581. [InlineData (1, 1, 2)]
  582. [InlineData (-1, 1, 0)]
  583. [InlineData (11, 1, 12)]
  584. [InlineData (0, -1, -1)]
  585. [InlineData (1, -1, 0)]
  586. [InlineData (-1, -1, -2)]
  587. [InlineData (11, -1, 10)]
  588. public void ViewportToScreen_NestedSuperView_WithoutAdornments (int frameX, int viewportX, int expectedX)
  589. {
  590. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  591. // Arrange
  592. var frame = new Rectangle (frameX, 0, 10, 10);
  593. var superSuperView = new View ()
  594. {
  595. X = 0,
  596. Y = 0,
  597. Height = Dim.Fill (),
  598. Width = Dim.Fill ()
  599. };
  600. var superView = new View ()
  601. {
  602. X = 0,
  603. Y = 0,
  604. Height = Dim.Fill (),
  605. Width = Dim.Fill ()
  606. };
  607. superSuperView.Add (superView);
  608. var view = new View ();
  609. view.Frame = frame;
  610. superView.Add (view);
  611. superView.LayoutSubviews ();
  612. // Act
  613. var screen = view.ViewportToScreen (new (viewportX, 0, 0, 0));
  614. // Assert
  615. Assert.Equal (expectedX, screen.X);
  616. }
  617. [Theory]
  618. [InlineData (0, 0, 2)]
  619. [InlineData (1, 0, 3)]
  620. [InlineData (-1, 0, 1)]
  621. [InlineData (11, 0, 13)]
  622. [InlineData (0, 1, 3)]
  623. [InlineData (1, 1, 4)]
  624. [InlineData (-1, 1, 2)]
  625. [InlineData (11, 1, 14)]
  626. [InlineData (0, -1, 1)]
  627. [InlineData (1, -1, 2)]
  628. [InlineData (-1, -1, 0)]
  629. [InlineData (11, -1, 12)]
  630. public void ViewportToScreen_NestedSuperView_WithAdornments (int frameX, int viewportX, int expectedX)
  631. {
  632. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  633. // Arrange
  634. var frame = new Rectangle (frameX, 0, 10, 10);
  635. var superSuperView = new View ()
  636. {
  637. X = 0,
  638. Y = 0,
  639. Height = Dim.Fill (),
  640. Width = Dim.Fill ()
  641. };
  642. superSuperView.BorderStyle = LineStyle.Single;
  643. var superView = new View ()
  644. {
  645. X = 0,
  646. Y = 0,
  647. Height = Dim.Fill (),
  648. Width = Dim.Fill ()
  649. };
  650. superSuperView.Add (superView);
  651. superView.BorderStyle = LineStyle.Single;
  652. var view = new View ();
  653. view.Frame = frame;
  654. superView.Add (view);
  655. superView.LayoutSubviews ();
  656. // Act
  657. var screen = view.ViewportToScreen (new (viewportX, 0, 0, 0));
  658. // Assert
  659. Assert.Equal (expectedX, screen.X);
  660. }
  661. [Theory]
  662. [InlineData (0, 0, 2)]
  663. [InlineData (1, 0, 3)]
  664. [InlineData (-1, 0, 1)]
  665. [InlineData (11, 0, 13)]
  666. [InlineData (0, 1, 3)]
  667. [InlineData (1, 1, 4)]
  668. [InlineData (-1, 1, 2)]
  669. [InlineData (11, 1, 14)]
  670. [InlineData (0, -1, 1)]
  671. [InlineData (1, -1, 2)]
  672. [InlineData (-1, -1, 0)]
  673. [InlineData (11, -1, 12)]
  674. public void ViewportToScreen_Positive_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX)
  675. {
  676. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  677. // Arrange
  678. var frame = new Rectangle (frameX, 0, 10, 10);
  679. var superSuperView = new View ()
  680. {
  681. X = 0,
  682. Y = 0,
  683. Height = Dim.Fill (),
  684. Width = Dim.Fill ()
  685. };
  686. superSuperView.BorderStyle = LineStyle.Single;
  687. var superView = new View ()
  688. {
  689. X = 0,
  690. Y = 0,
  691. Height = Dim.Fill (),
  692. Width = Dim.Fill ()
  693. };
  694. superSuperView.Add (superView);
  695. superView.BorderStyle = LineStyle.Single;
  696. var view = new View ();
  697. view.Frame = frame;
  698. view.ContentSize = new (11, 11);
  699. view.Viewport = view.Viewport with { Location = new (1, 1) };
  700. superView.Add (view);
  701. superView.LayoutSubviews ();
  702. // Act
  703. var screen = view.ViewportToScreen (new (testX, 0, 0, 0));
  704. // Assert
  705. Assert.Equal (expectedX, screen.X);
  706. }
  707. }