Files
OpenNest/OpenNest.Engine.Tests/Jobs/CandidatePlacementContextTests.cs
T

117 lines
3.6 KiB
C#

using OpenNest.CNC;
using OpenNest.Geometry;
using OpenNest.Engine.Jobs;
using OpenNest.Engine.Jobs.Placement;
namespace OpenNest.Engine.Tests.Jobs;
public class CandidatePlacementContextTests
{
[Fact]
public void FreshItemsReusePrivateDrawingsAndReflectCurrentRequirement()
{
var context = new CandidatePlacementContext();
var geometry = PartGeometrySnapshot.FromProgram(TestDrawingFactory.Rectangle(6, 4));
var first = Assert.Single(
context.CreateItems(
new[]
{
new NestJobPart(
"part",
geometry,
3,
priority: 7,
rotation: RotationPolicy.BoundedSweep(0.1, 0.7, 0.2)
),
}
)
);
var current = Assert.Single(
context.CreateItems(
new[]
{
new NestJobPart(
"part",
geometry,
1,
priority: 4,
rotation: RotationPolicy.Fixed(0.5)
),
}
)
);
Assert.NotSame(first, current);
Assert.Same(first.Drawing, current.Drawing);
Assert.Equal(1, current.Quantity);
Assert.Equal(4, current.Priority);
Assert.Equal(OpenNest.Math.Angle.TwoPI, current.StepAngle);
Assert.Equal(0.5, current.RotationStart);
Assert.Equal(0.5, current.RotationEnd);
}
[Fact]
public void PlacementMappingUsesPrivateDrawingIdentityAndRejectsInvalidParts()
{
var context = new CandidatePlacementContext();
var items = context.CreateItems(
new[]
{
new NestJobPart(
"part",
PartGeometrySnapshot.FromProgram(TestDrawingFactory.Rectangle(6, 4)),
1
),
}
);
var placed = new Part(items[0].Drawing, new Vector(7, 11));
placed.Rotate(0.3);
var placement = Assert.Single(context.MapPlacements(new[] { placed }));
Assert.Equal("part", placement.PartId);
Assert.Equal(0, placement.InstanceIndex);
// The mapping carries the part's committed pose; Rotate moves both program and location.
Assert.Equal(placed.Location.X, placement.X, 9);
Assert.Equal(placed.Location.Y, placement.Y, 9);
Assert.Equal(placed.Rotation, placement.Rotation, 9);
}
[Fact]
public void NullPartIsRejected()
{
var context = new CandidatePlacementContext();
Assert.Throws<InvalidOperationException>(
() =>
{
_ = context.MapPlacements(new List<Part> { null! });
}
);
}
[Fact]
public void ForeignDrawingWithKnownNameIsRejected()
{
var context = new CandidatePlacementContext();
_ = context.CreateItems(
new[]
{
new NestJobPart(
"part",
PartGeometrySnapshot.FromProgram(TestDrawingFactory.Rectangle(6, 4)),
1
),
}
);
// Same requirement name, but a foreign Drawing instance: identity is by reference.
var foreign = new Part(new Drawing("part", TestDrawingFactory.Rectangle(6, 4)));
Assert.Throws<InvalidOperationException>(
() =>
{
_ = context.MapPlacements(new[] { foreign });
}
);
}
}