StatusBarTests.cs 5.1 KB

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