using System.IO.Compression; using System.Text; using System.Text.Json.Nodes; using OpenNest.Geometry; namespace OpenNest.IO.Tests; /// /// Rails with clamps on other edges than the origin side persist those clamps in optional /// per-edge arrays; origin-side-only rails write exactly the keys they always did. /// public class ClampEdgePersistenceTests { private static ClampRail Mixed() => new(1.5, 0.625, new[] { new RailClamp(ClampEdge.OriginSide, 6), new RailClamp(ClampEdge.FarSide, 20), new RailClamp(ClampEdge.OriginEnd, 8), new RailClamp(ClampEdge.FarEnd, 30), }); private static Nest NestWith(ClampRail rail) { var nest = new Nest("edges"); nest.PlateDefaults.Size = new Size(48, 96); nest.SetClampRail(rail); var plate = nest.CreatePlate(); plate.CutOffs.Add(new CutOff(new Vector(40, 0), CutOffAxis.Vertical)); return nest; } private static MemoryStream Write(Nest nest) { var stream = new MemoryStream(); Assert.True(new NestWriter(nest).Write(stream)); stream.Position = 0; return stream; } private static JsonNode RailJson(MemoryStream zip) { zip.Position = 0; using var archive = new ZipArchive(zip, ZipArchiveMode.Read, leaveOpen: true); using var reader = new StreamReader(archive.GetEntry("nest.json")!.Open(), Encoding.UTF8); var json = JsonNode.Parse(reader.ReadToEnd())!["plateDefaults"]!["clampRail"]!; zip.Position = 0; return json; } [Fact] public void ClampsOnEveryEdgeRoundTripAndPlatesFollowTheRail() { var reopened = new NestReader(Write(NestWith(Mixed()))).Read(); Assert.Equal(Mixed(), reopened.PlateDefaults.ClampRail); var plate = Assert.Single(reopened.Plates); Assert.Same(reopened.PlateDefaults.ClampRail, plate.ClampRail); Assert.Equal(4, plate.ClampZones.Count); } [Fact] public void OriginSideOnlyRailsOmitTheOtherEdgeKeys() { var rail = RailJson(Write(NestWith(new ClampRail(1.5, 0.625, new double[] { 6, 21 })))).AsObject(); Assert.Equal(new[] { "width", "depth", "centers", "removalMinutes" }, rail.Select(p => p.Key)); } [Fact] public void OtherEdgesAreWrittenInTheirOwnArrays() { var rail = RailJson(Write(NestWith(Mixed()))); Assert.Equal(6, rail["centers"]![0]!.GetValue()); Assert.Equal(20, rail["farSideCenters"]![0]!.GetValue()); Assert.Equal(8, rail["originEndCenters"]![0]!.GetValue()); Assert.Equal(30, rail["farEndCenters"]![0]!.GetValue()); } [Fact] public void ARailWithNoOriginSideClampsStillLoads() { var farOnly = new ClampRail(1.5, 0.625, new[] { new RailClamp(ClampEdge.FarSide, 12) }); var reopened = new NestReader(Write(NestWith(farOnly))).Read(); Assert.Equal(farOnly, reopened.PlateDefaults.ClampRail); } }