ToScreenTests.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.LayoutTests;
  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 ()
  9. {
  10. // Test FrameToScreen
  11. [Theory]
  12. [InlineData (0, 0, 0, 0)]
  13. [InlineData (1, 0, 1, 0)]
  14. [InlineData (0, 1, 0, 1)]
  15. [InlineData (1, 1, 1, 1)]
  16. [InlineData (10, 10, 10, 10)]
  17. public void FrameToScreen_NoSuperView (int frameX, int frameY, int expectedScreenX, int expectedScreenY)
  18. {
  19. var view = new View { X = frameX, Y = frameY, Width = 10, Height = 10 };
  20. view.Layout ();
  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. super.Layout ();
  45. var expected = new Rectangle (expectedScreenX, expectedScreenY, 10, 10);
  46. Rectangle actual = view.FrameToScreen ();
  47. Assert.Equal (expected, actual);
  48. }
  49. [Theory]
  50. [InlineData (0, 0)]
  51. [InlineData (1, 1)]
  52. [InlineData (-1, -1)]
  53. [InlineData (11, 11)]
  54. public void FrameToScreen_NoSuperView_WithoutAdornments (int x, int expectedX)
  55. {
  56. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  57. // Arrange
  58. var frame = new Rectangle (x, 0, 10, 10);
  59. var view = new View ();
  60. view.Frame = frame;
  61. // Act
  62. Rectangle screen = view.FrameToScreen ();
  63. // Assert
  64. Assert.Equal (expectedX, screen.X);
  65. }
  66. [Theory]
  67. [InlineData (0, 0)]
  68. [InlineData (1, 1)]
  69. [InlineData (-1, -1)]
  70. [InlineData (11, 11)]
  71. public void FrameToScreen_NoSuperView_WithAdornments (int x, int expectedX)
  72. {
  73. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  74. // Arrange
  75. var frame = new Rectangle (x, 0, 10, 10);
  76. var view = new View ();
  77. view.BorderStyle = LineStyle.Single;
  78. view.Frame = frame;
  79. // Act
  80. Rectangle screen = view.FrameToScreen ();
  81. // Assert
  82. Assert.Equal (expectedX, screen.X);
  83. }
  84. [Theory]
  85. [InlineData (0, 1)]
  86. [InlineData (1, 2)]
  87. [InlineData (-1, 0)]
  88. [InlineData (11, 12)]
  89. public void FrameToScreen_NoSuperView_WithAdornment_WithSubView (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 view = new View ();
  95. view.BorderStyle = LineStyle.Single;
  96. view.Frame = frame;
  97. var subviewOfBorder = new View
  98. {
  99. X = 1, // screen should be 1
  100. Y = 0,
  101. Width = 1,
  102. Height = 1
  103. };
  104. view.Border.Add (subviewOfBorder);
  105. view.BeginInit ();
  106. view.EndInit ();
  107. // Act
  108. Rectangle screen = subviewOfBorder.FrameToScreen ();
  109. // Assert
  110. Assert.Equal (expectedX, screen.X);
  111. }
  112. [Theory]
  113. [InlineData (0, 3)]
  114. [InlineData (1, 4)]
  115. [InlineData (-1, 2)]
  116. [InlineData (11, 14)]
  117. public void FrameToScreen_Adornment_WithSubView_WithSubView (int topX, int expectedX)
  118. {
  119. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  120. // Arrange
  121. var adornmentFrame = new Rectangle (topX, 0, 10, 10);
  122. var adornment = new Adornment ();
  123. adornment.Frame = adornmentFrame;
  124. adornment.Thickness = new (1);
  125. var subviewOfAdornment = new View
  126. {
  127. Id = "subviewOfAdornment",
  128. X = 1, // screen should be 1
  129. Y = 0,
  130. Width = 1,
  131. Height = 1
  132. };
  133. var subviewOfSubView = new View
  134. {
  135. Id = "subviewOfSubView",
  136. X = 2, // screen should be 3 (the subviewOfAdornment location is 1)
  137. Y = 0,
  138. Width = 1,
  139. Height = 1
  140. };
  141. subviewOfAdornment.Add (subviewOfSubView);
  142. adornment.Add (subviewOfAdornment);
  143. adornment.BeginInit ();
  144. adornment.EndInit ();
  145. // Act
  146. Rectangle screen = subviewOfSubView.FrameToScreen ();
  147. // Assert
  148. Assert.Equal (expectedX, screen.X);
  149. }
  150. [Theory]
  151. [InlineData (0, 0)]
  152. [InlineData (1, 1)]
  153. [InlineData (-1, -1)]
  154. [InlineData (11, 11)]
  155. public void FrameToScreen_SuperView_WithoutAdornments (int x, int expectedX)
  156. {
  157. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  158. // Arrange
  159. var frame = new Rectangle (x, 0, 10, 10);
  160. var superView = new View
  161. {
  162. X = 0,
  163. Y = 0,
  164. Height = Dim.Fill (),
  165. Width = Dim.Fill ()
  166. };
  167. var view = new View ();
  168. view.Frame = frame;
  169. superView.Add (view);
  170. superView.LayoutSubViews ();
  171. // Act
  172. Rectangle screen = view.FrameToScreen ();
  173. // Assert
  174. Assert.Equal (expectedX, screen.X);
  175. }
  176. [Theory]
  177. [InlineData (0, 1)]
  178. [InlineData (1, 2)]
  179. [InlineData (-1, 0)]
  180. [InlineData (11, 12)]
  181. public void FrameToScreen_SuperView_WithAdornments (int x, int expectedX)
  182. {
  183. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  184. // Arrange
  185. var frame = new Rectangle (x, 0, 10, 10);
  186. var superView = new View
  187. {
  188. X = 0,
  189. Y = 0,
  190. Height = Dim.Fill (),
  191. Width = Dim.Fill ()
  192. };
  193. superView.BorderStyle = LineStyle.Single;
  194. var view = new View ();
  195. view.Frame = frame;
  196. superView.Add (view);
  197. superView.LayoutSubViews ();
  198. // Act
  199. Rectangle screen = view.FrameToScreen ();
  200. // Assert
  201. Assert.Equal (expectedX, screen.X);
  202. }
  203. [Theory]
  204. [InlineData (0, 0)]
  205. [InlineData (1, 1)]
  206. [InlineData (-1, -1)]
  207. [InlineData (11, 11)]
  208. public void FrameToScreen_NestedSuperView_WithoutAdornments (int x, int expectedX)
  209. {
  210. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  211. // Arrange
  212. var frame = new Rectangle (x, 0, 10, 10);
  213. var superSuperView = new View
  214. {
  215. X = 0,
  216. Y = 0,
  217. Height = Dim.Fill (),
  218. Width = Dim.Fill ()
  219. };
  220. var superView = new View
  221. {
  222. X = 0,
  223. Y = 0,
  224. Height = Dim.Fill (),
  225. Width = Dim.Fill ()
  226. };
  227. superSuperView.Add (superView);
  228. var view = new View ();
  229. view.Frame = frame;
  230. superView.Add (view);
  231. superView.LayoutSubViews ();
  232. // Act
  233. Rectangle screen = view.FrameToScreen ();
  234. // Assert
  235. Assert.Equal (expectedX, screen.X);
  236. }
  237. [Theory]
  238. [InlineData (0, 2)]
  239. [InlineData (1, 3)]
  240. [InlineData (-1, 1)]
  241. [InlineData (11, 13)]
  242. public void FrameToScreen_NestedSuperView_WithAdornments (int x, int expectedX)
  243. {
  244. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  245. // Arrange
  246. var frame = new Rectangle (x, 0, 10, 10);
  247. var superSuperView = new View
  248. {
  249. X = 0,
  250. Y = 0,
  251. Height = Dim.Fill (),
  252. Width = Dim.Fill ()
  253. };
  254. superSuperView.BorderStyle = LineStyle.Single;
  255. var superView = new View
  256. {
  257. X = 0,
  258. Y = 0,
  259. Height = Dim.Fill (),
  260. Width = Dim.Fill ()
  261. };
  262. superSuperView.Add (superView);
  263. superView.BorderStyle = LineStyle.Single;
  264. var view = new View ();
  265. view.Frame = frame;
  266. superView.Add (view);
  267. superSuperView.Layout ();
  268. // Act
  269. Rectangle screen = view.FrameToScreen ();
  270. // Assert
  271. Assert.Equal (expectedX, screen.X);
  272. }
  273. // ContentToScreen tests ----------------------
  274. [Fact]
  275. public void ContentToScreen_With_Positive_Content_Location ()
  276. {
  277. View view = new ()
  278. {
  279. X = 1,
  280. Y = 1,
  281. Width = 10,
  282. Height = 10
  283. };
  284. view.Layout ();
  285. view.SetContentSize (new (20, 20));
  286. Point testPoint = new (0, 0);
  287. Assert.Equal (new (1, 1), view.ContentToScreen (testPoint));
  288. }
  289. [Theory]
  290. [InlineData (0, 0, 1)]
  291. [InlineData (1, 0, 2)]
  292. [InlineData (-1, 0, 0)]
  293. [InlineData (0, 1, 2)]
  294. [InlineData (1, 1, 3)]
  295. [InlineData (-1, 1, 1)]
  296. [InlineData (0, -1, 0)]
  297. [InlineData (1, -1, 1)]
  298. [InlineData (-1, -1, -1)]
  299. public void ContentToScreen_NoSuperView_WithAdornments (int frameX, int contentX, int expectedX)
  300. {
  301. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  302. // Arrange
  303. var frame = new Rectangle (frameX, 0, 10, 10);
  304. var view = new View ();
  305. view.Frame = frame;
  306. view.SetContentSize (new (20, 20));
  307. view.BorderStyle = LineStyle.Single;
  308. // Act
  309. Point screen = view.ContentToScreen (new (contentX, 0));
  310. // Assert
  311. Assert.Equal (expectedX, screen.X);
  312. }
  313. [Theory]
  314. [InlineData (0, 0, 0)]
  315. [InlineData (1, 0, 1)]
  316. [InlineData (-1, 0, -1)]
  317. [InlineData (11, 0, 11)]
  318. [InlineData (0, 1, 1)]
  319. [InlineData (1, 1, 2)]
  320. [InlineData (-1, 1, 0)]
  321. [InlineData (11, 1, 12)]
  322. [InlineData (0, -1, -1)]
  323. [InlineData (1, -1, 0)]
  324. [InlineData (-1, -1, -2)]
  325. [InlineData (11, -1, 10)]
  326. public void ContentToScreen_SuperView_WithoutAdornments (int frameX, int contentX, int expectedX)
  327. {
  328. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  329. // Arrange
  330. var frame = new Rectangle (frameX, 0, 10, 10);
  331. var superView = new View
  332. {
  333. X = 0,
  334. Y = 0,
  335. Height = Dim.Fill (),
  336. Width = Dim.Fill ()
  337. };
  338. var view = new View ();
  339. view.Frame = frame;
  340. view.SetContentSize (new (20, 20));
  341. superView.Add (view);
  342. superView.LayoutSubViews ();
  343. // Act
  344. Point screen = view.ContentToScreen (new (contentX, 0));
  345. // Assert
  346. Assert.Equal (expectedX, screen.X);
  347. }
  348. //[Theory]
  349. //[InlineData (0, 0, 1)]
  350. //[InlineData (1, 0, 2)]
  351. //[InlineData (-1, 0, 0)]
  352. //[InlineData (11, 0, 12)]
  353. //[InlineData (0, 1, 2)]
  354. //[InlineData (1, 1, 3)]
  355. //[InlineData (-1, 1, 1)]
  356. //[InlineData (11, 1, 13)]
  357. //[InlineData (0, -1, 0)]
  358. //[InlineData (1, -1, 1)]
  359. //[InlineData (-1, -1, -1)]
  360. //[InlineData (11, -1, 11)]
  361. //public void ContentToScreen_SuperView_WithAdornments (int frameX, int ContentX, int expectedX)
  362. //{
  363. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  364. // // Arrange
  365. // var frame = new Rectangle (frameX, 0, 10, 10);
  366. // var superView = new View ()
  367. // {
  368. // X = 0,
  369. // Y = 0,
  370. // Height = Dim.Fill (),
  371. // Width = Dim.Fill ()
  372. // };
  373. // superView.BorderStyle = LineStyle.Single;
  374. // var view = new View ();
  375. // view.Frame = frame;
  376. // superView.Add (view);
  377. // superView.LayoutSubViews ();
  378. // // Act
  379. // var screen = view.ContentToScreen (new (ContentX, 0, 0, 0));
  380. // // Assert
  381. // Assert.Equal (expectedX, screen.X);
  382. //}
  383. //[Theory]
  384. //[InlineData (0, 0, 0)]
  385. //[InlineData (1, 0, 1)]
  386. //[InlineData (-1, 0, -1)]
  387. //[InlineData (11, 0, 11)]
  388. //[InlineData (0, 1, 1)]
  389. //[InlineData (1, 1, 2)]
  390. //[InlineData (-1, 1, 0)]
  391. //[InlineData (11, 1, 12)]
  392. //[InlineData (0, -1, -1)]
  393. //[InlineData (1, -1, 0)]
  394. //[InlineData (-1, -1, -2)]
  395. //[InlineData (11, -1, 10)]
  396. //public void ContentToScreen_NestedSuperView_WithoutAdornments (int frameX, int ContentX, int expectedX)
  397. //{
  398. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  399. // // Arrange
  400. // var frame = new Rectangle (frameX, 0, 10, 10);
  401. // var superSuperView = new View ()
  402. // {
  403. // X = 0,
  404. // Y = 0,
  405. // Height = Dim.Fill (),
  406. // Width = Dim.Fill ()
  407. // };
  408. // var superView = new View ()
  409. // {
  410. // X = 0,
  411. // Y = 0,
  412. // Height = Dim.Fill (),
  413. // Width = Dim.Fill ()
  414. // };
  415. // superSuperView.Add (superView);
  416. // var view = new View ();
  417. // view.Frame = frame;
  418. // superView.Add (view);
  419. // superView.LayoutSubViews ();
  420. // // Act
  421. // var screen = view.ContentToScreen (new (ContentX, 0, 0, 0));
  422. // // Assert
  423. // Assert.Equal (expectedX, screen.X);
  424. //}
  425. //[Theory]
  426. //[InlineData (0, 0, 2)]
  427. //[InlineData (1, 0, 3)]
  428. //[InlineData (-1, 0, 1)]
  429. //[InlineData (11, 0, 13)]
  430. //[InlineData (0, 1, 3)]
  431. //[InlineData (1, 1, 4)]
  432. //[InlineData (-1, 1, 2)]
  433. //[InlineData (11, 1, 14)]
  434. //[InlineData (0, -1, 1)]
  435. //[InlineData (1, -1, 2)]
  436. //[InlineData (-1, -1, 0)]
  437. //[InlineData (11, -1, 12)]
  438. //public void ContentToScreen_NestedSuperView_WithAdornments (int frameX, int ContentX, int expectedX)
  439. //{
  440. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  441. // // Arrange
  442. // var frame = new Rectangle (frameX, 0, 10, 10);
  443. // var superSuperView = new View ()
  444. // {
  445. // X = 0,
  446. // Y = 0,
  447. // Height = Dim.Fill (),
  448. // Width = Dim.Fill ()
  449. // };
  450. // superSuperView.BorderStyle = LineStyle.Single;
  451. // var superView = new View ()
  452. // {
  453. // X = 0,
  454. // Y = 0,
  455. // Height = Dim.Fill (),
  456. // Width = Dim.Fill ()
  457. // };
  458. // superSuperView.Add (superView);
  459. // superView.BorderStyle = LineStyle.Single;
  460. // var view = new View ();
  461. // view.Frame = frame;
  462. // superView.Add (view);
  463. // superView.LayoutSubViews ();
  464. // // Act
  465. // var screen = view.ContentToScreen (new (ContentX, 0, 0, 0));
  466. // // Assert
  467. // Assert.Equal (expectedX, screen.X);
  468. //}
  469. //[Theory]
  470. //[InlineData (0, 0, 3)]
  471. //[InlineData (1, 0, 4)]
  472. //[InlineData (-1, 0, 2)]
  473. //[InlineData (11, 0, 14)]
  474. //[InlineData (0, 1, 4)]
  475. //[InlineData (1, 1, 5)]
  476. //[InlineData (-1, 1, 3)]
  477. //[InlineData (11, 1, 15)]
  478. //[InlineData (0, -1, 2)]
  479. //[InlineData (1, -1, 3)]
  480. //[InlineData (-1, -1, 1)]
  481. //[InlineData (11, -1, 13)]
  482. //public void ContentToScreen_Positive_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX)
  483. //{
  484. // // We test with only X because Y is equivalent. Height/Width are irrelevant.
  485. // // Arrange
  486. // var frame = new Rectangle (frameX, 0, 10, 10);
  487. // var superSuperView = new View ()
  488. // {
  489. // X = 0,
  490. // Y = 0,
  491. // Height = Dim.Fill (),
  492. // Width = Dim.Fill ()
  493. // };
  494. // superSuperView.BorderStyle = LineStyle.Single;
  495. // var superView = new View ()
  496. // {
  497. // X = 0,
  498. // Y = 0,
  499. // Height = Dim.Fill (),
  500. // Width = Dim.Fill ()
  501. // };
  502. // superSuperView.Add (superView);
  503. // superView.BorderStyle = LineStyle.Single;
  504. // var view = new View ();
  505. // view.Frame = frame;
  506. // view.SetContentSize (new (11, 11));
  507. // view.Content = view.Content with { Location = new (1, 1) };
  508. // superView.Add (view);
  509. // superView.LayoutSubViews ();
  510. // // Act
  511. // var screen = view.ContentToScreen (new (testX, 0, 0, 0));
  512. // // Assert
  513. // Assert.Equal (expectedX, screen.X);
  514. //}
  515. // ViewportToScreen tests ----------------------
  516. [Fact]
  517. public void ViewportToScreen_With_Positive_Viewport_Location ()
  518. {
  519. View view = new ()
  520. {
  521. Width = 10,
  522. Height = 10,
  523. ViewportSettings = ViewportSettings.AllowNegativeLocation
  524. };
  525. view.Layout ();
  526. var testRect = new Rectangle (0, 0, 1, 1);
  527. Assert.Equal (new (0, 0), view.ViewportToScreen (testRect).Location);
  528. view.Viewport = view.Viewport with { Location = new (1, 1) };
  529. Assert.Equal (new (1, 1, 10, 10), view.Viewport);
  530. Assert.Equal (new (0, 0), view.ViewportToScreen (testRect).Location);
  531. }
  532. [Theory]
  533. [InlineData (0, 0, 0)]
  534. [InlineData (1, 0, 1)]
  535. [InlineData (-1, 0, -1)]
  536. [InlineData (11, 0, 11)]
  537. public void ViewportToScreen_NoSuperView_WithoutAdornments (int frameX, int viewportX, int expectedX)
  538. {
  539. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  540. // Arrange
  541. var frame = new Rectangle (frameX, 0, 10, 10);
  542. var view = new View ();
  543. view.Frame = frame;
  544. view.Layout ();
  545. // Act
  546. Point screen = view.ViewportToScreen (new Point (viewportX, 0));
  547. // Assert
  548. Assert.Equal (expectedX, screen.X);
  549. }
  550. [Theory]
  551. [InlineData (0, 0, 1)]
  552. [InlineData (1, 0, 2)]
  553. [InlineData (-1, 0, 0)]
  554. [InlineData (11, 0, 12)]
  555. [InlineData (0, 1, 2)]
  556. [InlineData (1, 1, 3)]
  557. [InlineData (-1, 1, 1)]
  558. [InlineData (11, 1, 13)]
  559. [InlineData (0, -1, 0)]
  560. [InlineData (1, -1, 1)]
  561. [InlineData (-1, -1, -1)]
  562. [InlineData (11, -1, 11)]
  563. public void ViewportToScreen_NoSuperView_WithAdornments (int frameX, int viewportX, int expectedX)
  564. {
  565. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  566. // Arrange
  567. var frame = new Rectangle (frameX, 0, 10, 10);
  568. var view = new View ();
  569. view.BorderStyle = LineStyle.Single;
  570. view.Frame = frame;
  571. // Act
  572. Point screen = view.ViewportToScreen (new Point (viewportX, 0));
  573. // Assert
  574. Assert.Equal (expectedX, screen.X);
  575. }
  576. [Theory]
  577. [InlineData (0, 0, 0)]
  578. [InlineData (1, 0, 1)]
  579. [InlineData (-1, 0, -1)]
  580. [InlineData (11, 0, 11)]
  581. [InlineData (0, 1, 1)]
  582. [InlineData (1, 1, 2)]
  583. [InlineData (-1, 1, 0)]
  584. [InlineData (11, 1, 12)]
  585. [InlineData (0, -1, -1)]
  586. [InlineData (1, -1, 0)]
  587. [InlineData (-1, -1, -2)]
  588. [InlineData (11, -1, 10)]
  589. public void ViewportToScreen_SuperView_WithoutAdornments (int frameX, int viewportX, int expectedX)
  590. {
  591. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  592. // Arrange
  593. var frame = new Rectangle (frameX, 0, 10, 10);
  594. var superView = new View
  595. {
  596. X = 0,
  597. Y = 0,
  598. Height = Dim.Fill (),
  599. Width = Dim.Fill ()
  600. };
  601. var view = new View ();
  602. view.Frame = frame;
  603. superView.Add (view);
  604. superView.LayoutSubViews ();
  605. // Act
  606. Point screen = view.ViewportToScreen (new Point (viewportX, 0));
  607. // Assert
  608. Assert.Equal (expectedX, screen.X);
  609. }
  610. [Theory]
  611. [InlineData (0, 0, 1)]
  612. [InlineData (1, 0, 2)]
  613. [InlineData (-1, 0, 0)]
  614. [InlineData (11, 0, 12)]
  615. [InlineData (0, 1, 2)]
  616. [InlineData (1, 1, 3)]
  617. [InlineData (-1, 1, 1)]
  618. [InlineData (11, 1, 13)]
  619. [InlineData (0, -1, 0)]
  620. [InlineData (1, -1, 1)]
  621. [InlineData (-1, -1, -1)]
  622. [InlineData (11, -1, 11)]
  623. public void ViewportToScreen_SuperView_WithAdornments (int frameX, int viewportX, int expectedX)
  624. {
  625. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  626. // Arrange
  627. var frame = new Rectangle (frameX, 0, 10, 10);
  628. var superView = new View
  629. {
  630. X = 0,
  631. Y = 0,
  632. Height = Dim.Fill (),
  633. Width = Dim.Fill ()
  634. };
  635. superView.BorderStyle = LineStyle.Single;
  636. var view = new View ();
  637. view.Frame = frame;
  638. superView.Add (view);
  639. superView.LayoutSubViews ();
  640. // Act
  641. Point screen = view.ViewportToScreen (new Point (viewportX, 0));
  642. // Assert
  643. Assert.Equal (expectedX, screen.X);
  644. }
  645. [Theory]
  646. [InlineData (0, 0, 0)]
  647. [InlineData (1, 0, 1)]
  648. [InlineData (-1, 0, -1)]
  649. [InlineData (11, 0, 11)]
  650. [InlineData (0, 1, 1)]
  651. [InlineData (1, 1, 2)]
  652. [InlineData (-1, 1, 0)]
  653. [InlineData (11, 1, 12)]
  654. [InlineData (0, -1, -1)]
  655. [InlineData (1, -1, 0)]
  656. [InlineData (-1, -1, -2)]
  657. [InlineData (11, -1, 10)]
  658. public void ViewportToScreen_NestedSuperView_WithoutAdornments (int frameX, int viewportX, int expectedX)
  659. {
  660. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  661. // Arrange
  662. var frame = new Rectangle (frameX, 0, 10, 10);
  663. var superSuperView = new View
  664. {
  665. X = 0,
  666. Y = 0,
  667. Height = Dim.Fill (),
  668. Width = Dim.Fill ()
  669. };
  670. var superView = new View
  671. {
  672. X = 0,
  673. Y = 0,
  674. Height = Dim.Fill (),
  675. Width = Dim.Fill ()
  676. };
  677. superSuperView.Add (superView);
  678. var view = new View ();
  679. view.Frame = frame;
  680. superView.Add (view);
  681. superView.LayoutSubViews ();
  682. // Act
  683. Point screen = view.ViewportToScreen (new Point (viewportX, 0));
  684. // Assert
  685. Assert.Equal (expectedX, screen.X);
  686. }
  687. [Theory]
  688. [InlineData (0, 0, 2)]
  689. [InlineData (1, 0, 3)]
  690. [InlineData (-1, 0, 1)]
  691. [InlineData (11, 0, 13)]
  692. [InlineData (0, 1, 3)]
  693. [InlineData (1, 1, 4)]
  694. [InlineData (-1, 1, 2)]
  695. [InlineData (11, 1, 14)]
  696. [InlineData (0, -1, 1)]
  697. [InlineData (1, -1, 2)]
  698. [InlineData (-1, -1, 0)]
  699. [InlineData (11, -1, 12)]
  700. public void ViewportToScreen_NestedSuperView_WithAdornments (int frameX, int viewportX, int expectedX)
  701. {
  702. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  703. // Arrange
  704. var frame = new Rectangle (frameX, 0, 10, 10);
  705. var superSuperView = new View
  706. {
  707. X = 0,
  708. Y = 0,
  709. Height = Dim.Fill (),
  710. Width = Dim.Fill ()
  711. };
  712. superSuperView.BorderStyle = LineStyle.Single;
  713. var superView = new View
  714. {
  715. X = 0,
  716. Y = 0,
  717. Height = Dim.Fill (),
  718. Width = Dim.Fill ()
  719. };
  720. superSuperView.Add (superView);
  721. superView.BorderStyle = LineStyle.Single;
  722. var view = new View ();
  723. view.Frame = frame;
  724. superView.Add (view);
  725. superView.Layout ();
  726. // Act
  727. Point screen = view.ViewportToScreen (new Point (viewportX, 0));
  728. // Assert
  729. Assert.Equal (expectedX, screen.X);
  730. }
  731. [Theory]
  732. [InlineData (0, 0, 2)]
  733. [InlineData (1, 0, 3)]
  734. [InlineData (-1, 0, 1)]
  735. [InlineData (11, 0, 13)]
  736. [InlineData (0, 1, 3)]
  737. [InlineData (1, 1, 4)]
  738. [InlineData (-1, 1, 2)]
  739. [InlineData (11, 1, 14)]
  740. [InlineData (0, -1, 1)]
  741. [InlineData (1, -1, 2)]
  742. [InlineData (-1, -1, 0)]
  743. [InlineData (11, -1, 12)]
  744. public void ViewportToScreen_Positive_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX)
  745. {
  746. // We test with only X because Y is equivalent. Height/Width are irrelevant.
  747. // Arrange
  748. var frame = new Rectangle (frameX, 0, 10, 10);
  749. var superSuperView = new View
  750. {
  751. X = 0,
  752. Y = 0,
  753. Height = Dim.Fill (),
  754. Width = Dim.Fill ()
  755. };
  756. superSuperView.BorderStyle = LineStyle.Single;
  757. var superView = new View
  758. {
  759. X = 0,
  760. Y = 0,
  761. Height = Dim.Fill (),
  762. Width = Dim.Fill ()
  763. };
  764. superSuperView.Add (superView);
  765. superView.BorderStyle = LineStyle.Single;
  766. var view = new View ();
  767. view.Frame = frame;
  768. view.SetContentSize (new (11, 11));
  769. view.Viewport = view.Viewport with { Location = new (1, 1) };
  770. superView.Add (view);
  771. superView.LayoutSubViews ();
  772. // Act
  773. Point screen = view.ViewportToScreen (new Point (testX, 0));
  774. // Assert
  775. Assert.Equal (expectedX, screen.X);
  776. }
  777. }