| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- using Xunit.Abstractions;
- namespace UnitTests_Parallelizable.ApplicationTests.RunnableTests;
- /// <summary>
- /// Tests for IRunnable lifecycle behavior.
- /// </summary>
- public class RunnableLifecycleTests (ITestOutputHelper output)
- {
- private readonly ITestOutputHelper _output = output;
- [Fact]
- public void Runnable_OnIsRunningChanging_CanExtractResult ()
- {
- // Arrange
- ResultExtractingRunnable runnable = new ();
- runnable.TestValue = "extracted";
- // Act
- bool canceled = runnable.RaiseIsRunningChanging (true, false); // Stopping
- // Assert
- Assert.False (canceled);
- Assert.Equal ("extracted", runnable.Result);
- }
- [Fact]
- public void Runnable_OnIsRunningChanging_ClearsResultWhenStarting ()
- {
- // Arrange
- ResultExtractingRunnable runnable = new () { Result = "previous" };
- // Act
- bool canceled = runnable.RaiseIsRunningChanging (false, true); // Starting
- // Assert
- Assert.False (canceled);
- Assert.Null (runnable.Result); // Result should be cleared
- }
- [Fact]
- public void Runnable_CanCancelStoppingWithUnsavedChanges ()
- {
- // Arrange
- UnsavedChangesRunnable runnable = new () { HasUnsavedChanges = true };
- // Act
- bool canceled = runnable.RaiseIsRunningChanging (true, false); // Stopping
- // Assert
- Assert.True (canceled); // Should be canceled
- }
- [Fact]
- public void Runnable_AllowsStoppingWithoutUnsavedChanges ()
- {
- // Arrange
- UnsavedChangesRunnable runnable = new () { HasUnsavedChanges = false };
- // Act
- bool canceled = runnable.RaiseIsRunningChanging (true, false); // Stopping
- // Assert
- Assert.False (canceled); // Should not be canceled
- }
- [Fact]
- public void Runnable_OnIsRunningChanged_CalledAfterStateChange ()
- {
- // Arrange
- TrackedRunnable runnable = new ();
- // Act
- runnable.RaiseIsRunningChangedEvent (true);
- // Assert
- Assert.True (runnable.OnIsRunningChangedCalled);
- Assert.True (runnable.LastIsRunningValue);
- }
- [Fact]
- public void Runnable_OnIsModalChanged_CalledAfterStateChange ()
- {
- // Arrange
- TrackedRunnable runnable = new ();
- // Act
- runnable.RaiseIsModalChangedEvent (true);
- // Assert
- Assert.True (runnable.OnIsModalChangedCalled);
- Assert.True (runnable.LastIsModalValue);
- }
- /// <summary>
- /// Test runnable that extracts result in OnIsRunningChanging.
- /// </summary>
- private class ResultExtractingRunnable : Runnable<string>
- {
- public string? TestValue { get; set; }
- protected override bool OnIsRunningChanging (bool oldIsRunning, bool newIsRunning)
- {
- if (!newIsRunning) // Stopping
- {
- // Extract result before removal from stack
- Result = TestValue;
- }
- return base.OnIsRunningChanging (oldIsRunning, newIsRunning);
- }
- }
- /// <summary>
- /// Test runnable that can prevent stopping with unsaved changes.
- /// </summary>
- private class UnsavedChangesRunnable : Runnable<int>
- {
- public bool HasUnsavedChanges { get; set; }
- protected override bool OnIsRunningChanging (bool oldIsRunning, bool newIsRunning)
- {
- if (!newIsRunning && HasUnsavedChanges) // Stopping with unsaved changes
- {
- return true; // Cancel stopping
- }
- return base.OnIsRunningChanging (oldIsRunning, newIsRunning);
- }
- }
- /// <summary>
- /// Test runnable that tracks lifecycle method calls.
- /// </summary>
- private class TrackedRunnable : Runnable<int>
- {
- public bool OnIsRunningChangedCalled { get; private set; }
- public bool LastIsRunningValue { get; private set; }
- public bool OnIsModalChangedCalled { get; private set; }
- public bool LastIsModalValue { get; private set; }
- protected override void OnIsRunningChanged (bool newIsRunning)
- {
- OnIsRunningChangedCalled = true;
- LastIsRunningValue = newIsRunning;
- base.OnIsRunningChanged (newIsRunning);
- }
- protected override void OnIsModalChanged (bool newIsModal)
- {
- OnIsModalChangedCalled = true;
- LastIsModalValue = newIsModal;
- base.OnIsModalChanged (newIsModal);
- }
- }
- }
|