ScenarioTests.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Terminal.Gui;
  5. using UICatalog;
  6. using Xunit;
  7. // Alais Console to MockConsole so we don't accidentally use Console
  8. using Console = Terminal.Gui.FakeConsole;
  9. namespace Terminal.Gui {
  10. public class ScenarioTests {
  11. int CreateInput (string input)
  12. {
  13. // Put a control-q in at the end
  14. Console.MockKeyPresses.Push (new ConsoleKeyInfo ('q', ConsoleKey.Q, shift: false, alt: false, control: true));
  15. foreach (var c in input.Reverse ()) {
  16. if (char.IsLetter (c)) {
  17. Console.MockKeyPresses.Push (new ConsoleKeyInfo (char.ToLower (c), (ConsoleKey)char.ToUpper (c), shift: char.IsUpper (c), alt: false, control: false));
  18. } else {
  19. Console.MockKeyPresses.Push (new ConsoleKeyInfo (c, (ConsoleKey)c, shift: false, alt: false, control: false));
  20. }
  21. }
  22. return Console.MockKeyPresses.Count;
  23. }
  24. /// <summary>
  25. /// This runs through all Sceanrios defined in UI Catalog, calling Init, Setup, and Run.
  26. /// It puts a Ctrl-Q in the input queue so the Scenario immediately exits.
  27. /// Should find any egregious regressions.
  28. /// </summary>
  29. [Fact]
  30. public void Run_All_Sceanrios ()
  31. {
  32. List<Type> scenarioClasses = Scenario.GetDerivedClasses<Scenario> ();
  33. Assert.NotEmpty (scenarioClasses);
  34. foreach (var scenarioClass in scenarioClasses) {
  35. // Setup some fake kepresses
  36. // Passing empty string will cause just a ctrl-q to be fired
  37. Console.MockKeyPresses.Clear ();
  38. int stackSize = CreateInput ("");
  39. int iterations = 0;
  40. Application.Iteration = () => {
  41. iterations++;
  42. // Stop if we run out of control...
  43. if (iterations > 10) {
  44. Application.RequestStop ();
  45. }
  46. };
  47. Application.Init (new FakeDriver (), new NetMainLoop (() => FakeConsole.ReadKey (true)));
  48. var ms = 1000;
  49. var abortCount = 0;
  50. Func<MainLoop, bool> abortCallback = (MainLoop loop) => {
  51. abortCount++;
  52. Application.RequestStop ();
  53. return false;
  54. };
  55. var token = Application.MainLoop.AddTimeout (TimeSpan.FromMilliseconds (ms), abortCallback);
  56. var scenario = (Scenario)Activator.CreateInstance (scenarioClass);
  57. scenario.Init (Application.Top, Colors.Base);
  58. scenario.Setup ();
  59. scenario.Run ();
  60. Application.Shutdown ();
  61. Assert.Equal (0, abortCount);
  62. // # of key up events should match # of iterations
  63. Assert.Equal (1, iterations);
  64. Assert.Equal (stackSize, iterations);
  65. }
  66. #if DEBUG_IDISPOSABLE
  67. foreach (var inst in Responder.Instances) {
  68. Assert.True (inst.WasDisposed);
  69. }
  70. #endif
  71. }
  72. [Fact]
  73. public void Run_Generic ()
  74. {
  75. List<Type> scenarioClasses = Scenario.GetDerivedClasses<Scenario> ();
  76. Assert.NotEmpty (scenarioClasses);
  77. var item = scenarioClasses.FindIndex (t => Scenario.ScenarioMetadata.GetName (t).Equals ("Clipping", StringComparison.OrdinalIgnoreCase));
  78. var scenarioClass = scenarioClasses[item];
  79. // Setup some fake kepresses
  80. // Passing empty string will cause just a ctrl-q to be fired
  81. int stackSize = CreateInput ("");
  82. int iterations = 0;
  83. Application.Iteration = () => {
  84. iterations++;
  85. // Stop if we run out of control...
  86. if (iterations == 10) {
  87. Application.RequestStop ();
  88. }
  89. };
  90. Application.Init (new FakeDriver (), new NetMainLoop (() => FakeConsole.ReadKey (true)));
  91. var ms = 1000;
  92. var abortCount = 0;
  93. Func<MainLoop, bool> abortCallback = (MainLoop loop) => {
  94. abortCount++;
  95. Application.RequestStop ();
  96. return false;
  97. };
  98. var token = Application.MainLoop.AddTimeout (TimeSpan.FromMilliseconds (ms), abortCallback);
  99. Application.Top.KeyPress += (View.KeyEventEventArgs args) => {
  100. Assert.Equal (Key.ControlQ, args.KeyEvent.Key);
  101. };
  102. var scenario = (Scenario)Activator.CreateInstance (scenarioClass);
  103. scenario.Init (Application.Top, Colors.Base);
  104. scenario.Setup ();
  105. scenario.Run ();
  106. Application.Shutdown ();
  107. Assert.Equal (0, abortCount);
  108. // # of key up events should match # of iterations
  109. //Assert.Equal (1, iterations);
  110. Assert.Equal (stackSize, iterations);
  111. #if DEBUG_IDISPOSABLE
  112. foreach (var inst in Responder.Instances) {
  113. Assert.True (inst.WasDisposed);
  114. }
  115. #endif
  116. }
  117. }
  118. }