From ad79e5fbecfb601888e1d51f9cd38af988f4d751 Mon Sep 17 00:00:00 2001 From: Mark Pitman Date: Wed, 4 Feb 2026 23:51:59 -0800 Subject: [PATCH] Preserve progress stop time --- .../Utilities/SpectreProgressDisplayTests.cs | 19 +++++++++++++++++++ .../Utilities/SpectreProgressDisplay.cs | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/src/RipSharp.Tests/Utilities/SpectreProgressDisplayTests.cs b/src/RipSharp.Tests/Utilities/SpectreProgressDisplayTests.cs index 2bcc715..0f34bbf 100644 --- a/src/RipSharp.Tests/Utilities/SpectreProgressDisplayTests.cs +++ b/src/RipSharp.Tests/Utilities/SpectreProgressDisplayTests.cs @@ -53,6 +53,25 @@ public void StopTask_FreezesElapsedTimer() GetElapsed(task).Should().BeCloseTo(stopTime!.Value - startTime, precision: TimeSpan.FromSeconds(0.25)); } + [Fact] + public void StopTask_DoesNotOverwriteStopTime() + { + var task = CreateLiveTask("Test", 100); + var startTime = DateTime.UtcNow - TimeSpan.FromSeconds(9); + var firstStopTime = DateTime.UtcNow - TimeSpan.FromSeconds(4); + + SetTaskValue(task, 1); + SetPrivateField(task, "_startTime", startTime); + SetPrivateField(task, "_stopTime", firstStopTime); + SetPrivateField(task, "_isStopped", true); + + Invoke(task, "StopTask"); + + var stopTime = (DateTime?)GetPrivateField(task, "_stopTime"); + stopTime.Should().Be(firstStopTime); + GetElapsed(task).Should().BeCloseTo(firstStopTime - startTime, precision: TimeSpan.FromSeconds(0.25)); + } + private static string InvokeFormatTimeSpan(TimeSpan value) { var method = typeof(SpectreProgressDisplay) diff --git a/src/RipSharp/Utilities/SpectreProgressDisplay.cs b/src/RipSharp/Utilities/SpectreProgressDisplay.cs index 7b97504..fc52a51 100644 --- a/src/RipSharp/Utilities/SpectreProgressDisplay.cs +++ b/src/RipSharp/Utilities/SpectreProgressDisplay.cs @@ -270,6 +270,10 @@ public void StopTask() { lock (_lock) { + if (_isStopped) + { + return; + } _value = _maxValue; _isStopped = true; _stopTime = DateTime.UtcNow;