BorderTests.cs 24 KB

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