RunStateTests.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Alias Console to MockConsole so we don't accidentally use Console
  2. using System.Numerics;
  3. using Terminal.Gui.Drivers;
  4. using UnitTests;
  5. namespace UnitTests.ApplicationTests;
  6. /// <summary>These tests focus on Application.RunState and the various ways it can be changed.</summary>
  7. public class RunStateTests
  8. {
  9. public RunStateTests ()
  10. {
  11. #if DEBUG_IDISPOSABLE
  12. View.EnableDebugIDisposableAsserts = true;
  13. View.Instances.Clear ();
  14. RunState.Instances.Clear ();
  15. #endif
  16. }
  17. [Fact]
  18. [AutoInitShutdown]
  19. public void Begin_End_Cleans_Up_RunState ()
  20. {
  21. // Test null Toplevel
  22. Assert.Throws<ArgumentNullException> (() => Application.Begin (null));
  23. var top = new Toplevel ();
  24. RunState rs = Application.Begin (top);
  25. Assert.NotNull (rs);
  26. Application.End (rs);
  27. Assert.NotNull (Application.Top);
  28. // v2 does not use main loop, it uses MainLoop<T> and its internal
  29. //Assert.NotNull (Application.MainLoop);
  30. Assert.NotNull (Application.Driver);
  31. top.Dispose ();
  32. Shutdown ();
  33. #if DEBUG_IDISPOSABLE
  34. Assert.True (rs.WasDisposed);
  35. #endif
  36. Assert.Null (Application.Top);
  37. // Assert.Null (Application.MainLoop);
  38. Assert.Null (Application.Driver);
  39. }
  40. [Fact]
  41. public void Dispose_Cleans_Up_RunState ()
  42. {
  43. var rs = new RunState (null);
  44. Assert.NotNull (rs);
  45. // Should not throw because Toplevel was null
  46. rs.Dispose ();
  47. #if DEBUG_IDISPOSABLE
  48. Assert.True (rs.WasDisposed);
  49. #endif
  50. var top = new Toplevel ();
  51. rs = new RunState (top);
  52. Assert.NotNull (rs);
  53. // Should throw because Toplevel was not cleaned up
  54. Assert.Throws<InvalidOperationException> (() => rs.Dispose ());
  55. rs.Toplevel.Dispose ();
  56. rs.Toplevel = null;
  57. rs.Dispose ();
  58. #if DEBUG_IDISPOSABLE
  59. Assert.True (rs.WasDisposed);
  60. Assert.True (top.WasDisposed);
  61. #endif
  62. }
  63. [Fact]
  64. public void New_Creates_RunState ()
  65. {
  66. var rs = new RunState (null);
  67. Assert.Null (rs.Toplevel);
  68. var top = new Toplevel ();
  69. rs = new RunState (top);
  70. Assert.Equal (top, rs.Toplevel);
  71. }
  72. private void Shutdown ()
  73. {
  74. Application.Shutdown ();
  75. #if DEBUG_IDISPOSABLE
  76. // Validate there are no outstanding RunState-based instances left
  77. foreach (RunState inst in RunState.Instances)
  78. {
  79. Assert.True (inst.WasDisposed);
  80. }
  81. #endif
  82. }
  83. }