using OpenNest.CNC; using OpenNest.CNC.CuttingStrategy; using OpenNest.Geometry; namespace OpenNest.Tests; public class PartLeadInTests { private static Part MakeSquarePart() { var pgm = new Program(); pgm.Codes.Add(new RapidMove(new Vector(0, 0))); pgm.Codes.Add(new LinearMove(new Vector(0, 10))); pgm.Codes.Add(new LinearMove(new Vector(10, 10))); pgm.Codes.Add(new LinearMove(new Vector(10, 0))); pgm.Codes.Add(new LinearMove(new Vector(0, 0))); var drawing = new Drawing("test", pgm); return new Part(drawing); } [Fact] public void ApplyLeadIns_SetsHasManualLeadIns() { var part = MakeSquarePart(); var parameters = new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }, InternalLeadIn = new LineLeadIn { Length = 0.25, ApproachAngle = 90 } }; part.ApplyLeadIns(parameters, new Vector(-5, -5)); Assert.True(part.HasManualLeadIns); } [Fact] public void ApplyLeadIns_StoresCuttingParameters() { var part = MakeSquarePart(); var parameters = new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }, InternalLeadIn = new LineLeadIn { Length = 0.25, ApproachAngle = 90 } }; part.ApplyLeadIns(parameters, new Vector(-5, -5)); Assert.Same(parameters, part.CuttingParameters); } [Fact] public void ApplyLeadIns_ProgramContainsLeadinCodes() { var part = MakeSquarePart(); var parameters = new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 } }; part.ApplyLeadIns(parameters, new Vector(-5, -5)); var hasLeadin = part.Program.Codes.OfType().Any(m => m.Layer == LayerType.Leadin); Assert.True(hasLeadin); } [Fact] public void RemoveLeadIns_RestoresOriginalProgram() { var part = MakeSquarePart(); var originalCodeCount = part.Program.Codes.Count; var parameters = new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 } }; part.ApplyLeadIns(parameters, new Vector(-5, -5)); part.RemoveLeadIns(); Assert.False(part.HasManualLeadIns); Assert.Null(part.CuttingParameters); Assert.Equal(originalCodeCount, part.Program.Codes.Count); } [Fact] public void RemoveLeadIns_PreservesRotation() { var part = MakeSquarePart(); part.Rotate(System.Math.PI / 4); // 45 degrees var rotation = part.Rotation; var parameters = new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 } }; part.ApplyLeadIns(parameters, new Vector(-5, -5)); part.RemoveLeadIns(); Assert.Equal(rotation, part.Rotation, 6); } [Fact] public void RemoveLeadIns_PreservesLocation() { var part = MakeSquarePart(); part.Offset(20, 30); var location = part.Location; var parameters = new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 } }; part.ApplyLeadIns(parameters, new Vector(-5, -5)); part.RemoveLeadIns(); Assert.Equal(location.X, part.Location.X, 6); Assert.Equal(location.Y, part.Location.Y, 6); } [Fact] public void LeadInsLocked_DefaultsFalse() { var part = MakeSquarePart(); Assert.False(part.LeadInsLocked); } }