From 1040db414f8d2b485235068360500821c7f43ccf Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 2 Apr 2026 09:46:37 -0400 Subject: [PATCH] feat: add VariableDefinition type for G-code user variables Adds immutable VariableDefinition record to OpenNest.CNC with name, expression, resolved value, inline, and global flags. Fixes namespace collision in PatternTilerTests and PolygonHelperTests caused by the new OpenNest.Tests.CNC namespace. Co-Authored-By: Claude Sonnet 4.6 --- OpenNest.Core/CNC/VariableDefinition.cs | 21 ++++++++++++ OpenNest.Tests/CNC/VariableDefinitionTests.cs | 33 +++++++++++++++++++ OpenNest.Tests/Fill/PatternTilerTests.cs | 11 ++++--- OpenNest.Tests/Geometry/PolygonHelperTests.cs | 12 +++---- 4 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 OpenNest.Core/CNC/VariableDefinition.cs create mode 100644 OpenNest.Tests/CNC/VariableDefinitionTests.cs diff --git a/OpenNest.Core/CNC/VariableDefinition.cs b/OpenNest.Core/CNC/VariableDefinition.cs new file mode 100644 index 0000000..d74d87f --- /dev/null +++ b/OpenNest.Core/CNC/VariableDefinition.cs @@ -0,0 +1,21 @@ +namespace OpenNest.CNC +{ + public sealed class VariableDefinition + { + public string Name { get; } + public string Expression { get; } + public double Value { get; } + public bool Inline { get; } + public bool Global { get; } + + public VariableDefinition(string name, string expression, double value, + bool inline = false, bool global = false) + { + Name = name; + Expression = expression; + Value = value; + Inline = inline; + Global = global; + } + } +} diff --git a/OpenNest.Tests/CNC/VariableDefinitionTests.cs b/OpenNest.Tests/CNC/VariableDefinitionTests.cs new file mode 100644 index 0000000..f965823 --- /dev/null +++ b/OpenNest.Tests/CNC/VariableDefinitionTests.cs @@ -0,0 +1,33 @@ +using OpenNest.CNC; + +namespace OpenNest.Tests.CNC; + +public class VariableDefinitionTests +{ + [Fact] + public void Constructor_SetsAllProperties() + { + var v = new VariableDefinition("diameter", "0.3", 0.3); + Assert.Equal("diameter", v.Name); + Assert.Equal("0.3", v.Expression); + Assert.Equal(0.3, v.Value); + Assert.False(v.Inline); + Assert.False(v.Global); + } + + [Fact] + public void Constructor_WithFlags_SetsFlags() + { + var v = new VariableDefinition("width", "48.0", 48.0, inline: true, global: true); + Assert.True(v.Inline); + Assert.True(v.Global); + } + + [Fact] + public void DefaultFlags_AreFalse() + { + var v = new VariableDefinition("x", "1", 1.0); + Assert.False(v.Inline); + Assert.False(v.Global); + } +} diff --git a/OpenNest.Tests/Fill/PatternTilerTests.cs b/OpenNest.Tests/Fill/PatternTilerTests.cs index 81db4bb..4a49d81 100644 --- a/OpenNest.Tests/Fill/PatternTilerTests.cs +++ b/OpenNest.Tests/Fill/PatternTilerTests.cs @@ -1,3 +1,4 @@ +using OpenNest.CNC; using OpenNest.Engine.Fill; using OpenNest.Geometry; @@ -7,11 +8,11 @@ public class PatternTilerTests { private static Drawing MakeSquareDrawing(double size) { - var pgm = new CNC.Program(); - pgm.Codes.Add(new CNC.LinearMove(size, 0)); - pgm.Codes.Add(new CNC.LinearMove(size, size)); - pgm.Codes.Add(new CNC.LinearMove(0, size)); - pgm.Codes.Add(new CNC.LinearMove(0, 0)); + var pgm = new Program(); + pgm.Codes.Add(new LinearMove(size, 0)); + pgm.Codes.Add(new LinearMove(size, size)); + pgm.Codes.Add(new LinearMove(0, size)); + pgm.Codes.Add(new LinearMove(0, 0)); return new Drawing("square", pgm); } diff --git a/OpenNest.Tests/Geometry/PolygonHelperTests.cs b/OpenNest.Tests/Geometry/PolygonHelperTests.cs index b896c0c..232a0f6 100644 --- a/OpenNest.Tests/Geometry/PolygonHelperTests.cs +++ b/OpenNest.Tests/Geometry/PolygonHelperTests.cs @@ -57,12 +57,12 @@ public class PolygonHelperTests public void ExtractPerimeterPolygon_InflatedPolygonIsLarger_ForCCWWinding() { // CCW winding: (0,0)→(10,0)→(10,10)→(0,10)→(0,0) - var pgm = new CNC.Program(); - pgm.Codes.Add(new CNC.RapidMove(new Vector(0, 0))); - pgm.Codes.Add(new CNC.LinearMove(new Vector(10, 0))); - pgm.Codes.Add(new CNC.LinearMove(new Vector(10, 10))); - pgm.Codes.Add(new CNC.LinearMove(new Vector(0, 10))); - pgm.Codes.Add(new CNC.LinearMove(new Vector(0, 0))); + 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, 10))); + pgm.Codes.Add(new LinearMove(new Vector(0, 0))); var drawing = new Drawing("ccw-square", pgm); var noSpacing = PolygonHelper.ExtractPerimeterPolygon(drawing, 0);