RunnableTests.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using Xunit.Abstractions;
  2. namespace ApplicationTests.RunnableTests;
  3. /// <summary>
  4. /// Tests for IRunnable interface and Runnable base class.
  5. /// </summary>
  6. public class RunnableTests (ITestOutputHelper output)
  7. {
  8. private readonly ITestOutputHelper _output = output;
  9. [Fact]
  10. public void Runnable_Implements_IRunnable ()
  11. {
  12. // Arrange & Act
  13. Runnable<int> runnable = new ();
  14. // Assert
  15. Assert.IsAssignableFrom<IRunnable> (runnable);
  16. Assert.IsAssignableFrom<IRunnable<int>> (runnable);
  17. }
  18. [Fact]
  19. public void Runnable_Result_DefaultsToDefault ()
  20. {
  21. // Arrange & Act
  22. Runnable<int> runnable = new ();
  23. // Assert
  24. Assert.Equal (0, runnable.Result);
  25. }
  26. [Fact]
  27. public void Runnable_Result_CanBeSet ()
  28. {
  29. // Arrange
  30. Runnable<int> runnable = new ();
  31. // Act
  32. runnable.Result = 42;
  33. // Assert
  34. Assert.Equal (42, runnable.Result);
  35. }
  36. [Fact]
  37. public void Runnable_Result_CanBeSetToNull ()
  38. {
  39. // Arrange
  40. Runnable<string> runnable = new ();
  41. // Act
  42. runnable.Result = null;
  43. // Assert
  44. Assert.Null (runnable.Result);
  45. }
  46. [Fact]
  47. public void Runnable_IsRunning_ReturnsFalse_WhenNotRunning ()
  48. {
  49. // Arrange
  50. IApplication app = Application.Create ();
  51. app.Init ();
  52. Runnable<int> runnable = new ();
  53. // Act & Assert
  54. Assert.False (runnable.IsRunning);
  55. // Cleanup
  56. app.Dispose ();
  57. }
  58. [Fact]
  59. public void Runnable_IsModal_ReturnsFalse_WhenNotRunning ()
  60. {
  61. // Arrange
  62. Runnable<int> runnable = new ();
  63. // Act & Assert
  64. // IsModal should be false when the runnable has no app or is not TopRunnable
  65. Assert.False (runnable.IsModal);
  66. }
  67. [Fact]
  68. public void RaiseIsRunningChanging_ClearsResult_WhenStarting ()
  69. {
  70. // Arrange
  71. Runnable<int> runnable = new () { Result = 42 };
  72. // Act
  73. bool canceled = runnable.RaiseIsRunningChanging (false, true);
  74. // Assert
  75. Assert.False (canceled);
  76. Assert.Equal (0, runnable.Result); // Result should be cleared
  77. }
  78. [Fact]
  79. public void RaiseIsRunningChanging_CanBeCanceled_ByVirtualMethod ()
  80. {
  81. // Arrange
  82. CancelableRunnable runnable = new ();
  83. // Act
  84. bool canceled = runnable.RaiseIsRunningChanging (false, true);
  85. // Assert
  86. Assert.True (canceled);
  87. }
  88. [Fact]
  89. public void RaiseIsRunningChanging_CanBeCanceled_ByEvent ()
  90. {
  91. // Arrange
  92. Runnable<int> runnable = new ();
  93. var eventRaised = false;
  94. runnable.IsRunningChanging += (s, e) =>
  95. {
  96. eventRaised = true;
  97. e.Cancel = true;
  98. };
  99. // Act
  100. bool canceled = runnable.RaiseIsRunningChanging (false, true);
  101. // Assert
  102. Assert.True (eventRaised);
  103. Assert.True (canceled);
  104. }
  105. [Fact]
  106. public void RaiseIsRunningChanged_RaisesEvent ()
  107. {
  108. // Arrange
  109. Runnable<int> runnable = new ();
  110. var eventRaised = false;
  111. bool? receivedValue = null;
  112. runnable.IsRunningChanged += (s, e) =>
  113. {
  114. eventRaised = true;
  115. receivedValue = e.Value;
  116. };
  117. // Act
  118. runnable.RaiseIsRunningChangedEvent (true);
  119. // Assert
  120. Assert.True (eventRaised);
  121. Assert.True (receivedValue);
  122. }
  123. [Fact]
  124. public void RaiseIsModalChanged_RaisesEvent ()
  125. {
  126. // Arrange
  127. Runnable<int> runnable = new ();
  128. var eventRaised = false;
  129. bool? receivedValue = null;
  130. runnable.IsModalChanged += (s, e) =>
  131. {
  132. eventRaised = true;
  133. receivedValue = e.Value;
  134. };
  135. // Act
  136. runnable.RaiseIsModalChangedEvent (true);
  137. // Assert
  138. Assert.True (eventRaised);
  139. Assert.True (receivedValue);
  140. }
  141. /// <summary>
  142. /// Test runnable that can cancel lifecycle changes.
  143. /// </summary>
  144. private class CancelableRunnable : Runnable<int>
  145. {
  146. protected override bool OnIsRunningChanging (bool oldIsRunning, bool newIsRunning) => true; // Always cancel
  147. }
  148. }