diff --git a/OpenNest.Core/Geometry/EllipseConverter.cs b/OpenNest.Core/Geometry/EllipseConverter.cs index 0163fbb..8f6d8a8 100644 --- a/OpenNest.Core/Geometry/EllipseConverter.cs +++ b/OpenNest.Core/Geometry/EllipseConverter.cs @@ -108,8 +108,18 @@ namespace OpenNest.Geometry nameof(tolerance), "Tolerance must be positive." ); - if (semiMajor <= 0 || semiMinor <= 0) - throw new ArgumentOutOfRangeException("Semi-axis lengths must be positive."); + if (semiMajor <= 0) + throw new ArgumentOutOfRangeException( + nameof(semiMajor), + semiMajor, + "Semi-major axis length must be positive." + ); + if (semiMinor <= 0) + throw new ArgumentOutOfRangeException( + nameof(semiMinor), + semiMinor, + "Semi-minor axis length must be positive." + ); if (endParam <= startParam) endParam += Angle.TwoPI; diff --git a/OpenNest.Tests/Geometry/EllipseArgumentValidationTests.cs b/OpenNest.Tests/Geometry/EllipseArgumentValidationTests.cs new file mode 100644 index 0000000..8672c94 --- /dev/null +++ b/OpenNest.Tests/Geometry/EllipseArgumentValidationTests.cs @@ -0,0 +1,46 @@ +using OpenNest.Geometry; +using OpenNest.Math; + +namespace OpenNest.Tests.Geometry; + +public class EllipseArgumentValidationTests +{ + [Theory] + [InlineData(0.0, 5.0, "semiMajor", 0.0)] + [InlineData(-3.0, 5.0, "semiMajor", -3.0)] + [InlineData(10.0, 0.0, "semiMinor", 0.0)] + [InlineData(10.0, -2.0, "semiMinor", -2.0)] + [InlineData(0.0, 0.0, "semiMajor", 0.0)] + [InlineData(0.0, -2.0, "semiMajor", 0.0)] + [InlineData(-3.0, 0.0, "semiMajor", -3.0)] + [InlineData(-3.0, -2.0, "semiMajor", -3.0)] + public void Convert_NonpositiveAxes_IdentifiesFirstInvalidAxis( + double semiMajor, + double semiMinor, + string expectedName, + double expectedValue + ) + { + var error = Assert.Throws(() => + EllipseConverter.Convert(new Vector(0, 0), semiMajor, semiMinor, 0, 0, Angle.TwoPI) + ); + + Assert.Equal(expectedName, error.ParamName); + Assert.Equal(expectedValue, Assert.IsType(error.ActualValue)); + Assert.Contains("positive", error.Message); + } + + [Theory] + [InlineData(0.0)] + [InlineData(-0.01)] + public void Convert_InvalidToleranceAndAxes_ValidatesToleranceFirst(double tolerance) + { + var error = Assert.Throws(() => + EllipseConverter.Convert(new Vector(0, 0), -3, -2, 0, 0, Angle.TwoPI, tolerance) + ); + + Assert.Equal(nameof(tolerance), error.ParamName); + Assert.Null(error.ActualValue); + Assert.Contains("Tolerance must be positive.", error.Message); + } +}