BorderTests.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947
  1. using Xunit.Abstractions;
  2. namespace UnitTests.ViewTests;
  3. public class BorderTests (ITestOutputHelper output)
  4. {
  5. [Fact]
  6. [SetupFakeApplication]
  7. public void Border_Parent_HasFocus_Title_Uses_FocusAttribute ()
  8. {
  9. var superView = new View { Width = 10, Height = 10, CanFocus = true };
  10. var otherView = new View { Width = 0, Height = 0, CanFocus = true };
  11. superView.Add (otherView);
  12. var view = new View { Title = "A", Height = 2, Width = 5 };
  13. superView.Add (view);
  14. view.Border!.Thickness = new (0, 1, 0, 0);
  15. view.Border!.LineStyle = LineStyle.Single;
  16. view.SetScheme (
  17. new ()
  18. {
  19. Normal = new (Color.Red, Color.Green),
  20. Focus = new (Color.Green, Color.Red)
  21. });
  22. Assert.NotEqual (view.GetScheme ().Normal.Foreground, view.GetScheme ().Focus.Foreground);
  23. Assert.Equal (ColorName16.Red, view.Border!.GetAttributeForRole (VisualRole.Normal).Foreground.GetClosestNamedColor16 ());
  24. Assert.Equal (ColorName16.Green, view.Border!.GetAttributeForRole (VisualRole.Focus).Foreground.GetClosestNamedColor16 ());
  25. Assert.Equal (view.GetAttributeForRole (VisualRole.Focus), view.Border!.GetAttributeForRole (VisualRole.Focus));
  26. superView.BeginInit ();
  27. superView.EndInit ();
  28. superView.Draw ();
  29. var expected = @"─┤A├─";
  30. DriverAssert.AssertDriverContentsAre (expected, output);
  31. DriverAssert.AssertDriverAttributesAre ("00000", output, null, view.GetScheme ().Normal);
  32. view.CanFocus = true;
  33. view.SetFocus ();
  34. View.SetClipToScreen ();
  35. view.Draw ();
  36. Assert.Equal (view.GetAttributeForRole (VisualRole.Focus), view.Border!.GetAttributeForRole (VisualRole.Focus));
  37. Assert.Equal (view.GetScheme ().Focus.Foreground, view.Border!.GetAttributeForRole (VisualRole.Focus).Foreground);
  38. Assert.Equal (view.GetScheme ().Normal.Foreground, view.Border!.GetAttributeForRole (VisualRole.Normal).Foreground);
  39. DriverAssert.AssertDriverAttributesAre ("00100", output, null, view.GetScheme ().Normal, view.GetAttributeForRole (VisualRole.Focus));
  40. }
  41. [Fact]
  42. [SetupFakeApplication]
  43. public void Border_Uses_Parent_Scheme ()
  44. {
  45. var view = new View { Title = "A", Height = 2, Width = 5 };
  46. view.Border!.Thickness = new (0, 1, 0, 0);
  47. view.Border!.LineStyle = LineStyle.Single;
  48. view.SetScheme (
  49. new ()
  50. {
  51. Normal = new (Color.Red, Color.Green), Focus = new (Color.Green, Color.Red)
  52. });
  53. Assert.Equal (ColorName16.Red, view.Border!.GetAttributeForRole (VisualRole.Normal).Foreground.GetClosestNamedColor16 ());
  54. Assert.Equal (ColorName16.Green, view.Border!.GetAttributeForRole (VisualRole.Focus).Foreground.GetClosestNamedColor16 ());
  55. Assert.Equal (view.GetAttributeForRole (VisualRole.Normal), view.Border!.GetAttributeForRole (VisualRole.Normal));
  56. Assert.Equal (view.GetAttributeForRole (VisualRole.Focus), view.Border!.GetAttributeForRole (VisualRole.Focus));
  57. view.BeginInit ();
  58. view.EndInit ();
  59. view.Draw ();
  60. var expected = @"─┤A├─";
  61. DriverAssert.AssertDriverContentsAre (expected, output);
  62. DriverAssert.AssertDriverAttributesAre ("00000", output, null, view.GetScheme ().Normal);
  63. }
  64. [Theory]
  65. [AutoInitShutdown]
  66. [InlineData (0)]
  67. [InlineData (1)]
  68. [InlineData (2)]
  69. [InlineData (3)]
  70. [InlineData (4)]
  71. [InlineData (5)]
  72. [InlineData (6)]
  73. [InlineData (7)]
  74. [InlineData (8)]
  75. [InlineData (9)]
  76. [InlineData (10)]
  77. public void Border_With_Title_Border_Double_Thickness_Top_Four_Size_Width (int width)
  78. {
  79. var win = new Window
  80. {
  81. Title = "1234", Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Double
  82. };
  83. win.Border!.Thickness = win.Border!.Thickness with { Top = 4 };
  84. SessionToken rs = Application.Begin (win);
  85. Application.Driver!.SetScreenSize (width, 5);
  86. AutoInitShutdownAttribute.RunIteration ();
  87. var expected = string.Empty;
  88. switch (width)
  89. {
  90. case 1:
  91. Assert.Equal (new (0, 0, 1, 5), win.Frame);
  92. expected = @"
  93. ║";
  94. break;
  95. case 2:
  96. Assert.Equal (new (0, 0, 2, 5), win.Frame);
  97. expected = @"
  98. ╔╗
  99. ║║
  100. ╚╝";
  101. break;
  102. case 3:
  103. Assert.Equal (new (0, 0, 3, 5), win.Frame);
  104. expected = @"
  105. ╔═╗
  106. ║ ║
  107. ╚═╝";
  108. break;
  109. case 4:
  110. Assert.Equal (new (0, 0, 4, 5), win.Frame);
  111. expected = @"
  112. ╒╕
  113. ╔╡╞╗
  114. ║╘╛║
  115. ╚══╝";
  116. break;
  117. case 5:
  118. Assert.Equal (new (0, 0, 5, 5), win.Frame);
  119. expected = @"
  120. ╒═╕
  121. ╔╡1╞╗
  122. ║╘═╛║
  123. ╚═══╝";
  124. break;
  125. case 6:
  126. Assert.Equal (new (0, 0, 6, 5), win.Frame);
  127. expected = @"
  128. ╒══╕
  129. ╔╡12╞╗
  130. ║╘══╛║
  131. ╚════╝";
  132. break;
  133. case 7:
  134. Assert.Equal (new (0, 0, 7, 5), win.Frame);
  135. expected = @"
  136. ╒═══╕
  137. ╔╡123╞╗
  138. ║╘═══╛║
  139. ╚═════╝";
  140. break;
  141. case 8:
  142. Assert.Equal (new (0, 0, 8, 5), win.Frame);
  143. expected = @"
  144. ╒════╕
  145. ╔╡1234╞╗
  146. ║╘════╛║
  147. ╚══════╝";
  148. break;
  149. case 9:
  150. Assert.Equal (new (0, 0, 9, 5), win.Frame);
  151. expected = @"
  152. ╒════╕
  153. ╔╡1234╞═╗
  154. ║╘════╛ ║
  155. ╚═══════╝";
  156. break;
  157. case 10:
  158. Assert.Equal (new (0, 0, 10, 5), win.Frame);
  159. expected = @"
  160. ╒════╕
  161. ╔╡1234╞══╗
  162. ║╘════╛ ║
  163. ╚════════╝";
  164. break;
  165. }
  166. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  167. Application.End (rs);
  168. win.Dispose ();
  169. }
  170. [Theory]
  171. [AutoInitShutdown]
  172. [InlineData (0)]
  173. [InlineData (1)]
  174. [InlineData (2)]
  175. [InlineData (3)]
  176. [InlineData (4)]
  177. [InlineData (5)]
  178. [InlineData (6)]
  179. [InlineData (7)]
  180. [InlineData (8)]
  181. [InlineData (9)]
  182. [InlineData (10)]
  183. public void Border_With_Title_Border_Double_Thickness_Top_Three_Size_Width (int width)
  184. {
  185. Window win = new ()
  186. {
  187. Title = "1234", Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Double
  188. };
  189. win.Border!.Thickness = win.Border!.Thickness with { Top = 3 };
  190. SessionToken rs = Application.Begin (win);
  191. Application.Driver!.SetScreenSize (width, 4);
  192. AutoInitShutdownAttribute.RunIteration ();
  193. var expected = string.Empty;
  194. switch (width)
  195. {
  196. case 1:
  197. Assert.Equal (new (0, 0, 1, 4), win.Frame);
  198. expected = @"
  199. ║";
  200. break;
  201. case 2:
  202. Assert.Equal (new (0, 0, 2, 4), win.Frame);
  203. expected = @"
  204. ╔╗
  205. ║║
  206. ╚╝";
  207. break;
  208. case 3:
  209. Assert.Equal (new (0, 0, 3, 4), win.Frame);
  210. expected = @"
  211. ╔═╗
  212. ║ ║
  213. ╚═╝";
  214. break;
  215. case 4:
  216. Assert.Equal (new (0, 0, 4, 4), win.Frame);
  217. expected = @"
  218. ╒╕
  219. ╔╡╞╗
  220. ║╘╛║
  221. ╚══╝";
  222. break;
  223. case 5:
  224. Assert.Equal (new (0, 0, 5, 4), win.Frame);
  225. expected = @"
  226. ╒═╕
  227. ╔╡1╞╗
  228. ║╘═╛║
  229. ╚═══╝";
  230. break;
  231. case 6:
  232. Assert.Equal (new (0, 0, 6, 4), win.Frame);
  233. expected = @"
  234. ╒══╕
  235. ╔╡12╞╗
  236. ║╘══╛║
  237. ╚════╝";
  238. break;
  239. case 7:
  240. Assert.Equal (new (0, 0, 7, 4), win.Frame);
  241. expected = @"
  242. ╒═══╕
  243. ╔╡123╞╗
  244. ║╘═══╛║
  245. ╚═════╝";
  246. break;
  247. case 8:
  248. Assert.Equal (new (0, 0, 8, 4), win.Frame);
  249. expected = @"
  250. ╒════╕
  251. ╔╡1234╞╗
  252. ║╘════╛║
  253. ╚══════╝";
  254. break;
  255. case 9:
  256. Assert.Equal (new (0, 0, 9, 4), win.Frame);
  257. expected = @"
  258. ╒════╕
  259. ╔╡1234╞═╗
  260. ║╘════╛ ║
  261. ╚═══════╝";
  262. break;
  263. case 10:
  264. Assert.Equal (new (0, 0, 10, 4), win.Frame);
  265. expected = @"
  266. ╒════╕
  267. ╔╡1234╞══╗
  268. ║╘════╛ ║
  269. ╚════════╝";
  270. break;
  271. }
  272. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  273. Application.End (rs);
  274. win.Dispose ();
  275. }
  276. [Theory]
  277. [AutoInitShutdown]
  278. [InlineData (0)]
  279. [InlineData (1)]
  280. [InlineData (2)]
  281. [InlineData (3)]
  282. [InlineData (4)]
  283. [InlineData (5)]
  284. [InlineData (6)]
  285. [InlineData (7)]
  286. [InlineData (8)]
  287. [InlineData (9)]
  288. [InlineData (10)]
  289. public void Border_With_Title_Border_Double_Thickness_Top_Two_Size_Width (int width)
  290. {
  291. var win = new Window
  292. {
  293. Title = "1234", Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Double
  294. };
  295. win.Border!.Thickness = win.Border!.Thickness with { Top = 2 };
  296. SessionToken rs = Application.Begin (win);
  297. Application.Driver!.SetScreenSize (width, 4);
  298. AutoInitShutdownAttribute.RunIteration ();
  299. var expected = string.Empty;
  300. switch (width)
  301. {
  302. case 1:
  303. Assert.Equal (new (0, 0, 1, 4), win.Frame);
  304. expected = @"
  305. ║";
  306. break;
  307. case 2:
  308. Assert.Equal (new (0, 0, 2, 4), win.Frame);
  309. expected = @"
  310. ╔╗
  311. ║║
  312. ╚╝";
  313. break;
  314. case 3:
  315. Assert.Equal (new (0, 0, 3, 4), win.Frame);
  316. expected = @"
  317. ╔═╗
  318. ║ ║
  319. ╚═╝";
  320. break;
  321. case 4:
  322. Assert.Equal (new (0, 0, 4, 4), win.Frame);
  323. expected = @"
  324. ╒╕
  325. ╔╛╘╗
  326. ║ ║
  327. ╚══╝";
  328. break;
  329. case 5:
  330. Assert.Equal (new (0, 0, 5, 4), win.Frame);
  331. expected = @"
  332. ╒═╕
  333. ╔╛1╘╗
  334. ║ ║
  335. ╚═══╝";
  336. break;
  337. case 6:
  338. Assert.Equal (new (0, 0, 6, 4), win.Frame);
  339. expected = @"
  340. ╒══╕
  341. ╔╛12╘╗
  342. ║ ║
  343. ╚════╝";
  344. break;
  345. case 7:
  346. Assert.Equal (new (0, 0, 7, 4), win.Frame);
  347. expected = @"
  348. ╒═══╕
  349. ╔╛123╘╗
  350. ║ ║
  351. ╚═════╝";
  352. break;
  353. case 8:
  354. Assert.Equal (new (0, 0, 8, 4), win.Frame);
  355. expected = @"
  356. ╒════╕
  357. ╔╛1234╘╗
  358. ║ ║
  359. ╚══════╝";
  360. break;
  361. case 9:
  362. Assert.Equal (new (0, 0, 9, 4), win.Frame);
  363. expected = @"
  364. ╒════╕
  365. ╔╛1234╘═╗
  366. ║ ║
  367. ╚═══════╝";
  368. break;
  369. case 10:
  370. Assert.Equal (new (0, 0, 10, 4), win.Frame);
  371. expected = @"
  372. ╒════╕
  373. ╔╛1234╘══╗
  374. ║ ║
  375. ╚════════╝";
  376. break;
  377. }
  378. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  379. Application.End (rs);
  380. win.Dispose ();
  381. }
  382. [Theory]
  383. [AutoInitShutdown]
  384. [InlineData (0)]
  385. [InlineData (1)]
  386. [InlineData (2)]
  387. [InlineData (3)]
  388. public void Border_With_Title_Size_Height (int height)
  389. {
  390. var win = new Window { Title = "1234", Width = Dim.Fill (), Height = Dim.Fill () };
  391. SessionToken rs = Application.Begin (win);
  392. Application.Driver!.SetScreenSize (20, height);
  393. AutoInitShutdownAttribute.RunIteration ();
  394. var expected = string.Empty;
  395. switch (height)
  396. {
  397. case 0:
  398. //Assert.Equal (new (0, 0, 17, 0), subview.Frame);
  399. expected = @"
  400. ";
  401. break;
  402. case 1:
  403. //Assert.Equal (new (0, 0, 17, 0), subview.Frame);
  404. expected = @"
  405. ─┤1234├─────────────";
  406. break;
  407. case 2:
  408. //Assert.Equal (new (0, 0, 17, 1), subview.Frame);
  409. expected = @"
  410. ┌┤1234├────────────┐
  411. └──────────────────┘
  412. ";
  413. break;
  414. case 3:
  415. //Assert.Equal (new (0, 0, 17, 2), subview.Frame);
  416. expected = @"
  417. ┌┤1234├────────────┐
  418. │ │
  419. └──────────────────┘
  420. ";
  421. break;
  422. }
  423. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  424. Application.End (rs);
  425. win.Dispose ();
  426. }
  427. [Theory]
  428. [AutoInitShutdown]
  429. [InlineData (0)]
  430. [InlineData (1)]
  431. [InlineData (2)]
  432. [InlineData (3)]
  433. [InlineData (4)]
  434. [InlineData (5)]
  435. [InlineData (6)]
  436. [InlineData (7)]
  437. [InlineData (8)]
  438. [InlineData (9)]
  439. [InlineData (10)]
  440. public void Border_With_Title_Size_Width (int width)
  441. {
  442. var win = new Window { Title = "1234", Width = Dim.Fill (), Height = Dim.Fill () };
  443. SessionToken rs = Application.Begin (win);
  444. Application.Driver!.SetScreenSize (width, 3);
  445. AutoInitShutdownAttribute.RunIteration ();
  446. var expected = string.Empty;
  447. switch (width)
  448. {
  449. case 1:
  450. //Assert.Equal (new (0, 0, 17, 0), subview.Frame);
  451. expected = @"
  452. │";
  453. break;
  454. case 2:
  455. //Assert.Equal (new (0, 0, 17, 1), subview.Frame);
  456. expected = @"
  457. ┌┐
  458. ││
  459. └┘";
  460. break;
  461. case 3:
  462. //Assert.Equal (new (0, 0, 17, 2), subview.Frame);
  463. expected = @"
  464. ┌─┐
  465. │ │
  466. └─┘
  467. ";
  468. break;
  469. case 4:
  470. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  471. expected = @"
  472. ┌┤├┐
  473. │ │
  474. └──┘";
  475. break;
  476. case 5:
  477. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  478. expected = @"
  479. ┌┤1├┐
  480. │ │
  481. └───┘";
  482. break;
  483. case 6:
  484. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  485. expected = @"
  486. ┌┤12├┐
  487. │ │
  488. └────┘";
  489. break;
  490. case 7:
  491. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  492. expected = @"
  493. ┌┤123├┐
  494. │ │
  495. └─────┘";
  496. break;
  497. case 8:
  498. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  499. expected = @"
  500. ┌┤1234├┐
  501. │ │
  502. └──────┘";
  503. break;
  504. case 9:
  505. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  506. expected = @"
  507. ┌┤1234├─┐
  508. │ │
  509. └───────┘";
  510. break;
  511. case 10:
  512. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  513. expected = @"
  514. ┌┤1234├──┐
  515. │ │
  516. └────────┘";
  517. break;
  518. }
  519. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  520. win.Dispose ();
  521. }
  522. [Theory]
  523. [InlineData (0, 0, 0, 2, 2)]
  524. [InlineData (1, 0, 0, 4, 4)]
  525. [InlineData (2, 0, 0, 6, 6)]
  526. [InlineData (1, 1, 0, 5, 4)]
  527. [InlineData (1, 0, 1, 4, 5)]
  528. [InlineData (1, 1, 1, 5, 5)]
  529. [InlineData (1, 10, 10, 14, 14)]
  530. public void FrameToScreen_NestedSuperView_WithBorder (
  531. int superOffset,
  532. int frameX,
  533. int frameY,
  534. int expectedScreenX,
  535. int expectedScreenY
  536. )
  537. {
  538. var superSuper = new View
  539. {
  540. X = superOffset,
  541. Y = superOffset,
  542. Width = 30,
  543. Height = 30,
  544. BorderStyle = LineStyle.Single
  545. };
  546. var super = new View
  547. {
  548. X = superOffset,
  549. Y = superOffset,
  550. Width = 20,
  551. Height = 20,
  552. BorderStyle = LineStyle.Single
  553. };
  554. superSuper.Add (super);
  555. var view = new View { X = frameX, Y = frameY, Width = 10, Height = 10 };
  556. super.Add (view);
  557. superSuper.Layout ();
  558. var expected = new Rectangle (expectedScreenX, expectedScreenY, 10, 10);
  559. Rectangle actual = view.FrameToScreen ();
  560. Assert.Equal (expected, actual);
  561. }
  562. [Theory]
  563. [InlineData (0, 0, 0, 1, 1)]
  564. [InlineData (1, 0, 0, 2, 2)]
  565. [InlineData (2, 0, 0, 3, 3)]
  566. [InlineData (1, 1, 0, 3, 2)]
  567. [InlineData (1, 0, 1, 2, 3)]
  568. [InlineData (1, 1, 1, 3, 3)]
  569. [InlineData (1, 10, 10, 12, 12)]
  570. public void FrameToScreen_SuperView_WithBorder (
  571. int superOffset,
  572. int frameX,
  573. int frameY,
  574. int expectedScreenX,
  575. int expectedScreenY
  576. )
  577. {
  578. var super = new View
  579. {
  580. X = superOffset,
  581. Y = superOffset,
  582. Width = 20,
  583. Height = 20,
  584. BorderStyle = LineStyle.Single
  585. };
  586. var view = new View { X = frameX, Y = frameY, Width = 10, Height = 10 };
  587. super.Add (view);
  588. super.Layout ();
  589. var expected = new Rectangle (expectedScreenX, expectedScreenY, 10, 10);
  590. Rectangle actual = view.FrameToScreen ();
  591. Assert.Equal (expected, actual);
  592. }
  593. [Fact]
  594. [AutoInitShutdown]
  595. public void HasSuperView ()
  596. {
  597. var top = new Toplevel ();
  598. top.BorderStyle = LineStyle.Double;
  599. var frame = new FrameView { Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Single };
  600. top.Add (frame);
  601. SessionToken rs = Application.Begin (top);
  602. Application.Driver!.SetScreenSize (5, 5);
  603. AutoInitShutdownAttribute.RunIteration ();
  604. var expected = @"
  605. ╔═══╗
  606. ║┌─┐║
  607. ║│ │║
  608. ║└─┘║
  609. ╚═══╝";
  610. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  611. Application.End (rs);
  612. top.Dispose ();
  613. }
  614. [Fact]
  615. [AutoInitShutdown]
  616. public void HasSuperView_Title ()
  617. {
  618. var top = new Toplevel ();
  619. top.BorderStyle = LineStyle.Double;
  620. var frame = new FrameView { Title = "1234", Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Single };
  621. top.Add (frame);
  622. SessionToken rs = Application.Begin (top);
  623. Application.Driver!.SetScreenSize (10, 4);
  624. AutoInitShutdownAttribute.RunIteration ();
  625. var expected = @"
  626. ╔════════╗
  627. ║┌┤1234├┐║
  628. ║└──────┘║
  629. ╚════════╝";
  630. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  631. Application.End (rs);
  632. top.Dispose ();
  633. }
  634. [Fact]
  635. [AutoInitShutdown]
  636. public void NoSuperView ()
  637. {
  638. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  639. SessionToken rs = Application.Begin (win);
  640. Application.Driver!.SetScreenSize (3, 3);
  641. AutoInitShutdownAttribute.RunIteration ();
  642. var expected = @"
  643. ┌─┐
  644. │ │
  645. └─┘";
  646. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  647. win.Dispose ();
  648. }
  649. [Fact]
  650. public void View_BorderStyle_Defaults ()
  651. {
  652. var view = new View ();
  653. Assert.Equal (LineStyle.None, view.BorderStyle);
  654. Assert.Equal (Thickness.Empty, view.Border!.Thickness);
  655. view.Dispose ();
  656. }
  657. [Fact]
  658. public void View_SetBorderStyle ()
  659. {
  660. var view = new View ();
  661. view.BorderStyle = LineStyle.Single;
  662. Assert.Equal (LineStyle.Single, view.BorderStyle);
  663. Assert.Equal (new (1), view.Border!.Thickness);
  664. view.BorderStyle = LineStyle.Double;
  665. Assert.Equal (LineStyle.Double, view.BorderStyle);
  666. Assert.Equal (new (1), view.Border!.Thickness);
  667. view.BorderStyle = LineStyle.None;
  668. Assert.Equal (LineStyle.None, view.BorderStyle);
  669. Assert.Equal (Thickness.Empty, view.Border!.Thickness);
  670. view.Dispose ();
  671. }
  672. [Theory]
  673. [InlineData (
  674. false,
  675. @"
  676. ┌───┐
  677. │ ║ │
  678. │═┌┄│
  679. │ ┊ │
  680. └───┘")]
  681. [InlineData (
  682. true,
  683. @"
  684. ╔═╦─┐
  685. ║ ║ │
  686. ╠═╬┄┤
  687. │ ┊ ┊
  688. └─┴┄┘")]
  689. [SetupFakeApplication]
  690. public void SuperViewRendersLineCanvas_No_SubViews_AutoJoinsLines (bool superViewRendersLineCanvas, string expected)
  691. {
  692. var superView = new View
  693. {
  694. Id = "superView",
  695. Width = 5,
  696. Height = 5,
  697. BorderStyle = LineStyle.Single
  698. };
  699. var view1 = new View
  700. {
  701. Id = "view1",
  702. Width = 3,
  703. Height = 3,
  704. X = -1,
  705. Y = -1,
  706. BorderStyle = LineStyle.Double,
  707. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  708. };
  709. var view2 = new View
  710. {
  711. Id = "view2",
  712. Width = 3,
  713. Height = 3,
  714. X = 1,
  715. Y = 1,
  716. BorderStyle = LineStyle.Dotted,
  717. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  718. };
  719. superView.Add (view1, view2);
  720. superView.BeginInit ();
  721. superView.EndInit ();
  722. superView.Draw ();
  723. DriverAssert.AssertDriverContentsAre (expected, output);
  724. }
  725. [Theory]
  726. [InlineData (
  727. false,
  728. @"
  729. ┌┤A├──────┐
  730. │ ║ │
  731. │ ║ │
  732. │════┌┤C├┄│
  733. │ ┊ │
  734. │ ┊ │
  735. └─────────┘")]
  736. [InlineData (
  737. true,
  738. @"
  739. ╔╡A╞═╦────┐
  740. ║ ║ │
  741. ║ ║ │
  742. ╠════╬┤C├┄┤
  743. │ ┊ ┊
  744. │ ┊ ┊
  745. └────┴┄┄┄┄┘")]
  746. [SetupFakeApplication]
  747. public void SuperViewRendersLineCanvas_Title_AutoJoinsLines (bool superViewRendersLineCanvas, string expected)
  748. {
  749. var superView = new View
  750. {
  751. Id = "superView",
  752. Title = "A",
  753. Width = 11,
  754. Height = 7,
  755. CanFocus = true,
  756. BorderStyle = LineStyle.Single
  757. };
  758. var view1 = new View
  759. {
  760. Id = "view1",
  761. Title = "B",
  762. Width = 6,
  763. Height = 4,
  764. X = -1,
  765. Y = -1,
  766. CanFocus = true,
  767. BorderStyle = LineStyle.Double,
  768. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  769. };
  770. var view2 = new View
  771. {
  772. Id = "view2",
  773. Title = "C",
  774. Width = 6,
  775. Height = 4,
  776. X = 4,
  777. Y = 2,
  778. CanFocus = true,
  779. BorderStyle = LineStyle.Dotted,
  780. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  781. };
  782. superView.Add (view1, view2);
  783. superView.BeginInit ();
  784. superView.EndInit ();
  785. superView.Draw ();
  786. DriverAssert.AssertDriverContentsAre (expected, output);
  787. }
  788. }