// Alias Console to MockConsole so we don't accidentally use Console namespace Terminal.Gui.ApplicationTests; /// These tests focus on Application.RunState and the various ways it can be changed. public class RunStateTests { public RunStateTests () { #if DEBUG_IDISPOSABLE Responder.Instances.Clear (); RunState.Instances.Clear (); #endif } [Fact] public void Begin_End_Cleans_Up_RunState () { // Setup Mock driver Init (); // Test null Toplevel Assert.Throws (() => Application.Begin (null)); var top = new Toplevel (); RunState rs = Application.Begin (top); Assert.NotNull (rs); Assert.Equal (top, Application.Current); Application.End (rs); Assert.Null (Application.Current); Assert.NotNull (Application.Top); Assert.NotNull (Application.MainLoop); Assert.NotNull (Application.Driver); top.Dispose (); Shutdown (); #if DEBUG_IDISPOSABLE Assert.True (rs.WasDisposed); #endif Assert.Null (Application.Top); Assert.Null (Application.MainLoop); Assert.Null (Application.Driver); } [Fact] public void Dispose_Cleans_Up_RunState () { var rs = new RunState (null); Assert.NotNull (rs); // Should not throw because Toplevel was null rs.Dispose (); #if DEBUG_IDISPOSABLE Assert.True (rs.WasDisposed); #endif var top = new Toplevel (); rs = new RunState (top); Assert.NotNull (rs); // Should throw because Toplevel was not cleaned up Assert.Throws (() => rs.Dispose ()); rs.Toplevel.Dispose (); rs.Toplevel = null; rs.Dispose (); #if DEBUG_IDISPOSABLE Assert.True (rs.WasDisposed); Assert.True (top.WasDisposed); #endif } [Fact] public void New_Creates_RunState () { var rs = new RunState (null); Assert.Null (rs.Toplevel); var top = new Toplevel (); rs = new RunState (top); Assert.Equal (top, rs.Toplevel); } private void Init () { Application.Init (new FakeDriver ()); Assert.NotNull (Application.Driver); Assert.NotNull (Application.MainLoop); Assert.NotNull (SynchronizationContext.Current); } private void Shutdown () { Application.Shutdown (); #if DEBUG_IDISPOSABLE // Validate there are no outstanding RunState-based instances left foreach (RunState inst in RunState.Instances) { Assert.True (inst.WasDisposed); } #endif } }