fix(geometry): identify invalid ellipse axes in exceptions

This commit is contained in:
aj committed 2026-09-30 13:16:00 -04:00
1 parent 23ffc14f3f
commit 6426a98f82
2 files changed
+58 -2

No files matched your search

+12 -2
View File
@@ -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;
@@ -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<ArgumentOutOfRangeException>(() =>
EllipseConverter.Convert(new Vector(0, 0), semiMajor, semiMinor, 0, 0, Angle.TwoPI)
);
Assert.Equal(expectedName, error.ParamName);
Assert.Equal(expectedValue, Assert.IsType<double>(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<ArgumentOutOfRangeException>(() =>
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);
}
}