From 300616e5fe377f78e10415c1bc4c82c95c07a341 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Thu, 14 Apr 2022 20:08:53 -0700 Subject: [PATCH] Adding generic-math tests for decimal and double/single/half to parity the integer tests (#68043) --- .../tests/System.Runtime.Tests.csproj | 1 + .../tests/System/DecimalTests.GenericMath.cs | 1142 ++++++++++++++ .../tests/System/DoubleTests.GenericMath.cs | 1329 +++++++++++++++- .../tests/System/HalfTests.GenericMath.cs | 1347 ++++++++++++++++- .../tests/System/SingleTests.GenericMath.cs | 1329 +++++++++++++++- 5 files changed, 5145 insertions(+), 3 deletions(-) create mode 100644 src/libraries/System.Runtime/tests/System/DecimalTests.GenericMath.cs diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj b/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj index 42939fce74836..abcddae701b99 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj @@ -250,6 +250,7 @@ + diff --git a/src/libraries/System.Runtime/tests/System/DecimalTests.GenericMath.cs b/src/libraries/System.Runtime/tests/System/DecimalTests.GenericMath.cs new file mode 100644 index 0000000000000..770f7b744cc23 --- /dev/null +++ b/src/libraries/System.Runtime/tests/System/DecimalTests.GenericMath.cs @@ -0,0 +1,1142 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Globalization; +using Xunit; + +namespace System.Tests +{ + public class DecimalTests_GenericMath + { + [Fact] + public static void AdditiveIdentityTest() + { + Assert.Equal(0.0m, AdditiveIdentityHelper.AdditiveIdentity); + } + + [Fact] + public static void MinValueTest() + { + Assert.Equal(decimal.MinValue, MinMaxValueHelper.MinValue); + } + + [Fact] + public static void MaxValueTest() + { + Assert.Equal(decimal.MaxValue, MinMaxValueHelper.MaxValue); + } + + [Fact] + public static void MultiplicativeIdentityTest() + { + Assert.Equal(1.0m, MultiplicativeIdentityHelper.MultiplicativeIdentity); + } + + [Fact] + public static void NegativeOneTest() + { + Assert.Equal(-1.0m, SignedNumberHelper.NegativeOne); + } + + [Fact] + public static void OneTest() + { + Assert.Equal(1.0m, NumberBaseHelper.One); + } + + [Fact] + public static void ZeroTest() + { + Assert.Equal(0.0m, NumberBaseHelper.Zero); + } + + [Fact] + public static void op_AdditionTest() + { + Assert.Equal(-79228162514264337593543950334.0m, AdditionOperatorsHelper.op_Addition(decimal.MinValue, 1.0m)); + Assert.Equal(0.0m, AdditionOperatorsHelper.op_Addition(-1.0m, 1.0m)); + Assert.Equal(1.0m, AdditionOperatorsHelper.op_Addition(-0.0m, 1.0m)); + Assert.Equal(1.0m, AdditionOperatorsHelper.op_Addition(0.0m, 1.0m)); + Assert.Equal(2.0m, AdditionOperatorsHelper.op_Addition(1.0m, 1.0m)); + + Assert.Throws(() => AdditionOperatorsHelper.op_Addition(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_CheckedAdditionTest() + { + Assert.Equal(-79228162514264337593543950334.0m, AdditionOperatorsHelper.op_CheckedAddition(decimal.MinValue, 1.0m)); + Assert.Equal(0.0m, AdditionOperatorsHelper.op_CheckedAddition(-1.0m, 1.0m)); + Assert.Equal(1.0m, AdditionOperatorsHelper.op_CheckedAddition(-0.0m, 1.0m)); + Assert.Equal(1.0m, AdditionOperatorsHelper.op_CheckedAddition(0.0m, 1.0m)); + Assert.Equal(2.0m, AdditionOperatorsHelper.op_CheckedAddition(1.0m, 1.0m)); + + Assert.Throws(() => AdditionOperatorsHelper.op_CheckedAddition(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_LessThanTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThan(decimal.MinValue, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-1.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-0.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(0.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(1.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_LessThanOrEqualTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(decimal.MinValue, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-1.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-0.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(0.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(1.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_GreaterThanTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(decimal.MinValue, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-1.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-0.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(0.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(1.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_GreaterThanOrEqualTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(decimal.MinValue, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-1.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-0.0m, 1.0m)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(0.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(1.0m, 1.0m)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_DecrementTest() + { + Assert.Equal(-2.0m, DecrementOperatorsHelper.op_Decrement(-1.0m)); + Assert.Equal(-1.0m, DecrementOperatorsHelper.op_Decrement(-0.0m)); + Assert.Equal(-1.0m, DecrementOperatorsHelper.op_Decrement(0.0m)); + Assert.Equal(0.0m, DecrementOperatorsHelper.op_Decrement(1.0m)); + Assert.Equal(79228162514264337593543950334.0m, DecrementOperatorsHelper.op_Decrement(decimal.MaxValue)); + + Assert.Throws(() => DecrementOperatorsHelper.op_Decrement(decimal.MinValue)); + } + + [Fact] + public static void op_CheckedDecrementTest() + { + Assert.Equal(-2.0m, DecrementOperatorsHelper.op_CheckedDecrement(-1.0m)); + Assert.Equal(-1.0m, DecrementOperatorsHelper.op_CheckedDecrement(-0.0m)); + Assert.Equal(-1.0m, DecrementOperatorsHelper.op_CheckedDecrement(0.0m)); + Assert.Equal(0.0m, DecrementOperatorsHelper.op_CheckedDecrement(1.0m)); + Assert.Equal(79228162514264337593543950334.0m, DecrementOperatorsHelper.op_CheckedDecrement(decimal.MaxValue)); + + Assert.Throws(() => DecrementOperatorsHelper.op_CheckedDecrement(decimal.MinValue)); + } + + [Fact] + public static void op_DivisionTest() + { + Assert.Equal(-39614081257132168796771975168.0m, DivisionOperatorsHelper.op_Division(decimal.MinValue, 2.0m)); + Assert.Equal(-0.5m, DivisionOperatorsHelper.op_Division(-1.0m, 2.0m)); + Assert.Equal(-0.0m, DivisionOperatorsHelper.op_Division(-0.0m, 2.0m)); + Assert.Equal(0.0m, DivisionOperatorsHelper.op_Division(0.0m, 2.0m)); + Assert.Equal(0.5m, DivisionOperatorsHelper.op_Division(1.0m, 2.0m)); + Assert.Equal(39614081257132168796771975168.0m, DivisionOperatorsHelper.op_Division(decimal.MaxValue, 2.0m)); + } + + [Fact] + public static void op_CheckedDivisionTest() + { + Assert.Equal(-39614081257132168796771975168.0m, DivisionOperatorsHelper.op_CheckedDivision(decimal.MinValue, 2.0m)); + Assert.Equal(-0.5m, DivisionOperatorsHelper.op_CheckedDivision(-1.0m, 2.0m)); + Assert.Equal(-0.0m, DivisionOperatorsHelper.op_CheckedDivision(-0.0m, 2.0m)); + Assert.Equal(0.0m, DivisionOperatorsHelper.op_CheckedDivision(0.0m, 2.0m)); + Assert.Equal(0.5m, DivisionOperatorsHelper.op_CheckedDivision(1.0m, 2.0m)); + Assert.Equal(39614081257132168796771975168.0m, DivisionOperatorsHelper.op_CheckedDivision(decimal.MaxValue, 2.0m)); + } + + [Fact] + public static void op_EqualityTest() + { + Assert.False(EqualityOperatorsHelper.op_Equality(decimal.MinValue, 1.0m)); + Assert.False(EqualityOperatorsHelper.op_Equality(-1.0m, 1.0m)); + Assert.False(EqualityOperatorsHelper.op_Equality(-0.0m, 1.0m)); + Assert.False(EqualityOperatorsHelper.op_Equality(0.0m, 1.0m)); + Assert.True(EqualityOperatorsHelper.op_Equality(1.0m, 1.0m)); + Assert.False(EqualityOperatorsHelper.op_Equality(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_InequalityTest() + { + Assert.True(EqualityOperatorsHelper.op_Inequality(decimal.MinValue, 1.0m)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-1.0m, 1.0m)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-0.0m, 1.0m)); + Assert.True(EqualityOperatorsHelper.op_Inequality(0.0m, 1.0m)); + Assert.False(EqualityOperatorsHelper.op_Inequality(1.0m, 1.0m)); + Assert.True(EqualityOperatorsHelper.op_Inequality(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void op_IncrementTest() + { + Assert.Equal(-79228162514264337593543950334.0m, IncrementOperatorsHelper.op_Increment(decimal.MinValue)); + Assert.Equal(0.0m, IncrementOperatorsHelper.op_Increment(-1.0m)); + Assert.Equal(1.0m, IncrementOperatorsHelper.op_Increment(-0.0m)); + Assert.Equal(1.0m, IncrementOperatorsHelper.op_Increment(0.0m)); + Assert.Equal(2.0m, IncrementOperatorsHelper.op_Increment(1.0m)); + + Assert.Throws(() => IncrementOperatorsHelper.op_Increment(decimal.MaxValue)); + } + + [Fact] + public static void op_CheckedIncrementTest() + { + Assert.Equal(-79228162514264337593543950334.0m, IncrementOperatorsHelper.op_CheckedIncrement(decimal.MinValue)); + Assert.Equal(0.0m, IncrementOperatorsHelper.op_CheckedIncrement(-1.0m)); + Assert.Equal(1.0m, IncrementOperatorsHelper.op_CheckedIncrement(-0.0m)); + Assert.Equal(1.0m, IncrementOperatorsHelper.op_CheckedIncrement(0.0m)); + Assert.Equal(2.0m, IncrementOperatorsHelper.op_CheckedIncrement(1.0m)); + + Assert.Throws(() => IncrementOperatorsHelper.op_CheckedIncrement(decimal.MaxValue)); + } + + [Fact] + public static void op_ModulusTest() + { + Assert.Equal(-1.0m, ModulusOperatorsHelper.op_Modulus(decimal.MinValue, 2.0m)); + Assert.Equal(-1.0m, ModulusOperatorsHelper.op_Modulus(-1.0m, 2.0m)); + Assert.Equal(-0.0m, ModulusOperatorsHelper.op_Modulus(-0.0m, 2.0m)); + Assert.Equal(0.0m, ModulusOperatorsHelper.op_Modulus(0.0m, 2.0m)); + Assert.Equal(1.0m, ModulusOperatorsHelper.op_Modulus(1.0m, 2.0m)); + Assert.Equal(1.0m, ModulusOperatorsHelper.op_Modulus(decimal.MaxValue, 2.0m)); + } + + [Fact] + public static void op_MultiplyTest() + { + Assert.Equal(-2.0m, MultiplyOperatorsHelper.op_Multiply(-1.0m, 2.0m)); + Assert.Equal(-0.0m, MultiplyOperatorsHelper.op_Multiply(-0.0m, 2.0m)); + Assert.Equal(0.0m, MultiplyOperatorsHelper.op_Multiply(0.0m, 2.0m)); + Assert.Equal(2.0m, MultiplyOperatorsHelper.op_Multiply(1.0m, 2.0m)); + + Assert.Throws(() => MultiplyOperatorsHelper.op_Multiply(decimal.MinValue, 2.0m)); + Assert.Throws(() => MultiplyOperatorsHelper.op_Multiply(decimal.MaxValue, 2.0m)); + } + + [Fact] + public static void op_CheckedMultiplyTest() + { + Assert.Equal(-2.0m, MultiplyOperatorsHelper.op_CheckedMultiply(-1.0m, 2.0m)); + Assert.Equal(-0.0m, MultiplyOperatorsHelper.op_CheckedMultiply(-0.0m, 2.0m)); + Assert.Equal(0.0m, MultiplyOperatorsHelper.op_CheckedMultiply(0.0m, 2.0m)); + Assert.Equal(2.0m, MultiplyOperatorsHelper.op_CheckedMultiply(1.0m, 2.0m)); + + Assert.Throws(() => MultiplyOperatorsHelper.op_CheckedMultiply(decimal.MinValue, 2.0m)); + Assert.Throws(() => MultiplyOperatorsHelper.op_CheckedMultiply(decimal.MaxValue, 2.0m)); + } + + [Fact] + public static void AbsTest() + { + Assert.Equal(decimal.MaxValue, NumberHelper.Abs(decimal.MinValue)); + Assert.Equal(1.0m, NumberHelper.Abs(-1.0m)); + Assert.Equal(0.0m, NumberHelper.Abs(-0.0m)); + Assert.Equal(0.0m, NumberHelper.Abs(0.0m)); + Assert.Equal(1.0m, NumberHelper.Abs(1.0m)); + Assert.Equal(decimal.MaxValue, NumberHelper.Abs(decimal.MaxValue)); + } + + [Fact] + public static void ClampTest() + { + Assert.Equal(1.0m, NumberHelper.Clamp(decimal.MinValue, 1.0m, 63.0m)); + Assert.Equal(1.0m, NumberHelper.Clamp(-1.0m, 1.0m, 63.0m)); + Assert.Equal(1.0m, NumberHelper.Clamp(-0.0m, 1.0m, 63.0m)); + Assert.Equal(1.0m, NumberHelper.Clamp(0.0m, 1.0m, 63.0m)); + Assert.Equal(1.0m, NumberHelper.Clamp(1.0m, 1.0m, 63.0m)); + Assert.Equal(63.0m, NumberHelper.Clamp(decimal.MaxValue, 1.0m, 63.0m)); + } + + [Fact] + public static void CreateCheckedFromByteTest() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x00)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x01)); + Assert.Equal(127.0m, NumberHelper.CreateChecked(0x7F)); + Assert.Equal(128.0m, NumberHelper.CreateChecked(0x80)); + Assert.Equal(255.0m, NumberHelper.CreateChecked(0xFF)); + } + + [Fact] + public static void CreateCheckedFromCharTest() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked((char)0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked((char)0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateChecked((char)0x7FFF)); + Assert.Equal(32768.0m, NumberHelper.CreateChecked((char)0x8000)); + Assert.Equal(65535.0m, NumberHelper.CreateChecked((char)0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromInt16Test() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateChecked(0x7FFF)); + Assert.Equal(-32768.0m, NumberHelper.CreateChecked(unchecked((short)0x8000))); + Assert.Equal(-1.0m, NumberHelper.CreateChecked(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt32Test() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateChecked(0x7FFFFFFF)); + Assert.Equal(-2147483648.0m, NumberHelper.CreateChecked(unchecked((int)0x80000000))); + Assert.Equal(-1.0m, NumberHelper.CreateChecked(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt64Test() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x0000000000000000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x0000000000000001)); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + Assert.Equal(-9223372036854775808.0m, NumberHelper.CreateChecked(unchecked(unchecked((long)0x8000000000000000)))); + Assert.Equal(-1.0m, NumberHelper.CreateChecked(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateCheckedFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000000))); + Assert.Equal(1.0m, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000001))); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateChecked(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + Assert.Equal(-9223372036854775808.0m, NumberHelper.CreateChecked(unchecked((nint)0x8000000000000000))); + Assert.Equal(-1.0m, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + Assert.Equal(0.0m, NumberHelper.CreateChecked((nint)0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked((nint)0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateChecked((nint)0x7FFFFFFF)); + Assert.Equal(-2147483648.0m, NumberHelper.CreateChecked(unchecked((nint)0x80000000))); + Assert.Equal(-1.0m, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateCheckedFromSByteTest() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x00)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x01)); + Assert.Equal(127.0m, NumberHelper.CreateChecked(0x7F)); + Assert.Equal(-128.0m, NumberHelper.CreateChecked(unchecked((sbyte)0x80))); + Assert.Equal(-1.0m, NumberHelper.CreateChecked(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateCheckedFromUInt16Test() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateChecked(0x7FFF)); + Assert.Equal(32768.0m, NumberHelper.CreateChecked(0x8000)); + Assert.Equal(65535.0m, NumberHelper.CreateChecked(0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt32Test() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateChecked(0x7FFFFFFF)); + Assert.Equal(2147483648.0m, NumberHelper.CreateChecked(0x80000000)); + Assert.Equal(4294967295.0m, NumberHelper.CreateChecked(0xFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt64Test() + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(0x0000000000000000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked(0x0000000000000001)); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + Assert.Equal(9223372036854775808.0m, NumberHelper.CreateChecked(0x8000000000000000)); + Assert.Equal(18446744073709551615.0m, NumberHelper.CreateChecked(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + Assert.Equal(0.0m, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000000))); + Assert.Equal(1.0m, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000001))); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateChecked(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + Assert.Equal(9223372036854775808.0m, NumberHelper.CreateChecked(unchecked((nuint)0x8000000000000000))); + Assert.Equal(18446744073709551615.0m,NumberHelper.CreateChecked(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + Assert.Equal(0.0m, NumberHelper.CreateChecked((nuint)0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateChecked((nuint)0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateChecked((nuint)0x7FFFFFFF)); + Assert.Equal(2147483648.0m, NumberHelper.CreateChecked((nuint)0x80000000)); + Assert.Equal(4294967295.0m, NumberHelper.CreateChecked((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateSaturatingFromByteTest() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x00)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x01)); + Assert.Equal(127.0m, NumberHelper.CreateSaturating(0x7F)); + Assert.Equal(128.0m, NumberHelper.CreateSaturating(0x80)); + Assert.Equal(255.0m, NumberHelper.CreateSaturating(0xFF)); + } + + [Fact] + public static void CreateSaturatingFromCharTest() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating((char)0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating((char)0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateSaturating((char)0x7FFF)); + Assert.Equal(32768.0m, NumberHelper.CreateSaturating((char)0x8000)); + Assert.Equal(65535.0m, NumberHelper.CreateSaturating((char)0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromInt16Test() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateSaturating(0x7FFF)); + Assert.Equal(-32768.0m, NumberHelper.CreateSaturating(unchecked((short)0x8000))); + Assert.Equal(-1.0m, NumberHelper.CreateSaturating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt32Test() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateSaturating(0x7FFFFFFF)); + Assert.Equal(-2147483648.0m, NumberHelper.CreateSaturating(unchecked((int)0x80000000))); + Assert.Equal(-1.0m, NumberHelper.CreateSaturating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt64Test() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x0000000000000000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x0000000000000001)); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + Assert.Equal(-9223372036854775808.0m, NumberHelper.CreateSaturating(unchecked(unchecked((long)0x8000000000000000)))); + Assert.Equal(-1.0m, NumberHelper.CreateSaturating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateSaturatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000000))); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000001))); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateSaturating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + Assert.Equal(-9223372036854775808.0m, NumberHelper.CreateSaturating(unchecked((nint)0x8000000000000000))); + Assert.Equal(-1.0m, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating((nint)0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating((nint)0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateSaturating((nint)0x7FFFFFFF)); + Assert.Equal(-2147483648.0m, NumberHelper.CreateSaturating(unchecked((nint)0x80000000))); + Assert.Equal(-1.0m, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateSaturatingFromSByteTest() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x00)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x01)); + Assert.Equal(127.0m, NumberHelper.CreateSaturating(0x7F)); + Assert.Equal(-128.0m, NumberHelper.CreateSaturating(unchecked((sbyte)0x80))); + Assert.Equal(-1.0m, NumberHelper.CreateSaturating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateSaturatingFromUInt16Test() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateSaturating(0x7FFF)); + Assert.Equal(32768.0m, NumberHelper.CreateSaturating(0x8000)); + Assert.Equal(65535.0m, NumberHelper.CreateSaturating(0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt32Test() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateSaturating(0x7FFFFFFF)); + Assert.Equal(2147483648.0m, NumberHelper.CreateSaturating(0x80000000)); + Assert.Equal(4294967295.0m, NumberHelper.CreateSaturating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt64Test() + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(0x0000000000000000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(0x0000000000000001)); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + Assert.Equal(9223372036854775808.0m, NumberHelper.CreateSaturating(0x8000000000000000)); + Assert.Equal(18446744073709551615.0m, NumberHelper.CreateSaturating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000000))); + Assert.Equal(1.0m, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000001))); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateSaturating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + Assert.Equal(9223372036854775808.0m, NumberHelper.CreateSaturating(unchecked((nuint)0x8000000000000000))); + Assert.Equal(18446744073709551615.0m, NumberHelper.CreateSaturating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + Assert.Equal(0.0m, NumberHelper.CreateSaturating((nuint)0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateSaturating((nuint)0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateSaturating((nuint)0x7FFFFFFF)); + Assert.Equal(2147483648.0m, NumberHelper.CreateSaturating((nuint)0x80000000)); + Assert.Equal(4294967295.0m, NumberHelper.CreateSaturating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateTruncatingFromByteTest() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x00)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x01)); + Assert.Equal(127.0m, NumberHelper.CreateTruncating(0x7F)); + Assert.Equal(128.0m, NumberHelper.CreateTruncating(0x80)); + Assert.Equal(255.0m, NumberHelper.CreateTruncating(0xFF)); + } + + [Fact] + public static void CreateTruncatingFromCharTest() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating((char)0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating((char)0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateTruncating((char)0x7FFF)); + Assert.Equal(32768.0m, NumberHelper.CreateTruncating((char)0x8000)); + Assert.Equal(65535.0m, NumberHelper.CreateTruncating((char)0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromInt16Test() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateTruncating(0x7FFF)); + Assert.Equal(-32768.0m, NumberHelper.CreateTruncating(unchecked((short)0x8000))); + Assert.Equal(-1.0m, NumberHelper.CreateTruncating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt32Test() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateTruncating(0x7FFFFFFF)); + Assert.Equal(-2147483648.0m, NumberHelper.CreateTruncating(unchecked((int)0x80000000))); + Assert.Equal(-1.0m, NumberHelper.CreateTruncating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt64Test() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x0000000000000000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x0000000000000001)); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + Assert.Equal(-9223372036854775808.0m, NumberHelper.CreateTruncating(unchecked(unchecked((long)0x8000000000000000)))); + Assert.Equal(-1.0m, NumberHelper.CreateTruncating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateTruncatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000000))); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000001))); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateTruncating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + Assert.Equal(-9223372036854775808.0m, NumberHelper.CreateTruncating(unchecked((nint)0x8000000000000000))); + Assert.Equal(-1.0m, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating((nint)0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating((nint)0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateTruncating((nint)0x7FFFFFFF)); + Assert.Equal(-2147483648.0m, NumberHelper.CreateTruncating(unchecked((nint)0x80000000))); + Assert.Equal(-1.0m, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateTruncatingFromSByteTest() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x00)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x01)); + Assert.Equal(127.0m, NumberHelper.CreateTruncating(0x7F)); + Assert.Equal(-128.0m, NumberHelper.CreateTruncating(unchecked((sbyte)0x80))); + Assert.Equal(-1.0m, NumberHelper.CreateTruncating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateTruncatingFromUInt16Test() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x0000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x0001)); + Assert.Equal(32767.0m, NumberHelper.CreateTruncating(0x7FFF)); + Assert.Equal(32768.0m, NumberHelper.CreateTruncating(0x8000)); + Assert.Equal(65535.0m, NumberHelper.CreateTruncating(0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt32Test() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateTruncating(0x7FFFFFFF)); + Assert.Equal(2147483648.0m, NumberHelper.CreateTruncating(0x80000000)); + Assert.Equal(4294967295.0m, NumberHelper.CreateTruncating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt64Test() + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(0x0000000000000000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(0x0000000000000001)); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + Assert.Equal(9223372036854775808.0m, NumberHelper.CreateTruncating(0x8000000000000000)); + Assert.Equal(18446744073709551615.0m, NumberHelper.CreateTruncating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000000))); + Assert.Equal(1.0m, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000001))); + Assert.Equal(9223372036854775807.0m, NumberHelper.CreateTruncating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + Assert.Equal(9223372036854775808.0m, NumberHelper.CreateTruncating(unchecked((nuint)0x8000000000000000))); + Assert.Equal(18446744073709551615.0m, NumberHelper.CreateTruncating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + Assert.Equal(0.0m, NumberHelper.CreateTruncating((nuint)0x00000000)); + Assert.Equal(1.0m, NumberHelper.CreateTruncating((nuint)0x00000001)); + Assert.Equal(2147483647.0m, NumberHelper.CreateTruncating((nuint)0x7FFFFFFF)); + Assert.Equal(2147483648.0m, NumberHelper.CreateTruncating((nuint)0x80000000)); + Assert.Equal(4294967295.0m, NumberHelper.CreateTruncating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void MaxTest() + { + Assert.Equal(1.0m, NumberHelper.Max(decimal.MinValue, 1.0m)); + Assert.Equal(1.0m, NumberHelper.Max(-1.0m, 1.0m)); + Assert.Equal(1.0m, NumberHelper.Max(-0.0m, 1.0m)); + Assert.Equal(1.0m, NumberHelper.Max(0.0m, 1.0m)); + Assert.Equal(1.0m, NumberHelper.Max(1.0m, 1.0m)); + Assert.Equal(decimal.MaxValue, NumberHelper.Max(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void MinTest() + { + Assert.Equal(decimal.MinValue, NumberHelper.Min(decimal.MinValue, 1.0m)); + Assert.Equal(-1.0m, NumberHelper.Min(-1.0m, 1.0m)); + Assert.Equal(-0.0m, NumberHelper.Min(-0.0m, 1.0m)); + Assert.Equal(0.0m, NumberHelper.Min(0.0m, 1.0m)); + Assert.Equal(1.0m, NumberHelper.Min(1.0m, 1.0m)); + Assert.Equal(1.0m, NumberHelper.Min(decimal.MaxValue, 1.0m)); + } + + [Fact] + public static void SignTest() + { + Assert.Equal(-1, NumberHelper.Sign(decimal.MinValue)); + Assert.Equal(-1, NumberHelper.Sign(-1.0m)); + + Assert.Equal(0, NumberHelper.Sign(-0.0m)); + Assert.Equal(0, NumberHelper.Sign(0.0m)); + + Assert.Equal(1, NumberHelper.Sign(1.0m)); + Assert.Equal(1, NumberHelper.Sign(decimal.MaxValue)); + } + + [Fact] + public static void TryCreateFromByteTest() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal(127.0m, result); + + Assert.True(NumberHelper.TryCreate(0x80, out result)); + Assert.Equal(128.0m, result); + + Assert.True(NumberHelper.TryCreate(0xFF, out result)); + Assert.Equal(255.0m, result); + } + + [Fact] + public static void TryCreateFromCharTest() + { + decimal result; + + Assert.True(NumberHelper.TryCreate((char)0x0000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate((char)0x0001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate((char)0x7FFF, out result)); + Assert.Equal(32767.0m, result); + + Assert.True(NumberHelper.TryCreate((char)0x8000, out result)); + Assert.Equal(32768.0m, result); + + Assert.True(NumberHelper.TryCreate((char)0xFFFF, out result)); + Assert.Equal(65535.0m, result); + } + + [Fact] + public static void TryCreateFromInt16Test() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal(32767.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0x8000), out result)); + Assert.Equal(-32768.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0xFFFF), out result)); + Assert.Equal(-1.0m, result); + } + + [Fact] + public static void TryCreateFromInt32Test() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0x80000000), out result)); + Assert.Equal(-2147483648.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0xFFFFFFFF), out result)); + Assert.Equal(-1.0m, result); + } + + [Fact] + public static void TryCreateFromInt64Test() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal(9223372036854775807.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0x8000000000000000)), out result)); + Assert.Equal(-9223372036854775808.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)), out result)); + Assert.Equal(-1.0m, result); + } + + [Fact] + public static void TryCreateFromIntPtrTest() + { + decimal result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000000), out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000001), out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal(9223372036854775807.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x8000000000000000), out result)); + Assert.Equal(-9223372036854775808.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFFFFFFFFFF), out result)); + Assert.Equal(-1.0m, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nint)0x00000000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate((nint)0x00000001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate((nint)0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x80000000), out result)); + Assert.Equal(-2147483648.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFF), out result)); + Assert.Equal(-1.0m, result); + } + } + + [Fact] + public static void TryCreateFromSByteTest() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal(127.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0x80), out result)); + Assert.Equal(-128.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0xFF), out result)); + Assert.Equal(-1.0m, result); + } + + [Fact] + public static void TryCreateFromUInt16Test() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal(32767.0m, result); + + Assert.True(NumberHelper.TryCreate(0x8000, out result)); + Assert.Equal(32768.0m, result); + + Assert.True(NumberHelper.TryCreate(0xFFFF, out result)); + Assert.Equal(65535.0m, result); + } + + [Fact] + public static void TryCreateFromUInt32Test() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0m, result); + + Assert.True(NumberHelper.TryCreate(0x80000000, out result)); + Assert.Equal(2147483648.0m, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFF, out result)); + Assert.Equal(4294967295.0m, result); + } + + [Fact] + public static void TryCreateFromUInt64Test() + { + decimal result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal(9223372036854775807.0m, result); + + Assert.True(NumberHelper.TryCreate(0x8000000000000000, out result)); + Assert.Equal(9223372036854775808.0m, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFFFFFFFFFF, out result)); + Assert.Equal(18446744073709551615.0m, result); + } + + [Fact] + public static void TryCreateFromUIntPtrTest() + { + decimal result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000000), out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000001), out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal(9223372036854775807.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x8000000000000000), out result)); + Assert.Equal(9223372036854775808.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFFFFFFFFFF), out result)); + Assert.Equal(18446744073709551615.0m, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nuint)0x00000000, out result)); + Assert.Equal(0.0m, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x00000001, out result)); + Assert.Equal(1.0m, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x80000000), out result)); + Assert.Equal(2147483648.0m, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFF), out result)); + Assert.Equal(4294967295.0m, result); + } + } + + [Fact] + public static void op_SubtractionTest() + { + Assert.Equal(-2.0m, SubtractionOperatorsHelper.op_Subtraction(-1.0m, 1.0m)); + Assert.Equal(-1.0m, SubtractionOperatorsHelper.op_Subtraction(-0.0m, 1.0m)); + Assert.Equal(-1.0m, SubtractionOperatorsHelper.op_Subtraction(0.0m, 1.0m)); + Assert.Equal(0.0m, SubtractionOperatorsHelper.op_Subtraction(1.0m, 1.0m)); + Assert.Equal(79228162514264337593543950334.0m, SubtractionOperatorsHelper.op_Subtraction(decimal.MaxValue, 1.0m)); + + Assert.Throws(() => SubtractionOperatorsHelper.op_Subtraction(decimal.MinValue, 1.0m)); + } + + [Fact] + public static void op_CheckedSubtractionTest() + { + Assert.Equal(-2.0m, SubtractionOperatorsHelper.op_CheckedSubtraction(-1.0m, 1.0m)); + Assert.Equal(-1.0m, SubtractionOperatorsHelper.op_CheckedSubtraction(-0.0m, 1.0m)); + Assert.Equal(-1.0m, SubtractionOperatorsHelper.op_CheckedSubtraction(0.0m, 1.0m)); + Assert.Equal(0.0m, SubtractionOperatorsHelper.op_CheckedSubtraction(1.0m, 1.0m)); + Assert.Equal(79228162514264337593543950334.0m, SubtractionOperatorsHelper.op_CheckedSubtraction(decimal.MaxValue, 1.0m)); + + Assert.Throws(() => SubtractionOperatorsHelper.op_CheckedSubtraction(decimal.MinValue, 1.0m)); + } + + [Fact] + public static void op_UnaryNegationTest() + { + Assert.Equal(decimal.MaxValue, UnaryNegationOperatorsHelper.op_UnaryNegation(decimal.MinValue)); + Assert.Equal(1.0m, UnaryNegationOperatorsHelper.op_UnaryNegation(-1.0m)); + Assert.Equal(0.0m, UnaryNegationOperatorsHelper.op_UnaryNegation(-0.0m)); + Assert.Equal(-0.0m, UnaryNegationOperatorsHelper.op_UnaryNegation(0.0m)); + Assert.Equal(-1.0m, UnaryNegationOperatorsHelper.op_UnaryNegation(1.0m)); + Assert.Equal(decimal.MinValue, UnaryNegationOperatorsHelper.op_UnaryNegation(decimal.MaxValue)); + } + + [Fact] + public static void op_CheckedUnaryNegationTest() + { + Assert.Equal(decimal.MaxValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(decimal.MinValue)); + Assert.Equal(1.0m, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-1.0m)); + Assert.Equal(0.0m, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-0.0m)); + Assert.Equal(-0.0m, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(0.0m)); + Assert.Equal(-1.0m, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(1.0m)); + Assert.Equal(decimal.MinValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(decimal.MaxValue)); + } + + [Fact] + public static void op_UnaryPlusTest() + { + Assert.Equal(decimal.MinValue, UnaryPlusOperatorsHelper.op_UnaryPlus(decimal.MinValue)); + Assert.Equal(-1.0m, UnaryPlusOperatorsHelper.op_UnaryPlus(-1.0m)); + Assert.Equal(-0.0m, UnaryPlusOperatorsHelper.op_UnaryPlus(-0.0m)); + Assert.Equal(0.0m, UnaryPlusOperatorsHelper.op_UnaryPlus(0.0m)); + Assert.Equal(1.0m, UnaryPlusOperatorsHelper.op_UnaryPlus(1.0m)); + Assert.Equal(decimal.MaxValue, UnaryPlusOperatorsHelper.op_UnaryPlus(decimal.MaxValue)); + } + + [Theory] + [MemberData(nameof(DecimalTests.Parse_Valid_TestData), MemberType = typeof(DecimalTests))] + public static void ParseValidStringTest(string value, NumberStyles style, IFormatProvider provider, decimal expected) + { + bool isDefaultProvider = provider == null || provider == NumberFormatInfo.CurrentInfo; + decimal result; + if ((style & ~(NumberStyles.Float | NumberStyles.AllowThousands)) == 0 && style != NumberStyles.None) + { + // Use Parse(string) or Parse(string, IFormatProvider) + if (isDefaultProvider) + { + Assert.True(NumberHelper.TryParse(value, null, out result)); + Assert.Equal(expected, result); + + Assert.Equal(expected, NumberHelper.Parse(value, null)); + } + + Assert.Equal(expected, NumberHelper.Parse(value, provider)); + } + + // Use Parse(string, NumberStyles, IFormatProvider) + Assert.True(NumberHelper.TryParse(value, style, provider, out result)); + Assert.Equal(expected, result); + + Assert.Equal(expected, NumberHelper.Parse(value, style, provider)); + + if (isDefaultProvider) + { + // Use Parse(string, NumberStyles) or Parse(string, NumberStyles, IFormatProvider) + Assert.True(NumberHelper.TryParse(value, style, NumberFormatInfo.CurrentInfo, out result)); + Assert.Equal(expected, result); + + Assert.Equal(expected, NumberHelper.Parse(value, style, null)); + Assert.Equal(expected, NumberHelper.Parse(value, style, NumberFormatInfo.CurrentInfo)); + } + } + + [Theory] + [MemberData(nameof(DecimalTests.Parse_Invalid_TestData), MemberType = typeof(DecimalTests))] + public static void ParseInvalidStringTest(string value, NumberStyles style, IFormatProvider provider, Type exceptionType) + { + bool isDefaultProvider = provider == null || provider == NumberFormatInfo.CurrentInfo; + decimal result; + if ((style & ~(NumberStyles.Float | NumberStyles.AllowThousands)) == 0 && style != NumberStyles.None && (style & NumberStyles.AllowLeadingWhite) == (style & NumberStyles.AllowTrailingWhite)) + { + // Use Parse(string) or Parse(string, IFormatProvider) + if (isDefaultProvider) + { + Assert.False(NumberHelper.TryParse(value, null, out result)); + Assert.Equal(default(decimal), result); + + Assert.Throws(exceptionType, () => NumberHelper.Parse(value, null)); + } + + Assert.Throws(exceptionType, () => NumberHelper.Parse(value, provider)); + } + + // Use Parse(string, NumberStyles, IFormatProvider) + Assert.False(NumberHelper.TryParse(value, style, provider, out result)); + Assert.Equal(default(decimal), result); + + Assert.Throws(exceptionType, () => NumberHelper.Parse(value, style, provider)); + + if (isDefaultProvider) + { + // Use Parse(string, NumberStyles) or Parse(string, NumberStyles, IFormatProvider) + Assert.False(NumberHelper.TryParse(value, style, NumberFormatInfo.CurrentInfo, out result)); + Assert.Equal(default(decimal), result); + + Assert.Throws(exceptionType, () => NumberHelper.Parse(value, style, null)); + Assert.Throws(exceptionType, () => NumberHelper.Parse(value, style, NumberFormatInfo.CurrentInfo)); + } + } + + [Theory] + [MemberData(nameof(DecimalTests.Parse_ValidWithOffsetCount_TestData), MemberType = typeof(DecimalTests))] + public static void ParseValidSpanTest(string value, int offset, int count, NumberStyles style, IFormatProvider provider, decimal expected) + { + bool isDefaultProvider = provider == null || provider == NumberFormatInfo.CurrentInfo; + decimal result; + if ((style & ~(NumberStyles.Float | NumberStyles.AllowThousands)) == 0 && style != NumberStyles.None) + { + // Use Parse(string) or Parse(string, IFormatProvider) + if (isDefaultProvider) + { + Assert.True(NumberHelper.TryParse(value.AsSpan(offset, count), null, out result)); + Assert.Equal(expected, result); + + Assert.Equal(expected, NumberHelper.Parse(value.AsSpan(offset, count), null)); + } + + Assert.Equal(expected, NumberHelper.Parse(value.AsSpan(offset, count), provider: provider)); + } + + Assert.Equal(expected, NumberHelper.Parse(value.AsSpan(offset, count), style, provider)); + + Assert.True(NumberHelper.TryParse(value.AsSpan(offset, count), style, provider, out result)); + Assert.Equal(expected, result); + } + + [Theory] + [MemberData(nameof(DecimalTests.Parse_Invalid_TestData), MemberType = typeof(DecimalTests))] + public static void ParseInvalidSpanTest(string value, NumberStyles style, IFormatProvider provider, Type exceptionType) + { + if (value != null) + { + Assert.Throws(exceptionType, () => NumberHelper.Parse(value.AsSpan(), style, provider)); + + Assert.False(NumberHelper.TryParse(value.AsSpan(), style, provider, out decimal result)); + Assert.Equal(0, result); + } + } + } +} diff --git a/src/libraries/System.Runtime/tests/System/DoubleTests.GenericMath.cs b/src/libraries/System.Runtime/tests/System/DoubleTests.GenericMath.cs index 25adcef44651a..31c5f86dd15b5 100644 --- a/src/libraries/System.Runtime/tests/System/DoubleTests.GenericMath.cs +++ b/src/libraries/System.Runtime/tests/System/DoubleTests.GenericMath.cs @@ -2,13 +2,1340 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Globalization; -using System.Runtime.Versioning; using Xunit; namespace System.Tests { public class DoubleTests_GenericMath { + private const double MinNormal = 2.2250738585072014E-308; + + private const double MaxSubnormal = 2.2250738585072009E-308; + + private static void AssertBitwiseEqual(double expected, double actual) + { + ulong expectedBits = BitConverter.DoubleToUInt64Bits(expected); + ulong actualBits = BitConverter.DoubleToUInt64Bits(actual); + + if (expectedBits == actualBits) + { + return; + } + + if (double.IsNaN(expected) && double.IsNaN(actual)) + { + return; + } + + throw new Xunit.Sdk.EqualException(expected, actual); + } + + [Fact] + public static void AdditiveIdentityTest() + { + AssertBitwiseEqual(0.0, AdditiveIdentityHelper.AdditiveIdentity); + } + + [Fact] + public static void MinValueTest() + { + AssertBitwiseEqual(double.MinValue, MinMaxValueHelper.MinValue); + } + + [Fact] + public static void MaxValueTest() + { + AssertBitwiseEqual(double.MaxValue, MinMaxValueHelper.MaxValue); + } + + [Fact] + public static void MultiplicativeIdentityTest() + { + AssertBitwiseEqual(1.0, MultiplicativeIdentityHelper.MultiplicativeIdentity); + } + + [Fact] + public static void NegativeOneTest() + { + Assert.Equal(-1.0, SignedNumberHelper.NegativeOne); + } + + [Fact] + public static void OneTest() + { + AssertBitwiseEqual(1.0, NumberBaseHelper.One); + } + + [Fact] + public static void ZeroTest() + { + AssertBitwiseEqual(0.0, NumberBaseHelper.Zero); + } + + [Fact] + public static void op_AdditionTest() + { + AssertBitwiseEqual(double.NegativeInfinity, AdditionOperatorsHelper.op_Addition(double.NegativeInfinity, 1.0)); + AssertBitwiseEqual(double.MinValue, AdditionOperatorsHelper.op_Addition(double.MinValue, 1.0)); + AssertBitwiseEqual(0.0, AdditionOperatorsHelper.op_Addition(-1.0, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(-MinNormal, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(-MaxSubnormal, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(-double.Epsilon, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(-0.0, 1.0)); + AssertBitwiseEqual(double.NaN, AdditionOperatorsHelper.op_Addition(double.NaN, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(0.0, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(double.Epsilon, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(MaxSubnormal, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_Addition(MinNormal, 1.0)); + AssertBitwiseEqual(2.0, AdditionOperatorsHelper.op_Addition(1.0, 1.0)); + AssertBitwiseEqual(double.MaxValue, AdditionOperatorsHelper.op_Addition(double.MaxValue, 1.0)); + AssertBitwiseEqual(double.PositiveInfinity, AdditionOperatorsHelper.op_Addition(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_CheckedAdditionTest() + { + AssertBitwiseEqual(double.NegativeInfinity, AdditionOperatorsHelper.op_CheckedAddition(double.NegativeInfinity, 1.0)); + AssertBitwiseEqual(double.MinValue, AdditionOperatorsHelper.op_CheckedAddition(double.MinValue, 1.0)); + AssertBitwiseEqual(0.0, AdditionOperatorsHelper.op_CheckedAddition(-1.0, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(-MinNormal, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(-MaxSubnormal, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(-double.Epsilon, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(-0.0, 1.0)); + AssertBitwiseEqual(double.NaN, AdditionOperatorsHelper.op_CheckedAddition(double.NaN, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(0.0, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(double.Epsilon, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(MaxSubnormal, 1.0)); + AssertBitwiseEqual(1.0, AdditionOperatorsHelper.op_CheckedAddition(MinNormal, 1.0)); + AssertBitwiseEqual(2.0, AdditionOperatorsHelper.op_CheckedAddition(1.0, 1.0)); + AssertBitwiseEqual(double.MaxValue, AdditionOperatorsHelper.op_CheckedAddition(double.MaxValue, 1.0)); + AssertBitwiseEqual(double.PositiveInfinity, AdditionOperatorsHelper.op_CheckedAddition(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void IsPow2Test() + { + Assert.False(BinaryNumberHelper.IsPow2(double.NegativeInfinity)); + Assert.False(BinaryNumberHelper.IsPow2(double.MinValue)); + Assert.False(BinaryNumberHelper.IsPow2(-1.0)); + Assert.False(BinaryNumberHelper.IsPow2(-MinNormal)); + Assert.False(BinaryNumberHelper.IsPow2(-MaxSubnormal)); + Assert.False(BinaryNumberHelper.IsPow2(-double.Epsilon)); + Assert.False(BinaryNumberHelper.IsPow2(-0.0)); + Assert.False(BinaryNumberHelper.IsPow2(double.NaN)); + Assert.False(BinaryNumberHelper.IsPow2(0.0)); + Assert.False(BinaryNumberHelper.IsPow2(double.Epsilon)); + Assert.False(BinaryNumberHelper.IsPow2(MaxSubnormal)); + Assert.True(BinaryNumberHelper.IsPow2(MinNormal)); + Assert.True(BinaryNumberHelper.IsPow2(1.0)); + Assert.False(BinaryNumberHelper.IsPow2(double.MaxValue)); + Assert.False(BinaryNumberHelper.IsPow2(double.PositiveInfinity)); + } + + [Fact] + public static void Log2Test() + { + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(double.NegativeInfinity)); + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(double.MinValue)); + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(-1.0)); + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(-MinNormal)); + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(-MaxSubnormal)); + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(-double.Epsilon)); + AssertBitwiseEqual(double.NegativeInfinity, BinaryNumberHelper.Log2(-0.0)); + AssertBitwiseEqual(double.NaN, BinaryNumberHelper.Log2(double.NaN)); + AssertBitwiseEqual(double.NegativeInfinity, BinaryNumberHelper.Log2(0.0)); + AssertBitwiseEqual(-1074.0, BinaryNumberHelper.Log2(double.Epsilon)); + AssertBitwiseEqual(-1022.0, BinaryNumberHelper.Log2(MaxSubnormal)); + AssertBitwiseEqual(-1022.0, BinaryNumberHelper.Log2(MinNormal)); + AssertBitwiseEqual(0.0, BinaryNumberHelper.Log2(1.0)); + AssertBitwiseEqual(1024.0, BinaryNumberHelper.Log2(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, BinaryNumberHelper.Log2(double.PositiveInfinity)); + } + + [Fact] + public static void op_LessThanTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThan(double.NegativeInfinity, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(double.MinValue, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-1.0, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-MinNormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-MaxSubnormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-double.Epsilon, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-0.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(double.NaN, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(0.0, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(double.Epsilon, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(MaxSubnormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(MinNormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(1.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(double.MaxValue, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_LessThanOrEqualTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(double.NegativeInfinity, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(double.MinValue, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-1.0, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-MinNormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-MaxSubnormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-double.Epsilon, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-0.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(double.NaN, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(0.0, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(double.Epsilon, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(MaxSubnormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(MinNormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(1.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(double.MaxValue, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_GreaterThanTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(double.NegativeInfinity, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(double.MinValue, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-1.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-MinNormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-MaxSubnormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-double.Epsilon, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-0.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(double.NaN, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(0.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(double.Epsilon, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(MaxSubnormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(MinNormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(1.0, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(double.MaxValue, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_GreaterThanOrEqualTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(double.NegativeInfinity, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(double.MinValue, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-1.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-MinNormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-MaxSubnormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-double.Epsilon, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-0.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(double.NaN, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(0.0, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(double.Epsilon, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(MaxSubnormal, 1.0)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(MinNormal, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(1.0, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(double.MaxValue, 1.0)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_DecrementTest() + { + AssertBitwiseEqual(double.NegativeInfinity, DecrementOperatorsHelper.op_Decrement(double.NegativeInfinity)); + AssertBitwiseEqual(double.MinValue, DecrementOperatorsHelper.op_Decrement(double.MinValue)); + AssertBitwiseEqual(-2.0, DecrementOperatorsHelper.op_Decrement(-1.0)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(-MinNormal)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(-MaxSubnormal)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(-double.Epsilon)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(-0.0)); + AssertBitwiseEqual(double.NaN, DecrementOperatorsHelper.op_Decrement(double.NaN)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(0.0)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(double.Epsilon)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(MaxSubnormal)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_Decrement(MinNormal)); + AssertBitwiseEqual(0.0, DecrementOperatorsHelper.op_Decrement(1.0)); + AssertBitwiseEqual(double.MaxValue, DecrementOperatorsHelper.op_Decrement(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, DecrementOperatorsHelper.op_Decrement(double.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedDecrementTest() + { + AssertBitwiseEqual(double.NegativeInfinity, DecrementOperatorsHelper.op_CheckedDecrement(double.NegativeInfinity)); + AssertBitwiseEqual(double.MinValue, DecrementOperatorsHelper.op_CheckedDecrement(double.MinValue)); + AssertBitwiseEqual(-2.0, DecrementOperatorsHelper.op_CheckedDecrement(-1.0)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(-MinNormal)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(-MaxSubnormal)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(-double.Epsilon)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(-0.0)); + AssertBitwiseEqual(double.NaN, DecrementOperatorsHelper.op_CheckedDecrement(double.NaN)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(0.0)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(double.Epsilon)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(MaxSubnormal)); + AssertBitwiseEqual(-1.0, DecrementOperatorsHelper.op_CheckedDecrement(MinNormal)); + AssertBitwiseEqual(0.0, DecrementOperatorsHelper.op_CheckedDecrement(1.0)); + AssertBitwiseEqual(double.MaxValue, DecrementOperatorsHelper.op_CheckedDecrement(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, DecrementOperatorsHelper.op_CheckedDecrement(double.PositiveInfinity)); + } + + [Fact] + public static void op_DivisionTest() + { + AssertBitwiseEqual(double.NegativeInfinity, DivisionOperatorsHelper.op_Division(double.NegativeInfinity, 2.0)); + AssertBitwiseEqual(-8.9884656743115785E+307, DivisionOperatorsHelper.op_Division(double.MinValue, 2.0)); + AssertBitwiseEqual(-0.5, DivisionOperatorsHelper.op_Division(-1.0, 2.0)); + AssertBitwiseEqual(-1.1125369292536007E-308, DivisionOperatorsHelper.op_Division(-MinNormal, 2.0)); + AssertBitwiseEqual(-1.1125369292536007E-308, DivisionOperatorsHelper.op_Division(-MaxSubnormal, 2.0)); + AssertBitwiseEqual(-0.0, DivisionOperatorsHelper.op_Division(-double.Epsilon, 2.0)); + AssertBitwiseEqual(-0.0, DivisionOperatorsHelper.op_Division(-0.0, 2.0)); + AssertBitwiseEqual(double.NaN, DivisionOperatorsHelper.op_Division(double.NaN, 2.0)); + AssertBitwiseEqual(0.0, DivisionOperatorsHelper.op_Division(0.0, 2.0)); + AssertBitwiseEqual(0.0, DivisionOperatorsHelper.op_Division(double.Epsilon, 2.0)); + AssertBitwiseEqual(1.1125369292536007E-308, DivisionOperatorsHelper.op_Division(MaxSubnormal, 2.0)); + AssertBitwiseEqual(1.1125369292536007E-308, DivisionOperatorsHelper.op_Division(MinNormal, 2.0)); + AssertBitwiseEqual(0.5, DivisionOperatorsHelper.op_Division(1.0, 2.0)); + AssertBitwiseEqual(8.9884656743115785E+307, DivisionOperatorsHelper.op_Division(double.MaxValue, 2.0)); + AssertBitwiseEqual(double.PositiveInfinity, DivisionOperatorsHelper.op_Division(double.PositiveInfinity, 2.0)); + } + + [Fact] + public static void op_CheckedDivisionTest() + { + AssertBitwiseEqual(double.NegativeInfinity, DivisionOperatorsHelper.op_CheckedDivision(double.NegativeInfinity, 2.0)); + AssertBitwiseEqual(-8.9884656743115785E+307, DivisionOperatorsHelper.op_CheckedDivision(double.MinValue, 2.0)); + AssertBitwiseEqual(-0.5, DivisionOperatorsHelper.op_CheckedDivision(-1.0, 2.0)); + AssertBitwiseEqual(-1.1125369292536007E-308, DivisionOperatorsHelper.op_CheckedDivision(-MinNormal, 2.0)); + AssertBitwiseEqual(-1.1125369292536007E-308, DivisionOperatorsHelper.op_CheckedDivision(-MaxSubnormal, 2.0)); + AssertBitwiseEqual(-0.0, DivisionOperatorsHelper.op_CheckedDivision(-double.Epsilon, 2.0)); + AssertBitwiseEqual(-0.0, DivisionOperatorsHelper.op_CheckedDivision(-0.0, 2.0)); + AssertBitwiseEqual(double.NaN, DivisionOperatorsHelper.op_CheckedDivision(double.NaN, 2.0)); + AssertBitwiseEqual(0.0, DivisionOperatorsHelper.op_CheckedDivision(0.0, 2.0)); + AssertBitwiseEqual(0.0, DivisionOperatorsHelper.op_CheckedDivision(double.Epsilon, 2.0)); + AssertBitwiseEqual(1.1125369292536007E-308, DivisionOperatorsHelper.op_CheckedDivision(MaxSubnormal, 2.0)); + AssertBitwiseEqual(1.1125369292536007E-308, DivisionOperatorsHelper.op_CheckedDivision(MinNormal, 2.0)); + AssertBitwiseEqual(0.5, DivisionOperatorsHelper.op_CheckedDivision(1.0, 2.0)); + AssertBitwiseEqual(8.9884656743115785E+307, DivisionOperatorsHelper.op_CheckedDivision(double.MaxValue, 2.0)); + AssertBitwiseEqual(double.PositiveInfinity, DivisionOperatorsHelper.op_CheckedDivision(double.PositiveInfinity, 2.0)); + } + + [Fact] + public static void op_EqualityTest() + { + Assert.False(EqualityOperatorsHelper.op_Equality(double.NegativeInfinity, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(double.MinValue, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(-1.0, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(-MinNormal, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(-MaxSubnormal, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(-double.Epsilon, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(-0.0, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(double.NaN, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(0.0, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(double.Epsilon, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(MaxSubnormal, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(MinNormal, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Equality(1.0, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(double.MaxValue, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Equality(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_InequalityTest() + { + Assert.True(EqualityOperatorsHelper.op_Inequality(double.NegativeInfinity, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(double.MinValue, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-1.0, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-MinNormal, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-MaxSubnormal, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-double.Epsilon, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-0.0, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(double.NaN, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(0.0, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(double.Epsilon, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(MaxSubnormal, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(MinNormal, 1.0)); + Assert.False(EqualityOperatorsHelper.op_Inequality(1.0, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(double.MaxValue, 1.0)); + Assert.True(EqualityOperatorsHelper.op_Inequality(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_IncrementTest() + { + AssertBitwiseEqual(double.NegativeInfinity, IncrementOperatorsHelper.op_Increment(double.NegativeInfinity)); + AssertBitwiseEqual(double.MinValue, IncrementOperatorsHelper.op_Increment(double.MinValue)); + AssertBitwiseEqual(0.0, IncrementOperatorsHelper.op_Increment(-1.0)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(-MinNormal)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(-MaxSubnormal)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(-double.Epsilon)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(-0.0)); + AssertBitwiseEqual(double.NaN, IncrementOperatorsHelper.op_Increment(double.NaN)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(0.0)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(double.Epsilon)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(MaxSubnormal)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_Increment(MinNormal)); + AssertBitwiseEqual(2.0, IncrementOperatorsHelper.op_Increment(1.0)); + AssertBitwiseEqual(double.MaxValue, IncrementOperatorsHelper.op_Increment(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, IncrementOperatorsHelper.op_Increment(double.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedIncrementTest() + { + AssertBitwiseEqual(double.NegativeInfinity, IncrementOperatorsHelper.op_CheckedIncrement(double.NegativeInfinity)); + AssertBitwiseEqual(double.MinValue, IncrementOperatorsHelper.op_CheckedIncrement(double.MinValue)); + AssertBitwiseEqual(0.0, IncrementOperatorsHelper.op_CheckedIncrement(-1.0)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(-MinNormal)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(-MaxSubnormal)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(-double.Epsilon)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(-0.0)); + AssertBitwiseEqual(double.NaN, IncrementOperatorsHelper.op_CheckedIncrement(double.NaN)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(0.0)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(double.Epsilon)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(MaxSubnormal)); + AssertBitwiseEqual(1.0, IncrementOperatorsHelper.op_CheckedIncrement(MinNormal)); + AssertBitwiseEqual(2.0, IncrementOperatorsHelper.op_CheckedIncrement(1.0)); + AssertBitwiseEqual(double.MaxValue, IncrementOperatorsHelper.op_CheckedIncrement(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, IncrementOperatorsHelper.op_CheckedIncrement(double.PositiveInfinity)); + } + + [Fact] + public static void op_ModulusTest() + { + AssertBitwiseEqual(double.NaN, ModulusOperatorsHelper.op_Modulus(double.NegativeInfinity, 2.0)); + AssertBitwiseEqual(-0.0, ModulusOperatorsHelper.op_Modulus(double.MinValue, 2.0)); + AssertBitwiseEqual(-1.0, ModulusOperatorsHelper.op_Modulus(-1.0, 2.0)); + AssertBitwiseEqual(-MinNormal, ModulusOperatorsHelper.op_Modulus(-MinNormal, 2.0)); + AssertBitwiseEqual(-MaxSubnormal, ModulusOperatorsHelper.op_Modulus(-MaxSubnormal, 2.0)); + AssertBitwiseEqual(-double.Epsilon, ModulusOperatorsHelper.op_Modulus(-double.Epsilon, 2.0)); ; + AssertBitwiseEqual(-0.0, ModulusOperatorsHelper.op_Modulus(-0.0, 2.0)); + AssertBitwiseEqual(double.NaN, ModulusOperatorsHelper.op_Modulus(double.NaN, 2.0)); + AssertBitwiseEqual(0.0, ModulusOperatorsHelper.op_Modulus(0.0, 2.0)); + AssertBitwiseEqual(double.Epsilon, ModulusOperatorsHelper.op_Modulus(double.Epsilon, 2.0)); + AssertBitwiseEqual(MaxSubnormal, ModulusOperatorsHelper.op_Modulus(MaxSubnormal, 2.0)); + AssertBitwiseEqual(MinNormal, ModulusOperatorsHelper.op_Modulus(MinNormal, 2.0)); + AssertBitwiseEqual(1.0, ModulusOperatorsHelper.op_Modulus(1.0, 2.0)); + AssertBitwiseEqual(0.0, ModulusOperatorsHelper.op_Modulus(double.MaxValue, 2.0)); + AssertBitwiseEqual(double.NaN, ModulusOperatorsHelper.op_Modulus(double.PositiveInfinity, 2.0)); + } + + [Fact] + public static void op_MultiplyTest() + { + AssertBitwiseEqual(double.NegativeInfinity, MultiplyOperatorsHelper.op_Multiply(double.NegativeInfinity, 2.0)); + AssertBitwiseEqual(double.NegativeInfinity, MultiplyOperatorsHelper.op_Multiply(double.MinValue, 2.0)); + AssertBitwiseEqual(-2.0, MultiplyOperatorsHelper.op_Multiply(-1.0, 2.0)); + AssertBitwiseEqual(-4.4501477170144028E-308, MultiplyOperatorsHelper.op_Multiply(-MinNormal, 2.0)); + AssertBitwiseEqual(-4.4501477170144018E-308, MultiplyOperatorsHelper.op_Multiply(-MaxSubnormal, 2.0)); + AssertBitwiseEqual(-9.8813129168249309E-324, MultiplyOperatorsHelper.op_Multiply(-double.Epsilon, 2.0)); + AssertBitwiseEqual(-0.0, MultiplyOperatorsHelper.op_Multiply(-0.0, 2.0)); + AssertBitwiseEqual(double.NaN, MultiplyOperatorsHelper.op_Multiply(double.NaN, 2.0)); + AssertBitwiseEqual(0.0, MultiplyOperatorsHelper.op_Multiply(0.0, 2.0)); + AssertBitwiseEqual(9.8813129168249309E-324, MultiplyOperatorsHelper.op_Multiply(double.Epsilon, 2.0)); + AssertBitwiseEqual(4.4501477170144018E-308, MultiplyOperatorsHelper.op_Multiply(MaxSubnormal, 2.0)); + AssertBitwiseEqual(4.4501477170144028E-308, MultiplyOperatorsHelper.op_Multiply(MinNormal, 2.0)); + AssertBitwiseEqual(2.0, MultiplyOperatorsHelper.op_Multiply(1.0, 2.0)); + AssertBitwiseEqual(double.PositiveInfinity, MultiplyOperatorsHelper.op_Multiply(double.MaxValue, 2.0)); + AssertBitwiseEqual(double.PositiveInfinity, MultiplyOperatorsHelper.op_Multiply(double.PositiveInfinity, 2.0)); + } + + [Fact] + public static void op_CheckedMultiplyTest() + { + AssertBitwiseEqual(double.NegativeInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(double.NegativeInfinity, 2.0)); + AssertBitwiseEqual(double.NegativeInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(double.MinValue, 2.0)); + AssertBitwiseEqual(-2.0, MultiplyOperatorsHelper.op_CheckedMultiply(-1.0, 2.0)); + AssertBitwiseEqual(-4.4501477170144028E-308, MultiplyOperatorsHelper.op_CheckedMultiply(-MinNormal, 2.0)); + AssertBitwiseEqual(-4.4501477170144018E-308, MultiplyOperatorsHelper.op_CheckedMultiply(-MaxSubnormal, 2.0)); + AssertBitwiseEqual(-9.8813129168249309E-324, MultiplyOperatorsHelper.op_CheckedMultiply(-double.Epsilon, 2.0)); + AssertBitwiseEqual(-0.0, MultiplyOperatorsHelper.op_CheckedMultiply(-0.0, 2.0)); + AssertBitwiseEqual(double.NaN, MultiplyOperatorsHelper.op_CheckedMultiply(double.NaN, 2.0)); + AssertBitwiseEqual(0.0, MultiplyOperatorsHelper.op_CheckedMultiply(0.0, 2.0)); + AssertBitwiseEqual(9.8813129168249309E-324, MultiplyOperatorsHelper.op_CheckedMultiply(double.Epsilon, 2.0)); + AssertBitwiseEqual(4.4501477170144018E-308, MultiplyOperatorsHelper.op_CheckedMultiply(MaxSubnormal, 2.0)); + AssertBitwiseEqual(4.4501477170144028E-308, MultiplyOperatorsHelper.op_CheckedMultiply(MinNormal, 2.0)); + AssertBitwiseEqual(2.0, MultiplyOperatorsHelper.op_CheckedMultiply(1.0, 2.0)); + AssertBitwiseEqual(double.PositiveInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(double.MaxValue, 2.0)); + AssertBitwiseEqual(double.PositiveInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(double.PositiveInfinity, 2.0)); + } + + [Fact] + public static void AbsTest() + { + AssertBitwiseEqual(double.PositiveInfinity, NumberHelper.Abs(double.NegativeInfinity)); + AssertBitwiseEqual(double.MaxValue, NumberHelper.Abs(double.MinValue)); + AssertBitwiseEqual(1.0, NumberHelper.Abs(-1.0)); + AssertBitwiseEqual(MinNormal, NumberHelper.Abs(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Abs(-MaxSubnormal)); + AssertBitwiseEqual(double.Epsilon, NumberHelper.Abs(-double.Epsilon)); + AssertBitwiseEqual(0.0, NumberHelper.Abs(-0.0)); + AssertBitwiseEqual(double.NaN, NumberHelper.Abs(double.NaN)); + AssertBitwiseEqual(0.0, NumberHelper.Abs(0.0)); + AssertBitwiseEqual(double.Epsilon, NumberHelper.Abs(double.Epsilon)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Abs(MaxSubnormal)); + AssertBitwiseEqual(MinNormal, NumberHelper.Abs(MinNormal)); + AssertBitwiseEqual(1.0, NumberHelper.Abs(1.0)); + AssertBitwiseEqual(double.MaxValue, NumberHelper.Abs(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, NumberHelper.Abs(double.PositiveInfinity)); + } + + [Fact] + public static void ClampTest() + { + AssertBitwiseEqual(1.0, NumberHelper.Clamp(double.NegativeInfinity, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(double.MinValue, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(-1.0, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(-MinNormal, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(-MaxSubnormal, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(-double.Epsilon, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(-0.0, 1.0, 63.0)); + AssertBitwiseEqual(double.NaN, NumberHelper.Clamp(double.NaN, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(0.0, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(double.Epsilon, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(MaxSubnormal, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(MinNormal, 1.0, 63.0)); + AssertBitwiseEqual(1.0, NumberHelper.Clamp(1.0, 1.0, 63.0)); + AssertBitwiseEqual(63.0, NumberHelper.Clamp(double.MaxValue, 1.0, 63.0)); + AssertBitwiseEqual(63.0, NumberHelper.Clamp(double.PositiveInfinity, 1.0, 63.0)); + } + + [Fact] + public static void CreateCheckedFromByteTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x00)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x01)); + AssertBitwiseEqual(127.0, NumberHelper.CreateChecked(0x7F)); + AssertBitwiseEqual(128.0, NumberHelper.CreateChecked(0x80)); + AssertBitwiseEqual(255.0, NumberHelper.CreateChecked(0xFF)); + } + + [Fact] + public static void CreateCheckedFromCharTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked((char)0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked((char)0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateChecked((char)0x7FFF)); + AssertBitwiseEqual(32768.0, NumberHelper.CreateChecked((char)0x8000)); + AssertBitwiseEqual(65535.0, NumberHelper.CreateChecked((char)0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromInt16Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateChecked(0x7FFF)); + AssertBitwiseEqual(-32768.0, NumberHelper.CreateChecked(unchecked((short)0x8000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateChecked(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt32Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateChecked(0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0, NumberHelper.CreateChecked(unchecked((int)0x80000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateChecked(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt64Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x0000000000000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(-9223372036854775808.0, NumberHelper.CreateChecked(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateChecked(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateCheckedFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateChecked(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual(-9223372036854775808.0, NumberHelper.CreateChecked(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked((nint)0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked((nint)0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateChecked((nint)0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0, NumberHelper.CreateChecked(unchecked((nint)0x80000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateCheckedFromSByteTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x00)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x01)); + AssertBitwiseEqual(127.0, NumberHelper.CreateChecked(0x7F)); + AssertBitwiseEqual(-128.0, NumberHelper.CreateChecked(unchecked((sbyte)0x80))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateChecked(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateCheckedFromUInt16Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateChecked(0x7FFF)); + AssertBitwiseEqual(32768.0, NumberHelper.CreateChecked(0x8000)); + AssertBitwiseEqual(65535.0, NumberHelper.CreateChecked(0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt32Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateChecked(0x7FFFFFFF)); + AssertBitwiseEqual(2147483648.0, NumberHelper.CreateChecked(0x80000000)); + AssertBitwiseEqual(4294967295.0, NumberHelper.CreateChecked(0xFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt64Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(0x0000000000000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(9223372036854775808.0, NumberHelper.CreateChecked(0x8000000000000000)); + AssertBitwiseEqual(18446744073709551615.0, NumberHelper.CreateChecked(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateChecked(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(9223372036854775808.0, NumberHelper.CreateChecked(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual(18446744073709551615.0,NumberHelper.CreateChecked(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0, NumberHelper.CreateChecked((nuint)0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateChecked((nuint)0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateChecked((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(2147483648.0, NumberHelper.CreateChecked((nuint)0x80000000)); + // AssertBitwiseEqual(4294967295.0, NumberHelper.CreateChecked((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateSaturatingFromByteTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x00)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x01)); + AssertBitwiseEqual(127.0, NumberHelper.CreateSaturating(0x7F)); + AssertBitwiseEqual(128.0, NumberHelper.CreateSaturating(0x80)); + AssertBitwiseEqual(255.0, NumberHelper.CreateSaturating(0xFF)); + } + + [Fact] + public static void CreateSaturatingFromCharTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating((char)0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating((char)0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateSaturating((char)0x7FFF)); + AssertBitwiseEqual(32768.0, NumberHelper.CreateSaturating((char)0x8000)); + AssertBitwiseEqual(65535.0, NumberHelper.CreateSaturating((char)0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromInt16Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateSaturating(0x7FFF)); + AssertBitwiseEqual(-32768.0, NumberHelper.CreateSaturating(unchecked((short)0x8000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateSaturating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt32Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateSaturating(0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0, NumberHelper.CreateSaturating(unchecked((int)0x80000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateSaturating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt64Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x0000000000000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(-9223372036854775808.0, NumberHelper.CreateSaturating(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateSaturating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateSaturatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateSaturating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual(-9223372036854775808.0, NumberHelper.CreateSaturating(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating((nint)0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating((nint)0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateSaturating((nint)0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0, NumberHelper.CreateSaturating(unchecked((nint)0x80000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateSaturatingFromSByteTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x00)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x01)); + AssertBitwiseEqual(127.0, NumberHelper.CreateSaturating(0x7F)); + AssertBitwiseEqual(-128.0, NumberHelper.CreateSaturating(unchecked((sbyte)0x80))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateSaturating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateSaturatingFromUInt16Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateSaturating(0x7FFF)); + AssertBitwiseEqual(32768.0, NumberHelper.CreateSaturating(0x8000)); + AssertBitwiseEqual(65535.0, NumberHelper.CreateSaturating(0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt32Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateSaturating(0x7FFFFFFF)); + AssertBitwiseEqual(2147483648.0, NumberHelper.CreateSaturating(0x80000000)); + AssertBitwiseEqual(4294967295.0, NumberHelper.CreateSaturating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt64Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(0x0000000000000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(9223372036854775808.0, NumberHelper.CreateSaturating(0x8000000000000000)); + AssertBitwiseEqual(18446744073709551615.0, NumberHelper.CreateSaturating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateSaturating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(9223372036854775808.0, NumberHelper.CreateSaturating(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual(18446744073709551615.0, NumberHelper.CreateSaturating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0, NumberHelper.CreateSaturating((nuint)0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateSaturating((nuint)0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateSaturating((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(2147483648.0, NumberHelper.CreateSaturating((nuint)0x80000000)); + // AssertBitwiseEqual(4294967295.0, NumberHelper.CreateSaturating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateTruncatingFromByteTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x00)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x01)); + AssertBitwiseEqual(127.0, NumberHelper.CreateTruncating(0x7F)); + AssertBitwiseEqual(128.0, NumberHelper.CreateTruncating(0x80)); + AssertBitwiseEqual(255.0, NumberHelper.CreateTruncating(0xFF)); + } + + [Fact] + public static void CreateTruncatingFromCharTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating((char)0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating((char)0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateTruncating((char)0x7FFF)); + AssertBitwiseEqual(32768.0, NumberHelper.CreateTruncating((char)0x8000)); + AssertBitwiseEqual(65535.0, NumberHelper.CreateTruncating((char)0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromInt16Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateTruncating(0x7FFF)); + AssertBitwiseEqual(-32768.0, NumberHelper.CreateTruncating(unchecked((short)0x8000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateTruncating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt32Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateTruncating(0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0, NumberHelper.CreateTruncating(unchecked((int)0x80000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateTruncating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt64Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x0000000000000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(-9223372036854775808.0, NumberHelper.CreateTruncating(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateTruncating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateTruncatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateTruncating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual(-9223372036854775808.0, NumberHelper.CreateTruncating(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating((nint)0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating((nint)0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateTruncating((nint)0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0, NumberHelper.CreateTruncating(unchecked((nint)0x80000000))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateTruncatingFromSByteTest() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x00)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x01)); + AssertBitwiseEqual(127.0, NumberHelper.CreateTruncating(0x7F)); + AssertBitwiseEqual(-128.0, NumberHelper.CreateTruncating(unchecked((sbyte)0x80))); + AssertBitwiseEqual(-1.0, NumberHelper.CreateTruncating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateTruncatingFromUInt16Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x0000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x0001)); + AssertBitwiseEqual(32767.0, NumberHelper.CreateTruncating(0x7FFF)); + AssertBitwiseEqual(32768.0, NumberHelper.CreateTruncating(0x8000)); + AssertBitwiseEqual(65535.0, NumberHelper.CreateTruncating(0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt32Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateTruncating(0x7FFFFFFF)); + AssertBitwiseEqual(2147483648.0, NumberHelper.CreateTruncating(0x80000000)); + AssertBitwiseEqual(4294967295.0, NumberHelper.CreateTruncating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt64Test() + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(0x0000000000000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(9223372036854775808.0, NumberHelper.CreateTruncating(0x8000000000000000)); + AssertBitwiseEqual(18446744073709551615.0, NumberHelper.CreateTruncating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0, NumberHelper.CreateTruncating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(9223372036854775808.0, NumberHelper.CreateTruncating(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual(18446744073709551615.0, NumberHelper.CreateTruncating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0, NumberHelper.CreateTruncating((nuint)0x00000000)); + AssertBitwiseEqual(1.0, NumberHelper.CreateTruncating((nuint)0x00000001)); + AssertBitwiseEqual(2147483647.0, NumberHelper.CreateTruncating((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(2147483648.0, NumberHelper.CreateTruncating((nuint)0x80000000)); + // AssertBitwiseEqual(4294967295.0, NumberHelper.CreateTruncating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void MaxTest() + { + AssertBitwiseEqual(1.0, NumberHelper.Max(double.NegativeInfinity, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(double.MinValue, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(-1.0, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(-MinNormal, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(-MaxSubnormal, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(-double.Epsilon, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(-0.0, 1.0)); + AssertBitwiseEqual(double.NaN, NumberHelper.Max(double.NaN, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(0.0, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(double.Epsilon, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(MaxSubnormal, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(MinNormal, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Max(1.0, 1.0)); + AssertBitwiseEqual(double.MaxValue, NumberHelper.Max(double.MaxValue, 1.0)); + AssertBitwiseEqual(double.PositiveInfinity, NumberHelper.Max(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void MinTest() + { + AssertBitwiseEqual(double.NegativeInfinity, NumberHelper.Min(double.NegativeInfinity, 1.0)); + AssertBitwiseEqual(double.MinValue, NumberHelper.Min(double.MinValue, 1.0)); + AssertBitwiseEqual(-1.0, NumberHelper.Min(-1.0, 1.0)); + AssertBitwiseEqual(-MinNormal, NumberHelper.Min(-MinNormal, 1.0)); + AssertBitwiseEqual(-MaxSubnormal, NumberHelper.Min(-MaxSubnormal, 1.0)); + AssertBitwiseEqual(-double.Epsilon, NumberHelper.Min(-double.Epsilon, 1.0)); + AssertBitwiseEqual(-0.0, NumberHelper.Min(-0.0, 1.0)); + AssertBitwiseEqual(double.NaN, NumberHelper.Min(double.NaN, 1.0)); + AssertBitwiseEqual(0.0, NumberHelper.Min(0.0, 1.0)); + AssertBitwiseEqual(double.Epsilon, NumberHelper.Min(double.Epsilon, 1.0)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Min(MaxSubnormal, 1.0)); + AssertBitwiseEqual(MinNormal, NumberHelper.Min(MinNormal, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Min(1.0, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Min(double.MaxValue, 1.0)); + AssertBitwiseEqual(1.0, NumberHelper.Min(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void SignTest() + { + Assert.Equal(-1, NumberHelper.Sign(double.NegativeInfinity)); + Assert.Equal(-1, NumberHelper.Sign(double.MinValue)); + Assert.Equal(-1, NumberHelper.Sign(-1.0)); + Assert.Equal(-1, NumberHelper.Sign(-MinNormal)); + Assert.Equal(-1, NumberHelper.Sign(-MaxSubnormal)); + Assert.Equal(-1, NumberHelper.Sign(-double.Epsilon)); + + Assert.Equal(0, NumberHelper.Sign(-0.0)); + Assert.Equal(0, NumberHelper.Sign(0.0)); + + Assert.Equal(1, NumberHelper.Sign(double.Epsilon)); + Assert.Equal(1, NumberHelper.Sign(MaxSubnormal)); + Assert.Equal(1, NumberHelper.Sign(MinNormal)); + Assert.Equal(1, NumberHelper.Sign(1.0)); + Assert.Equal(1, NumberHelper.Sign(double.MaxValue)); + Assert.Equal(1, NumberHelper.Sign(double.PositiveInfinity)); + + Assert.Throws(() => NumberHelper.Sign(double.NaN)); + } + + [Fact] + public static void TryCreateFromByteTest() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal(127.0, result); + + Assert.True(NumberHelper.TryCreate(0x80, out result)); + Assert.Equal(128.0, result); + + Assert.True(NumberHelper.TryCreate(0xFF, out result)); + Assert.Equal(255.0, result); + } + + [Fact] + public static void TryCreateFromCharTest() + { + double result; + + Assert.True(NumberHelper.TryCreate((char)0x0000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate((char)0x0001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate((char)0x7FFF, out result)); + Assert.Equal(32767.0, result); + + Assert.True(NumberHelper.TryCreate((char)0x8000, out result)); + Assert.Equal(32768.0, result); + + Assert.True(NumberHelper.TryCreate((char)0xFFFF, out result)); + Assert.Equal(65535.0, result); + } + + [Fact] + public static void TryCreateFromInt16Test() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal(32767.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0x8000), out result)); + Assert.Equal(-32768.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0xFFFF), out result)); + Assert.Equal(-1.0, result); + } + + [Fact] + public static void TryCreateFromInt32Test() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0x80000000), out result)); + Assert.Equal(-2147483648.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0xFFFFFFFF), out result)); + Assert.Equal(-1.0, result); + } + + [Fact] + public static void TryCreateFromInt64Test() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal(9223372036854775807.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0x8000000000000000)), out result)); + Assert.Equal(-9223372036854775808.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)), out result)); + Assert.Equal(-1.0, result); + } + + [Fact] + public static void TryCreateFromIntPtrTest() + { + double result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000000), out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000001), out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal(9223372036854775807.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x8000000000000000), out result)); + Assert.Equal(-9223372036854775808.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFFFFFFFFFF), out result)); + Assert.Equal(-1.0, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nint)0x00000000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate((nint)0x00000001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate((nint)0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x80000000), out result)); + Assert.Equal(-2147483648.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFF), out result)); + Assert.Equal(-1.0, result); + } + } + + [Fact] + public static void TryCreateFromSByteTest() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal(127.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0x80), out result)); + Assert.Equal(-128.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0xFF), out result)); + Assert.Equal(-1.0, result); + } + + [Fact] + public static void TryCreateFromUInt16Test() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal(32767.0, result); + + Assert.True(NumberHelper.TryCreate(0x8000, out result)); + Assert.Equal(32768.0, result); + + Assert.True(NumberHelper.TryCreate(0xFFFF, out result)); + Assert.Equal(65535.0, result); + } + + [Fact] + public static void TryCreateFromUInt32Test() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0, result); + + Assert.True(NumberHelper.TryCreate(0x80000000, out result)); + Assert.Equal(2147483648.0, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFF, out result)); + Assert.Equal(4294967295.0, result); + } + + [Fact] + public static void TryCreateFromUInt64Test() + { + double result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal(9223372036854775807.0, result); + + Assert.True(NumberHelper.TryCreate(0x8000000000000000, out result)); + Assert.Equal(9223372036854775808.0, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFFFFFFFFFF, out result)); + Assert.Equal(18446744073709551615.0, result); + } + + [Fact] + public static void TryCreateFromUIntPtrTest() + { + double result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000000), out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000001), out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal(9223372036854775807.0, result); + + // https://github.com/dotnet/roslyn/issues/60714 + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x8000000000000000), out result)); + // Assert.Equal(9223372036854775808.0, result); + // + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFFFFFFFFFF), out result)); + // Assert.Equal(18446744073709551615.0, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nuint)0x00000000, out result)); + Assert.Equal(0.0, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x00000001, out result)); + Assert.Equal(1.0, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0, result); + + // https://github.com/dotnet/roslyn/issues/60714 + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x80000000), out result)); + // Assert.Equal(2147483648.0, result); + // + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFF), out result)); + // Assert.Equal(4294967295.0, result); + } + } + + [Fact] + public static void op_SubtractionTest() + { + AssertBitwiseEqual(double.NegativeInfinity, SubtractionOperatorsHelper.op_Subtraction(double.NegativeInfinity, 1.0)); + AssertBitwiseEqual(double.MinValue, SubtractionOperatorsHelper.op_Subtraction(double.MinValue, 1.0)); + AssertBitwiseEqual(-2.0, SubtractionOperatorsHelper.op_Subtraction(-1.0, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(-MinNormal, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(-MaxSubnormal, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(-double.Epsilon, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(-0.0, 1.0)); + AssertBitwiseEqual(double.NaN, SubtractionOperatorsHelper.op_Subtraction(double.NaN, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(0.0, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(double.Epsilon, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(MaxSubnormal, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_Subtraction(MinNormal, 1.0)); + AssertBitwiseEqual(0.0, SubtractionOperatorsHelper.op_Subtraction(1.0, 1.0)); + AssertBitwiseEqual(double.MaxValue, SubtractionOperatorsHelper.op_Subtraction(double.MaxValue, 1.0)); + AssertBitwiseEqual(double.PositiveInfinity, SubtractionOperatorsHelper.op_Subtraction(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_CheckedSubtractionTest() + { + AssertBitwiseEqual(double.NegativeInfinity, SubtractionOperatorsHelper.op_CheckedSubtraction(double.NegativeInfinity, 1.0)); + AssertBitwiseEqual(double.MinValue, SubtractionOperatorsHelper.op_CheckedSubtraction(double.MinValue, 1.0)); + AssertBitwiseEqual(-2.0, SubtractionOperatorsHelper.op_CheckedSubtraction(-1.0, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(-MinNormal, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(-MaxSubnormal, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(-double.Epsilon, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(-0.0, 1.0)); + AssertBitwiseEqual(double.NaN, SubtractionOperatorsHelper.op_CheckedSubtraction(double.NaN, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(0.0, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(double.Epsilon, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(MaxSubnormal, 1.0)); + AssertBitwiseEqual(-1.0, SubtractionOperatorsHelper.op_CheckedSubtraction(MinNormal, 1.0)); + AssertBitwiseEqual(0.0, SubtractionOperatorsHelper.op_CheckedSubtraction(1.0, 1.0)); + AssertBitwiseEqual(double.MaxValue, SubtractionOperatorsHelper.op_CheckedSubtraction(double.MaxValue, 1.0)); + AssertBitwiseEqual(double.PositiveInfinity, SubtractionOperatorsHelper.op_CheckedSubtraction(double.PositiveInfinity, 1.0)); + } + + [Fact] + public static void op_UnaryNegationTest() + { + AssertBitwiseEqual(double.PositiveInfinity, UnaryNegationOperatorsHelper.op_UnaryNegation(double.NegativeInfinity)); + AssertBitwiseEqual(double.MaxValue, UnaryNegationOperatorsHelper.op_UnaryNegation(double.MinValue)); + AssertBitwiseEqual(1.0, UnaryNegationOperatorsHelper.op_UnaryNegation(-1.0)); + AssertBitwiseEqual(MinNormal, UnaryNegationOperatorsHelper.op_UnaryNegation(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, UnaryNegationOperatorsHelper.op_UnaryNegation(-MaxSubnormal)); + AssertBitwiseEqual(double.Epsilon, UnaryNegationOperatorsHelper.op_UnaryNegation(-double.Epsilon)); + AssertBitwiseEqual(0.0, UnaryNegationOperatorsHelper.op_UnaryNegation(-0.0)); + AssertBitwiseEqual(double.NaN, UnaryNegationOperatorsHelper.op_UnaryNegation(double.NaN)); + AssertBitwiseEqual(-0.0, UnaryNegationOperatorsHelper.op_UnaryNegation(0.0)); + AssertBitwiseEqual(-double.Epsilon, UnaryNegationOperatorsHelper.op_UnaryNegation(double.Epsilon)); + AssertBitwiseEqual(-MaxSubnormal, UnaryNegationOperatorsHelper.op_UnaryNegation(MaxSubnormal)); + AssertBitwiseEqual(-MinNormal, UnaryNegationOperatorsHelper.op_UnaryNegation(MinNormal)); + AssertBitwiseEqual(-1.0, UnaryNegationOperatorsHelper.op_UnaryNegation(1.0)); + AssertBitwiseEqual(double.MinValue, UnaryNegationOperatorsHelper.op_UnaryNegation(double.MaxValue)); + AssertBitwiseEqual(double.NegativeInfinity, UnaryNegationOperatorsHelper.op_UnaryNegation(double.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedUnaryNegationTest() + { + AssertBitwiseEqual(double.PositiveInfinity, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(double.NegativeInfinity)); + AssertBitwiseEqual(double.MaxValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(double.MinValue)); + AssertBitwiseEqual(1.0, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-1.0)); + AssertBitwiseEqual(MinNormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-MaxSubnormal)); + AssertBitwiseEqual(double.Epsilon, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-double.Epsilon)); + AssertBitwiseEqual(0.0, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-0.0)); + AssertBitwiseEqual(double.NaN, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(double.NaN)); + AssertBitwiseEqual(-0.0, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(0.0)); + AssertBitwiseEqual(-double.Epsilon, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(double.Epsilon)); + AssertBitwiseEqual(-MaxSubnormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(MaxSubnormal)); + AssertBitwiseEqual(-MinNormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(MinNormal)); + AssertBitwiseEqual(-1.0, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(1.0)); + AssertBitwiseEqual(double.MinValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(double.MaxValue)); + AssertBitwiseEqual(double.NegativeInfinity, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(double.PositiveInfinity)); + } + + [Fact] + public static void op_UnaryPlusTest() + { + AssertBitwiseEqual(double.NegativeInfinity, UnaryPlusOperatorsHelper.op_UnaryPlus(double.NegativeInfinity)); + AssertBitwiseEqual(double.MinValue, UnaryPlusOperatorsHelper.op_UnaryPlus(double.MinValue)); + AssertBitwiseEqual(-1.0, UnaryPlusOperatorsHelper.op_UnaryPlus(-1.0)); + AssertBitwiseEqual(-MinNormal, UnaryPlusOperatorsHelper.op_UnaryPlus(-MinNormal)); + AssertBitwiseEqual(-MaxSubnormal, UnaryPlusOperatorsHelper.op_UnaryPlus(-MaxSubnormal)); + AssertBitwiseEqual(-double.Epsilon, UnaryPlusOperatorsHelper.op_UnaryPlus(-double.Epsilon)); + AssertBitwiseEqual(-0.0, UnaryPlusOperatorsHelper.op_UnaryPlus(-0.0)); + AssertBitwiseEqual(double.NaN, UnaryPlusOperatorsHelper.op_UnaryPlus(double.NaN)); + AssertBitwiseEqual(0.0, UnaryPlusOperatorsHelper.op_UnaryPlus(0.0)); + AssertBitwiseEqual(double.Epsilon, UnaryPlusOperatorsHelper.op_UnaryPlus(double.Epsilon)); + AssertBitwiseEqual(MaxSubnormal, UnaryPlusOperatorsHelper.op_UnaryPlus(MaxSubnormal)); + AssertBitwiseEqual(MinNormal, UnaryPlusOperatorsHelper.op_UnaryPlus(MinNormal)); + AssertBitwiseEqual(1.0, UnaryPlusOperatorsHelper.op_UnaryPlus(1.0)); + AssertBitwiseEqual(double.MaxValue, UnaryPlusOperatorsHelper.op_UnaryPlus(double.MaxValue)); + AssertBitwiseEqual(double.PositiveInfinity, UnaryPlusOperatorsHelper.op_UnaryPlus(double.PositiveInfinity)); + } + [Theory] [MemberData(nameof(DoubleTests.Parse_Valid_TestData), MemberType = typeof(DoubleTests))] public static void ParseValidStringTest(string value, NumberStyles style, IFormatProvider provider, double expected) diff --git a/src/libraries/System.Runtime/tests/System/HalfTests.GenericMath.cs b/src/libraries/System.Runtime/tests/System/HalfTests.GenericMath.cs index a5be3cc2f6135..9b17a84248517 100644 --- a/src/libraries/System.Runtime/tests/System/HalfTests.GenericMath.cs +++ b/src/libraries/System.Runtime/tests/System/HalfTests.GenericMath.cs @@ -2,13 +2,1358 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Globalization; -using System.Runtime.Versioning; using Xunit; namespace System.Tests { public class HalfTests_GenericMath { + private static Half MinNormal => BitConverter.UInt16BitsToHalf(0x0400); + + private static Half MaxSubnormal => BitConverter.UInt16BitsToHalf(0x03FF); + + private static Half NegativeOne => BitConverter.UInt16BitsToHalf(0xBC00); + + private static Half NegativeTwo => BitConverter.UInt16BitsToHalf(0xC000); + + private static Half NegativeZero => BitConverter.UInt16BitsToHalf(0x8000); + + private static Half PositiveOne => BitConverter.UInt16BitsToHalf(0x3C00); + + private static Half PositiveTwo => BitConverter.UInt16BitsToHalf(0x4000); + + private static Half PositiveZero => BitConverter.UInt16BitsToHalf(0x0000); + + private static void AssertBitwiseEqual(Half expected, Half actual) + { + ushort expectedBits = BitConverter.HalfToUInt16Bits(expected); + ushort actualBits = BitConverter.HalfToUInt16Bits(actual); + + if (expectedBits == actualBits) + { + return; + } + + if (Half.IsNaN(expected) && Half.IsNaN(actual)) + { + return; + } + + throw new Xunit.Sdk.EqualException(expected, actual); + } + + [Fact] + public static void AdditiveIdentityTest() + { + AssertBitwiseEqual(PositiveZero, AdditiveIdentityHelper.AdditiveIdentity); + } + + [Fact] + public static void MinValueTest() + { + AssertBitwiseEqual(Half.MinValue, MinMaxValueHelper.MinValue); + } + + [Fact] + public static void MaxValueTest() + { + AssertBitwiseEqual(Half.MaxValue, MinMaxValueHelper.MaxValue); + } + + [Fact] + public static void MultiplicativeIdentityTest() + { + AssertBitwiseEqual(PositiveOne, MultiplicativeIdentityHelper.MultiplicativeIdentity); + } + + [Fact] + public static void NegativeOneTest() + { + Assert.Equal(NegativeOne, SignedNumberHelper.NegativeOne); + } + + [Fact] + public static void OneTest() + { + AssertBitwiseEqual(PositiveOne, NumberBaseHelper.One); + } + + [Fact] + public static void ZeroTest() + { + AssertBitwiseEqual(PositiveZero, NumberBaseHelper.Zero); + } + + [Fact] + public static void op_AdditionTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, AdditionOperatorsHelper.op_Addition(Half.NegativeInfinity, PositiveOne)); + AssertBitwiseEqual(Half.MinValue, AdditionOperatorsHelper.op_Addition(Half.MinValue, PositiveOne)); + AssertBitwiseEqual(PositiveZero, AdditionOperatorsHelper.op_Addition(NegativeOne, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(-MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(-MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(-Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(NegativeZero, PositiveOne)); + AssertBitwiseEqual(Half.NaN, AdditionOperatorsHelper.op_Addition(Half.NaN, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(PositiveZero, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_Addition(MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveTwo, AdditionOperatorsHelper.op_Addition(PositiveOne, PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, AdditionOperatorsHelper.op_Addition(Half.MaxValue, PositiveOne)); + AssertBitwiseEqual(Half.PositiveInfinity, AdditionOperatorsHelper.op_Addition(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_CheckedAdditionTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, AdditionOperatorsHelper.op_CheckedAddition(Half.NegativeInfinity, PositiveOne)); + AssertBitwiseEqual(Half.MinValue, AdditionOperatorsHelper.op_CheckedAddition(Half.MinValue, PositiveOne)); + AssertBitwiseEqual(PositiveZero, AdditionOperatorsHelper.op_CheckedAddition(NegativeOne, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(-MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(-MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(-Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(NegativeZero, PositiveOne)); + AssertBitwiseEqual(Half.NaN, AdditionOperatorsHelper.op_CheckedAddition(Half.NaN, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(PositiveZero, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, AdditionOperatorsHelper.op_CheckedAddition(MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveTwo, AdditionOperatorsHelper.op_CheckedAddition(PositiveOne, PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, AdditionOperatorsHelper.op_CheckedAddition(Half.MaxValue, PositiveOne)); + AssertBitwiseEqual(Half.PositiveInfinity, AdditionOperatorsHelper.op_CheckedAddition(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void IsPow2Test() + { + Assert.False(BinaryNumberHelper.IsPow2(Half.NegativeInfinity)); + Assert.False(BinaryNumberHelper.IsPow2(Half.MinValue)); + Assert.False(BinaryNumberHelper.IsPow2(NegativeOne)); + Assert.False(BinaryNumberHelper.IsPow2(-MinNormal)); + Assert.False(BinaryNumberHelper.IsPow2(-MaxSubnormal)); + Assert.False(BinaryNumberHelper.IsPow2(-Half.Epsilon)); + Assert.False(BinaryNumberHelper.IsPow2(NegativeZero)); + Assert.False(BinaryNumberHelper.IsPow2(Half.NaN)); + Assert.False(BinaryNumberHelper.IsPow2(PositiveZero)); + Assert.False(BinaryNumberHelper.IsPow2(Half.Epsilon)); + Assert.False(BinaryNumberHelper.IsPow2(MaxSubnormal)); + Assert.True(BinaryNumberHelper.IsPow2(MinNormal)); + Assert.True(BinaryNumberHelper.IsPow2(PositiveOne)); + Assert.False(BinaryNumberHelper.IsPow2(Half.MaxValue)); + Assert.False(BinaryNumberHelper.IsPow2(Half.PositiveInfinity)); + } + + [Fact] + public static void Log2Test() + { + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(Half.MinValue)); + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(NegativeOne)); + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(-MinNormal)); + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(-MaxSubnormal)); + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(-Half.Epsilon)); + AssertBitwiseEqual(Half.NegativeInfinity, BinaryNumberHelper.Log2(NegativeZero)); + AssertBitwiseEqual(Half.NaN, BinaryNumberHelper.Log2(Half.NaN)); + AssertBitwiseEqual(Half.NegativeInfinity, BinaryNumberHelper.Log2(PositiveZero)); + AssertBitwiseEqual((Half)(-24.0f), BinaryNumberHelper.Log2(Half.Epsilon)); + AssertBitwiseEqual((Half)(-14.0f), BinaryNumberHelper.Log2(MaxSubnormal)); + AssertBitwiseEqual((Half)(-14.0f), BinaryNumberHelper.Log2(MinNormal)); + AssertBitwiseEqual(PositiveZero, BinaryNumberHelper.Log2(PositiveOne)); + AssertBitwiseEqual((Half)16.0f, BinaryNumberHelper.Log2(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, BinaryNumberHelper.Log2(Half.PositiveInfinity)); + } + + [Fact] + public static void op_LessThanTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThan(Half.NegativeInfinity, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(Half.MinValue, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(NegativeOne, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-MinNormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-MaxSubnormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-Half.Epsilon, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(NegativeZero, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(Half.NaN, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(PositiveZero, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(Half.Epsilon, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(MaxSubnormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(MinNormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(PositiveOne, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(Half.MaxValue, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_LessThanOrEqualTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(Half.NegativeInfinity, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(Half.MinValue, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(NegativeOne, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-MinNormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-MaxSubnormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-Half.Epsilon, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(NegativeZero, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(Half.NaN, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(PositiveZero, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(Half.Epsilon, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(MaxSubnormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(MinNormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(PositiveOne, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(Half.MaxValue, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_GreaterThanTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(Half.NegativeInfinity, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(Half.MinValue, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(NegativeOne, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-MinNormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-MaxSubnormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-Half.Epsilon, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(NegativeZero, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(Half.NaN, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(PositiveZero, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(Half.Epsilon, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(MaxSubnormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(MinNormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(PositiveOne, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(Half.MaxValue, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_GreaterThanOrEqualTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(Half.NegativeInfinity, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(Half.MinValue, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(NegativeOne, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-MinNormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-MaxSubnormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-Half.Epsilon, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(NegativeZero, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(Half.NaN, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(PositiveZero, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(Half.Epsilon, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(MaxSubnormal, PositiveOne)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(MinNormal, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(PositiveOne, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(Half.MaxValue, PositiveOne)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_DecrementTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, DecrementOperatorsHelper.op_Decrement(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MinValue, DecrementOperatorsHelper.op_Decrement(Half.MinValue)); + AssertBitwiseEqual(NegativeTwo, DecrementOperatorsHelper.op_Decrement(NegativeOne)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(-MinNormal)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(-MaxSubnormal)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(-Half.Epsilon)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(NegativeZero)); + AssertBitwiseEqual(Half.NaN, DecrementOperatorsHelper.op_Decrement(Half.NaN)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(PositiveZero)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(Half.Epsilon)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(MaxSubnormal)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_Decrement(MinNormal)); + AssertBitwiseEqual(PositiveZero, DecrementOperatorsHelper.op_Decrement(PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, DecrementOperatorsHelper.op_Decrement(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, DecrementOperatorsHelper.op_Decrement(Half.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedDecrementTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, DecrementOperatorsHelper.op_CheckedDecrement(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MinValue, DecrementOperatorsHelper.op_CheckedDecrement(Half.MinValue)); + AssertBitwiseEqual(NegativeTwo, DecrementOperatorsHelper.op_CheckedDecrement(NegativeOne)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(-MinNormal)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(-MaxSubnormal)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(-Half.Epsilon)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(NegativeZero)); + AssertBitwiseEqual(Half.NaN, DecrementOperatorsHelper.op_CheckedDecrement(Half.NaN)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(PositiveZero)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(Half.Epsilon)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(MaxSubnormal)); + AssertBitwiseEqual(NegativeOne, DecrementOperatorsHelper.op_CheckedDecrement(MinNormal)); + AssertBitwiseEqual(PositiveZero, DecrementOperatorsHelper.op_CheckedDecrement(PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, DecrementOperatorsHelper.op_CheckedDecrement(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, DecrementOperatorsHelper.op_CheckedDecrement(Half.PositiveInfinity)); + } + + [Fact] + public static void op_DivisionTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, DivisionOperatorsHelper.op_Division(Half.NegativeInfinity, PositiveTwo)); + AssertBitwiseEqual((Half)(-32750.0f), DivisionOperatorsHelper.op_Division(Half.MinValue, PositiveTwo)); + AssertBitwiseEqual((Half)(-0.5f), DivisionOperatorsHelper.op_Division(NegativeOne, PositiveTwo)); + AssertBitwiseEqual((Half)(-3.05E-05f), DivisionOperatorsHelper.op_Division(-MinNormal, PositiveTwo)); + AssertBitwiseEqual((Half)(-3.05E-05f), DivisionOperatorsHelper.op_Division(-MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual(NegativeZero, DivisionOperatorsHelper.op_Division(-Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual(NegativeZero, DivisionOperatorsHelper.op_Division(NegativeZero, PositiveTwo)); + AssertBitwiseEqual(Half.NaN, DivisionOperatorsHelper.op_Division(Half.NaN, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, DivisionOperatorsHelper.op_Division(PositiveZero, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, DivisionOperatorsHelper.op_Division(Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual((Half)3.05E-05f, DivisionOperatorsHelper.op_Division(MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual((Half)3.05E-05f, DivisionOperatorsHelper.op_Division(MinNormal, PositiveTwo)); + AssertBitwiseEqual((Half)0.5f, DivisionOperatorsHelper.op_Division(PositiveOne, PositiveTwo)); + AssertBitwiseEqual((Half)32750.0f, DivisionOperatorsHelper.op_Division(Half.MaxValue, PositiveTwo)); + AssertBitwiseEqual(Half.PositiveInfinity, DivisionOperatorsHelper.op_Division(Half.PositiveInfinity, PositiveTwo)); + } + + [Fact] + public static void op_CheckedDivisionTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, DivisionOperatorsHelper.op_CheckedDivision(Half.NegativeInfinity, PositiveTwo)); + AssertBitwiseEqual((Half)(-32750.0f), DivisionOperatorsHelper.op_CheckedDivision(Half.MinValue, PositiveTwo)); + AssertBitwiseEqual((Half)(-0.5f), DivisionOperatorsHelper.op_CheckedDivision(NegativeOne, PositiveTwo)); + AssertBitwiseEqual((Half)(-3.05E-05f), DivisionOperatorsHelper.op_CheckedDivision(-MinNormal, PositiveTwo)); + AssertBitwiseEqual((Half)(-3.05E-05f), DivisionOperatorsHelper.op_CheckedDivision(-MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual(NegativeZero, DivisionOperatorsHelper.op_CheckedDivision(-Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual(NegativeZero, DivisionOperatorsHelper.op_CheckedDivision(NegativeZero, PositiveTwo)); + AssertBitwiseEqual(Half.NaN, DivisionOperatorsHelper.op_CheckedDivision(Half.NaN, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, DivisionOperatorsHelper.op_CheckedDivision(PositiveZero, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, DivisionOperatorsHelper.op_CheckedDivision(Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual((Half)3.05E-05f, DivisionOperatorsHelper.op_CheckedDivision(MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual((Half)3.05E-05f, DivisionOperatorsHelper.op_CheckedDivision(MinNormal, PositiveTwo)); + AssertBitwiseEqual((Half)0.5f, DivisionOperatorsHelper.op_CheckedDivision(PositiveOne, PositiveTwo)); + AssertBitwiseEqual((Half)32750.0f, DivisionOperatorsHelper.op_CheckedDivision(Half.MaxValue, PositiveTwo)); + AssertBitwiseEqual(Half.PositiveInfinity, DivisionOperatorsHelper.op_CheckedDivision(Half.PositiveInfinity, PositiveTwo)); + } + + [Fact] + public static void op_EqualityTest() + { + Assert.False(EqualityOperatorsHelper.op_Equality(Half.NegativeInfinity, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(Half.MinValue, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(NegativeOne, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(-MinNormal, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(-MaxSubnormal, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(-Half.Epsilon, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(NegativeZero, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(Half.NaN, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(PositiveZero, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(Half.Epsilon, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(MaxSubnormal, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(MinNormal, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Equality(PositiveOne, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(Half.MaxValue, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Equality(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_InequalityTest() + { + Assert.True(EqualityOperatorsHelper.op_Inequality(Half.NegativeInfinity, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(Half.MinValue, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(NegativeOne, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-MinNormal, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-MaxSubnormal, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-Half.Epsilon, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(NegativeZero, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(Half.NaN, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(PositiveZero, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(Half.Epsilon, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(MaxSubnormal, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(MinNormal, PositiveOne)); + Assert.False(EqualityOperatorsHelper.op_Inequality(PositiveOne, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(Half.MaxValue, PositiveOne)); + Assert.True(EqualityOperatorsHelper.op_Inequality(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_IncrementTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, IncrementOperatorsHelper.op_Increment(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MinValue, IncrementOperatorsHelper.op_Increment(Half.MinValue)); + AssertBitwiseEqual(PositiveZero, IncrementOperatorsHelper.op_Increment(NegativeOne)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(-MinNormal)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(-MaxSubnormal)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(-Half.Epsilon)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(NegativeZero)); + AssertBitwiseEqual(Half.NaN, IncrementOperatorsHelper.op_Increment(Half.NaN)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(PositiveZero)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(Half.Epsilon)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(MaxSubnormal)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_Increment(MinNormal)); + AssertBitwiseEqual(PositiveTwo, IncrementOperatorsHelper.op_Increment(PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, IncrementOperatorsHelper.op_Increment(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, IncrementOperatorsHelper.op_Increment(Half.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedIncrementTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, IncrementOperatorsHelper.op_CheckedIncrement(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MinValue, IncrementOperatorsHelper.op_CheckedIncrement(Half.MinValue)); + AssertBitwiseEqual(PositiveZero, IncrementOperatorsHelper.op_CheckedIncrement(NegativeOne)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(-MinNormal)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(-MaxSubnormal)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(-Half.Epsilon)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(NegativeZero)); + AssertBitwiseEqual(Half.NaN, IncrementOperatorsHelper.op_CheckedIncrement(Half.NaN)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(PositiveZero)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(Half.Epsilon)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(MaxSubnormal)); + AssertBitwiseEqual(PositiveOne, IncrementOperatorsHelper.op_CheckedIncrement(MinNormal)); + AssertBitwiseEqual(PositiveTwo, IncrementOperatorsHelper.op_CheckedIncrement(PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, IncrementOperatorsHelper.op_CheckedIncrement(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, IncrementOperatorsHelper.op_CheckedIncrement(Half.PositiveInfinity)); + } + + [Fact] + public static void op_ModulusTest() + { + AssertBitwiseEqual(Half.NaN, ModulusOperatorsHelper.op_Modulus(Half.NegativeInfinity, PositiveTwo)); + + // https://github.com/dotnet/runtime/issues/67993 + // AssertBitwiseEqual(NegativeZero, ModulusOperatorsHelper.op_Modulus(Half.MinValue, PositiveTwo)); + + AssertBitwiseEqual(NegativeOne, ModulusOperatorsHelper.op_Modulus(NegativeOne, PositiveTwo)); + AssertBitwiseEqual(-MinNormal, ModulusOperatorsHelper.op_Modulus(-MinNormal, PositiveTwo)); + AssertBitwiseEqual(-MaxSubnormal, ModulusOperatorsHelper.op_Modulus(-MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual(-Half.Epsilon, ModulusOperatorsHelper.op_Modulus(-Half.Epsilon, PositiveTwo)); ; + + // https://github.com/dotnet/runtime/issues/67993 + // AssertBitwiseEqual(NegativeZero, ModulusOperatorsHelper.op_Modulus(NegativeZero, PositiveTwo)); + + AssertBitwiseEqual(Half.NaN, ModulusOperatorsHelper.op_Modulus(Half.NaN, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, ModulusOperatorsHelper.op_Modulus(PositiveZero, PositiveTwo)); + AssertBitwiseEqual(Half.Epsilon, ModulusOperatorsHelper.op_Modulus(Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual(MaxSubnormal, ModulusOperatorsHelper.op_Modulus(MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual(MinNormal, ModulusOperatorsHelper.op_Modulus(MinNormal, PositiveTwo)); + AssertBitwiseEqual(PositiveOne, ModulusOperatorsHelper.op_Modulus(PositiveOne, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, ModulusOperatorsHelper.op_Modulus(Half.MaxValue, PositiveTwo)); + AssertBitwiseEqual(Half.NaN, ModulusOperatorsHelper.op_Modulus(Half.PositiveInfinity, PositiveTwo)); + } + + [Fact] + public static void op_MultiplyTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, MultiplyOperatorsHelper.op_Multiply(Half.NegativeInfinity, PositiveTwo)); + AssertBitwiseEqual(Half.NegativeInfinity, MultiplyOperatorsHelper.op_Multiply(Half.MinValue, PositiveTwo)); + AssertBitwiseEqual(NegativeTwo, MultiplyOperatorsHelper.op_Multiply(NegativeOne, PositiveTwo)); + AssertBitwiseEqual((Half)(-0.0001221f), MultiplyOperatorsHelper.op_Multiply(-MinNormal, PositiveTwo)); + AssertBitwiseEqual((Half)(-0.00012195f), MultiplyOperatorsHelper.op_Multiply(-MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual((Half)(-1E-07f), MultiplyOperatorsHelper.op_Multiply(-Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual(NegativeZero, MultiplyOperatorsHelper.op_Multiply(NegativeZero, PositiveTwo)); + AssertBitwiseEqual(Half.NaN, MultiplyOperatorsHelper.op_Multiply(Half.NaN, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, MultiplyOperatorsHelper.op_Multiply(PositiveZero, PositiveTwo)); + AssertBitwiseEqual((Half)1E-07f, MultiplyOperatorsHelper.op_Multiply(Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual((Half)0.00012195f, MultiplyOperatorsHelper.op_Multiply(MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual((Half)0.0001221f, MultiplyOperatorsHelper.op_Multiply(MinNormal, PositiveTwo)); + AssertBitwiseEqual(PositiveTwo, MultiplyOperatorsHelper.op_Multiply(PositiveOne, PositiveTwo)); + AssertBitwiseEqual(Half.PositiveInfinity, MultiplyOperatorsHelper.op_Multiply(Half.MaxValue, PositiveTwo)); + AssertBitwiseEqual(Half.PositiveInfinity, MultiplyOperatorsHelper.op_Multiply(Half.PositiveInfinity, PositiveTwo)); + } + + [Fact] + public static void op_CheckedMultiplyTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(Half.NegativeInfinity, PositiveTwo)); + AssertBitwiseEqual(Half.NegativeInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(Half.MinValue, PositiveTwo)); + AssertBitwiseEqual(NegativeTwo, MultiplyOperatorsHelper.op_CheckedMultiply(NegativeOne, PositiveTwo)); + AssertBitwiseEqual((Half)(-0.0001221f), MultiplyOperatorsHelper.op_CheckedMultiply(-MinNormal, PositiveTwo)); + AssertBitwiseEqual((Half)(-0.00012195f), MultiplyOperatorsHelper.op_CheckedMultiply(-MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual((Half)(-1E-07f), MultiplyOperatorsHelper.op_CheckedMultiply(-Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual(NegativeZero, MultiplyOperatorsHelper.op_CheckedMultiply(NegativeZero, PositiveTwo)); + AssertBitwiseEqual(Half.NaN, MultiplyOperatorsHelper.op_CheckedMultiply(Half.NaN, PositiveTwo)); + AssertBitwiseEqual(PositiveZero, MultiplyOperatorsHelper.op_CheckedMultiply(PositiveZero, PositiveTwo)); + AssertBitwiseEqual((Half)1E-07f, MultiplyOperatorsHelper.op_CheckedMultiply(Half.Epsilon, PositiveTwo)); + AssertBitwiseEqual((Half)0.00012195f, MultiplyOperatorsHelper.op_CheckedMultiply(MaxSubnormal, PositiveTwo)); + AssertBitwiseEqual((Half)0.0001221f, MultiplyOperatorsHelper.op_CheckedMultiply(MinNormal, PositiveTwo)); + AssertBitwiseEqual(PositiveTwo, MultiplyOperatorsHelper.op_CheckedMultiply(PositiveOne, PositiveTwo)); + AssertBitwiseEqual(Half.PositiveInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(Half.MaxValue, PositiveTwo)); + AssertBitwiseEqual(Half.PositiveInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(Half.PositiveInfinity, PositiveTwo)); + } + + [Fact] + public static void AbsTest() + { + AssertBitwiseEqual(Half.PositiveInfinity, NumberHelper.Abs(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MaxValue, NumberHelper.Abs(Half.MinValue)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Abs(NegativeOne)); + AssertBitwiseEqual(MinNormal, NumberHelper.Abs(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Abs(-MaxSubnormal)); + AssertBitwiseEqual(Half.Epsilon, NumberHelper.Abs(-Half.Epsilon)); + AssertBitwiseEqual(PositiveZero, NumberHelper.Abs(NegativeZero)); + AssertBitwiseEqual(Half.NaN, NumberHelper.Abs(Half.NaN)); + AssertBitwiseEqual(PositiveZero, NumberHelper.Abs(PositiveZero)); + AssertBitwiseEqual(Half.Epsilon, NumberHelper.Abs(Half.Epsilon)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Abs(MaxSubnormal)); + AssertBitwiseEqual(MinNormal, NumberHelper.Abs(MinNormal)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Abs(PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, NumberHelper.Abs(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, NumberHelper.Abs(Half.PositiveInfinity)); + } + + [Fact] + public static void ClampTest() + { + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(Half.NegativeInfinity, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(Half.MinValue, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(NegativeOne, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(-MinNormal, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(-MaxSubnormal, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(-Half.Epsilon, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(NegativeZero, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(Half.NaN, NumberHelper.Clamp(Half.NaN, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(PositiveZero, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(Half.Epsilon, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(MaxSubnormal, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(MinNormal, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Clamp(PositiveOne, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual((Half)63.0f, NumberHelper.Clamp(Half.MaxValue, PositiveOne, (Half)63.0f)); + AssertBitwiseEqual((Half)63.0f, NumberHelper.Clamp(Half.PositiveInfinity, PositiveOne, (Half)63.0f)); + } + + [Fact] + public static void CreateCheckedFromByteTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x00)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x01)); + AssertBitwiseEqual((Half)127.0f, NumberHelper.CreateChecked(0x7F)); + AssertBitwiseEqual((Half)128.0f, NumberHelper.CreateChecked(0x80)); + AssertBitwiseEqual((Half)255.0f, NumberHelper.CreateChecked(0xFF)); + } + + [Fact] + public static void CreateCheckedFromCharTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked((char)0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked((char)0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateChecked((char)0x7FFF)); + AssertBitwiseEqual((Half)32768.0f, NumberHelper.CreateChecked((char)0x8000)); + AssertBitwiseEqual((Half)65535.0f, NumberHelper.CreateChecked((char)0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromInt16Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateChecked(0x7FFF)); + AssertBitwiseEqual((Half)(-32768.0f), NumberHelper.CreateChecked(unchecked((short)0x8000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateChecked(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt32Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateChecked(0x7FFFFFFF)); + AssertBitwiseEqual((Half)(-2147483648.0f), NumberHelper.CreateChecked(unchecked((int)0x80000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateChecked(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt64Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x0000000000000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x0000000000000001)); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual((Half)(-9223372036854775808.0f), NumberHelper.CreateChecked(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateChecked(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateCheckedFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateChecked(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual((Half)(-9223372036854775808.0f), NumberHelper.CreateChecked(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked((nint)0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked((nint)0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateChecked((nint)0x7FFFFFFF)); + AssertBitwiseEqual((Half)(-2147483648.0f), NumberHelper.CreateChecked(unchecked((nint)0x80000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateCheckedFromSByteTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x00)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x01)); + AssertBitwiseEqual((Half)127.0f, NumberHelper.CreateChecked(0x7F)); + AssertBitwiseEqual((Half)(-128.0f), NumberHelper.CreateChecked(unchecked((sbyte)0x80))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateChecked(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateCheckedFromUInt16Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateChecked(0x7FFF)); + AssertBitwiseEqual((Half)32768.0f, NumberHelper.CreateChecked(0x8000)); + AssertBitwiseEqual((Half)65535.0f, NumberHelper.CreateChecked(0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt32Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateChecked(0x7FFFFFFF)); + AssertBitwiseEqual((Half)2147483648.0f, NumberHelper.CreateChecked(0x80000000)); + AssertBitwiseEqual((Half)4294967295.0f, NumberHelper.CreateChecked(0xFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt64Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(0x0000000000000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(0x0000000000000001)); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual((Half)9223372036854775808.0f, NumberHelper.CreateChecked(0x8000000000000000)); + AssertBitwiseEqual((Half)18446744073709551615.0f, NumberHelper.CreateChecked(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateChecked(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual((Half)9223372036854775808.0f, NumberHelper.CreateChecked(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual((Half)18446744073709551615.0f,NumberHelper.CreateChecked(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateChecked((nuint)0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateChecked((nuint)0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateChecked((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual((Half)2147483648.0f, NumberHelper.CreateChecked((nuint)0x80000000)); + // AssertBitwiseEqual((Half)4294967295.0f, NumberHelper.CreateChecked((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateSaturatingFromByteTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x00)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x01)); + AssertBitwiseEqual((Half)127.0f, NumberHelper.CreateSaturating(0x7F)); + AssertBitwiseEqual((Half)128.0f, NumberHelper.CreateSaturating(0x80)); + AssertBitwiseEqual((Half)255.0f, NumberHelper.CreateSaturating(0xFF)); + } + + [Fact] + public static void CreateSaturatingFromCharTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating((char)0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating((char)0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateSaturating((char)0x7FFF)); + AssertBitwiseEqual((Half)32768.0f, NumberHelper.CreateSaturating((char)0x8000)); + AssertBitwiseEqual((Half)65535.0f, NumberHelper.CreateSaturating((char)0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromInt16Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateSaturating(0x7FFF)); + AssertBitwiseEqual((Half)(-32768.0f), NumberHelper.CreateSaturating(unchecked((short)0x8000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateSaturating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt32Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateSaturating(0x7FFFFFFF)); + AssertBitwiseEqual((Half)(-2147483648.0f), NumberHelper.CreateSaturating(unchecked((int)0x80000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateSaturating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt64Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x0000000000000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x0000000000000001)); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual((Half)(-9223372036854775808.0f), NumberHelper.CreateSaturating(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateSaturating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateSaturatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateSaturating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual((Half)(-9223372036854775808.0f), NumberHelper.CreateSaturating(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating((nint)0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating((nint)0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateSaturating((nint)0x7FFFFFFF)); + AssertBitwiseEqual((Half)(-2147483648.0f), NumberHelper.CreateSaturating(unchecked((nint)0x80000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateSaturatingFromSByteTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x00)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x01)); + AssertBitwiseEqual((Half)127.0f, NumberHelper.CreateSaturating(0x7F)); + AssertBitwiseEqual((Half)(-128.0f), NumberHelper.CreateSaturating(unchecked((sbyte)0x80))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateSaturating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateSaturatingFromUInt16Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateSaturating(0x7FFF)); + AssertBitwiseEqual((Half)32768.0f, NumberHelper.CreateSaturating(0x8000)); + AssertBitwiseEqual((Half)65535.0f, NumberHelper.CreateSaturating(0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt32Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateSaturating(0x7FFFFFFF)); + AssertBitwiseEqual((Half)2147483648.0f, NumberHelper.CreateSaturating(0x80000000)); + AssertBitwiseEqual((Half)4294967295.0f, NumberHelper.CreateSaturating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt64Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(0x0000000000000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(0x0000000000000001)); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual((Half)9223372036854775808.0f, NumberHelper.CreateSaturating(0x8000000000000000)); + AssertBitwiseEqual((Half)18446744073709551615.0f, NumberHelper.CreateSaturating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateSaturating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual((Half)9223372036854775808.0f, NumberHelper.CreateSaturating(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual((Half)18446744073709551615.0f, NumberHelper.CreateSaturating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateSaturating((nuint)0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateSaturating((nuint)0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateSaturating((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual((Half)2147483648.0f, NumberHelper.CreateSaturating((nuint)0x80000000)); + // AssertBitwiseEqual((Half)4294967295.0f, NumberHelper.CreateSaturating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateTruncatingFromByteTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x00)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x01)); + AssertBitwiseEqual((Half)127.0f, NumberHelper.CreateTruncating(0x7F)); + AssertBitwiseEqual((Half)128.0f, NumberHelper.CreateTruncating(0x80)); + AssertBitwiseEqual((Half)255.0f, NumberHelper.CreateTruncating(0xFF)); + } + + [Fact] + public static void CreateTruncatingFromCharTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating((char)0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating((char)0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateTruncating((char)0x7FFF)); + AssertBitwiseEqual((Half)32768.0f, NumberHelper.CreateTruncating((char)0x8000)); + AssertBitwiseEqual((Half)65535.0f, NumberHelper.CreateTruncating((char)0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromInt16Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateTruncating(0x7FFF)); + AssertBitwiseEqual((Half)(-32768.0f), NumberHelper.CreateTruncating(unchecked((short)0x8000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateTruncating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt32Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateTruncating(0x7FFFFFFF)); + AssertBitwiseEqual((Half)(-2147483648.0f), NumberHelper.CreateTruncating(unchecked((int)0x80000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateTruncating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt64Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x0000000000000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x0000000000000001)); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual((Half)(-9223372036854775808.0f), NumberHelper.CreateTruncating(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateTruncating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateTruncatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateTruncating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual((Half)(-9223372036854775808.0f), NumberHelper.CreateTruncating(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating((nint)0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating((nint)0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateTruncating((nint)0x7FFFFFFF)); + AssertBitwiseEqual((Half)(-2147483648.0f), NumberHelper.CreateTruncating(unchecked((nint)0x80000000))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateTruncatingFromSByteTest() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x00)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x01)); + AssertBitwiseEqual((Half)127.0f, NumberHelper.CreateTruncating(0x7F)); + AssertBitwiseEqual((Half)(-128.0f), NumberHelper.CreateTruncating(unchecked((sbyte)0x80))); + AssertBitwiseEqual(NegativeOne, NumberHelper.CreateTruncating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateTruncatingFromUInt16Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x0000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x0001)); + AssertBitwiseEqual((Half)32767.0f, NumberHelper.CreateTruncating(0x7FFF)); + AssertBitwiseEqual((Half)32768.0f, NumberHelper.CreateTruncating(0x8000)); + AssertBitwiseEqual((Half)65535.0f, NumberHelper.CreateTruncating(0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt32Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateTruncating(0x7FFFFFFF)); + AssertBitwiseEqual((Half)2147483648.0f, NumberHelper.CreateTruncating(0x80000000)); + AssertBitwiseEqual((Half)4294967295.0f, NumberHelper.CreateTruncating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt64Test() + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(0x0000000000000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(0x0000000000000001)); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual((Half)9223372036854775808.0f, NumberHelper.CreateTruncating(0x8000000000000000)); + AssertBitwiseEqual((Half)18446744073709551615.0f, NumberHelper.CreateTruncating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual((Half)9223372036854775807.0f, NumberHelper.CreateTruncating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual((Half)9223372036854775808.0f, NumberHelper.CreateTruncating(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual((Half)18446744073709551615.0f, NumberHelper.CreateTruncating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(PositiveZero, NumberHelper.CreateTruncating((nuint)0x00000000)); + AssertBitwiseEqual(PositiveOne, NumberHelper.CreateTruncating((nuint)0x00000001)); + AssertBitwiseEqual((Half)2147483647.0f, NumberHelper.CreateTruncating((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual((Half)2147483648.0f, NumberHelper.CreateTruncating((nuint)0x80000000)); + // AssertBitwiseEqual((Half)4294967295.0f, NumberHelper.CreateTruncating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void MaxTest() + { + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(Half.NegativeInfinity, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(Half.MinValue, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(NegativeOne, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(-MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(-MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(-Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(NegativeZero, PositiveOne)); + AssertBitwiseEqual(Half.NaN, NumberHelper.Max(Half.NaN, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(PositiveZero, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Max(PositiveOne, PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, NumberHelper.Max(Half.MaxValue, PositiveOne)); + AssertBitwiseEqual(Half.PositiveInfinity, NumberHelper.Max(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void MinTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, NumberHelper.Min(Half.NegativeInfinity, PositiveOne)); + AssertBitwiseEqual(Half.MinValue, NumberHelper.Min(Half.MinValue, PositiveOne)); + AssertBitwiseEqual(NegativeOne, NumberHelper.Min(NegativeOne, PositiveOne)); + AssertBitwiseEqual(-MinNormal, NumberHelper.Min(-MinNormal, PositiveOne)); + AssertBitwiseEqual(-MaxSubnormal, NumberHelper.Min(-MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(-Half.Epsilon, NumberHelper.Min(-Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(NegativeZero, NumberHelper.Min(NegativeZero, PositiveOne)); + AssertBitwiseEqual(Half.NaN, NumberHelper.Min(Half.NaN, PositiveOne)); + AssertBitwiseEqual(PositiveZero, NumberHelper.Min(PositiveZero, PositiveOne)); + AssertBitwiseEqual(Half.Epsilon, NumberHelper.Min(Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Min(MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(MinNormal, NumberHelper.Min(MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Min(PositiveOne, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Min(Half.MaxValue, PositiveOne)); + AssertBitwiseEqual(PositiveOne, NumberHelper.Min(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void SignTest() + { + Assert.Equal(-1, NumberHelper.Sign(Half.NegativeInfinity)); + Assert.Equal(-1, NumberHelper.Sign(Half.MinValue)); + Assert.Equal(-1, NumberHelper.Sign(NegativeOne)); + Assert.Equal(-1, NumberHelper.Sign(-MinNormal)); + Assert.Equal(-1, NumberHelper.Sign(-MaxSubnormal)); + Assert.Equal(-1, NumberHelper.Sign(-Half.Epsilon)); + + Assert.Equal(0, NumberHelper.Sign(NegativeZero)); + Assert.Equal(0, NumberHelper.Sign(PositiveZero)); + + Assert.Equal(1, NumberHelper.Sign(Half.Epsilon)); + Assert.Equal(1, NumberHelper.Sign(MaxSubnormal)); + Assert.Equal(1, NumberHelper.Sign(MinNormal)); + Assert.Equal(1, NumberHelper.Sign(PositiveOne)); + Assert.Equal(1, NumberHelper.Sign(Half.MaxValue)); + Assert.Equal(1, NumberHelper.Sign(Half.PositiveInfinity)); + + Assert.Throws(() => NumberHelper.Sign(Half.NaN)); + } + + [Fact] + public static void TryCreateFromByteTest() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal((Half)127.0f, result); + + Assert.True(NumberHelper.TryCreate(0x80, out result)); + Assert.Equal((Half)128.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFF, out result)); + Assert.Equal((Half)255.0f, result); + } + + [Fact] + public static void TryCreateFromCharTest() + { + Half result; + + Assert.True(NumberHelper.TryCreate((char)0x0000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate((char)0x0001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate((char)0x7FFF, out result)); + Assert.Equal((Half)32767.0f, result); + + Assert.True(NumberHelper.TryCreate((char)0x8000, out result)); + Assert.Equal((Half)32768.0f, result); + + Assert.True(NumberHelper.TryCreate((char)0xFFFF, out result)); + Assert.Equal((Half)65535.0f, result); + } + + [Fact] + public static void TryCreateFromInt16Test() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal((Half)32767.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0x8000), out result)); + Assert.Equal((Half)(-32768.0f), result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0xFFFF), out result)); + Assert.Equal(NegativeOne, result); + } + + [Fact] + public static void TryCreateFromInt32Test() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal((Half)2147483647.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0x80000000), out result)); + Assert.Equal((Half)(-2147483648.0f), result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0xFFFFFFFF), out result)); + Assert.Equal(NegativeOne, result); + } + + [Fact] + public static void TryCreateFromInt64Test() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal((Half)9223372036854775807.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0x8000000000000000)), out result)); + Assert.Equal((Half)(-9223372036854775808.0f), result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)), out result)); + Assert.Equal(NegativeOne, result); + } + + [Fact] + public static void TryCreateFromIntPtrTest() + { + Half result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000000), out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000001), out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal((Half)9223372036854775807.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x8000000000000000), out result)); + Assert.Equal((Half)(-9223372036854775808.0f), result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFFFFFFFFFF), out result)); + Assert.Equal(NegativeOne, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nint)0x00000000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate((nint)0x00000001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate((nint)0x7FFFFFFF, out result)); + Assert.Equal((Half)2147483647.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x80000000), out result)); + Assert.Equal((Half)(-2147483648.0f), result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFF), out result)); + Assert.Equal(NegativeOne, result); + } + } + + [Fact] + public static void TryCreateFromSByteTest() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal((Half)127.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0x80), out result)); + Assert.Equal((Half)(-128.0f), result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0xFF), out result)); + Assert.Equal(NegativeOne, result); + } + + [Fact] + public static void TryCreateFromUInt16Test() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal((Half)32767.0f, result); + + Assert.True(NumberHelper.TryCreate(0x8000, out result)); + Assert.Equal((Half)32768.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFFFF, out result)); + Assert.Equal((Half)65535.0f, result); + } + + [Fact] + public static void TryCreateFromUInt32Test() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal((Half)2147483647.0f, result); + + Assert.True(NumberHelper.TryCreate(0x80000000, out result)); + Assert.Equal((Half)2147483648.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFF, out result)); + Assert.Equal((Half)4294967295.0f, result); + } + + [Fact] + public static void TryCreateFromUInt64Test() + { + Half result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal((Half)9223372036854775807.0f, result); + + Assert.True(NumberHelper.TryCreate(0x8000000000000000, out result)); + Assert.Equal((Half)9223372036854775808.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFFFFFFFFFF, out result)); + Assert.Equal((Half)18446744073709551615.0f, result); + } + + [Fact] + public static void TryCreateFromUIntPtrTest() + { + Half result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000000), out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000001), out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal((Half)9223372036854775807.0f, result); + + // https://github.com/dotnet/roslyn/issues/60714 + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x8000000000000000), out result)); + // Assert.Equal((Half)9223372036854775808.0f, result); + // + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFFFFFFFFFF), out result)); + // Assert.Equal((Half)18446744073709551615.0f, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nuint)0x00000000, out result)); + Assert.Equal(PositiveZero, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x00000001, out result)); + Assert.Equal(PositiveOne, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x7FFFFFFF, out result)); + Assert.Equal((Half)2147483647.0f, result); + + // https://github.com/dotnet/roslyn/issues/60714 + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x80000000), out result)); + // Assert.Equal((Half)2147483648.0f, result); + // + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFF), out result)); + // Assert.Equal((Half)4294967295.0f, result); + } + } + + [Fact] + public static void op_SubtractionTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, SubtractionOperatorsHelper.op_Subtraction(Half.NegativeInfinity, PositiveOne)); + AssertBitwiseEqual(Half.MinValue, SubtractionOperatorsHelper.op_Subtraction(Half.MinValue, PositiveOne)); + AssertBitwiseEqual(NegativeTwo, SubtractionOperatorsHelper.op_Subtraction(NegativeOne, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(-MinNormal, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(-MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(-Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(NegativeZero, PositiveOne)); + AssertBitwiseEqual(Half.NaN, SubtractionOperatorsHelper.op_Subtraction(Half.NaN, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(PositiveZero, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_Subtraction(MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveZero, SubtractionOperatorsHelper.op_Subtraction(PositiveOne, PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, SubtractionOperatorsHelper.op_Subtraction(Half.MaxValue, PositiveOne)); + AssertBitwiseEqual(Half.PositiveInfinity, SubtractionOperatorsHelper.op_Subtraction(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_CheckedSubtractionTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, SubtractionOperatorsHelper.op_CheckedSubtraction(Half.NegativeInfinity, PositiveOne)); + AssertBitwiseEqual(Half.MinValue, SubtractionOperatorsHelper.op_CheckedSubtraction(Half.MinValue, PositiveOne)); + AssertBitwiseEqual(NegativeTwo, SubtractionOperatorsHelper.op_CheckedSubtraction(NegativeOne, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(-MinNormal, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(-MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(-Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(NegativeZero, PositiveOne)); + AssertBitwiseEqual(Half.NaN, SubtractionOperatorsHelper.op_CheckedSubtraction(Half.NaN, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(PositiveZero, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(Half.Epsilon, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(MaxSubnormal, PositiveOne)); + AssertBitwiseEqual(NegativeOne, SubtractionOperatorsHelper.op_CheckedSubtraction(MinNormal, PositiveOne)); + AssertBitwiseEqual(PositiveZero, SubtractionOperatorsHelper.op_CheckedSubtraction(PositiveOne, PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, SubtractionOperatorsHelper.op_CheckedSubtraction(Half.MaxValue, PositiveOne)); + AssertBitwiseEqual(Half.PositiveInfinity, SubtractionOperatorsHelper.op_CheckedSubtraction(Half.PositiveInfinity, PositiveOne)); + } + + [Fact] + public static void op_UnaryNegationTest() + { + AssertBitwiseEqual(Half.PositiveInfinity, UnaryNegationOperatorsHelper.op_UnaryNegation(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MaxValue, UnaryNegationOperatorsHelper.op_UnaryNegation(Half.MinValue)); + AssertBitwiseEqual(PositiveOne, UnaryNegationOperatorsHelper.op_UnaryNegation(NegativeOne)); + AssertBitwiseEqual(MinNormal, UnaryNegationOperatorsHelper.op_UnaryNegation(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, UnaryNegationOperatorsHelper.op_UnaryNegation(-MaxSubnormal)); + AssertBitwiseEqual(Half.Epsilon, UnaryNegationOperatorsHelper.op_UnaryNegation(-Half.Epsilon)); + AssertBitwiseEqual(PositiveZero, UnaryNegationOperatorsHelper.op_UnaryNegation(NegativeZero)); + AssertBitwiseEqual(Half.NaN, UnaryNegationOperatorsHelper.op_UnaryNegation(Half.NaN)); + AssertBitwiseEqual(NegativeZero, UnaryNegationOperatorsHelper.op_UnaryNegation(PositiveZero)); + AssertBitwiseEqual(-Half.Epsilon, UnaryNegationOperatorsHelper.op_UnaryNegation(Half.Epsilon)); + AssertBitwiseEqual(-MaxSubnormal, UnaryNegationOperatorsHelper.op_UnaryNegation(MaxSubnormal)); + AssertBitwiseEqual(-MinNormal, UnaryNegationOperatorsHelper.op_UnaryNegation(MinNormal)); + AssertBitwiseEqual(NegativeOne, UnaryNegationOperatorsHelper.op_UnaryNegation(PositiveOne)); + AssertBitwiseEqual(Half.MinValue, UnaryNegationOperatorsHelper.op_UnaryNegation(Half.MaxValue)); + AssertBitwiseEqual(Half.NegativeInfinity, UnaryNegationOperatorsHelper.op_UnaryNegation(Half.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedUnaryNegationTest() + { + AssertBitwiseEqual(Half.PositiveInfinity, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MaxValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(Half.MinValue)); + AssertBitwiseEqual(PositiveOne, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(NegativeOne)); + AssertBitwiseEqual(MinNormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-MaxSubnormal)); + AssertBitwiseEqual(Half.Epsilon, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-Half.Epsilon)); + AssertBitwiseEqual(PositiveZero, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(NegativeZero)); + AssertBitwiseEqual(Half.NaN, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(Half.NaN)); + AssertBitwiseEqual(NegativeZero, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(PositiveZero)); + AssertBitwiseEqual(-Half.Epsilon, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(Half.Epsilon)); + AssertBitwiseEqual(-MaxSubnormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(MaxSubnormal)); + AssertBitwiseEqual(-MinNormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(MinNormal)); + AssertBitwiseEqual(NegativeOne, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(PositiveOne)); + AssertBitwiseEqual(Half.MinValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(Half.MaxValue)); + AssertBitwiseEqual(Half.NegativeInfinity, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(Half.PositiveInfinity)); + } + + [Fact] + public static void op_UnaryPlusTest() + { + AssertBitwiseEqual(Half.NegativeInfinity, UnaryPlusOperatorsHelper.op_UnaryPlus(Half.NegativeInfinity)); + AssertBitwiseEqual(Half.MinValue, UnaryPlusOperatorsHelper.op_UnaryPlus(Half.MinValue)); + AssertBitwiseEqual(NegativeOne, UnaryPlusOperatorsHelper.op_UnaryPlus(NegativeOne)); + AssertBitwiseEqual(-MinNormal, UnaryPlusOperatorsHelper.op_UnaryPlus(-MinNormal)); + AssertBitwiseEqual(-MaxSubnormal, UnaryPlusOperatorsHelper.op_UnaryPlus(-MaxSubnormal)); + AssertBitwiseEqual(-Half.Epsilon, UnaryPlusOperatorsHelper.op_UnaryPlus(-Half.Epsilon)); + AssertBitwiseEqual(NegativeZero, UnaryPlusOperatorsHelper.op_UnaryPlus(NegativeZero)); + AssertBitwiseEqual(Half.NaN, UnaryPlusOperatorsHelper.op_UnaryPlus(Half.NaN)); + AssertBitwiseEqual(PositiveZero, UnaryPlusOperatorsHelper.op_UnaryPlus(PositiveZero)); + AssertBitwiseEqual(Half.Epsilon, UnaryPlusOperatorsHelper.op_UnaryPlus(Half.Epsilon)); + AssertBitwiseEqual(MaxSubnormal, UnaryPlusOperatorsHelper.op_UnaryPlus(MaxSubnormal)); + AssertBitwiseEqual(MinNormal, UnaryPlusOperatorsHelper.op_UnaryPlus(MinNormal)); + AssertBitwiseEqual(PositiveOne, UnaryPlusOperatorsHelper.op_UnaryPlus(PositiveOne)); + AssertBitwiseEqual(Half.MaxValue, UnaryPlusOperatorsHelper.op_UnaryPlus(Half.MaxValue)); + AssertBitwiseEqual(Half.PositiveInfinity, UnaryPlusOperatorsHelper.op_UnaryPlus(Half.PositiveInfinity)); + } + [Theory] [MemberData(nameof(HalfTests.Parse_Valid_TestData), MemberType = typeof(HalfTests))] public static void ParseValidStringTest(string value, NumberStyles style, IFormatProvider provider, Half expected) diff --git a/src/libraries/System.Runtime/tests/System/SingleTests.GenericMath.cs b/src/libraries/System.Runtime/tests/System/SingleTests.GenericMath.cs index 212d61131f599..4aee62a28d29a 100644 --- a/src/libraries/System.Runtime/tests/System/SingleTests.GenericMath.cs +++ b/src/libraries/System.Runtime/tests/System/SingleTests.GenericMath.cs @@ -2,13 +2,1340 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Globalization; -using System.Runtime.Versioning; using Xunit; namespace System.Tests { public class SingleTests_GenericMath { + private const float MinNormal = 1.17549435E-38f; + + private const float MaxSubnormal = 1.17549421E-38f; + + private static void AssertBitwiseEqual(float expected, float actual) + { + uint expectedBits = BitConverter.SingleToUInt32Bits(expected); + uint actualBits = BitConverter.SingleToUInt32Bits(actual); + + if (expectedBits == actualBits) + { + return; + } + + if (float.IsNaN(expected) && float.IsNaN(actual)) + { + return; + } + + throw new Xunit.Sdk.EqualException(expected, actual); + } + + [Fact] + public static void AdditiveIdentityTest() + { + AssertBitwiseEqual(0.0f, AdditiveIdentityHelper.AdditiveIdentity); + } + + [Fact] + public static void MinValueTest() + { + AssertBitwiseEqual(float.MinValue, MinMaxValueHelper.MinValue); + } + + [Fact] + public static void MaxValueTest() + { + AssertBitwiseEqual(float.MaxValue, MinMaxValueHelper.MaxValue); + } + + [Fact] + public static void MultiplicativeIdentityTest() + { + AssertBitwiseEqual(1.0f, MultiplicativeIdentityHelper.MultiplicativeIdentity); + } + + [Fact] + public static void NegativeOneTest() + { + Assert.Equal(-1.0f, SignedNumberHelper.NegativeOne); + } + + [Fact] + public static void OneTest() + { + AssertBitwiseEqual(1.0f, NumberBaseHelper.One); + } + + [Fact] + public static void ZeroTest() + { + AssertBitwiseEqual(0.0f, NumberBaseHelper.Zero); + } + + [Fact] + public static void op_AdditionTest() + { + AssertBitwiseEqual(float.NegativeInfinity, AdditionOperatorsHelper.op_Addition(float.NegativeInfinity, 1.0f)); + AssertBitwiseEqual(float.MinValue, AdditionOperatorsHelper.op_Addition(float.MinValue, 1.0f)); + AssertBitwiseEqual(0.0f, AdditionOperatorsHelper.op_Addition(-1.0f, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(-MinNormal, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(-MaxSubnormal, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(-float.Epsilon, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(-0.0f, 1.0f)); + AssertBitwiseEqual(float.NaN, AdditionOperatorsHelper.op_Addition(float.NaN, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(0.0f, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(float.Epsilon, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(MaxSubnormal, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_Addition(MinNormal, 1.0f)); + AssertBitwiseEqual(2.0f, AdditionOperatorsHelper.op_Addition(1.0f, 1.0f)); + AssertBitwiseEqual(float.MaxValue, AdditionOperatorsHelper.op_Addition(float.MaxValue, 1.0f)); + AssertBitwiseEqual(float.PositiveInfinity, AdditionOperatorsHelper.op_Addition(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_CheckedAdditionTest() + { + AssertBitwiseEqual(float.NegativeInfinity, AdditionOperatorsHelper.op_CheckedAddition(float.NegativeInfinity, 1.0f)); + AssertBitwiseEqual(float.MinValue, AdditionOperatorsHelper.op_CheckedAddition(float.MinValue, 1.0f)); + AssertBitwiseEqual(0.0f, AdditionOperatorsHelper.op_CheckedAddition(-1.0f, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(-MinNormal, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(-MaxSubnormal, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(-float.Epsilon, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(-0.0f, 1.0f)); + AssertBitwiseEqual(float.NaN, AdditionOperatorsHelper.op_CheckedAddition(float.NaN, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(0.0f, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(float.Epsilon, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(MaxSubnormal, 1.0f)); + AssertBitwiseEqual(1.0f, AdditionOperatorsHelper.op_CheckedAddition(MinNormal, 1.0f)); + AssertBitwiseEqual(2.0f, AdditionOperatorsHelper.op_CheckedAddition(1.0f, 1.0f)); + AssertBitwiseEqual(float.MaxValue, AdditionOperatorsHelper.op_CheckedAddition(float.MaxValue, 1.0f)); + AssertBitwiseEqual(float.PositiveInfinity, AdditionOperatorsHelper.op_CheckedAddition(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void IsPow2Test() + { + Assert.False(BinaryNumberHelper.IsPow2(float.NegativeInfinity)); + Assert.False(BinaryNumberHelper.IsPow2(float.MinValue)); + Assert.False(BinaryNumberHelper.IsPow2(-1.0f)); + Assert.False(BinaryNumberHelper.IsPow2(-MinNormal)); + Assert.False(BinaryNumberHelper.IsPow2(-MaxSubnormal)); + Assert.False(BinaryNumberHelper.IsPow2(-float.Epsilon)); + Assert.False(BinaryNumberHelper.IsPow2(-0.0f)); + Assert.False(BinaryNumberHelper.IsPow2(float.NaN)); + Assert.False(BinaryNumberHelper.IsPow2(0.0f)); + Assert.False(BinaryNumberHelper.IsPow2(float.Epsilon)); + Assert.False(BinaryNumberHelper.IsPow2(MaxSubnormal)); + Assert.True(BinaryNumberHelper.IsPow2(MinNormal)); + Assert.True(BinaryNumberHelper.IsPow2(1.0f)); + Assert.False(BinaryNumberHelper.IsPow2(float.MaxValue)); + Assert.False(BinaryNumberHelper.IsPow2(float.PositiveInfinity)); + } + + [Fact] + public static void Log2Test() + { + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(float.NegativeInfinity)); + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(float.MinValue)); + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(-1.0f)); + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(-MinNormal)); + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(-MaxSubnormal)); + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(-float.Epsilon)); + AssertBitwiseEqual(float.NegativeInfinity, BinaryNumberHelper.Log2(-0.0f)); + AssertBitwiseEqual(float.NaN, BinaryNumberHelper.Log2(float.NaN)); + AssertBitwiseEqual(float.NegativeInfinity, BinaryNumberHelper.Log2(0.0f)); + AssertBitwiseEqual(-149.0f, BinaryNumberHelper.Log2(float.Epsilon)); + AssertBitwiseEqual(-126.0f, BinaryNumberHelper.Log2(MaxSubnormal)); + AssertBitwiseEqual(-126.0f, BinaryNumberHelper.Log2(MinNormal)); + AssertBitwiseEqual(0.0f, BinaryNumberHelper.Log2(1.0f)); + AssertBitwiseEqual(128.0f, BinaryNumberHelper.Log2(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, BinaryNumberHelper.Log2(float.PositiveInfinity)); + } + + [Fact] + public static void op_LessThanTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThan(float.NegativeInfinity, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(float.MinValue, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-1.0f, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-MinNormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-MaxSubnormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-float.Epsilon, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(-0.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(float.NaN, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(0.0f, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(float.Epsilon, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(MaxSubnormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThan(MinNormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(1.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(float.MaxValue, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThan(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_LessThanOrEqualTest() + { + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(float.NegativeInfinity, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(float.MinValue, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-1.0f, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-MinNormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-MaxSubnormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-float.Epsilon, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(-0.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(float.NaN, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(0.0f, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(float.Epsilon, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(MaxSubnormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(MinNormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_LessThanOrEqual(1.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(float.MaxValue, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_LessThanOrEqual(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_GreaterThanTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(float.NegativeInfinity, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(float.MinValue, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-1.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-MinNormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-MaxSubnormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-float.Epsilon, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(-0.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(float.NaN, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(0.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(float.Epsilon, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(MaxSubnormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(MinNormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThan(1.0f, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(float.MaxValue, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThan(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_GreaterThanOrEqualTest() + { + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(float.NegativeInfinity, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(float.MinValue, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-1.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-MinNormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-MaxSubnormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-float.Epsilon, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(-0.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(float.NaN, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(0.0f, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(float.Epsilon, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(MaxSubnormal, 1.0f)); + Assert.False(ComparisonOperatorsHelper.op_GreaterThanOrEqual(MinNormal, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(1.0f, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(float.MaxValue, 1.0f)); + Assert.True(ComparisonOperatorsHelper.op_GreaterThanOrEqual(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_DecrementTest() + { + AssertBitwiseEqual(float.NegativeInfinity, DecrementOperatorsHelper.op_Decrement(float.NegativeInfinity)); + AssertBitwiseEqual(float.MinValue, DecrementOperatorsHelper.op_Decrement(float.MinValue)); + AssertBitwiseEqual(-2.0f, DecrementOperatorsHelper.op_Decrement(-1.0f)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(-MinNormal)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(-MaxSubnormal)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(-float.Epsilon)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(-0.0f)); + AssertBitwiseEqual(float.NaN, DecrementOperatorsHelper.op_Decrement(float.NaN)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(0.0f)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(float.Epsilon)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(MaxSubnormal)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_Decrement(MinNormal)); + AssertBitwiseEqual(0.0f, DecrementOperatorsHelper.op_Decrement(1.0f)); + AssertBitwiseEqual(float.MaxValue, DecrementOperatorsHelper.op_Decrement(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, DecrementOperatorsHelper.op_Decrement(float.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedDecrementTest() + { + AssertBitwiseEqual(float.NegativeInfinity, DecrementOperatorsHelper.op_CheckedDecrement(float.NegativeInfinity)); + AssertBitwiseEqual(float.MinValue, DecrementOperatorsHelper.op_CheckedDecrement(float.MinValue)); + AssertBitwiseEqual(-2.0f, DecrementOperatorsHelper.op_CheckedDecrement(-1.0f)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(-MinNormal)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(-MaxSubnormal)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(-float.Epsilon)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(-0.0f)); + AssertBitwiseEqual(float.NaN, DecrementOperatorsHelper.op_CheckedDecrement(float.NaN)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(0.0f)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(float.Epsilon)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(MaxSubnormal)); + AssertBitwiseEqual(-1.0f, DecrementOperatorsHelper.op_CheckedDecrement(MinNormal)); + AssertBitwiseEqual(0.0f, DecrementOperatorsHelper.op_CheckedDecrement(1.0f)); + AssertBitwiseEqual(float.MaxValue, DecrementOperatorsHelper.op_CheckedDecrement(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, DecrementOperatorsHelper.op_CheckedDecrement(float.PositiveInfinity)); + } + + [Fact] + public static void op_DivisionTest() + { + AssertBitwiseEqual(float.NegativeInfinity, DivisionOperatorsHelper.op_Division(float.NegativeInfinity, 2.0f)); + AssertBitwiseEqual(-1.70141173E+38f, DivisionOperatorsHelper.op_Division(float.MinValue, 2.0f)); + AssertBitwiseEqual(-0.5f, DivisionOperatorsHelper.op_Division(-1.0f, 2.0f)); + AssertBitwiseEqual(-5.87747175E-39f, DivisionOperatorsHelper.op_Division(-MinNormal, 2.0f)); + AssertBitwiseEqual(-5.87747175E-39f, DivisionOperatorsHelper.op_Division(-MaxSubnormal, 2.0f)); + AssertBitwiseEqual(-0.0f, DivisionOperatorsHelper.op_Division(-float.Epsilon, 2.0f)); + AssertBitwiseEqual(-0.0f, DivisionOperatorsHelper.op_Division(-0.0f, 2.0f)); + AssertBitwiseEqual(float.NaN, DivisionOperatorsHelper.op_Division(float.NaN, 2.0f)); + AssertBitwiseEqual(0.0f, DivisionOperatorsHelper.op_Division(0.0f, 2.0f)); + AssertBitwiseEqual(0.0f, DivisionOperatorsHelper.op_Division(float.Epsilon, 2.0f)); + AssertBitwiseEqual(5.87747175E-39f, DivisionOperatorsHelper.op_Division(MaxSubnormal, 2.0f)); + AssertBitwiseEqual(5.87747175E-39f, DivisionOperatorsHelper.op_Division(MinNormal, 2.0f)); + AssertBitwiseEqual(0.5f, DivisionOperatorsHelper.op_Division(1.0f, 2.0f)); + AssertBitwiseEqual(1.70141173E+38f, DivisionOperatorsHelper.op_Division(float.MaxValue, 2.0f)); + AssertBitwiseEqual(float.PositiveInfinity, DivisionOperatorsHelper.op_Division(float.PositiveInfinity, 2.0f)); + } + + [Fact] + public static void op_CheckedDivisionTest() + { + AssertBitwiseEqual(float.NegativeInfinity, DivisionOperatorsHelper.op_CheckedDivision(float.NegativeInfinity, 2.0f)); + AssertBitwiseEqual(-1.70141173E+38f, DivisionOperatorsHelper.op_CheckedDivision(float.MinValue, 2.0f)); + AssertBitwiseEqual(-0.5f, DivisionOperatorsHelper.op_CheckedDivision(-1.0f, 2.0f)); + AssertBitwiseEqual(-5.87747175E-39f, DivisionOperatorsHelper.op_CheckedDivision(-MinNormal, 2.0f)); + AssertBitwiseEqual(-5.87747175E-39f, DivisionOperatorsHelper.op_CheckedDivision(-MaxSubnormal, 2.0f)); + AssertBitwiseEqual(-0.0f, DivisionOperatorsHelper.op_CheckedDivision(-float.Epsilon, 2.0f)); + AssertBitwiseEqual(-0.0f, DivisionOperatorsHelper.op_CheckedDivision(-0.0f, 2.0f)); + AssertBitwiseEqual(float.NaN, DivisionOperatorsHelper.op_CheckedDivision(float.NaN, 2.0f)); + AssertBitwiseEqual(0.0f, DivisionOperatorsHelper.op_CheckedDivision(0.0f, 2.0f)); + AssertBitwiseEqual(0.0f, DivisionOperatorsHelper.op_CheckedDivision(float.Epsilon, 2.0f)); + AssertBitwiseEqual(5.87747175E-39f, DivisionOperatorsHelper.op_CheckedDivision(MaxSubnormal, 2.0f)); + AssertBitwiseEqual(5.87747175E-39f, DivisionOperatorsHelper.op_CheckedDivision(MinNormal, 2.0f)); + AssertBitwiseEqual(0.5f, DivisionOperatorsHelper.op_CheckedDivision(1.0f, 2.0f)); + AssertBitwiseEqual(1.70141173E+38f, DivisionOperatorsHelper.op_CheckedDivision(float.MaxValue, 2.0f)); + AssertBitwiseEqual(float.PositiveInfinity, DivisionOperatorsHelper.op_CheckedDivision(float.PositiveInfinity, 2.0f)); + } + + [Fact] + public static void op_EqualityTest() + { + Assert.False(EqualityOperatorsHelper.op_Equality(float.NegativeInfinity, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(float.MinValue, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(-1.0f, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(-MinNormal, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(-MaxSubnormal, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(-float.Epsilon, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(-0.0f, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(float.NaN, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(0.0f, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(float.Epsilon, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(MaxSubnormal, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(MinNormal, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Equality(1.0f, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(float.MaxValue, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Equality(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_InequalityTest() + { + Assert.True(EqualityOperatorsHelper.op_Inequality(float.NegativeInfinity, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(float.MinValue, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-1.0f, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-MinNormal, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-MaxSubnormal, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-float.Epsilon, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(-0.0f, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(float.NaN, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(0.0f, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(float.Epsilon, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(MaxSubnormal, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(MinNormal, 1.0f)); + Assert.False(EqualityOperatorsHelper.op_Inequality(1.0f, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(float.MaxValue, 1.0f)); + Assert.True(EqualityOperatorsHelper.op_Inequality(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_IncrementTest() + { + AssertBitwiseEqual(float.NegativeInfinity, IncrementOperatorsHelper.op_Increment(float.NegativeInfinity)); + AssertBitwiseEqual(float.MinValue, IncrementOperatorsHelper.op_Increment(float.MinValue)); + AssertBitwiseEqual(0.0f, IncrementOperatorsHelper.op_Increment(-1.0f)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(-MinNormal)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(-MaxSubnormal)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(-float.Epsilon)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(-0.0f)); + AssertBitwiseEqual(float.NaN, IncrementOperatorsHelper.op_Increment(float.NaN)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(0.0f)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(float.Epsilon)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(MaxSubnormal)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_Increment(MinNormal)); + AssertBitwiseEqual(2.0f, IncrementOperatorsHelper.op_Increment(1.0f)); + AssertBitwiseEqual(float.MaxValue, IncrementOperatorsHelper.op_Increment(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, IncrementOperatorsHelper.op_Increment(float.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedIncrementTest() + { + AssertBitwiseEqual(float.NegativeInfinity, IncrementOperatorsHelper.op_CheckedIncrement(float.NegativeInfinity)); + AssertBitwiseEqual(float.MinValue, IncrementOperatorsHelper.op_CheckedIncrement(float.MinValue)); + AssertBitwiseEqual(0.0f, IncrementOperatorsHelper.op_CheckedIncrement(-1.0f)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(-MinNormal)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(-MaxSubnormal)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(-float.Epsilon)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(-0.0f)); + AssertBitwiseEqual(float.NaN, IncrementOperatorsHelper.op_CheckedIncrement(float.NaN)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(0.0f)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(float.Epsilon)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(MaxSubnormal)); + AssertBitwiseEqual(1.0f, IncrementOperatorsHelper.op_CheckedIncrement(MinNormal)); + AssertBitwiseEqual(2.0f, IncrementOperatorsHelper.op_CheckedIncrement(1.0f)); + AssertBitwiseEqual(float.MaxValue, IncrementOperatorsHelper.op_CheckedIncrement(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, IncrementOperatorsHelper.op_CheckedIncrement(float.PositiveInfinity)); + } + + [Fact] + public static void op_ModulusTest() + { + AssertBitwiseEqual(float.NaN, ModulusOperatorsHelper.op_Modulus(float.NegativeInfinity, 2.0f)); + AssertBitwiseEqual(-0.0f, ModulusOperatorsHelper.op_Modulus(float.MinValue, 2.0f)); + AssertBitwiseEqual(-1.0f, ModulusOperatorsHelper.op_Modulus(-1.0f, 2.0f)); + AssertBitwiseEqual(-MinNormal, ModulusOperatorsHelper.op_Modulus(-MinNormal, 2.0f)); + AssertBitwiseEqual(-MaxSubnormal, ModulusOperatorsHelper.op_Modulus(-MaxSubnormal, 2.0f)); + AssertBitwiseEqual(-float.Epsilon, ModulusOperatorsHelper.op_Modulus(-float.Epsilon, 2.0f)); ; + AssertBitwiseEqual(-0.0f, ModulusOperatorsHelper.op_Modulus(-0.0f, 2.0f)); + AssertBitwiseEqual(float.NaN, ModulusOperatorsHelper.op_Modulus(float.NaN, 2.0f)); + AssertBitwiseEqual(0.0f, ModulusOperatorsHelper.op_Modulus(0.0f, 2.0f)); + AssertBitwiseEqual(float.Epsilon, ModulusOperatorsHelper.op_Modulus(float.Epsilon, 2.0f)); + AssertBitwiseEqual(MaxSubnormal, ModulusOperatorsHelper.op_Modulus(MaxSubnormal, 2.0f)); + AssertBitwiseEqual(MinNormal, ModulusOperatorsHelper.op_Modulus(MinNormal, 2.0f)); + AssertBitwiseEqual(1.0f, ModulusOperatorsHelper.op_Modulus(1.0f, 2.0f)); + AssertBitwiseEqual(0.0f, ModulusOperatorsHelper.op_Modulus(float.MaxValue, 2.0f)); + AssertBitwiseEqual(float.NaN, ModulusOperatorsHelper.op_Modulus(float.PositiveInfinity, 2.0f)); + } + + [Fact] + public static void op_MultiplyTest() + { + AssertBitwiseEqual(float.NegativeInfinity, MultiplyOperatorsHelper.op_Multiply(float.NegativeInfinity, 2.0f)); + AssertBitwiseEqual(float.NegativeInfinity, MultiplyOperatorsHelper.op_Multiply(float.MinValue, 2.0f)); + AssertBitwiseEqual(-2.0f, MultiplyOperatorsHelper.op_Multiply(-1.0f, 2.0f)); + AssertBitwiseEqual(-2.3509887E-38f, MultiplyOperatorsHelper.op_Multiply(-MinNormal, 2.0f)); + AssertBitwiseEqual(-2.35098842E-38f, MultiplyOperatorsHelper.op_Multiply(-MaxSubnormal, 2.0f)); + AssertBitwiseEqual(-2.80259693E-45f, MultiplyOperatorsHelper.op_Multiply(-float.Epsilon, 2.0f)); + AssertBitwiseEqual(-0.0f, MultiplyOperatorsHelper.op_Multiply(-0.0f, 2.0f)); + AssertBitwiseEqual(float.NaN, MultiplyOperatorsHelper.op_Multiply(float.NaN, 2.0f)); + AssertBitwiseEqual(0.0f, MultiplyOperatorsHelper.op_Multiply(0.0f, 2.0f)); + AssertBitwiseEqual(2.80259693E-45f, MultiplyOperatorsHelper.op_Multiply(float.Epsilon, 2.0f)); + AssertBitwiseEqual(2.35098842E-38f, MultiplyOperatorsHelper.op_Multiply(MaxSubnormal, 2.0f)); + AssertBitwiseEqual(2.3509887E-38f, MultiplyOperatorsHelper.op_Multiply(MinNormal, 2.0f)); + AssertBitwiseEqual(2.0f, MultiplyOperatorsHelper.op_Multiply(1.0f, 2.0f)); + AssertBitwiseEqual(float.PositiveInfinity, MultiplyOperatorsHelper.op_Multiply(float.MaxValue, 2.0f)); + AssertBitwiseEqual(float.PositiveInfinity, MultiplyOperatorsHelper.op_Multiply(float.PositiveInfinity, 2.0f)); + } + + [Fact] + public static void op_CheckedMultiplyTest() + { + AssertBitwiseEqual(float.NegativeInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(float.NegativeInfinity, 2.0f)); + AssertBitwiseEqual(float.NegativeInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(float.MinValue, 2.0f)); + AssertBitwiseEqual(-2.0f, MultiplyOperatorsHelper.op_CheckedMultiply(-1.0f, 2.0f)); + AssertBitwiseEqual(-2.3509887E-38f, MultiplyOperatorsHelper.op_CheckedMultiply(-MinNormal, 2.0f)); + AssertBitwiseEqual(-2.35098842E-38f, MultiplyOperatorsHelper.op_CheckedMultiply(-MaxSubnormal, 2.0f)); + AssertBitwiseEqual(-2.80259693E-45f, MultiplyOperatorsHelper.op_CheckedMultiply(-float.Epsilon, 2.0f)); + AssertBitwiseEqual(-0.0f, MultiplyOperatorsHelper.op_CheckedMultiply(-0.0f, 2.0f)); + AssertBitwiseEqual(float.NaN, MultiplyOperatorsHelper.op_CheckedMultiply(float.NaN, 2.0f)); + AssertBitwiseEqual(0.0f, MultiplyOperatorsHelper.op_CheckedMultiply(0.0f, 2.0f)); + AssertBitwiseEqual(2.80259693E-45f, MultiplyOperatorsHelper.op_CheckedMultiply(float.Epsilon, 2.0f)); + AssertBitwiseEqual(2.35098842E-38f, MultiplyOperatorsHelper.op_CheckedMultiply(MaxSubnormal, 2.0f)); + AssertBitwiseEqual(2.3509887E-38f, MultiplyOperatorsHelper.op_CheckedMultiply(MinNormal, 2.0f)); + AssertBitwiseEqual(2.0f, MultiplyOperatorsHelper.op_CheckedMultiply(1.0f, 2.0f)); + AssertBitwiseEqual(float.PositiveInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(float.MaxValue, 2.0f)); + AssertBitwiseEqual(float.PositiveInfinity, MultiplyOperatorsHelper.op_CheckedMultiply(float.PositiveInfinity, 2.0f)); + } + + [Fact] + public static void AbsTest() + { + AssertBitwiseEqual(float.PositiveInfinity, NumberHelper.Abs(float.NegativeInfinity)); + AssertBitwiseEqual(float.MaxValue, NumberHelper.Abs(float.MinValue)); + AssertBitwiseEqual(1.0f, NumberHelper.Abs(-1.0f)); + AssertBitwiseEqual(MinNormal, NumberHelper.Abs(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Abs(-MaxSubnormal)); + AssertBitwiseEqual(float.Epsilon, NumberHelper.Abs(-float.Epsilon)); + AssertBitwiseEqual(0.0f, NumberHelper.Abs(-0.0f)); + AssertBitwiseEqual(float.NaN, NumberHelper.Abs(float.NaN)); + AssertBitwiseEqual(0.0f, NumberHelper.Abs(0.0f)); + AssertBitwiseEqual(float.Epsilon, NumberHelper.Abs(float.Epsilon)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Abs(MaxSubnormal)); + AssertBitwiseEqual(MinNormal, NumberHelper.Abs(MinNormal)); + AssertBitwiseEqual(1.0f, NumberHelper.Abs(1.0f)); + AssertBitwiseEqual(float.MaxValue, NumberHelper.Abs(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, NumberHelper.Abs(float.PositiveInfinity)); + } + + [Fact] + public static void ClampTest() + { + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(float.NegativeInfinity, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(float.MinValue, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(-1.0f, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(-MinNormal, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(-MaxSubnormal, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(-float.Epsilon, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(-0.0f, 1.0f, 63.0f)); + AssertBitwiseEqual(float.NaN, NumberHelper.Clamp(float.NaN, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(0.0f, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(float.Epsilon, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(MaxSubnormal, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(MinNormal, 1.0f, 63.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Clamp(1.0f, 1.0f, 63.0f)); + AssertBitwiseEqual(63.0f, NumberHelper.Clamp(float.MaxValue, 1.0f, 63.0f)); + AssertBitwiseEqual(63.0f, NumberHelper.Clamp(float.PositiveInfinity, 1.0f, 63.0f)); + } + + [Fact] + public static void CreateCheckedFromByteTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x00)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x01)); + AssertBitwiseEqual(127.0f, NumberHelper.CreateChecked(0x7F)); + AssertBitwiseEqual(128.0f, NumberHelper.CreateChecked(0x80)); + AssertBitwiseEqual(255.0f, NumberHelper.CreateChecked(0xFF)); + } + + [Fact] + public static void CreateCheckedFromCharTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked((char)0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked((char)0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateChecked((char)0x7FFF)); + AssertBitwiseEqual(32768.0f, NumberHelper.CreateChecked((char)0x8000)); + AssertBitwiseEqual(65535.0f, NumberHelper.CreateChecked((char)0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromInt16Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateChecked(0x7FFF)); + AssertBitwiseEqual(-32768.0f, NumberHelper.CreateChecked(unchecked((short)0x8000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateChecked(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt32Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateChecked(0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0f, NumberHelper.CreateChecked(unchecked((int)0x80000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateChecked(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateCheckedFromInt64Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x0000000000000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(-9223372036854775808.0f, NumberHelper.CreateChecked(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateChecked(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateCheckedFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateChecked(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual(-9223372036854775808.0f, NumberHelper.CreateChecked(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked((nint)0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked((nint)0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateChecked((nint)0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0f, NumberHelper.CreateChecked(unchecked((nint)0x80000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateChecked(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateCheckedFromSByteTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x00)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x01)); + AssertBitwiseEqual(127.0f, NumberHelper.CreateChecked(0x7F)); + AssertBitwiseEqual(-128.0f, NumberHelper.CreateChecked(unchecked((sbyte)0x80))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateChecked(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateCheckedFromUInt16Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateChecked(0x7FFF)); + AssertBitwiseEqual(32768.0f, NumberHelper.CreateChecked(0x8000)); + AssertBitwiseEqual(65535.0f, NumberHelper.CreateChecked(0xFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt32Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateChecked(0x7FFFFFFF)); + AssertBitwiseEqual(2147483648.0f, NumberHelper.CreateChecked(0x80000000)); + AssertBitwiseEqual(4294967295.0f, NumberHelper.CreateChecked(0xFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUInt64Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(0x0000000000000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateChecked(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(9223372036854775808.0f, NumberHelper.CreateChecked(0x8000000000000000)); + AssertBitwiseEqual(18446744073709551615.0f, NumberHelper.CreateChecked(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateCheckedFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateChecked(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(9223372036854775808.0f, NumberHelper.CreateChecked(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual(18446744073709551615.0f,NumberHelper.CreateChecked(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateChecked((nuint)0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateChecked((nuint)0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateChecked((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(2147483648.0f, NumberHelper.CreateChecked((nuint)0x80000000)); + // AssertBitwiseEqual(4294967295.0f, NumberHelper.CreateChecked((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateSaturatingFromByteTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x00)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x01)); + AssertBitwiseEqual(127.0f, NumberHelper.CreateSaturating(0x7F)); + AssertBitwiseEqual(128.0f, NumberHelper.CreateSaturating(0x80)); + AssertBitwiseEqual(255.0f, NumberHelper.CreateSaturating(0xFF)); + } + + [Fact] + public static void CreateSaturatingFromCharTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating((char)0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating((char)0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateSaturating((char)0x7FFF)); + AssertBitwiseEqual(32768.0f, NumberHelper.CreateSaturating((char)0x8000)); + AssertBitwiseEqual(65535.0f, NumberHelper.CreateSaturating((char)0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromInt16Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateSaturating(0x7FFF)); + AssertBitwiseEqual(-32768.0f, NumberHelper.CreateSaturating(unchecked((short)0x8000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateSaturating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt32Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateSaturating(0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0f, NumberHelper.CreateSaturating(unchecked((int)0x80000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateSaturating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateSaturatingFromInt64Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x0000000000000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(-9223372036854775808.0f, NumberHelper.CreateSaturating(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateSaturating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateSaturatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateSaturating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual(-9223372036854775808.0f, NumberHelper.CreateSaturating(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating((nint)0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating((nint)0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateSaturating((nint)0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0f, NumberHelper.CreateSaturating(unchecked((nint)0x80000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateSaturating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateSaturatingFromSByteTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x00)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x01)); + AssertBitwiseEqual(127.0f, NumberHelper.CreateSaturating(0x7F)); + AssertBitwiseEqual(-128.0f, NumberHelper.CreateSaturating(unchecked((sbyte)0x80))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateSaturating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateSaturatingFromUInt16Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateSaturating(0x7FFF)); + AssertBitwiseEqual(32768.0f, NumberHelper.CreateSaturating(0x8000)); + AssertBitwiseEqual(65535.0f, NumberHelper.CreateSaturating(0xFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt32Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateSaturating(0x7FFFFFFF)); + AssertBitwiseEqual(2147483648.0f, NumberHelper.CreateSaturating(0x80000000)); + AssertBitwiseEqual(4294967295.0f, NumberHelper.CreateSaturating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUInt64Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(0x0000000000000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateSaturating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(9223372036854775808.0f, NumberHelper.CreateSaturating(0x8000000000000000)); + AssertBitwiseEqual(18446744073709551615.0f, NumberHelper.CreateSaturating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateSaturatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateSaturating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(9223372036854775808.0f, NumberHelper.CreateSaturating(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual(18446744073709551615.0f, NumberHelper.CreateSaturating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateSaturating((nuint)0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateSaturating((nuint)0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateSaturating((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(2147483648.0f, NumberHelper.CreateSaturating((nuint)0x80000000)); + // AssertBitwiseEqual(4294967295.0f, NumberHelper.CreateSaturating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void CreateTruncatingFromByteTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x00)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x01)); + AssertBitwiseEqual(127.0f, NumberHelper.CreateTruncating(0x7F)); + AssertBitwiseEqual(128.0f, NumberHelper.CreateTruncating(0x80)); + AssertBitwiseEqual(255.0f, NumberHelper.CreateTruncating(0xFF)); + } + + [Fact] + public static void CreateTruncatingFromCharTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating((char)0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating((char)0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateTruncating((char)0x7FFF)); + AssertBitwiseEqual(32768.0f, NumberHelper.CreateTruncating((char)0x8000)); + AssertBitwiseEqual(65535.0f, NumberHelper.CreateTruncating((char)0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromInt16Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateTruncating(0x7FFF)); + AssertBitwiseEqual(-32768.0f, NumberHelper.CreateTruncating(unchecked((short)0x8000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateTruncating(unchecked((short)0xFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt32Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateTruncating(0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0f, NumberHelper.CreateTruncating(unchecked((int)0x80000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateTruncating(unchecked((int)0xFFFFFFFF))); + } + + [Fact] + public static void CreateTruncatingFromInt64Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x0000000000000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(-9223372036854775808.0f, NumberHelper.CreateTruncating(unchecked(unchecked((long)0x8000000000000000)))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateTruncating(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)))); + } + + [Fact] + public static void CreateTruncatingFromIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000000))); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(unchecked((nint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateTruncating(unchecked((nint)0x7FFFFFFFFFFFFFFF))); + AssertBitwiseEqual(-9223372036854775808.0f, NumberHelper.CreateTruncating(unchecked((nint)0x8000000000000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating((nint)0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating((nint)0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateTruncating((nint)0x7FFFFFFF)); + AssertBitwiseEqual(-2147483648.0f, NumberHelper.CreateTruncating(unchecked((nint)0x80000000))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateTruncating(unchecked((nint)0xFFFFFFFF))); + } + } + + [Fact] + public static void CreateTruncatingFromSByteTest() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x00)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x01)); + AssertBitwiseEqual(127.0f, NumberHelper.CreateTruncating(0x7F)); + AssertBitwiseEqual(-128.0f, NumberHelper.CreateTruncating(unchecked((sbyte)0x80))); + AssertBitwiseEqual(-1.0f, NumberHelper.CreateTruncating(unchecked((sbyte)0xFF))); + } + + [Fact] + public static void CreateTruncatingFromUInt16Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x0000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x0001)); + AssertBitwiseEqual(32767.0f, NumberHelper.CreateTruncating(0x7FFF)); + AssertBitwiseEqual(32768.0f, NumberHelper.CreateTruncating(0x8000)); + AssertBitwiseEqual(65535.0f, NumberHelper.CreateTruncating(0xFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt32Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateTruncating(0x7FFFFFFF)); + AssertBitwiseEqual(2147483648.0f, NumberHelper.CreateTruncating(0x80000000)); + AssertBitwiseEqual(4294967295.0f, NumberHelper.CreateTruncating(0xFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUInt64Test() + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(0x0000000000000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(0x0000000000000001)); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateTruncating(0x7FFFFFFFFFFFFFFF)); + AssertBitwiseEqual(9223372036854775808.0f, NumberHelper.CreateTruncating(0x8000000000000000)); + AssertBitwiseEqual(18446744073709551615.0f, NumberHelper.CreateTruncating(0xFFFFFFFFFFFFFFFF)); + } + + [Fact] + public static void CreateTruncatingFromUIntPtrTest() + { + if (Environment.Is64BitProcess) + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000000))); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating(unchecked((nuint)0x0000000000000001))); + AssertBitwiseEqual(9223372036854775807.0f, NumberHelper.CreateTruncating(unchecked((nuint)0x7FFFFFFFFFFFFFFF))); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(9223372036854775808.0f, NumberHelper.CreateTruncating(unchecked((nuint)0x8000000000000000))); + // AssertBitwiseEqual(18446744073709551615.0f, NumberHelper.CreateTruncating(unchecked((nuint)0xFFFFFFFFFFFFFFFF))); + } + else + { + AssertBitwiseEqual(0.0f, NumberHelper.CreateTruncating((nuint)0x00000000)); + AssertBitwiseEqual(1.0f, NumberHelper.CreateTruncating((nuint)0x00000001)); + AssertBitwiseEqual(2147483647.0f, NumberHelper.CreateTruncating((nuint)0x7FFFFFFF)); + + // https://github.com/dotnet/roslyn/issues/60714 + // AssertBitwiseEqual(2147483648.0f, NumberHelper.CreateTruncating((nuint)0x80000000)); + // AssertBitwiseEqual(4294967295.0f, NumberHelper.CreateTruncating((nuint)0xFFFFFFFF)); + } + } + + [Fact] + public static void MaxTest() + { + AssertBitwiseEqual(1.0f, NumberHelper.Max(float.NegativeInfinity, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(float.MinValue, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(-1.0f, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(-MinNormal, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(-MaxSubnormal, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(-float.Epsilon, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(-0.0f, 1.0f)); + AssertBitwiseEqual(float.NaN, NumberHelper.Max(float.NaN, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(0.0f, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(float.Epsilon, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(MaxSubnormal, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(MinNormal, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Max(1.0f, 1.0f)); + AssertBitwiseEqual(float.MaxValue, NumberHelper.Max(float.MaxValue, 1.0f)); + AssertBitwiseEqual(float.PositiveInfinity, NumberHelper.Max(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void MinTest() + { + AssertBitwiseEqual(float.NegativeInfinity, NumberHelper.Min(float.NegativeInfinity, 1.0f)); + AssertBitwiseEqual(float.MinValue, NumberHelper.Min(float.MinValue, 1.0f)); + AssertBitwiseEqual(-1.0f, NumberHelper.Min(-1.0f, 1.0f)); + AssertBitwiseEqual(-MinNormal, NumberHelper.Min(-MinNormal, 1.0f)); + AssertBitwiseEqual(-MaxSubnormal, NumberHelper.Min(-MaxSubnormal, 1.0f)); + AssertBitwiseEqual(-float.Epsilon, NumberHelper.Min(-float.Epsilon, 1.0f)); + AssertBitwiseEqual(-0.0f, NumberHelper.Min(-0.0f, 1.0f)); + AssertBitwiseEqual(float.NaN, NumberHelper.Min(float.NaN, 1.0f)); + AssertBitwiseEqual(0.0f, NumberHelper.Min(0.0f, 1.0f)); + AssertBitwiseEqual(float.Epsilon, NumberHelper.Min(float.Epsilon, 1.0f)); + AssertBitwiseEqual(MaxSubnormal, NumberHelper.Min(MaxSubnormal, 1.0f)); + AssertBitwiseEqual(MinNormal, NumberHelper.Min(MinNormal, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Min(1.0f, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Min(float.MaxValue, 1.0f)); + AssertBitwiseEqual(1.0f, NumberHelper.Min(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void SignTest() + { + Assert.Equal(-1, NumberHelper.Sign(float.NegativeInfinity)); + Assert.Equal(-1, NumberHelper.Sign(float.MinValue)); + Assert.Equal(-1, NumberHelper.Sign(-1.0f)); + Assert.Equal(-1, NumberHelper.Sign(-MinNormal)); + Assert.Equal(-1, NumberHelper.Sign(-MaxSubnormal)); + Assert.Equal(-1, NumberHelper.Sign(-float.Epsilon)); + + Assert.Equal(0, NumberHelper.Sign(-0.0f)); + Assert.Equal(0, NumberHelper.Sign(0.0f)); + + Assert.Equal(1, NumberHelper.Sign(float.Epsilon)); + Assert.Equal(1, NumberHelper.Sign(MaxSubnormal)); + Assert.Equal(1, NumberHelper.Sign(MinNormal)); + Assert.Equal(1, NumberHelper.Sign(1.0f)); + Assert.Equal(1, NumberHelper.Sign(float.MaxValue)); + Assert.Equal(1, NumberHelper.Sign(float.PositiveInfinity)); + + Assert.Throws(() => NumberHelper.Sign(float.NaN)); + } + + [Fact] + public static void TryCreateFromByteTest() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal(127.0f, result); + + Assert.True(NumberHelper.TryCreate(0x80, out result)); + Assert.Equal(128.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFF, out result)); + Assert.Equal(255.0f, result); + } + + [Fact] + public static void TryCreateFromCharTest() + { + float result; + + Assert.True(NumberHelper.TryCreate((char)0x0000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate((char)0x0001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate((char)0x7FFF, out result)); + Assert.Equal(32767.0f, result); + + Assert.True(NumberHelper.TryCreate((char)0x8000, out result)); + Assert.Equal(32768.0f, result); + + Assert.True(NumberHelper.TryCreate((char)0xFFFF, out result)); + Assert.Equal(65535.0f, result); + } + + [Fact] + public static void TryCreateFromInt16Test() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal(32767.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0x8000), out result)); + Assert.Equal(-32768.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((short)0xFFFF), out result)); + Assert.Equal(-1.0f, result); + } + + [Fact] + public static void TryCreateFromInt32Test() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0x80000000), out result)); + Assert.Equal(-2147483648.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((int)0xFFFFFFFF), out result)); + Assert.Equal(-1.0f, result); + } + + [Fact] + public static void TryCreateFromInt64Test() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal(9223372036854775807.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0x8000000000000000)), out result)); + Assert.Equal(-9223372036854775808.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked(unchecked((long)0xFFFFFFFFFFFFFFFF)), out result)); + Assert.Equal(-1.0f, result); + } + + [Fact] + public static void TryCreateFromIntPtrTest() + { + float result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000000), out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x0000000000000001), out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal(9223372036854775807.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x8000000000000000), out result)); + Assert.Equal(-9223372036854775808.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFFFFFFFFFF), out result)); + Assert.Equal(-1.0f, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nint)0x00000000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate((nint)0x00000001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate((nint)0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0x80000000), out result)); + Assert.Equal(-2147483648.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nint)0xFFFFFFFF), out result)); + Assert.Equal(-1.0f, result); + } + } + + [Fact] + public static void TryCreateFromSByteTest() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x00, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x01, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7F, out result)); + Assert.Equal(127.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0x80), out result)); + Assert.Equal(-128.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((sbyte)0xFF), out result)); + Assert.Equal(-1.0f, result); + } + + [Fact] + public static void TryCreateFromUInt16Test() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x0000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x0001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7FFF, out result)); + Assert.Equal(32767.0f, result); + + Assert.True(NumberHelper.TryCreate(0x8000, out result)); + Assert.Equal(32768.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFFFF, out result)); + Assert.Equal(65535.0f, result); + } + + [Fact] + public static void TryCreateFromUInt32Test() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x00000000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x00000001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0f, result); + + Assert.True(NumberHelper.TryCreate(0x80000000, out result)); + Assert.Equal(2147483648.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFF, out result)); + Assert.Equal(4294967295.0f, result); + } + + [Fact] + public static void TryCreateFromUInt64Test() + { + float result; + + Assert.True(NumberHelper.TryCreate(0x0000000000000000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(0x0000000000000001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(0x7FFFFFFFFFFFFFFF, out result)); + Assert.Equal(9223372036854775807.0f, result); + + Assert.True(NumberHelper.TryCreate(0x8000000000000000, out result)); + Assert.Equal(9223372036854775808.0f, result); + + Assert.True(NumberHelper.TryCreate(0xFFFFFFFFFFFFFFFF, out result)); + Assert.Equal(18446744073709551615.0f, result); + } + + [Fact] + public static void TryCreateFromUIntPtrTest() + { + float result; + + if (Environment.Is64BitProcess) + { + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000000), out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x0000000000000001), out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x7FFFFFFFFFFFFFFF), out result)); + Assert.Equal(9223372036854775807.0f, result); + + // https://github.com/dotnet/roslyn/issues/60714 + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x8000000000000000), out result)); + // Assert.Equal(9223372036854775808.0f, result); + // + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFFFFFFFFFF), out result)); + // Assert.Equal(18446744073709551615.0f, result); + } + else + { + Assert.True(NumberHelper.TryCreate((nuint)0x00000000, out result)); + Assert.Equal(0.0f, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x00000001, out result)); + Assert.Equal(1.0f, result); + + Assert.True(NumberHelper.TryCreate((nuint)0x7FFFFFFF, out result)); + Assert.Equal(2147483647.0f, result); + + // https://github.com/dotnet/roslyn/issues/60714 + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0x80000000), out result)); + // Assert.Equal(2147483648.0f, result); + // + // Assert.True(NumberHelper.TryCreate(unchecked((nuint)0xFFFFFFFF), out result)); + // Assert.Equal(4294967295.0f, result); + } + } + + [Fact] + public static void op_SubtractionTest() + { + AssertBitwiseEqual(float.NegativeInfinity, SubtractionOperatorsHelper.op_Subtraction(float.NegativeInfinity, 1.0f)); + AssertBitwiseEqual(float.MinValue, SubtractionOperatorsHelper.op_Subtraction(float.MinValue, 1.0f)); + AssertBitwiseEqual(-2.0f, SubtractionOperatorsHelper.op_Subtraction(-1.0f, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(-MinNormal, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(-MaxSubnormal, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(-float.Epsilon, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(-0.0f, 1.0f)); + AssertBitwiseEqual(float.NaN, SubtractionOperatorsHelper.op_Subtraction(float.NaN, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(0.0f, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(float.Epsilon, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(MaxSubnormal, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_Subtraction(MinNormal, 1.0f)); + AssertBitwiseEqual(0.0f, SubtractionOperatorsHelper.op_Subtraction(1.0f, 1.0f)); + AssertBitwiseEqual(float.MaxValue, SubtractionOperatorsHelper.op_Subtraction(float.MaxValue, 1.0f)); + AssertBitwiseEqual(float.PositiveInfinity, SubtractionOperatorsHelper.op_Subtraction(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_CheckedSubtractionTest() + { + AssertBitwiseEqual(float.NegativeInfinity, SubtractionOperatorsHelper.op_CheckedSubtraction(float.NegativeInfinity, 1.0f)); + AssertBitwiseEqual(float.MinValue, SubtractionOperatorsHelper.op_CheckedSubtraction(float.MinValue, 1.0f)); + AssertBitwiseEqual(-2.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(-1.0f, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(-MinNormal, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(-MaxSubnormal, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(-float.Epsilon, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(-0.0f, 1.0f)); + AssertBitwiseEqual(float.NaN, SubtractionOperatorsHelper.op_CheckedSubtraction(float.NaN, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(0.0f, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(float.Epsilon, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(MaxSubnormal, 1.0f)); + AssertBitwiseEqual(-1.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(MinNormal, 1.0f)); + AssertBitwiseEqual(0.0f, SubtractionOperatorsHelper.op_CheckedSubtraction(1.0f, 1.0f)); + AssertBitwiseEqual(float.MaxValue, SubtractionOperatorsHelper.op_CheckedSubtraction(float.MaxValue, 1.0f)); + AssertBitwiseEqual(float.PositiveInfinity, SubtractionOperatorsHelper.op_CheckedSubtraction(float.PositiveInfinity, 1.0f)); + } + + [Fact] + public static void op_UnaryNegationTest() + { + AssertBitwiseEqual(float.PositiveInfinity, UnaryNegationOperatorsHelper.op_UnaryNegation(float.NegativeInfinity)); + AssertBitwiseEqual(float.MaxValue, UnaryNegationOperatorsHelper.op_UnaryNegation(float.MinValue)); + AssertBitwiseEqual(1.0f, UnaryNegationOperatorsHelper.op_UnaryNegation(-1.0f)); + AssertBitwiseEqual(MinNormal, UnaryNegationOperatorsHelper.op_UnaryNegation(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, UnaryNegationOperatorsHelper.op_UnaryNegation(-MaxSubnormal)); + AssertBitwiseEqual(float.Epsilon, UnaryNegationOperatorsHelper.op_UnaryNegation(-float.Epsilon)); + AssertBitwiseEqual(0.0f, UnaryNegationOperatorsHelper.op_UnaryNegation(-0.0f)); + AssertBitwiseEqual(float.NaN, UnaryNegationOperatorsHelper.op_UnaryNegation(float.NaN)); + AssertBitwiseEqual(-0.0f, UnaryNegationOperatorsHelper.op_UnaryNegation(0.0f)); + AssertBitwiseEqual(-float.Epsilon, UnaryNegationOperatorsHelper.op_UnaryNegation(float.Epsilon)); + AssertBitwiseEqual(-MaxSubnormal, UnaryNegationOperatorsHelper.op_UnaryNegation(MaxSubnormal)); + AssertBitwiseEqual(-MinNormal, UnaryNegationOperatorsHelper.op_UnaryNegation(MinNormal)); + AssertBitwiseEqual(-1.0f, UnaryNegationOperatorsHelper.op_UnaryNegation(1.0f)); + AssertBitwiseEqual(float.MinValue, UnaryNegationOperatorsHelper.op_UnaryNegation(float.MaxValue)); + AssertBitwiseEqual(float.NegativeInfinity, UnaryNegationOperatorsHelper.op_UnaryNegation(float.PositiveInfinity)); + } + + [Fact] + public static void op_CheckedUnaryNegationTest() + { + AssertBitwiseEqual(float.PositiveInfinity, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(float.NegativeInfinity)); + AssertBitwiseEqual(float.MaxValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(float.MinValue)); + AssertBitwiseEqual(1.0f, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-1.0f)); + AssertBitwiseEqual(MinNormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-MinNormal)); + AssertBitwiseEqual(MaxSubnormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-MaxSubnormal)); + AssertBitwiseEqual(float.Epsilon, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-float.Epsilon)); + AssertBitwiseEqual(0.0f, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(-0.0f)); + AssertBitwiseEqual(float.NaN, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(float.NaN)); + AssertBitwiseEqual(-0.0f, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(0.0f)); + AssertBitwiseEqual(-float.Epsilon, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(float.Epsilon)); + AssertBitwiseEqual(-MaxSubnormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(MaxSubnormal)); + AssertBitwiseEqual(-MinNormal, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(MinNormal)); + AssertBitwiseEqual(-1.0f, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(1.0f)); + AssertBitwiseEqual(float.MinValue, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(float.MaxValue)); + AssertBitwiseEqual(float.NegativeInfinity, UnaryNegationOperatorsHelper.op_CheckedUnaryNegation(float.PositiveInfinity)); + } + + [Fact] + public static void op_UnaryPlusTest() + { + AssertBitwiseEqual(float.NegativeInfinity, UnaryPlusOperatorsHelper.op_UnaryPlus(float.NegativeInfinity)); + AssertBitwiseEqual(float.MinValue, UnaryPlusOperatorsHelper.op_UnaryPlus(float.MinValue)); + AssertBitwiseEqual(-1.0f, UnaryPlusOperatorsHelper.op_UnaryPlus(-1.0f)); + AssertBitwiseEqual(-MinNormal, UnaryPlusOperatorsHelper.op_UnaryPlus(-MinNormal)); + AssertBitwiseEqual(-MaxSubnormal, UnaryPlusOperatorsHelper.op_UnaryPlus(-MaxSubnormal)); + AssertBitwiseEqual(-float.Epsilon, UnaryPlusOperatorsHelper.op_UnaryPlus(-float.Epsilon)); + AssertBitwiseEqual(-0.0f, UnaryPlusOperatorsHelper.op_UnaryPlus(-0.0f)); + AssertBitwiseEqual(float.NaN, UnaryPlusOperatorsHelper.op_UnaryPlus(float.NaN)); + AssertBitwiseEqual(0.0f, UnaryPlusOperatorsHelper.op_UnaryPlus(0.0f)); + AssertBitwiseEqual(float.Epsilon, UnaryPlusOperatorsHelper.op_UnaryPlus(float.Epsilon)); + AssertBitwiseEqual(MaxSubnormal, UnaryPlusOperatorsHelper.op_UnaryPlus(MaxSubnormal)); + AssertBitwiseEqual(MinNormal, UnaryPlusOperatorsHelper.op_UnaryPlus(MinNormal)); + AssertBitwiseEqual(1.0f, UnaryPlusOperatorsHelper.op_UnaryPlus(1.0f)); + AssertBitwiseEqual(float.MaxValue, UnaryPlusOperatorsHelper.op_UnaryPlus(float.MaxValue)); + AssertBitwiseEqual(float.PositiveInfinity, UnaryPlusOperatorsHelper.op_UnaryPlus(float.PositiveInfinity)); + } + [Theory] [MemberData(nameof(SingleTests.Parse_Valid_TestData), MemberType = typeof(SingleTests))] public static void ParseValidStringTest(string value, NumberStyles style, IFormatProvider provider, float expected)