BorderTests.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. using UnitTests;
  2. using Xunit.Abstractions;
  3. namespace Terminal.Gui.ViewTests;
  4. public class BorderTests (ITestOutputHelper output)
  5. {
  6. [Fact]
  7. [SetupFakeDriver]
  8. public void Border_Parent_HasFocus_Title_Uses_FocusAttribute ()
  9. {
  10. var superView = new View { Width = 10, Height = 10, CanFocus = true };
  11. var otherView = new View { Width = 0, Height = 0, CanFocus = true };
  12. superView.Add (otherView);
  13. var view = new View { Title = "A", Height = 2, Width = 5 };
  14. superView.Add (view);
  15. view.Border!.Thickness = new (0, 1, 0, 0);
  16. view.Border.LineStyle = LineStyle.Single;
  17. view.ColorScheme = new ()
  18. {
  19. Normal = new (Color.Red, Color.Green),
  20. Focus = new (Color.Green, Color.Red)
  21. };
  22. Assert.NotEqual (view.ColorScheme.Normal.Foreground, view.ColorScheme.Focus.Foreground);
  23. Assert.Equal (ColorName16.Red, view.Border.GetNormalColor ().Foreground.GetClosestNamedColor16 ());
  24. Assert.Equal (ColorName16.Green, view.Border.GetFocusColor ().Foreground.GetClosestNamedColor16 ());
  25. Assert.Equal (view.GetFocusColor (), view.Border.GetFocusColor ());
  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.ColorScheme.Normal);
  32. view.CanFocus = true;
  33. view.SetFocus ();
  34. View.SetClipToScreen ();
  35. view.Draw ();
  36. Assert.Equal (view.GetFocusColor (), view.Border.GetFocusColor ());
  37. Assert.Equal (view.ColorScheme.Focus.Foreground, view.Border.GetFocusColor ().Foreground);
  38. Assert.Equal (view.ColorScheme.Normal.Foreground, view.Border.GetNormalColor ().Foreground);
  39. DriverAssert.AssertDriverAttributesAre ("00100", output, null, view.ColorScheme.Normal, view.GetFocusColor ());
  40. }
  41. [Fact]
  42. [SetupFakeDriver]
  43. public void Border_Uses_Parent_ColorScheme ()
  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.ColorScheme = new ()
  49. {
  50. Normal = new (Color.Red, Color.Green), Focus = new (Color.Green, Color.Red)
  51. };
  52. Assert.Equal (ColorName16.Red, view.Border.GetNormalColor ().Foreground.GetClosestNamedColor16 ());
  53. Assert.Equal (ColorName16.Green, view.Border.GetFocusColor ().Foreground.GetClosestNamedColor16 ());
  54. Assert.Equal (view.GetNormalColor (), view.Border.GetNormalColor ());
  55. Assert.Equal (view.GetFocusColor (), view.Border.GetFocusColor ());
  56. view.BeginInit ();
  57. view.EndInit ();
  58. view.Draw ();
  59. var expected = @"─┤A├─";
  60. DriverAssert.AssertDriverContentsAre (expected, output);
  61. DriverAssert.AssertDriverAttributesAre ("00000", output, null, view.ColorScheme.Normal);
  62. }
  63. [Theory]
  64. [AutoInitShutdown]
  65. [InlineData (0)]
  66. [InlineData (1)]
  67. [InlineData (2)]
  68. [InlineData (3)]
  69. [InlineData (4)]
  70. [InlineData (5)]
  71. [InlineData (6)]
  72. [InlineData (7)]
  73. [InlineData (8)]
  74. [InlineData (9)]
  75. [InlineData (10)]
  76. public void Border_With_Title_Border_Double_Thickness_Top_Four_Size_Width (int width)
  77. {
  78. var win = new Window
  79. {
  80. Title = "1234", Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Double
  81. };
  82. win.Border.Thickness = win.Border.Thickness with { Top = 4 };
  83. RunState rs = Application.Begin (win);
  84. var firstIteration = false;
  85. ((FakeDriver)Application.Driver!).SetBufferSize (width, 5);
  86. Application.RunIteration (ref rs, firstIteration);
  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. var win = new Window
  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. RunState rs = Application.Begin (win);
  191. ((FakeDriver)Application.Driver!).SetBufferSize (width, 4);
  192. Application.RunIteration (ref rs, false);
  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. RunState rs = Application.Begin (win);
  297. var firstIteration = false;
  298. ((FakeDriver)Application.Driver!).SetBufferSize (width, 4);
  299. Application.RunIteration (ref rs, firstIteration);
  300. var expected = string.Empty;
  301. switch (width)
  302. {
  303. case 1:
  304. Assert.Equal (new (0, 0, 1, 4), win.Frame);
  305. expected = @"
  306. ║";
  307. break;
  308. case 2:
  309. Assert.Equal (new (0, 0, 2, 4), win.Frame);
  310. expected = @"
  311. ╔╗
  312. ║║
  313. ╚╝";
  314. break;
  315. case 3:
  316. Assert.Equal (new (0, 0, 3, 4), win.Frame);
  317. expected = @"
  318. ╔═╗
  319. ║ ║
  320. ╚═╝";
  321. break;
  322. case 4:
  323. Assert.Equal (new (0, 0, 4, 4), win.Frame);
  324. expected = @"
  325. ╒╕
  326. ╔╛╘╗
  327. ║ ║
  328. ╚══╝";
  329. break;
  330. case 5:
  331. Assert.Equal (new (0, 0, 5, 4), win.Frame);
  332. expected = @"
  333. ╒═╕
  334. ╔╛1╘╗
  335. ║ ║
  336. ╚═══╝";
  337. break;
  338. case 6:
  339. Assert.Equal (new (0, 0, 6, 4), win.Frame);
  340. expected = @"
  341. ╒══╕
  342. ╔╛12╘╗
  343. ║ ║
  344. ╚════╝";
  345. break;
  346. case 7:
  347. Assert.Equal (new (0, 0, 7, 4), win.Frame);
  348. expected = @"
  349. ╒═══╕
  350. ╔╛123╘╗
  351. ║ ║
  352. ╚═════╝";
  353. break;
  354. case 8:
  355. Assert.Equal (new (0, 0, 8, 4), win.Frame);
  356. expected = @"
  357. ╒════╕
  358. ╔╛1234╘╗
  359. ║ ║
  360. ╚══════╝";
  361. break;
  362. case 9:
  363. Assert.Equal (new (0, 0, 9, 4), win.Frame);
  364. expected = @"
  365. ╒════╕
  366. ╔╛1234╘═╗
  367. ║ ║
  368. ╚═══════╝";
  369. break;
  370. case 10:
  371. Assert.Equal (new (0, 0, 10, 4), win.Frame);
  372. expected = @"
  373. ╒════╕
  374. ╔╛1234╘══╗
  375. ║ ║
  376. ╚════════╝";
  377. break;
  378. }
  379. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  380. Application.End (rs);
  381. win.Dispose ();
  382. }
  383. [Theory]
  384. [AutoInitShutdown]
  385. [InlineData (0)]
  386. [InlineData (1)]
  387. [InlineData (2)]
  388. [InlineData (3)]
  389. public void Border_With_Title_Size_Height (int height)
  390. {
  391. var win = new Window { Title = "1234", Width = Dim.Fill (), Height = Dim.Fill () };
  392. RunState rs = Application.Begin (win);
  393. var firstIteration = false;
  394. ((FakeDriver)Application.Driver!).SetBufferSize (20, height);
  395. Application.RunIteration (ref rs, firstIteration);
  396. var expected = string.Empty;
  397. switch (height)
  398. {
  399. case 0:
  400. //Assert.Equal (new (0, 0, 17, 0), subview.Frame);
  401. expected = @"
  402. ";
  403. break;
  404. case 1:
  405. //Assert.Equal (new (0, 0, 17, 0), subview.Frame);
  406. expected = @"
  407. ─┤1234├─────────────";
  408. break;
  409. case 2:
  410. //Assert.Equal (new (0, 0, 17, 1), subview.Frame);
  411. expected = @"
  412. ┌┤1234├────────────┐
  413. └──────────────────┘
  414. ";
  415. break;
  416. case 3:
  417. //Assert.Equal (new (0, 0, 17, 2), subview.Frame);
  418. expected = @"
  419. ┌┤1234├────────────┐
  420. │ │
  421. └──────────────────┘
  422. ";
  423. break;
  424. }
  425. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  426. Application.End (rs);
  427. win.Dispose ();
  428. }
  429. [Theory]
  430. [AutoInitShutdown]
  431. [InlineData (0)]
  432. [InlineData (1)]
  433. [InlineData (2)]
  434. [InlineData (3)]
  435. [InlineData (4)]
  436. [InlineData (5)]
  437. [InlineData (6)]
  438. [InlineData (7)]
  439. [InlineData (8)]
  440. [InlineData (9)]
  441. [InlineData (10)]
  442. public void Border_With_Title_Size_Width (int width)
  443. {
  444. var win = new Window { Title = "1234", Width = Dim.Fill (), Height = Dim.Fill () };
  445. RunState rs = Application.Begin (win);
  446. var firstIteration = false;
  447. ((FakeDriver)Application.Driver!).SetBufferSize (width, 3);
  448. Application.RunIteration (ref rs, firstIteration);
  449. var expected = string.Empty;
  450. switch (width)
  451. {
  452. case 1:
  453. //Assert.Equal (new (0, 0, 17, 0), subview.Frame);
  454. expected = @"
  455. │";
  456. break;
  457. case 2:
  458. //Assert.Equal (new (0, 0, 17, 1), subview.Frame);
  459. expected = @"
  460. ┌┐
  461. ││
  462. └┘";
  463. break;
  464. case 3:
  465. //Assert.Equal (new (0, 0, 17, 2), subview.Frame);
  466. expected = @"
  467. ┌─┐
  468. │ │
  469. └─┘
  470. ";
  471. break;
  472. case 4:
  473. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  474. expected = @"
  475. ┌┤├┐
  476. │ │
  477. └──┘";
  478. break;
  479. case 5:
  480. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  481. expected = @"
  482. ┌┤1├┐
  483. │ │
  484. └───┘";
  485. break;
  486. case 6:
  487. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  488. expected = @"
  489. ┌┤12├┐
  490. │ │
  491. └────┘";
  492. break;
  493. case 7:
  494. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  495. expected = @"
  496. ┌┤123├┐
  497. │ │
  498. └─────┘";
  499. break;
  500. case 8:
  501. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  502. expected = @"
  503. ┌┤1234├┐
  504. │ │
  505. └──────┘";
  506. break;
  507. case 9:
  508. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  509. expected = @"
  510. ┌┤1234├─┐
  511. │ │
  512. └───────┘";
  513. break;
  514. case 10:
  515. //Assert.Equal (new (0, 0, 17, 3), subview.Frame);
  516. expected = @"
  517. ┌┤1234├──┐
  518. │ │
  519. └────────┘";
  520. break;
  521. }
  522. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  523. win.Dispose ();
  524. }
  525. [Theory]
  526. [InlineData (0, 0, 0, 2, 2)]
  527. [InlineData (1, 0, 0, 4, 4)]
  528. [InlineData (2, 0, 0, 6, 6)]
  529. [InlineData (1, 1, 0, 5, 4)]
  530. [InlineData (1, 0, 1, 4, 5)]
  531. [InlineData (1, 1, 1, 5, 5)]
  532. [InlineData (1, 10, 10, 14, 14)]
  533. public void FrameToScreen_NestedSuperView_WithBorder (
  534. int superOffset,
  535. int frameX,
  536. int frameY,
  537. int expectedScreenX,
  538. int expectedScreenY
  539. )
  540. {
  541. var superSuper = new View
  542. {
  543. X = superOffset,
  544. Y = superOffset,
  545. Width = 30,
  546. Height = 30,
  547. BorderStyle = LineStyle.Single
  548. };
  549. var super = new View
  550. {
  551. X = superOffset,
  552. Y = superOffset,
  553. Width = 20,
  554. Height = 20,
  555. BorderStyle = LineStyle.Single
  556. };
  557. superSuper.Add (super);
  558. var view = new View { X = frameX, Y = frameY, Width = 10, Height = 10 };
  559. super.Add (view);
  560. superSuper.Layout ();
  561. var expected = new Rectangle (expectedScreenX, expectedScreenY, 10, 10);
  562. Rectangle actual = view.FrameToScreen ();
  563. Assert.Equal (expected, actual);
  564. }
  565. [Theory]
  566. [InlineData (0, 0, 0, 1, 1)]
  567. [InlineData (1, 0, 0, 2, 2)]
  568. [InlineData (2, 0, 0, 3, 3)]
  569. [InlineData (1, 1, 0, 3, 2)]
  570. [InlineData (1, 0, 1, 2, 3)]
  571. [InlineData (1, 1, 1, 3, 3)]
  572. [InlineData (1, 10, 10, 12, 12)]
  573. public void FrameToScreen_SuperView_WithBorder (
  574. int superOffset,
  575. int frameX,
  576. int frameY,
  577. int expectedScreenX,
  578. int expectedScreenY
  579. )
  580. {
  581. var super = new View
  582. {
  583. X = superOffset,
  584. Y = superOffset,
  585. Width = 20,
  586. Height = 20,
  587. BorderStyle = LineStyle.Single
  588. };
  589. var view = new View { X = frameX, Y = frameY, Width = 10, Height = 10 };
  590. super.Add (view);
  591. super.Layout ();
  592. var expected = new Rectangle (expectedScreenX, expectedScreenY, 10, 10);
  593. Rectangle actual = view.FrameToScreen ();
  594. Assert.Equal (expected, actual);
  595. }
  596. [Fact]
  597. [AutoInitShutdown]
  598. public void HasSuperView ()
  599. {
  600. var top = new Toplevel ();
  601. top.BorderStyle = LineStyle.Double;
  602. var frame = new FrameView { Width = Dim.Fill (), Height = Dim.Fill () };
  603. top.Add (frame);
  604. RunState rs = Application.Begin (top);
  605. var firstIteration = false;
  606. ((FakeDriver)Application.Driver!).SetBufferSize (5, 5);
  607. Application.RunIteration (ref rs, firstIteration);
  608. var expected = @"
  609. ╔═══╗
  610. ║┌─┐║
  611. ║│ │║
  612. ║└─┘║
  613. ╚═══╝";
  614. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  615. Application.End (rs);
  616. top.Dispose ();
  617. }
  618. [Fact]
  619. [AutoInitShutdown]
  620. public void HasSuperView_Title ()
  621. {
  622. var top = new Toplevel ();
  623. top.BorderStyle = LineStyle.Double;
  624. var frame = new FrameView { Title = "1234", Width = Dim.Fill (), Height = Dim.Fill () };
  625. top.Add (frame);
  626. RunState rs = Application.Begin (top);
  627. var firstIteration = false;
  628. ((FakeDriver)Application.Driver!).SetBufferSize (10, 4);
  629. Application.RunIteration (ref rs, firstIteration);
  630. var expected = @"
  631. ╔════════╗
  632. ║┌┤1234├┐║
  633. ║└──────┘║
  634. ╚════════╝";
  635. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  636. Application.End (rs);
  637. top.Dispose ();
  638. }
  639. [Fact]
  640. [AutoInitShutdown]
  641. public void NoSuperView ()
  642. {
  643. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  644. RunState rs = Application.Begin (win);
  645. var firstIteration = false;
  646. ((FakeDriver)Application.Driver!).SetBufferSize (3, 3);
  647. Application.RunIteration (ref rs, firstIteration);
  648. var expected = @"
  649. ┌─┐
  650. │ │
  651. └─┘";
  652. _ = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  653. win.Dispose ();
  654. }
  655. [Fact]
  656. public void View_BorderStyle_Defaults ()
  657. {
  658. var view = new View ();
  659. Assert.Equal (LineStyle.None, view.BorderStyle);
  660. Assert.Equal (Thickness.Empty, view.Border.Thickness);
  661. view.Dispose ();
  662. }
  663. [Fact]
  664. public void View_SetBorderStyle ()
  665. {
  666. var view = new View ();
  667. view.BorderStyle = LineStyle.Single;
  668. Assert.Equal (LineStyle.Single, view.BorderStyle);
  669. Assert.Equal (new (1), view.Border.Thickness);
  670. view.BorderStyle = LineStyle.Double;
  671. Assert.Equal (LineStyle.Double, view.BorderStyle);
  672. Assert.Equal (new (1), view.Border.Thickness);
  673. view.BorderStyle = LineStyle.None;
  674. Assert.Equal (LineStyle.None, view.BorderStyle);
  675. Assert.Equal (Thickness.Empty, view.Border.Thickness);
  676. view.Dispose ();
  677. }
  678. [Theory]
  679. [InlineData (false, @"
  680. ┌───┐
  681. │ ║ │
  682. │═┌┄│
  683. │ ┊ │
  684. └───┘")]
  685. [InlineData (true, @"
  686. ╔═╦─┐
  687. ║ ║ │
  688. ╠═╬┄┤
  689. │ ┊ ┊
  690. └─┴┄┘")]
  691. [SetupFakeDriver]
  692. public void SuperViewRendersLineCanvas_No_SubViews_AutoJoinsLines (bool superViewRendersLineCanvas, string expected)
  693. {
  694. View superView = new View ()
  695. {
  696. Id = "superView",
  697. Width = 5,
  698. Height = 5,
  699. BorderStyle = LineStyle.Single
  700. };
  701. View view1 = new View ()
  702. {
  703. Id = "view1",
  704. Width = 3,
  705. Height = 3,
  706. X = -1,
  707. Y = -1,
  708. BorderStyle = LineStyle.Double,
  709. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  710. };
  711. View view2 = new View ()
  712. {
  713. Id = "view2",
  714. Width = 3,
  715. Height = 3,
  716. X = 1,
  717. Y = 1,
  718. BorderStyle = LineStyle.Dotted,
  719. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  720. };
  721. superView.Add (view1, view2);
  722. superView.BeginInit ();
  723. superView.EndInit ();
  724. superView.Draw ();
  725. DriverAssert.AssertDriverContentsAre (expected, output);
  726. }
  727. [Theory]
  728. [InlineData (false, @"
  729. ┌┤A├──────┐
  730. │ ║ │
  731. │ ║ │
  732. │════┌┤C├┄│
  733. │ ┊ │
  734. │ ┊ │
  735. └─────────┘")]
  736. [InlineData (true, @"
  737. ╔╡A╞═╦────┐
  738. ║ ║ │
  739. ║ ║ │
  740. ╠════╬┤C├┄┤
  741. │ ┊ ┊
  742. │ ┊ ┊
  743. └────┴┄┄┄┄┘")]
  744. [SetupFakeDriver]
  745. public void SuperViewRendersLineCanvas_Title_AutoJoinsLines (bool superViewRendersLineCanvas, string expected)
  746. {
  747. View superView = new View ()
  748. {
  749. Id = "superView",
  750. Title = "A",
  751. Width = 11,
  752. Height = 7,
  753. CanFocus = true,
  754. BorderStyle = LineStyle.Single,
  755. };
  756. View view1 = new View ()
  757. {
  758. Id = "view1",
  759. Title = "B",
  760. Width = 6,
  761. Height = 4,
  762. X = -1,
  763. Y = -1,
  764. CanFocus = true,
  765. BorderStyle = LineStyle.Double,
  766. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  767. };
  768. View view2 = new View ()
  769. {
  770. Id = "view2",
  771. Title = "C",
  772. Width = 6,
  773. Height = 4,
  774. X = 4,
  775. Y = 2,
  776. CanFocus = true,
  777. BorderStyle = LineStyle.Dotted,
  778. SuperViewRendersLineCanvas = superViewRendersLineCanvas
  779. };
  780. superView.Add (view1, view2);
  781. superView.BeginInit ();
  782. superView.EndInit ();
  783. superView.Draw ();
  784. DriverAssert.AssertDriverContentsAre (expected, output);
  785. }
  786. }