StatusBarTests.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using System;
  2. using Xunit;
  3. using Xunit.Abstractions;
  4. namespace Terminal.Gui.ViewsTests {
  5. public class StatusBarTests {
  6. readonly ITestOutputHelper output;
  7. public StatusBarTests (ITestOutputHelper output)
  8. {
  9. this.output = output;
  10. }
  11. [Fact]
  12. public void StatusItem_Constructor ()
  13. {
  14. Application.Init ();
  15. var si = new StatusItem (Application.QuitKey, $"{Application.QuitKey} to Quit", null);
  16. Assert.Equal (KeyCode.CtrlMask | KeyCode.Q, si.Shortcut);
  17. Assert.Equal ($"{Application.QuitKey} to Quit", si.Title);
  18. Assert.Null (si.Action);
  19. si = new StatusItem (Application.QuitKey, $"{Application.QuitKey} to Quit", () => { });
  20. Assert.NotNull (si.Action);
  21. Application.Shutdown ();
  22. }
  23. [Fact]
  24. public void StatusBar_Constructor_Default ()
  25. {
  26. var sb = new StatusBar ();
  27. Assert.Empty (sb.Items);
  28. Assert.False (sb.CanFocus);
  29. Assert.Equal (Colors.Menu, sb.ColorScheme);
  30. Assert.Equal (0, sb.X);
  31. Assert.Equal ("AnchorEnd(1)", sb.Y.ToString ());
  32. Assert.Equal (Dim.Fill (), sb.Width);
  33. Assert.Equal (1, sb.Height);
  34. var driver = new FakeDriver ();
  35. Application.Init (driver);
  36. sb = new StatusBar ();
  37. driver.SetCursorVisibility (CursorVisibility.Default);
  38. driver.GetCursorVisibility (out CursorVisibility cv);
  39. Assert.Equal (CursorVisibility.Default, cv);
  40. Assert.True (FakeConsole.CursorVisible);
  41. Application.Iteration += (s, a) => {
  42. Assert.Equal (24, sb.Frame.Y);
  43. driver.SetWindowSize (driver.Cols, 15);
  44. Assert.Equal (14, sb.Frame.Y);
  45. sb.OnEnter (null);
  46. driver.GetCursorVisibility (out cv);
  47. Assert.Equal (CursorVisibility.Invisible, cv);
  48. Assert.False (FakeConsole.CursorVisible);
  49. Application.RequestStop ();
  50. };
  51. Application.Top.Add (sb);
  52. Application.Run ();
  53. Application.Shutdown ();
  54. }
  55. [Fact]
  56. [AutoInitShutdown]
  57. public void Run_Action_With_Key_And_Mouse ()
  58. {
  59. var msg = "";
  60. var sb = new StatusBar (new StatusItem [] { new StatusItem (Application.QuitKey, $"{Application.QuitKey} to Quit", () => msg = "Quiting...") });
  61. Application.Top.Add (sb);
  62. var iteration = 0;
  63. Application.Iteration += (s, a) => {
  64. if (iteration == 0) {
  65. Assert.Equal ("", msg);
  66. sb.NewKeyDownEvent (new (KeyCode.CtrlMask | KeyCode.Q));
  67. } else if (iteration == 1) {
  68. Assert.Equal ("Quiting...", msg);
  69. msg = "";
  70. sb.MouseEvent (new MouseEvent () { X = 1, Y = 24, Flags = MouseFlags.Button1Clicked });
  71. } else {
  72. Assert.Equal ("Quiting...", msg);
  73. Application.RequestStop ();
  74. }
  75. iteration++;
  76. };
  77. Application.Run ();
  78. }
  79. [Fact]
  80. [AutoInitShutdown]
  81. public void Redraw_Output ()
  82. {
  83. var sb = new StatusBar (new StatusItem [] {
  84. new StatusItem (KeyCode.CtrlMask | KeyCode.O, "~^O~ Open", null),
  85. new StatusItem (Application.QuitKey, $"{Application.QuitKey} to Quit!", null)
  86. });
  87. Application.Top.Add (sb);
  88. sb.OnDrawContent (sb.Bounds);
  89. string expected = @$"
  90. ^O Open {CM.Glyphs.VLine} Ctrl+Q to Quit!
  91. ";
  92. TestHelpers.AssertDriverContentsAre (expected, output);
  93. }
  94. [Fact]
  95. [AutoInitShutdown]
  96. public void Redraw_Output_CTRLQ ()
  97. {
  98. var sb = new StatusBar (new StatusItem [] {
  99. new StatusItem (KeyCode.CtrlMask | KeyCode.O, "~CTRL-O~ Open", null),
  100. new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~CTRL-Q~ Quit", null)
  101. });
  102. Application.Top.Add (sb);
  103. sb.OnDrawContent (sb.Bounds);
  104. string expected = @$"
  105. CTRL-O Open {CM.Glyphs.VLine} CTRL-Q Quit
  106. ";
  107. TestHelpers.AssertDriverContentsAre (expected, output);
  108. }
  109. [Fact]
  110. public void AddItemAt_RemoveItem_Replacing ()
  111. {
  112. var sb = new StatusBar (new StatusItem [] {
  113. new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~^O~ Open", null),
  114. new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~^S~ Save", null),
  115. new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~^Q~ Quit", null)
  116. });
  117. sb.AddItemAt (2, new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~^C~ Close", null));
  118. Assert.Equal ("~^O~ Open", sb.Items [0].Title);
  119. Assert.Equal ("~^S~ Save", sb.Items [1].Title);
  120. Assert.Equal ("~^C~ Close", sb.Items [2].Title);
  121. Assert.Equal ("~^Q~ Quit", sb.Items [^1].Title);
  122. Assert.Equal ("~^S~ Save", sb.RemoveItem (1).Title);
  123. Assert.Equal ("~^O~ Open", sb.Items [0].Title);
  124. Assert.Equal ("~^C~ Close", sb.Items [1].Title);
  125. Assert.Equal ("~^Q~ Quit", sb.Items [^1].Title);
  126. sb.Items [1] = new StatusItem (KeyCode.CtrlMask | KeyCode.A, "~^A~ Save As", null);
  127. Assert.Equal ("~^O~ Open", sb.Items [0].Title);
  128. Assert.Equal ("~^A~ Save As", sb.Items [1].Title);
  129. Assert.Equal ("~^Q~ Quit", sb.Items [^1].Title);
  130. }
  131. [Fact, AutoInitShutdown]
  132. public void CanExecute_ProcessHotKey ()
  133. {
  134. Window win = null;
  135. var statusBar = new StatusBar (new StatusItem [] {
  136. new StatusItem (KeyCode.CtrlMask | KeyCode.N, "~^N~ New", New, CanExecuteNew),
  137. new StatusItem (KeyCode.CtrlMask | KeyCode.C, "~^C~ Close", Close, CanExecuteClose)
  138. });
  139. var top = Application.Top;
  140. top.Add (statusBar);
  141. bool CanExecuteNew () => win == null;
  142. void New ()
  143. {
  144. win = new Window ();
  145. }
  146. bool CanExecuteClose () => win != null;
  147. void Close ()
  148. {
  149. win = null;
  150. }
  151. Application.Begin (top);
  152. Assert.Null (win);
  153. Assert.True (CanExecuteNew ());
  154. Assert.False (CanExecuteClose ());
  155. Assert.True (top.NewKeyDownEvent (new (KeyCode.N | KeyCode.CtrlMask)));
  156. Application.MainLoop.RunIteration ();
  157. Assert.NotNull (win);
  158. Assert.False (CanExecuteNew ());
  159. Assert.True (CanExecuteClose ());
  160. }
  161. }
  162. }