From 973e6f1fa9e0836ea5a94f1678b721e5da904452 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 12 Jun 2023 10:13:09 +1000 Subject: [PATCH] Fix implementation and tests --- src/ImageSharp/Primitives/LongRational.cs | 9 ++-- .../Numerics/RationalTests.cs | 45 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/ImageSharp/Primitives/LongRational.cs b/src/ImageSharp/Primitives/LongRational.cs index deef2d09be..69139ac9c4 100644 --- a/src/ImageSharp/Primitives/LongRational.cs +++ b/src/ImageSharp/Primitives/LongRational.cs @@ -131,6 +131,11 @@ internal readonly struct LongRational : IEquatable /// Whether to use the best possible precision when parsing the value. public static LongRational FromDouble(double value, bool bestPrecision) { + if (value == 0.0) + { + return new LongRational(0, 1); + } + if (double.IsNaN(value)) { return new LongRational(0, 0); @@ -153,10 +158,6 @@ internal readonly struct LongRational : IEquatable double df = numerator / (double)denominator; double epsilon = bestPrecision ? double.Epsilon : .000001; - if(val < epsilon) { - return new LongRational(0, 1); - } - while (Math.Abs(df - val) > epsilon) { if (df < val) diff --git a/tests/ImageSharp.Tests/Numerics/RationalTests.cs b/tests/ImageSharp.Tests/Numerics/RationalTests.cs index a696cce9e5..f9cefaddda 100644 --- a/tests/ImageSharp.Tests/Numerics/RationalTests.cs +++ b/tests/ImageSharp.Tests/Numerics/RationalTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Six Labors Split License. namespace SixLabors.ImageSharp.Tests; @@ -14,15 +14,15 @@ public class RationalTests [Fact] public void AreEqual() { - var r1 = new Rational(3, 2); - var r2 = new Rational(3, 2); + Rational r1 = new(3, 2); + Rational r2 = new(3, 2); Assert.Equal(r1, r2); Assert.True(r1 == r2); - var r3 = new Rational(7.55); - var r4 = new Rational(755, 100); - var r5 = new Rational(151, 20); + Rational r3 = new(7.55); + Rational r4 = new(755, 100); + Rational r5 = new(151, 20); Assert.Equal(r3, r4); Assert.Equal(r4, r5); @@ -34,23 +34,30 @@ public class RationalTests [Fact] public void AreNotEqual() { - var first = new Rational(0, 100); - var second = new Rational(100, 100); + Rational first = new(0, 100); + Rational second = new(100, 100); Assert.NotEqual(first, second); Assert.True(first != second); } /// - /// Tests the correct FromDouble(0). + /// Tests known out-of-range values. /// - [Fact] - public void FromDouble0Non0Denominator() + /// The input value. + /// The expected numerator. + /// The expected denominator. + [Theory] + [InlineData(0, 0, 1)] + [InlineData(double.NaN, 0, 0)] + [InlineData(double.PositiveInfinity, 1, 0)] + [InlineData(double.NegativeInfinity, 1, 0)] + public void FromDoubleOutOfRange(double value, uint numerator, uint denominator) { - var r = Rational.FromDouble(0); + Rational r = Rational.FromDouble(value); - Assert.Equal(0, r.Numerator); - Assert.Equal(1, r.Denominator); + Assert.Equal(numerator, r.Numerator); + Assert.Equal(denominator, r.Denominator); } /// @@ -59,7 +66,7 @@ public class RationalTests [Fact] public void ConstructorAssignsProperties() { - var rational = new Rational(7, 55); + Rational rational = new(7, 55); Assert.Equal(7U, rational.Numerator); Assert.Equal(55U, rational.Denominator); @@ -83,15 +90,15 @@ public class RationalTests [Fact] public void Fraction() { - var first = new Rational(1.0 / 1600); - var second = new Rational(1.0 / 1600, true); + Rational first = new(1.0 / 1600); + Rational second = new(1.0 / 1600, true); Assert.False(first.Equals(second)); } [Fact] public void ToDouble() { - var rational = new Rational(0, 0); + Rational rational = new(0, 0); Assert.Equal(double.NaN, rational.ToDouble()); rational = new Rational(2, 0); @@ -101,7 +108,7 @@ public class RationalTests [Fact] public void ToStringRepresentation() { - var rational = new Rational(0, 0); + Rational rational = new(0, 0); Assert.Equal("[ Indeterminate ]", rational.ToString()); rational = new Rational(double.PositiveInfinity);