This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Globalization;
|
||||
using System.Numerics;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
@@ -6,6 +7,54 @@ namespace Just.PreciseMath.Tests;
|
||||
|
||||
public class DoubleDoubleNumberStylesTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData(" 9,007,199,254,740,993 ", NumberStyles.Number, 9007199254740992.0, 1.0)]
|
||||
[InlineData("-1.000000000000000055511151231257827021181583404541015625", NumberStyles.Float, -1.0, -5.5511151231257827e-17)]
|
||||
public void GenericStyledParsingRetainsExactResidual(string text, NumberStyles style, double high, double low)
|
||||
{
|
||||
// Exact integers 2^53 + 1 and dyadic -(1 + 2^-54), not rounded double parses.
|
||||
AssertGenericStyledParsing<DoubleDouble>(text, style, high, low);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("1,000", NumberStyles.Float)]
|
||||
[InlineData("1e+", NumberStyles.Any)]
|
||||
[InlineData("not-a-number", NumberStyles.Number)]
|
||||
public void GenericStyledParsingRejectsInvalidInput(string text, NumberStyles style)
|
||||
{
|
||||
AssertGenericStyledParsingFailure<DoubleDouble>(text, style);
|
||||
}
|
||||
|
||||
private static void AssertGenericStyledParsing<T>(string text, NumberStyles style, double high, double low)
|
||||
where T : INumberBase<T>
|
||||
{
|
||||
T fromString = T.Parse(text, style, CultureInfo.InvariantCulture);
|
||||
T fromSpan = T.Parse(text.AsSpan(), style, CultureInfo.InvariantCulture);
|
||||
T.TryParse(text, style, CultureInfo.InvariantCulture, out T? triedString).ShouldBeTrue();
|
||||
T.TryParse(text.AsSpan(), style, CultureInfo.InvariantCulture, out T? triedSpan).ShouldBeTrue();
|
||||
foreach (T? parsed in new[] { fromString, fromSpan, triedString, triedSpan })
|
||||
{
|
||||
DoubleDouble value = parsed.ShouldBeOfType<DoubleDouble>();
|
||||
value.High.ShouldBe(high);
|
||||
value.Low.ShouldBe(low);
|
||||
}
|
||||
}
|
||||
|
||||
private static void AssertGenericStyledParsingFailure<T>(string text, NumberStyles style)
|
||||
where T : INumberBase<T>
|
||||
{
|
||||
Should.Throw<FormatException>(() => T.Parse(text, style, CultureInfo.InvariantCulture));
|
||||
Should.Throw<FormatException>(() => T.Parse(text.AsSpan(), style, CultureInfo.InvariantCulture));
|
||||
T.TryParse(text, style, CultureInfo.InvariantCulture, out T? fromString).ShouldBeFalse();
|
||||
T.TryParse(text.AsSpan(), style, CultureInfo.InvariantCulture, out T? fromSpan).ShouldBeFalse();
|
||||
foreach (T? parsed in new[] { fromString, fromSpan })
|
||||
{
|
||||
DoubleDouble value = parsed.ShouldBeOfType<DoubleDouble>();
|
||||
BitConverter.DoubleToInt64Bits(value.High).ShouldBe(0L);
|
||||
BitConverter.DoubleToInt64Bits(value.Low).ShouldBe(0L);
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("123", NumberStyles.None, 123.0)]
|
||||
[InlineData(" -1.25e+2 ", NumberStyles.Float, -125.0)]
|
||||
|
||||
Reference in New Issue
Block a user