using TraceCad.Core.Geometry; using TraceCad.Core.Model; using Xunit; namespace TraceCad.Tests; public sealed class GeometryTests { [Fact] public void LineLengthUsesMillimetres() { var line = new LineEntity(Guid.NewGuid(), Layer.Cut.Name, new Point2(0, 0), new Point2(3, 4)); Assert.Equal(5.0, line.Length, 9); } [Fact] public void CircleFromThreePointsComputesCenterAndRadius() { var success = GeometryHelpers.TryCreateCircleFromThreePoints( new Point2(1, 0), new Point2(0, 1), new Point2(-1, 0), out var circle); Assert.True(success); Assert.Equal(0.0, circle.Center.X, 9); Assert.Equal(0.0, circle.Center.Y, 9); Assert.Equal(1.0, circle.Radius, 9); } [Fact] public void CircleFromCollinearPointsFails() { var success = GeometryHelpers.TryCreateCircleFromThreePoints( new Point2(0, 0), new Point2(1, 1), new Point2(2, 2), out _); Assert.False(success); } [Fact] public void ArcFromThreePointsPreservesPointOnCounterClockwiseSweep() { var success = GeometryHelpers.TryCreateArcFromThreePoints( new Point2(1, 0), new Point2(0, 1), new Point2(-1, 0), out var arc); Assert.True(success); Assert.False(arc.IsClockwise); Assert.Equal(0.0, arc.StartAngleDeg, 9); Assert.Equal(180.0, arc.EndAngleDeg, 9); Assert.Equal(1.0, arc.Radius, 9); } [Fact] public void ArcFromCollinearPointsFails() { var success = GeometryHelpers.TryCreateArcFromThreePoints( new Point2(0, 0), new Point2(5, 0), new Point2(10, 0), out _); Assert.False(success); } [Theory] [InlineData(360, 0)] [InlineData(-90, 270)] [InlineData(725, 5)] public void AngleNormalizationWrapsToPositiveDegrees(double input, double expected) { Assert.Equal(expected, GeometryHelpers.NormalizeAngleDeg(input), 9); } }