diff --git a/src/ImageSharp/Primitives/LongRational.cs b/src/ImageSharp/Primitives/LongRational.cs index e92875a98b..69139ac9c4 100644 --- a/src/ImageSharp/Primitives/LongRational.cs +++ b/src/ImageSharp/Primitives/LongRational.cs @@ -131,6 +131,11 @@ public string ToString(IFormatProvider provider) /// 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); @@ -201,11 +206,6 @@ public LongRational Simplify() return this; } - if (this.Numerator == 0) - { - return new LongRational(0, 0); - } - if (this.Numerator == this.Denominator) { return new LongRational(1, 1); diff --git a/tests/ImageSharp.Tests/Numerics/RationalTests.cs b/tests/ImageSharp.Tests/Numerics/RationalTests.cs index d165bd9d39..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,20 +34,39 @@ public void AreEqual() [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 known out-of-range values. + /// + /// 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) + { + Rational r = Rational.FromDouble(value); + + Assert.Equal(numerator, r.Numerator); + Assert.Equal(denominator, r.Denominator); + } + /// /// Tests whether the Rational constructor correctly assign properties. /// [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); @@ -71,15 +90,15 @@ public void ConstructorAssignsProperties() [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); @@ -89,7 +108,7 @@ public void ToDouble() [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);