From f3b27c32c37bae65c3e32c09908fb0970de0063e Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 9 Apr 2026 14:28:37 -0400 Subject: [PATCH] feat: add SubPrograms dictionary to Program with deep-copy support Co-Authored-By: Claude Sonnet 4.6 --- OpenNest.Core/CNC/Program.cs | 5 +++ .../CuttingStrategy/HoleSubProgramTests.cs | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/OpenNest.Core/CNC/Program.cs b/OpenNest.Core/CNC/Program.cs index 71b1587..b70336f 100644 --- a/OpenNest.Core/CNC/Program.cs +++ b/OpenNest.Core/CNC/Program.cs @@ -12,6 +12,8 @@ namespace OpenNest.CNC public Dictionary Variables { get; } = new(StringComparer.OrdinalIgnoreCase); + public Dictionary SubPrograms { get; } = new(); + private Mode mode; public Program(Mode mode = Mode.Absolute) @@ -460,6 +462,9 @@ namespace OpenNest.CNC foreach (var kvp in Variables) pgm.Variables[kvp.Key] = kvp.Value; + foreach (var kvp in SubPrograms) + pgm.SubPrograms[kvp.Key] = (Program)kvp.Value.Clone(); + return pgm; } diff --git a/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs b/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs index dadc3c1..9e997d3 100644 --- a/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs +++ b/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs @@ -40,4 +40,40 @@ public class HoleSubProgramTests Assert.Contains("X1.5", str); Assert.Contains("Y2.5", str); } + + [Fact] + public void Program_SubPrograms_EmptyByDefault() + { + var pgm = new Program(); + Assert.NotNull(pgm.SubPrograms); + Assert.Empty(pgm.SubPrograms); + } + + [Fact] + public void Program_SubPrograms_StoresAndRetrieves() + { + var pgm = new Program(); + var sub = new Program(Mode.Incremental); + sub.Codes.Add(new LinearMove(0.1, 0.2)); + + pgm.SubPrograms[1] = sub; + + Assert.Single(pgm.SubPrograms); + Assert.Same(sub, pgm.SubPrograms[1]); + } + + [Fact] + public void Program_Clone_DeepCopiesSubPrograms() + { + var pgm = new Program(); + var sub = new Program(Mode.Incremental); + sub.Codes.Add(new LinearMove(0.1, 0.2)); + pgm.SubPrograms[1] = sub; + + var clone = (Program)pgm.Clone(); + + Assert.Single(clone.SubPrograms); + Assert.NotSame(sub, clone.SubPrograms[1]); + Assert.Equal(Mode.Incremental, clone.SubPrograms[1].Mode); + } }