Files
OpenNest/OpenNest.Tests/PlateDisplayNumberingTests.cs
T
ajandClaude Opus 5.5 872cd8e4b8 fix(ui): show the plate size on the new-plate header
The empty new-plate header read only "New plate (empty)", so the sheet
size of the plate about to be nested was hidden until parts were added.
FormatHeader now appends the size (and quantity above one) there too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 16:48:52 -05:00

153 lines
5.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using OpenNest.CNC;
using OpenNest.Geometry;
namespace OpenNest.Tests;
public class PlateDisplayNumberingTests
{
private static Nest CreateNest() => new("test");
private static Part MakePart()
{
var pgm = new Program();
pgm.Codes.Add(new RapidMove(new Vector(0, 0)));
pgm.Codes.Add(new LinearMove(new Vector(10, 0)));
pgm.Codes.Add(new LinearMove(new Vector(10, 10)));
pgm.Codes.Add(new LinearMove(new Vector(0, 0)));
return new Part(new Drawing("test", pgm));
}
[Fact]
public void PopulatedThenSentinel_TotalIsOneAndRealPlateDisplaysAsOne()
{
var nest = CreateNest();
var real = nest.CreatePlate();
real.Parts.Add(MakePart());
nest.CreatePlate(); // The trailing empty sentinel.
Assert.Equal(1, PlateDisplayNumbering.DisplayedPlateCount(nest.Plates));
Assert.Equal(1, PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 0));
Assert.Equal("Plate 1 of 1", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, null));
}
[Fact]
public void Sentinel_IsLabeledAsNewPlateNotNumbered()
{
var nest = CreateNest();
var real = nest.CreatePlate();
real.Parts.Add(MakePart());
nest.CreatePlate();
var sentinel = nest.Plates.Count - 1;
Assert.True(PlateDisplayNumbering.IsTrailingSentinel(nest.Plates, sentinel));
Assert.Null(PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, sentinel));
Assert.Equal("New plate (empty)", PlateDisplayNumbering.FormatHeader(nest.Plates, sentinel, null));
Assert.Equal("New plate (empty) | 60 x 120",
PlateDisplayNumbering.FormatHeader(nest.Plates, sentinel, "60 x 120"));
}
[Fact]
public void Header_ShowsSizeAndQuantityAboveOne()
{
var nest = CreateNest();
nest.Plates.Add(WithPart());
Assert.Equal("Plate 1 of 1 | 60 x 120", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, "60 x 120"));
Assert.Equal("Plate 1 of 1 | 60 x 120", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, "60 x 120", 1));
Assert.Equal("Plate 1 of 1 | 60 x 120 | ×4", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, "60 x 120", 4));
Assert.Equal("Plate 1 of 1 | ×2", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, null, 2));
}
[Fact]
public void TwoRealPlatesThenSentinel_TotalIsTwo()
{
var nest = CreateNest();
nest.Plates.Add(WithPart());
nest.Plates.Add(WithPart());
nest.CreatePlate(); // sentinel
Assert.Equal(2, PlateDisplayNumbering.DisplayedPlateCount(nest.Plates));
Assert.Equal(1, PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 0));
Assert.Equal(2, PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 1));
Assert.Null(PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 2));
}
[Fact]
public void NoPlates_TotalIsZeroAndHeaderSaysNoPlates()
{
var nest = CreateNest();
Assert.Equal(0, PlateDisplayNumbering.DisplayedPlateCount(nest.Plates));
Assert.Null(PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 0));
Assert.Equal("No plates", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, null));
}
[Fact]
public void SingleEmptyPlate_IsTheNewPlateView_NotNumbered()
{
var nest = CreateNest();
nest.CreatePlate(); // only the sentinel
Assert.Equal(0, PlateDisplayNumbering.DisplayedPlateCount(nest.Plates));
Assert.True(PlateDisplayNumbering.IsTrailingSentinel(nest.Plates, 0));
Assert.Equal("New plate (empty)", PlateDisplayNumbering.FormatHeader(nest.Plates, 0, null));
}
[Fact]
public void InteriorEmptyPlate_KeepsItsSlotAndNumber()
{
var nest = CreateNest();
nest.Plates.Add(WithPart());
nest.CreatePlate(); // An empty interior plate: EnsureSentinel only trims at the tail.
nest.Plates.Add(WithPart());
nest.CreatePlate(); // sentinel
Assert.Equal(3, PlateDisplayNumbering.DisplayedPlateCount(nest.Plates));
Assert.Equal(2, PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 1));
Assert.Equal(3, PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 2));
Assert.False(PlateDisplayNumbering.IsTrailingSentinel(nest.Plates, 1));
}
[Fact]
public void LastPlateWithParts_IsNotASentinel()
{
var nest = CreateNest();
nest.Plates.Add(WithPart());
Assert.Equal(1, PlateDisplayNumbering.DisplayedPlateCount(nest.Plates));
Assert.False(PlateDisplayNumbering.IsTrailingSentinel(nest.Plates, 0));
}
[Fact]
public void IndexOutsideCollection_HasNoNumberAndIsNotASentinel()
{
var nest = CreateNest();
nest.Plates.Add(WithPart());
Assert.Null(PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, 5));
Assert.Null(PlateDisplayNumbering.DisplayedPlateNumber(nest.Plates, -1));
Assert.False(PlateDisplayNumbering.IsTrailingSentinel(nest.Plates, 5));
}
[Fact]
public void Helper_DoesNotMutateTheNest()
{
var nest = CreateNest();
nest.Plates.Add(WithPart());
nest.CreatePlate();
var before = nest.Plates.Count;
PlateDisplayNumbering.DisplayedPlateCount(nest.Plates);
PlateDisplayNumbering.FormatHeader(nest.Plates, 1, "100 x 100");
Assert.Equal(before, nest.Plates.Count);
}
private static Plate WithPart()
{
var plate = new Plate();
plate.Parts.Add(MakePart());
return plate;
}
}