Files
OpenNest/OpenNest.Tests/Diagnostics/OverlapAutoCheckSchedulerTests.cs
T
ajandClaude Opus 5.5 f0d84e041c test: share the circle, square, rectangle and contour fixtures
Cutting-planning, diagnostics and fill tests drew the same circles,
squares, clockwise rectangles, closed polygons, rounded rectangles and
right-midpoint rectangle contours in private helpers. They now use
TestHelpers; files whose helper had its own default size keep a
one-line wrapper for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 10:50:50 -05:00

105 lines
4.2 KiB
C#

using OpenNest.CNC;
using OpenNest.Diagnostics;
using OpenNest.Geometry;
using static OpenNest.Tests.TestHelpers;
namespace OpenNest.Tests.Diagnostics;
public class OverlapAutoCheckSchedulerTests
{
[Fact]
public void ChecksOnlyAfterTheLayoutStaysQuietForAWholePeriod()
{
var plate = PlateWithParts();
var state = new OverlapReportState();
var scheduler = new OverlapAutoCheckScheduler();
Assert.True(scheduler.Observe(plate, state)); // NotChecked: start the timer
Assert.False(scheduler.Observe(plate, state)); // repaint without change: leave it running
plate.Parts[0].Offset(1, 0); // drag step
Assert.True(scheduler.Observe(plate, state)); // restart the quiet period
plate.Parts[0].Offset(1, 0); // moved again, not yet observed
Assert.Equal(OverlapAutoCheckStep.Wait, scheduler.Elapsed(plate, state, interactionActive: false));
Assert.Equal(OverlapAutoCheckStep.Check, scheduler.Elapsed(plate, state, interactionActive: false));
Assert.False(scheduler.IsWaiting);
}
[Fact]
public void WaitsWhileAnInteractionIsActive()
{
var plate = PlateWithParts();
var state = new OverlapReportState();
var scheduler = new OverlapAutoCheckScheduler();
scheduler.Observe(plate, state);
Assert.Equal(OverlapAutoCheckStep.Wait, scheduler.Elapsed(plate, state, interactionActive: true));
Assert.Equal(OverlapAutoCheckStep.Check, scheduler.Elapsed(plate, state, interactionActive: false));
}
[Fact]
public void CurrentOrRunningChecksNeedNoAutomaticRequest()
{
var plate = PlateWithParts();
var state = new OverlapReportState();
var scheduler = new OverlapAutoCheckScheduler();
scheduler.Observe(plate, state);
var request = state.Begin(plate);
scheduler.Started(plate);
Assert.False(scheduler.Observe(plate, state));
Assert.Equal(OverlapAutoCheckStep.None, scheduler.Elapsed(plate, state, false));
Assert.True(state.TryPublish(request, plate, PlateOverlapAnalyzer.Analyze(plate.Parts.ToArray())));
Assert.False(scheduler.Observe(plate, state));
plate.Parts[1].Offset(0, 3);
state.EnsureFresh(plate); // Stale after the edit
Assert.True(scheduler.Observe(plate, state));
Assert.Equal(OverlapAutoCheckStep.Check, scheduler.Elapsed(plate, state, false));
}
[Theory]
[InlineData(true)]
[InlineData(false)]
public void CanceledOrFailedLayoutIsNotRetriedUntilItChanges(bool cancel)
{
var plate = PlateWithParts();
var state = new OverlapReportState();
var scheduler = new OverlapAutoCheckScheduler();
var request = state.Begin(plate);
scheduler.Started(plate);
if (cancel)
state.Cancel();
else
Assert.True(state.TryFail(request, plate));
Assert.False(scheduler.Observe(plate, state)); // respect the cancel / avoid a failure loop
Assert.Equal(OverlapAutoCheckStep.None, scheduler.Elapsed(plate, state, false));
plate.Parts[0].Offset(0.5, 0);
Assert.True(scheduler.Observe(plate, state));
Assert.Equal(OverlapAutoCheckStep.Check, scheduler.Elapsed(plate, state, false));
}
[Fact]
public void ResetForgetsPendingWorkAndPreviousRequests()
{
var plate = PlateWithParts();
var state = new OverlapReportState();
var scheduler = new OverlapAutoCheckScheduler();
state.Begin(plate);
scheduler.Started(plate);
state.Cancel();
scheduler.Reset();
Assert.True(scheduler.Observe(plate, state)); // a new document/plate may check again
scheduler.Reset();
Assert.False(scheduler.IsWaiting);
Assert.Equal(OverlapAutoCheckStep.None, scheduler.Elapsed(plate, state, false));
Assert.False(scheduler.Observe(null, state));
}
private static Plate PlateWithParts()
{
var plate = new Plate();
plate.Parts.Add(MakeSquarePart("same name"));
plate.Parts.Add(MakeSquarePart("same name"));
return plate;
}
}