LabelTests.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. using System.ComponentModel;
  2. using Xunit.Abstractions;
  3. namespace Terminal.Gui.ViewsTests;
  4. public class LabelTests
  5. {
  6. private readonly ITestOutputHelper _output;
  7. public LabelTests (ITestOutputHelper output) { _output = output; }
  8. // Test that Title and Text are the same
  9. [Fact]
  10. public void Text_Mirrors_Title ()
  11. {
  12. var label = new Label ();
  13. label.Title = "Hello";
  14. Assert.Equal ("Hello", label.Title);
  15. Assert.Equal ("Hello", label.TitleTextFormatter.Text);
  16. Assert.Equal ("Hello", label.Text);
  17. Assert.Equal ("Hello", label.TextFormatter.Text);
  18. }
  19. [Fact]
  20. public void Title_Mirrors_Text ()
  21. {
  22. var label = new Label ();
  23. label.Text = "Hello";
  24. Assert.Equal ("Hello", label.Text);
  25. Assert.Equal ("Hello", label.TextFormatter.Text);
  26. Assert.Equal ("Hello", label.Title);
  27. Assert.Equal ("Hello", label.TitleTextFormatter.Text);
  28. }
  29. [Fact]
  30. public void HotKey_Command_SetsFocus_OnNextSubview ()
  31. {
  32. var superView = new View () { CanFocus = true };
  33. var label = new Label ();
  34. var nextSubview = new View () { CanFocus = true };
  35. superView.Add (label, nextSubview);
  36. superView.BeginInit ();
  37. superView.EndInit ();
  38. Assert.False (label.HasFocus);
  39. Assert.False (nextSubview.HasFocus);
  40. label.InvokeCommand (Command.HotKey);
  41. Assert.False (label.HasFocus);
  42. Assert.True (nextSubview.HasFocus);
  43. }
  44. [Fact]
  45. public void MouseClick_SetsFocus_OnNextSubview ()
  46. {
  47. var superView = new View () { CanFocus = true, Height = 1, Width = 15 };
  48. var focusedView = new View () { CanFocus = true, Width = 1, Height = 1 };
  49. var label = new Label () { X = 2, Title = "_x" };
  50. var nextSubview = new View () { CanFocus = true, X = 4, Width = 4, Height = 1 };
  51. superView.Add (focusedView, label, nextSubview);
  52. superView.BeginInit ();
  53. superView.EndInit ();
  54. Assert.False (focusedView.HasFocus);
  55. Assert.False (label.HasFocus);
  56. Assert.False (nextSubview.HasFocus);
  57. label.NewMouseEvent (new MouseEvent () { X = 0, Y = 0, Flags = MouseFlags.Button1Clicked });
  58. Assert.False (label.HasFocus);
  59. Assert.True (nextSubview.HasFocus);
  60. }
  61. [Fact]
  62. public void HotKey_Command_Does_Not_Accept ()
  63. {
  64. var label = new Label ();
  65. var accepted = false;
  66. label.Accept += LabelOnAccept;
  67. label.InvokeCommand (Command.HotKey);
  68. Assert.False (accepted);
  69. return;
  70. void LabelOnAccept (object sender, CancelEventArgs e) { accepted = true; }
  71. }
  72. [Fact]
  73. [AutoInitShutdown]
  74. public void AutoSize_Stays_True_AnchorEnd ()
  75. {
  76. var label = new Label { Y = Pos.Center (), Text = "Say Hello 你", AutoSize = true };
  77. label.X = Pos.AnchorEnd (0) - Pos.Function (() => label.TextFormatter.Text.GetColumns ());
  78. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  79. win.Add (label);
  80. var top = new Toplevel ();
  81. top.Add (win);
  82. Assert.True (label.AutoSize);
  83. Application.Begin (top);
  84. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  85. var expected = @"
  86. ┌────────────────────────────┐
  87. │ │
  88. │ Say Hello 你│
  89. │ │
  90. └────────────────────────────┘
  91. ";
  92. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  93. Assert.True (label.AutoSize);
  94. label.Text = "Say Hello 你 changed";
  95. Assert.True (label.AutoSize);
  96. Application.Refresh ();
  97. expected = @"
  98. ┌────────────────────────────┐
  99. │ │
  100. │ Say Hello 你 changed│
  101. │ │
  102. └────────────────────────────┘
  103. ";
  104. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  105. }
  106. [Fact]
  107. [AutoInitShutdown]
  108. public void AutoSize_Stays_True_Center ()
  109. {
  110. var label = new Label { X = Pos.Center (), Y = Pos.Center (), Text = "Say Hello 你" };
  111. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  112. win.Add (label);
  113. var top = new Toplevel ();
  114. top.Add (win);
  115. //Assert.True (label.AutoSize);
  116. Application.Begin (top);
  117. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  118. var expected = @"
  119. ┌────────────────────────────┐
  120. │ │
  121. │ Say Hello 你 │
  122. │ │
  123. └────────────────────────────┘
  124. ";
  125. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  126. Assert.True (label.AutoSize);
  127. label.Text = "Say Hello 你 changed";
  128. Assert.True (label.AutoSize);
  129. Application.Refresh ();
  130. expected = @"
  131. ┌────────────────────────────┐
  132. │ │
  133. │ Say Hello 你 changed │
  134. │ │
  135. └────────────────────────────┘
  136. ";
  137. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  138. }
  139. [Fact]
  140. [AutoInitShutdown]
  141. public void AutoSize_Stays_True_With_EmptyText ()
  142. {
  143. var label = new Label { X = Pos.Center (), Y = Pos.Center (), AutoSize = true };
  144. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  145. win.Add (label);
  146. var top = new Toplevel ();
  147. top.Add (win);
  148. Assert.True (label.AutoSize);
  149. label.Text = "Say Hello 你";
  150. Assert.True (label.AutoSize);
  151. Application.Begin (top);
  152. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  153. var expected = @"
  154. ┌────────────────────────────┐
  155. │ │
  156. │ Say Hello 你 │
  157. │ │
  158. └────────────────────────────┘
  159. ";
  160. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  161. }
  162. [Fact]
  163. public void Constructors_Defaults ()
  164. {
  165. var label = new Label ();
  166. Assert.Equal (string.Empty, label.Text);
  167. Assert.Equal (TextAlignment.Left, label.TextAlignment);
  168. //Assert.True (label.AutoSize);
  169. Assert.False (label.CanFocus);
  170. Assert.Equal (new Rectangle (0, 0, 0, 0), label.Frame);
  171. Assert.Equal (KeyCode.Null, label.HotKey);
  172. }
  173. // [Fact]
  174. // [AutoInitShutdown]
  175. // public void Label_Draw_Fill_Remaining_AutoSize_True ()
  176. // {
  177. // var label = new Label { Text = "This label needs to be cleared before rewritten." };
  178. // var tf1 = new TextFormatter { Direction = TextDirection.LeftRight_TopBottom };
  179. // tf1.Text = "This TextFormatter (tf1) without fill will not be cleared on rewritten.";
  180. // Size tf1Size = tf1.Size;
  181. // var tf2 = new TextFormatter { Direction = TextDirection.LeftRight_TopBottom, FillRemaining = true };
  182. // tf2.Text = "This TextFormatter (tf2) with fill will be cleared on rewritten.";
  183. // Size tf2Size = tf2.Size;
  184. // var top = new Toplevel ();
  185. // top.Add (label);
  186. // Application.Begin (top);
  187. // Assert.True (label.AutoSize);
  188. // tf1.Draw (
  189. // new Rectangle (new Point (0, 1), tf1Size),
  190. // label.GetNormalColor (),
  191. // label.ColorScheme.HotNormal
  192. // );
  193. // tf2.Draw (new Rectangle (new Point (0, 2), tf2Size), label.GetNormalColor (), label.ColorScheme.HotNormal);
  194. // TestHelpers.AssertDriverContentsWithFrameAre (
  195. // @"
  196. //This label needs to be cleared before rewritten.
  197. //This TextFormatter (tf1) without fill will not be cleared on rewritten.
  198. //This TextFormatter (tf2) with fill will be cleared on rewritten.
  199. //",
  200. // _output
  201. // );
  202. // label.Text = "This label is rewritten.";
  203. // label.Draw ();
  204. // tf1.Text = "This TextFormatter (tf1) is rewritten.";
  205. // tf1.Draw (
  206. // new Rectangle (new Point (0, 1), tf1Size),
  207. // label.GetNormalColor (),
  208. // label.ColorScheme.HotNormal
  209. // );
  210. // tf2.Text = "This TextFormatter (tf2) is rewritten.";
  211. // tf2.Draw (new Rectangle (new Point (0, 2), tf2Size), label.GetNormalColor (), label.ColorScheme.HotNormal);
  212. // TestHelpers.AssertDriverContentsWithFrameAre (
  213. // @"
  214. //This label is rewritten.
  215. //This TextFormatter (tf1) is rewritten.will not be cleared on rewritten.
  216. //This TextFormatter (tf2) is rewritten.
  217. //",
  218. // _output
  219. // );
  220. // }
  221. [Fact]
  222. [AutoInitShutdown]
  223. public void Label_Draw_Horizontal_Simple_Runes ()
  224. {
  225. var label = new Label { Text = "Demo Simple Rune" };
  226. var top = new Toplevel ();
  227. top.Add (label);
  228. Application.Begin (top);
  229. Assert.True (label.AutoSize);
  230. Assert.Equal (new Rectangle (0, 0, 16, 1), label.Frame);
  231. var expected = @"
  232. Demo Simple Rune
  233. ";
  234. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  235. Assert.Equal (new Rectangle (0, 0, 16, 1), pos);
  236. }
  237. [Fact]
  238. [AutoInitShutdown]
  239. public void Label_Draw_Vertical_Simple_Runes ()
  240. {
  241. var label = new Label { TextDirection = TextDirection.TopBottom_LeftRight, Text = "Demo Simple Rune" };
  242. var top = new Toplevel ();
  243. top.Add (label);
  244. Application.Begin (top);
  245. Assert.NotNull (label.Width);
  246. Assert.NotNull (label.Height);
  247. var expected = @"
  248. D
  249. e
  250. m
  251. o
  252. S
  253. i
  254. m
  255. p
  256. l
  257. e
  258. R
  259. u
  260. n
  261. e
  262. ";
  263. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  264. Assert.Equal (new Rectangle (0, 0, 1, 16), pos);
  265. }
  266. [Fact]
  267. [AutoInitShutdown]
  268. public void Label_Draw_Vertical_Wide_Runes ()
  269. {
  270. var label = new Label { TextDirection = TextDirection.TopBottom_LeftRight, Text = "デモエムポンズ" };
  271. var top = new Toplevel ();
  272. top.Add (label);
  273. Application.Begin (top);
  274. var expected = @"
  275. ";
  276. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  277. Assert.Equal (new Rectangle (0, 0, 2, 7), pos);
  278. }
  279. [Fact]
  280. [AutoInitShutdown]
  281. public void Label_HotKeyChanged_EventFires ()
  282. {
  283. var label = new Label { Text = "Yar" };
  284. label.HotKey = 'Y';
  285. object sender = null;
  286. KeyChangedEventArgs args = null;
  287. label.HotKeyChanged += (s, e) =>
  288. {
  289. sender = s;
  290. args = e;
  291. };
  292. label.HotKey = Key.R;
  293. Assert.Same (label, sender);
  294. Assert.Equal (KeyCode.Y | KeyCode.ShiftMask, args.OldKey);
  295. Assert.Equal (Key.R, args.NewKey);
  296. }
  297. [Fact]
  298. [AutoInitShutdown]
  299. public void Label_HotKeyChanged_EventFires_WithNone ()
  300. {
  301. var label = new Label ();
  302. object sender = null;
  303. KeyChangedEventArgs args = null;
  304. label.HotKeyChanged += (s, e) =>
  305. {
  306. sender = s;
  307. args = e;
  308. };
  309. label.HotKey = KeyCode.R;
  310. Assert.Same (label, sender);
  311. Assert.Equal (KeyCode.Null, args.OldKey);
  312. Assert.Equal (KeyCode.R, args.NewKey);
  313. }
  314. [Fact]
  315. public void TestAssignTextToLabel ()
  316. {
  317. View b = new Label { Text = "heya" };
  318. Assert.Equal ("heya", b.Text);
  319. Assert.Contains ("heya", b.TextFormatter.Text);
  320. b.Text = "heyb";
  321. Assert.Equal ("heyb", b.Text);
  322. Assert.Contains ("heyb", b.TextFormatter.Text);
  323. // with cast
  324. Assert.Equal ("heyb", ((Label)b).Text);
  325. }
  326. [Fact]
  327. [AutoInitShutdown]
  328. public void Update_Only_On_Or_After_Initialize ()
  329. {
  330. var label = new Label { X = Pos.Center (), Y = Pos.Center (), Text = "Say Hello 你" };
  331. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  332. win.Add (label);
  333. var top = new Toplevel ();
  334. top.Add (win);
  335. Assert.False (label.IsInitialized);
  336. Application.Begin (top);
  337. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  338. Assert.True (label.IsInitialized);
  339. Assert.Equal ("Say Hello 你", label.Text);
  340. Assert.Equal ("Say Hello 你", label.TextFormatter.Text);
  341. Assert.Equal (new Rectangle (0, 0, 12, 1), label.Viewport);
  342. var expected = @"
  343. ┌────────────────────────────┐
  344. │ │
  345. │ Say Hello 你 │
  346. │ │
  347. └────────────────────────────┘
  348. ";
  349. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  350. Assert.Equal (new Rectangle (0, 0, 30, 5), pos);
  351. }
  352. [Fact]
  353. [AutoInitShutdown]
  354. public void Update_Parameterless_Only_On_Or_After_Initialize ()
  355. {
  356. var label = new Label { X = Pos.Center (), Y = Pos.Center (), Text = "Say Hello 你", AutoSize = true };
  357. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  358. win.Add (label);
  359. var top = new Toplevel ();
  360. top.Add (win);
  361. Assert.False (label.IsInitialized);
  362. Application.Begin (top);
  363. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  364. Assert.True (label.IsInitialized);
  365. Assert.Equal ("Say Hello 你", label.Text);
  366. Assert.Equal ("Say Hello 你", label.TextFormatter.Text);
  367. Assert.Equal (new Rectangle (0, 0, 12, 1), label.Viewport);
  368. var expected = @"
  369. ┌────────────────────────────┐
  370. │ │
  371. │ Say Hello 你 │
  372. │ │
  373. └────────────────────────────┘
  374. ";
  375. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  376. Assert.Equal (new Rectangle (0, 0, 30, 5), pos);
  377. }
  378. [Fact]
  379. [SetupFakeDriver]
  380. public void Full_Border ()
  381. {
  382. var label = new Label { BorderStyle = LineStyle.Single , Text = "Test",} ;
  383. label.BeginInit();
  384. label.EndInit();
  385. label.SetRelativeLayout (Application.Driver.Screen.Size);
  386. Assert.Equal (new (0, 0, 4, 1), label.Viewport);
  387. Assert.Equal (new (0, 0, 6, 3), label.Frame);
  388. label.Draw ();
  389. TestHelpers.AssertDriverContentsWithFrameAre (
  390. @"
  391. ┌┤Te├┐
  392. │Test│
  393. └────┘",
  394. _output
  395. );
  396. label.Dispose ();
  397. }
  398. [Fact]
  399. [AutoInitShutdown]
  400. public void With_Top_Margin_Without_Top_Border ()
  401. {
  402. var label = new Label { Text = "Test", /*Width = 6, Height = 3,*/ BorderStyle = LineStyle.Single };
  403. label.Margin.Thickness = new Thickness (0, 1, 0, 0);
  404. label.Border.Thickness = new Thickness (1, 0, 1, 1);
  405. var top = new Toplevel ();
  406. top.Add (label);
  407. Application.Begin (top);
  408. Assert.Equal (new (0, 0, 6, 3), label.Frame);
  409. Assert.Equal (new (0, 0, 4, 1), label.Viewport);
  410. Application.Begin (top);
  411. TestHelpers.AssertDriverContentsWithFrameAre (
  412. @"
  413. │Test│
  414. └────┘",
  415. _output
  416. );
  417. }
  418. [Fact]
  419. [AutoInitShutdown]
  420. public void Without_Top_Border ()
  421. {
  422. var label = new Label { Text = "Test", /* Width = 6, Height = 3, */BorderStyle = LineStyle.Single };
  423. label.Border.Thickness = new Thickness (1, 0, 1, 1);
  424. var top = new Toplevel ();
  425. top.Add (label);
  426. Application.Begin (top);
  427. Assert.Equal (new (0, 0, 6, 2), label.Frame);
  428. Assert.Equal (new (0, 0, 4, 1), label.Viewport);
  429. Application.Begin (top);
  430. TestHelpers.AssertDriverContentsWithFrameAre (
  431. @"
  432. │Test│
  433. └────┘",
  434. _output
  435. );
  436. }
  437. }