2
0

LabelTests.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  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 你" };
  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. Application.Begin (top);
  83. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  84. var expected = @"
  85. ┌────────────────────────────┐
  86. │ │
  87. │ Say Hello 你│
  88. │ │
  89. └────────────────────────────┘
  90. ";
  91. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  92. label.Text = "Say Hello 你 changed";
  93. Application.Refresh ();
  94. expected = @"
  95. ┌────────────────────────────┐
  96. │ │
  97. │ Say Hello 你 changed│
  98. │ │
  99. └────────────────────────────┘
  100. ";
  101. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  102. }
  103. [Fact]
  104. [AutoInitShutdown]
  105. public void AutoSize_Stays_True_Center ()
  106. {
  107. var label = new Label { X = Pos.Center (), Y = Pos.Center (), Text = "Say Hello 你" };
  108. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  109. win.Add (label);
  110. var top = new Toplevel ();
  111. top.Add (win);
  112. Application.Begin (top);
  113. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  114. var expected = @"
  115. ┌────────────────────────────┐
  116. │ │
  117. │ Say Hello 你 │
  118. │ │
  119. └────────────────────────────┘
  120. ";
  121. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  122. label.Text = "Say Hello 你 changed";
  123. Application.Refresh ();
  124. expected = @"
  125. ┌────────────────────────────┐
  126. │ │
  127. │ Say Hello 你 changed │
  128. │ │
  129. └────────────────────────────┘
  130. ";
  131. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  132. }
  133. [Fact]
  134. [AutoInitShutdown]
  135. public void AutoSize_Stays_True_With_EmptyText ()
  136. {
  137. var label = new Label { X = Pos.Center (), Y = Pos.Center () };
  138. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  139. win.Add (label);
  140. var top = new Toplevel ();
  141. top.Add (win);
  142. label.Text = "Say Hello 你";
  143. Application.Begin (top);
  144. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  145. var expected = @"
  146. ┌────────────────────────────┐
  147. │ │
  148. │ Say Hello 你 │
  149. │ │
  150. └────────────────────────────┘
  151. ";
  152. TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  153. }
  154. [Fact]
  155. public void Constructors_Defaults ()
  156. {
  157. var label = new Label ();
  158. Assert.Equal (string.Empty, label.Text);
  159. Assert.Equal (Justification.Left, label.Justification);
  160. Assert.False (label.CanFocus);
  161. Assert.Equal (new Rectangle (0, 0, 0, 0), label.Frame);
  162. Assert.Equal (KeyCode.Null, label.HotKey);
  163. }
  164. [Fact]
  165. [AutoInitShutdown]
  166. public void Label_Draw_Fill_Remaining_AutoSize_False ()
  167. {
  168. Size tfSize = new Size (80, 1);
  169. var label = new Label { Text = "This label needs to be cleared before rewritten.", Width = tfSize.Width, Height = tfSize.Height };
  170. var tf1 = new TextFormatter { Direction = TextDirection.LeftRight_TopBottom, Size = tfSize };
  171. tf1.Text = "This TextFormatter (tf1) without fill will not be cleared on rewritten.";
  172. var tf2 = new TextFormatter { Direction = TextDirection.LeftRight_TopBottom, Size = tfSize, FillRemaining = true };
  173. tf2.Text = "This TextFormatter (tf2) with fill will be cleared on rewritten.";
  174. var top = new Toplevel ();
  175. top.Add (label);
  176. Application.Begin (top);
  177. Assert.False (label.TextFormatter.AutoSize);
  178. Assert.False (tf1.AutoSize);
  179. Assert.False (tf2.AutoSize);
  180. Assert.False (label.TextFormatter.FillRemaining);
  181. Assert.False (tf1.FillRemaining);
  182. Assert.True (tf2.FillRemaining);
  183. tf1.Draw (new Rectangle (new Point (0, 1), tfSize), label.GetNormalColor (), label.ColorScheme.HotNormal);
  184. tf2.Draw (new Rectangle (new Point (0, 2), tfSize), label.GetNormalColor (), label.ColorScheme.HotNormal);
  185. TestHelpers.AssertDriverContentsWithFrameAre (
  186. @"
  187. This label needs to be cleared before rewritten.
  188. This TextFormatter (tf1) without fill will not be cleared on rewritten.
  189. This TextFormatter (tf2) with fill will be cleared on rewritten. ",
  190. _output
  191. );
  192. Assert.False (label.NeedsDisplay);
  193. Assert.False (label.LayoutNeeded);
  194. Assert.False (label.SubViewNeedsDisplay);
  195. label.Text = "This label is rewritten.";
  196. Assert.True (label.NeedsDisplay);
  197. Assert.True (label.LayoutNeeded);
  198. Assert.False (label.SubViewNeedsDisplay);
  199. label.Draw ();
  200. tf1.Text = "This TextFormatter (tf1) is rewritten.";
  201. tf1.Draw (new Rectangle (new Point (0, 1), tfSize), label.GetNormalColor (), label.ColorScheme.HotNormal);
  202. tf2.Text = "This TextFormatter (tf2) is rewritten.";
  203. tf2.Draw (new Rectangle (new Point (0, 2), tfSize), label.GetNormalColor (), label.ColorScheme.HotNormal);
  204. TestHelpers.AssertDriverContentsWithFrameAre (
  205. @"
  206. This label is rewritten.
  207. This TextFormatter (tf1) is rewritten.will not be cleared on rewritten.
  208. This TextFormatter (tf2) is rewritten. ",
  209. _output
  210. );
  211. }
  212. [Fact]
  213. [AutoInitShutdown]
  214. public void Label_Draw_Horizontal_Simple_Runes ()
  215. {
  216. var label = new Label { Text = "Demo Simple Rune" };
  217. var top = new Toplevel ();
  218. top.Add (label);
  219. Application.Begin (top);
  220. Assert.Equal (new Rectangle (0, 0, 16, 1), label.Frame);
  221. var expected = @"
  222. Demo Simple Rune
  223. ";
  224. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  225. Assert.Equal (new Rectangle (0, 0, 16, 1), pos);
  226. }
  227. [Fact]
  228. [AutoInitShutdown]
  229. public void Label_Draw_Vertical_Simple_Runes ()
  230. {
  231. var label = new Label { TextDirection = TextDirection.TopBottom_LeftRight, Text = "Demo Simple Rune" };
  232. var top = new Toplevel ();
  233. top.Add (label);
  234. Application.Begin (top);
  235. Assert.NotNull (label.Width);
  236. Assert.NotNull (label.Height);
  237. var expected = @"
  238. D
  239. e
  240. m
  241. o
  242. S
  243. i
  244. m
  245. p
  246. l
  247. e
  248. R
  249. u
  250. n
  251. e
  252. ";
  253. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  254. Assert.Equal (new Rectangle (0, 0, 1, 16), pos);
  255. }
  256. [Fact]
  257. [AutoInitShutdown]
  258. public void Label_Draw_Vertical_Wide_Runes ()
  259. {
  260. var label = new Label { TextDirection = TextDirection.TopBottom_LeftRight, Text = "デモエムポンズ" };
  261. var top = new Toplevel ();
  262. top.Add (label);
  263. Application.Begin (top);
  264. var expected = @"
  265. ";
  266. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  267. Assert.Equal (new Rectangle (0, 0, 2, 7), pos);
  268. }
  269. [Fact]
  270. [AutoInitShutdown]
  271. public void Label_HotKeyChanged_EventFires ()
  272. {
  273. var label = new Label { Text = "Yar" };
  274. label.HotKey = 'Y';
  275. object sender = null;
  276. KeyChangedEventArgs args = null;
  277. label.HotKeyChanged += (s, e) =>
  278. {
  279. sender = s;
  280. args = e;
  281. };
  282. label.HotKey = Key.R;
  283. Assert.Same (label, sender);
  284. Assert.Equal (KeyCode.Y | KeyCode.ShiftMask, args.OldKey);
  285. Assert.Equal (Key.R, args.NewKey);
  286. }
  287. [Fact]
  288. [AutoInitShutdown]
  289. public void Label_HotKeyChanged_EventFires_WithNone ()
  290. {
  291. var label = new Label ();
  292. object sender = null;
  293. KeyChangedEventArgs args = null;
  294. label.HotKeyChanged += (s, e) =>
  295. {
  296. sender = s;
  297. args = e;
  298. };
  299. label.HotKey = KeyCode.R;
  300. Assert.Same (label, sender);
  301. Assert.Equal (KeyCode.Null, args.OldKey);
  302. Assert.Equal (KeyCode.R, args.NewKey);
  303. }
  304. [Fact]
  305. public void TestAssignTextToLabel ()
  306. {
  307. View b = new Label { Text = "heya" };
  308. Assert.Equal ("heya", b.Text);
  309. Assert.Contains ("heya", b.TextFormatter.Text);
  310. b.Text = "heyb";
  311. Assert.Equal ("heyb", b.Text);
  312. Assert.Contains ("heyb", b.TextFormatter.Text);
  313. // with cast
  314. Assert.Equal ("heyb", ((Label)b).Text);
  315. }
  316. [Fact]
  317. [AutoInitShutdown]
  318. public void Update_Only_On_Or_After_Initialize ()
  319. {
  320. var label = new Label { X = Pos.Center (), Y = Pos.Center (), Text = "Say Hello 你" };
  321. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  322. win.Add (label);
  323. var top = new Toplevel ();
  324. top.Add (win);
  325. Assert.False (label.IsInitialized);
  326. Application.Begin (top);
  327. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  328. Assert.True (label.IsInitialized);
  329. Assert.Equal ("Say Hello 你", label.Text);
  330. Assert.Equal ("Say Hello 你", label.TextFormatter.Text);
  331. Assert.Equal (new Rectangle (0, 0, 12, 1), label.Viewport);
  332. var expected = @"
  333. ┌────────────────────────────┐
  334. │ │
  335. │ Say Hello 你 │
  336. │ │
  337. └────────────────────────────┘
  338. ";
  339. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  340. Assert.Equal (new Rectangle (0, 0, 30, 5), pos);
  341. }
  342. [Fact]
  343. [AutoInitShutdown]
  344. public void Update_Parameterless_Only_On_Or_After_Initialize ()
  345. {
  346. var label = new Label { X = Pos.Center (), Y = Pos.Center (), Text = "Say Hello 你" };
  347. var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () };
  348. win.Add (label);
  349. var top = new Toplevel ();
  350. top.Add (win);
  351. Assert.False (label.IsInitialized);
  352. Application.Begin (top);
  353. ((FakeDriver)Application.Driver).SetBufferSize (30, 5);
  354. Assert.True (label.IsInitialized);
  355. Assert.Equal ("Say Hello 你", label.Text);
  356. Assert.Equal ("Say Hello 你", label.TextFormatter.Text);
  357. Assert.Equal (new Rectangle (0, 0, 12, 1), label.Viewport);
  358. var expected = @"
  359. ┌────────────────────────────┐
  360. │ │
  361. │ Say Hello 你 │
  362. │ │
  363. └────────────────────────────┘
  364. ";
  365. Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
  366. Assert.Equal (new Rectangle (0, 0, 30, 5), pos);
  367. }
  368. [Fact]
  369. [SetupFakeDriver]
  370. public void Full_Border ()
  371. {
  372. var label = new Label { BorderStyle = LineStyle.Single , Text = "Test",} ;
  373. label.BeginInit();
  374. label.EndInit();
  375. label.SetRelativeLayout (Application.Driver.Screen.Size);
  376. Assert.Equal (new (0, 0, 4, 1), label.Viewport);
  377. Assert.Equal (new (0, 0, 6, 3), label.Frame);
  378. label.Draw ();
  379. TestHelpers.AssertDriverContentsWithFrameAre (
  380. @"
  381. ┌┤Te├┐
  382. │Test│
  383. └────┘",
  384. _output
  385. );
  386. label.Dispose ();
  387. }
  388. [Fact]
  389. [AutoInitShutdown]
  390. public void With_Top_Margin_Without_Top_Border ()
  391. {
  392. var label = new Label { Text = "Test", /*Width = 6, Height = 3,*/ BorderStyle = LineStyle.Single };
  393. label.Margin.Thickness = new Thickness (0, 1, 0, 0);
  394. label.Border.Thickness = new Thickness (1, 0, 1, 1);
  395. var top = new Toplevel ();
  396. top.Add (label);
  397. Application.Begin (top);
  398. Assert.Equal (new (0, 0, 6, 3), label.Frame);
  399. Assert.Equal (new (0, 0, 4, 1), label.Viewport);
  400. Application.Begin (top);
  401. TestHelpers.AssertDriverContentsWithFrameAre (
  402. @"
  403. │Test│
  404. └────┘",
  405. _output
  406. );
  407. }
  408. [Fact]
  409. [AutoInitShutdown]
  410. public void Without_Top_Border ()
  411. {
  412. var label = new Label { Text = "Test", /* Width = 6, Height = 3, */BorderStyle = LineStyle.Single };
  413. label.Border.Thickness = new Thickness (1, 0, 1, 1);
  414. var top = new Toplevel ();
  415. top.Add (label);
  416. Application.Begin (top);
  417. Assert.Equal (new (0, 0, 6, 2), label.Frame);
  418. Assert.Equal (new (0, 0, 4, 1), label.Viewport);
  419. Application.Begin (top);
  420. TestHelpers.AssertDriverContentsWithFrameAre (
  421. @"
  422. │Test│
  423. └────┘",
  424. _output
  425. );
  426. }
  427. }