mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-11-14 02:15:07 -05:00
Area and the canonical angle were refreshed together only by the Program setter; an in-place program edit needed two separate calls, and UpdateArea kept a stale Area when no material was left. ProgramChanged is now the single entry point (the setter calls it), a program with no material or a null program gives Area 0, and UpdateArea/RecomputeCanonicalAngle are private. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
89 lines
2.6 KiB
C#
89 lines
2.6 KiB
C#
using System.Linq;
|
|
using OpenNest.CNC;
|
|
using OpenNest.Geometry;
|
|
|
|
namespace OpenNest.Tests;
|
|
|
|
public class DrawingProgramChangedTests
|
|
{
|
|
private static Program Rectangle(double width, double height)
|
|
{
|
|
var program = new Program();
|
|
program.Codes.Add(new RapidMove(new Vector(0, 0)));
|
|
program.Codes.Add(new LinearMove(new Vector(width, 0)));
|
|
program.Codes.Add(new LinearMove(new Vector(width, height)));
|
|
program.Codes.Add(new LinearMove(new Vector(0, height)));
|
|
program.Codes.Add(new LinearMove(new Vector(0, 0)));
|
|
return program;
|
|
}
|
|
|
|
[Fact]
|
|
public void InPlaceEditIsStaleUntilProgramChangedRefreshesAreaAndAngle()
|
|
{
|
|
var drawing = new Drawing("r", Rectangle(100, 50));
|
|
Assert.Equal(5000, drawing.Area, 6);
|
|
Assert.Equal(0.0, drawing.Source.Angle, 6);
|
|
|
|
// Neither edit goes through the Program setter.
|
|
foreach (var move in drawing.Program.Codes.OfType<LinearMove>())
|
|
move.EndPoint = new Vector(move.EndPoint.X * 2, move.EndPoint.Y);
|
|
drawing.Program.Rotate(0.5, drawing.Program.BoundingBox().Center);
|
|
Assert.Equal(5000, drawing.Area, 6);
|
|
Assert.Equal(0.0, drawing.Source.Angle, 6);
|
|
|
|
drawing.ProgramChanged();
|
|
|
|
Assert.Equal(10000, drawing.Area, 6);
|
|
Assert.InRange(drawing.Source.Angle, -0.52, -0.48);
|
|
}
|
|
|
|
[Fact]
|
|
public void ClearingTheMaterialZeroesTheArea()
|
|
{
|
|
var drawing = new Drawing("r", Rectangle(100, 50));
|
|
|
|
foreach (var move in drawing.Program.Codes.OfType<LinearMove>())
|
|
move.Layer = LayerType.Scribe;
|
|
drawing.ProgramChanged();
|
|
|
|
Assert.Equal(0.0, drawing.Area);
|
|
}
|
|
|
|
[Fact]
|
|
public void AnEmptiedProgramZeroesTheArea()
|
|
{
|
|
var drawing = new Drawing("r", Rectangle(100, 50));
|
|
|
|
drawing.Program.Codes.Clear();
|
|
drawing.ProgramChanged();
|
|
|
|
Assert.Equal(0.0, drawing.Area);
|
|
}
|
|
|
|
[Fact]
|
|
public void ANullProgramZeroesAreaAndAngle()
|
|
{
|
|
var program = Rectangle(100, 50);
|
|
program.Rotate(0.5, program.BoundingBox().Center);
|
|
var drawing = new Drawing("r", program);
|
|
Assert.NotEqual(0.0, drawing.Source.Angle);
|
|
|
|
drawing.Program = null;
|
|
|
|
Assert.Equal(0.0, drawing.Area);
|
|
Assert.Equal(0.0, drawing.Source.Angle);
|
|
}
|
|
|
|
[Fact]
|
|
public void ACutOffDrawingKeepsAngleZero()
|
|
{
|
|
var drawing = new Drawing("cut", Rectangle(100, 50)) { IsCutOff = true };
|
|
|
|
drawing.Program.Rotate(0.5, drawing.Program.BoundingBox().Center);
|
|
drawing.ProgramChanged();
|
|
|
|
Assert.Equal(0.0, drawing.Source.Angle);
|
|
Assert.Equal(5000, drawing.Area, 6);
|
|
}
|
|
}
|