RunnableTests.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. using Xunit.Abstractions;
  2. namespace UnitTests_Parallelizable.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.Shutdown ();
  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 RaiseIsModalChanging_CanBeCanceled_ByVirtualMethod ()
  125. {
  126. // Arrange
  127. CancelableRunnable runnable = new () { CancelModalChange = true };
  128. // Act
  129. bool canceled = runnable.RaiseIsModalChanging (false, true);
  130. // Assert
  131. Assert.True (canceled);
  132. }
  133. [Fact]
  134. public void RaiseIsModalChanging_CanBeCanceled_ByEvent ()
  135. {
  136. // Arrange
  137. Runnable<int> runnable = new ();
  138. var eventRaised = false;
  139. runnable.IsModalChanging += (s, e) =>
  140. {
  141. eventRaised = true;
  142. e.Cancel = true;
  143. };
  144. // Act
  145. bool canceled = runnable.RaiseIsModalChanging (false, true);
  146. // Assert
  147. Assert.True (eventRaised);
  148. Assert.True (canceled);
  149. }
  150. [Fact]
  151. public void RaiseIsModalChanged_RaisesEvent ()
  152. {
  153. // Arrange
  154. Runnable<int> runnable = new ();
  155. var eventRaised = false;
  156. bool? receivedValue = null;
  157. runnable.IsModalChanged += (s, e) =>
  158. {
  159. eventRaised = true;
  160. receivedValue = e.Value;
  161. };
  162. // Act
  163. runnable.RaiseIsModalChangedEvent (true);
  164. // Assert
  165. Assert.True (eventRaised);
  166. Assert.True (receivedValue);
  167. }
  168. /// <summary>
  169. /// Test runnable that can cancel lifecycle changes.
  170. /// </summary>
  171. private class CancelableRunnable : Runnable<int>
  172. {
  173. public bool CancelModalChange { get; set; }
  174. protected override bool OnIsRunningChanging (bool oldIsRunning, bool newIsRunning) => true; // Always cancel
  175. protected override bool OnIsModalChanging (bool oldIsModal, bool newIsModal) => CancelModalChange;
  176. }
  177. }