|
@@ -1,4 +1,5 @@
|
|
|
-using Xunit.Abstractions;
|
|
|
+using Microsoft.VisualBasic;
|
|
|
+using Xunit.Abstractions;
|
|
|
|
|
|
// Alias Console to MockConsole so we don't accidentally use Console
|
|
|
|
|
@@ -147,8 +148,12 @@ public class ApplicationTests
|
|
|
Shutdown ();
|
|
|
}
|
|
|
|
|
|
- [Fact]
|
|
|
- public void Init_ResetState_Resets_Properties ()
|
|
|
+ [Theory]
|
|
|
+ [InlineData (typeof (FakeDriver))]
|
|
|
+ [InlineData (typeof (NetDriver))]
|
|
|
+ [InlineData (typeof (WindowsDriver))]
|
|
|
+ [InlineData (typeof (CursesDriver))]
|
|
|
+ public void Init_ResetState_Resets_Properties (Type driverType)
|
|
|
{
|
|
|
ConfigurationManager.ThrowOnJsonErrors = true;
|
|
|
|
|
@@ -156,7 +161,7 @@ public class ApplicationTests
|
|
|
|
|
|
// Set some values
|
|
|
|
|
|
- Application.Init ();
|
|
|
+ Application.Init (driverName: driverType.Name);
|
|
|
Application._initialized = true;
|
|
|
|
|
|
// Reset
|
|
@@ -228,7 +233,7 @@ public class ApplicationTests
|
|
|
Application.AlternateBackwardKey = Key.A;
|
|
|
Application.AlternateForwardKey = Key.B;
|
|
|
Application.QuitKey = Key.C;
|
|
|
- Application.AddKeyBinding(Key.A, new View ());
|
|
|
+ Application.AddKeyBinding (Key.A, new View ());
|
|
|
|
|
|
//Application.OverlappedChildren = new List<View> ();
|
|
|
//Application.OverlappedTop =
|
|
@@ -266,6 +271,71 @@ public class ApplicationTests
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+ [Theory]
|
|
|
+ [InlineData (typeof (FakeDriver))]
|
|
|
+ [InlineData (typeof (NetDriver))]
|
|
|
+ [InlineData (typeof (WindowsDriver))]
|
|
|
+ [InlineData (typeof (CursesDriver))]
|
|
|
+ public void Init_Shutdown_Fire_InitializedChanged (Type driverType)
|
|
|
+ {
|
|
|
+ bool initialized = false;
|
|
|
+ bool shutdown = false;
|
|
|
+
|
|
|
+ Application.InitializedChanged += OnApplicationOnInitializedChanged;
|
|
|
+
|
|
|
+ Application.Init (driverName: driverType.Name);
|
|
|
+ Assert.True (initialized);
|
|
|
+ Assert.False (shutdown);
|
|
|
+
|
|
|
+ Application.Shutdown ();
|
|
|
+ Assert.True (initialized);
|
|
|
+ Assert.True (shutdown);
|
|
|
+
|
|
|
+ Application.InitializedChanged -= OnApplicationOnInitializedChanged;
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ void OnApplicationOnInitializedChanged (object s, StateEventArgs<bool> a)
|
|
|
+ {
|
|
|
+ if (a.NewValue)
|
|
|
+ {
|
|
|
+ initialized = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ shutdown = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void Run_Iteration_Fires ()
|
|
|
+ {
|
|
|
+ int iteration = 0;
|
|
|
+
|
|
|
+ Application.Init (new FakeDriver ());
|
|
|
+
|
|
|
+ Application.Iteration += Application_Iteration;
|
|
|
+ Application.Run<Toplevel> ().Dispose ();
|
|
|
+
|
|
|
+ Assert.Equal (1, iteration);
|
|
|
+ Application.Shutdown ();
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ void Application_Iteration (object sender, IterationEventArgs e)
|
|
|
+ {
|
|
|
+ if (iteration > 0)
|
|
|
+ {
|
|
|
+ Assert.Fail ();
|
|
|
+ }
|
|
|
+ iteration++;
|
|
|
+ Application.RequestStop ();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
[Fact]
|
|
|
public void Init_Unbalanced_Throws ()
|
|
|
{
|
|
@@ -826,10 +896,10 @@ public class ApplicationTests
|
|
|
|
|
|
Application.OnMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
|
|
|
Assert.Equal (w.Border, Application.MouseGrabView);
|
|
|
- Assert.Equal (new Point (0,0), w.Frame.Location);
|
|
|
+ Assert.Equal (new Point (0, 0), w.Frame.Location);
|
|
|
|
|
|
// Move down and to the right.
|
|
|
- Application.OnMouseEvent (new () { Position = new (1,1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition });
|
|
|
+ Application.OnMouseEvent (new () { Position = new (1, 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition });
|
|
|
Assert.Equal (new Point (1, 1), w.Frame.Location);
|
|
|
|
|
|
Application.End (rs);
|
|
@@ -1024,4 +1094,123 @@ public class ApplicationTests
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
+
|
|
|
+
|
|
|
+ private object _timeoutLock;
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void AddTimeout_Fires ()
|
|
|
+ {
|
|
|
+ Assert.Null (_timeoutLock);
|
|
|
+ _timeoutLock = new object ();
|
|
|
+
|
|
|
+ uint timeoutTime = 250;
|
|
|
+ bool initialized = false;
|
|
|
+ int iteration = 0;
|
|
|
+ bool shutdown = false;
|
|
|
+ object timeout = null;
|
|
|
+ int timeoutCount = 0;
|
|
|
+
|
|
|
+ Application.InitializedChanged += OnApplicationOnInitializedChanged;
|
|
|
+
|
|
|
+ Application.Init (new FakeDriver ());
|
|
|
+ Assert.True (initialized);
|
|
|
+ Assert.False (shutdown);
|
|
|
+
|
|
|
+ _output.WriteLine ("Application.Run<Toplevel> ().Dispose ()..");
|
|
|
+ Application.Run<Toplevel> ().Dispose ();
|
|
|
+ _output.WriteLine ("Back from Application.Run<Toplevel> ().Dispose ()");
|
|
|
+
|
|
|
+ Assert.True (initialized);
|
|
|
+ Assert.False (shutdown);
|
|
|
+
|
|
|
+ Assert.Equal (1, timeoutCount);
|
|
|
+ Application.Shutdown ();
|
|
|
+
|
|
|
+ Application.InitializedChanged -= OnApplicationOnInitializedChanged;
|
|
|
+
|
|
|
+ lock (_timeoutLock)
|
|
|
+ {
|
|
|
+ if (timeout is { })
|
|
|
+ {
|
|
|
+ Application.RemoveTimeout (timeout);
|
|
|
+ timeout = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Assert.True (initialized);
|
|
|
+ Assert.True (shutdown);
|
|
|
+
|
|
|
+#if DEBUG_IDISPOSABLE
|
|
|
+ Assert.Empty (Responder.Instances);
|
|
|
+#endif
|
|
|
+ lock (_timeoutLock)
|
|
|
+ {
|
|
|
+ _timeoutLock = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ void OnApplicationOnInitializedChanged (object s, StateEventArgs<bool> a)
|
|
|
+ {
|
|
|
+ if (a.NewValue)
|
|
|
+ {
|
|
|
+ Application.Iteration += OnApplicationOnIteration;
|
|
|
+ initialized = true;
|
|
|
+
|
|
|
+ lock (_timeoutLock)
|
|
|
+ {
|
|
|
+ _output.WriteLine ($"Setting timeout for {timeoutTime}ms");
|
|
|
+ timeout = Application.AddTimeout (TimeSpan.FromMilliseconds (timeoutTime), TimeoutCallback);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Application.Iteration -= OnApplicationOnIteration;
|
|
|
+ shutdown = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ bool TimeoutCallback ()
|
|
|
+ {
|
|
|
+ lock (_timeoutLock)
|
|
|
+ {
|
|
|
+ _output.WriteLine ($"TimeoutCallback. Count: {++timeoutCount}. Application Iteration: {iteration}");
|
|
|
+ if (timeout is { })
|
|
|
+ {
|
|
|
+ _output.WriteLine ($" Nulling timeout.");
|
|
|
+ timeout = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // False means "don't re-do timer and remove it"
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ void OnApplicationOnIteration (object s, IterationEventArgs a)
|
|
|
+ {
|
|
|
+ lock (_timeoutLock)
|
|
|
+ {
|
|
|
+ if (timeoutCount > 0)
|
|
|
+ {
|
|
|
+ _output.WriteLine ($"Iteration #{iteration} - Timeout fired. Calling Application.RequestStop.");
|
|
|
+ Application.RequestStop ();
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ iteration++;
|
|
|
+
|
|
|
+ // Simulate a delay
|
|
|
+ Thread.Sleep ((int)timeoutTime / 10);
|
|
|
+
|
|
|
+ // Worst case scenario - something went wrong
|
|
|
+ if (Application._initialized && iteration > 25)
|
|
|
+ {
|
|
|
+ _output.WriteLine ($"Too many iterations ({iteration}): Calling Application.RequestStop.");
|
|
|
+ Application.RequestStop ();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|