fix(expand): distinguish part blockers from plate edges

This commit is contained in:
aj committed 2026-10-13 21:31:57 -04:00
1 parent dc4b07ddf5
commit fdc6f074ee
3 files changed
+77 -28

No files matched your search

@@ -536,6 +536,49 @@ public class ExpanderTests
Assert.Equal(0, host.Location.X);
}
[Fact]
public void Separate_ReportsPartBlockerRatherThanPlateEdge()
{
var plate = MakePlate(20, 20, edge: 0);
var pinned = AddSquare(plate, 8, 8);
AddSquare(plate, 3.8, 8);
AddSquare(plate, 12.2, 8);
AddSquare(plate, 8, 3.8);
AddSquare(plate, 8, 12.2);
var (_, poses, violations) = Expander.Separate(new List<Part> { pinned }, plate, 1);
Assert.NotEmpty(violations);
Assert.All(violations, v => Assert.False(v.BlockedByEdge,
$"{v.B.BaseDrawing.Name}: blocker before the work-area edge, pose={poses[0]}"));
}
[Fact]
public void Separate_ReportsActualPlateEdgeWhenItLimitsMovement()
{
var plate = MakePlate(12, 12, edge: 0);
var anchor = AddSquare(plate, 1, 4, 2);
var moving = AddSquare(plate, 7, 4, 2);
var (_, poses, violations) = Expander.Separate(new List<Part> { anchor, moving }, plate, 9);
var pair = Assert.Single(violations.Where(v => ReferenceEquals(v.A, anchor) && ReferenceEquals(v.B, moving)));
Assert.True(pair.BlockedByEdge);
Assert.True(poses[1].X + 2 <= 12 + 1e-6);
}
[Fact]
public void Separate_ReportsPartBeforeFartherEdge_OnNarrowPlate()
{
var plate = MakePlate(9, 2, edge: 0);
var anchor = AddSquare(plate, 0, 0, 2);
var moving = AddSquare(plate, 3, 0, 2);
var wall = AddRectangle(plate, 5.5, 0, 0.2, 2);
var (_, poses, violations) = Expander.Separate(new List<Part> { anchor, moving }, plate, 4);
var pair = Assert.Single(violations.Where(v => ReferenceEquals(v.A, anchor) && ReferenceEquals(v.B, moving)));
Assert.False(pair.BlockedByEdge);
Assert.True(poses[1].X + 2 <= wall.Location.X + 1e-6);
}
[Fact]
public void Expand_WallsAndUnselectedPairs_StayExactlyAtClearance()
{