using OpenNest.Converters;
using OpenNest.Geometry;
using OpenNest.IO;
using OpenNest.IO.Bom;
namespace OpenNest.Tests.Bom;
///
/// BOM items to rows to an operator edit to groups to the created nest,
/// the same path the import dialog takes.
///
public sealed class BomImportFlowTests : IDisposable
{
private readonly string folder = Path.Combine(
Path.GetTempPath(),
"bom-flow-" + Guid.NewGuid().ToString("N")
);
public BomImportFlowTests()
{
Directory.CreateDirectory(folder);
WriteSquare("PT01");
WriteSquare("PT02");
}
public void Dispose()
{
if (Directory.Exists(folder))
Directory.Delete(folder, recursive: true);
}
[Fact]
public void EditedQuantity_ReachesTheGroupTotalAndTheNestDrawing()
{
var rows = BomImportRows.Build(new List { Item("PT01", 2), Item("PT02", null) }, folder);
Assert.True(rows[0].TrySetQuantity("5"));
Assert.False(rows[1].TrySetQuantity("0"));
var group = Assert.Single(BomImportGroups.Build(rows));
Assert.Equal(6, group.TotalQty);
var nest = Assert.IsType(BomNestBuilder.Build(group, Plate(), "Job", null).Nest);
Assert.Equal(
new[] { ("PT01", 5), ("PT02", 1) },
nest.Drawings.OrderBy(d => d.Name).Select(d => (d.Name, d.Quantity.Required))
);
}
[Fact]
public void BomQuantityBelowOne_KeepsThePartOutUntilTheOperatorFixesIt()
{
var rows = BomImportRows.Build(new List { Item("PT01", 0), Item("PT02", 3) }, folder);
Assert.Equal(new[] { "PT02" }, Assert.Single(BomImportGroups.Build(rows)).Parts.Select(p => p.FileName));
Assert.True(rows[0].TrySetQuantity("4"));
var group = Assert.Single(BomImportGroups.Build(rows));
Assert.Equal(7, group.TotalQty);
}
private static BomItem Item(string fileName, int? qty) =>
new()
{
FileName = fileName,
Qty = qty,
Material = "Stainless",
Thickness = 0.25,
};
private static BomGroupPlateSettings Plate() => new() { PlateWidth = 60, PlateLength = 120 };
private void WriteSquare(string name)
{
var shape = new Shape();
shape.Entities.Add(new Line(new Vector(0, 0), new Vector(2, 0)));
shape.Entities.Add(new Line(new Vector(2, 0), new Vector(2, 2)));
shape.Entities.Add(new Line(new Vector(2, 2), new Vector(0, 2)));
shape.Entities.Add(new Line(new Vector(0, 2), new Vector(0, 0)));
Dxf.ExportProgram(ConvertGeometry.ToProgram(shape), Path.Combine(folder, name + ".dxf"));
}
}