diff --git a/OpenNest.Engine.Tests/Jobs/NestPipelineTests.cs b/OpenNest.Engine.Tests/Jobs/NestPipelineTests.cs index 30774cf..9519a60 100644 --- a/OpenNest.Engine.Tests/Jobs/NestPipelineTests.cs +++ b/OpenNest.Engine.Tests/Jobs/NestPipelineTests.cs @@ -101,6 +101,21 @@ public class NestPipelineTests Assert.Contains("Default", error.Message); } + [Fact] + public void CancellationDuringSolveDiscardsEvenAnEngineThatReturnsNormally() + { + using var cts = new CancellationTokenSource(); + var engine = new StubEngine(job => + { + cts.Cancel(); + return OnePlate(job, new NestJobPlacement(job.Parts[0].Id, 0, 1, 1, 0)); + }); + + Assert.ThrowsAny(() => + NestPipeline.Run(engine, "IgnoresStop", Request("IgnoresStop", Item("bracket", 1)), null, cts.Token) + ); + } + [Fact] public void CancellationPropagatesWithoutAResult() { diff --git a/OpenNest.Engine/Jobs/NestPipeline.cs b/OpenNest.Engine/Jobs/NestPipeline.cs index 84facaf..4cf3692 100644 --- a/OpenNest.Engine/Jobs/NestPipeline.cs +++ b/OpenNest.Engine/Jobs/NestPipeline.cs @@ -115,6 +115,7 @@ public static class NestPipeline engine.Solve(job, progress, token) ?? throw new InvalidOperationException($"Engine '{engineName}' returned no result."); var solveTime = clock.Elapsed; + token.ThrowIfCancellationRequested(); clock.Restart(); var violations = Validate(job, raw, drawingsByPartId); @@ -128,6 +129,7 @@ public static class NestPipeline )) .ToList(); + token.ThrowIfCancellationRequested(); return new NestPipelineResult( engineName, job,