Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kzrnm committed Feb 24, 2025
1 parent 2ef4970 commit 66ecbda
Showing 1 changed file with 272 additions and 1 deletion.
273 changes: 272 additions & 1 deletion src/libraries/System.Runtime.Numerics/tests/BigInteger/Rotate.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;
using System.Globalization;
using Xunit;

namespace System.Numerics.Tests
Expand Down Expand Up @@ -307,6 +307,142 @@ public class RotateLeftTest : RotateTestBase
{
public override string opstring => "bRotateLeft";


public static TheoryData<BigInteger, int, BigInteger> NegativeNumber_TestData = new TheoryData<BigInteger, int, BigInteger>
{

{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0000)),
1,
new BigInteger(unchecked((long)0xFFFF_FFFE_0000_0001))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0000)),
2,
new BigInteger(unchecked((long)0xFFFF_FFFC_0000_0003))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0001)),
1,
new BigInteger(unchecked((long)0xFFFF_FFFE_0000_0003))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0001)),
2,
new BigInteger(unchecked((long)0xFFFF_FFFC_0000_0007))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0002)),
1,
new BigInteger(unchecked((long)0xFFFF_FFFE_0000_0005))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0002)),
2,
new BigInteger(unchecked((long)0xFFFF_FFFC_0000_000B))
},

{
new BigInteger(unchecked((long)0x8000_0000_0000_0000)),
1,
new BigInteger(0x1)
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0000)),
2,
new BigInteger(0x2)
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0001)),
1,
new BigInteger(0x3)
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0001)),
2,
new BigInteger(0x6)
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0002)),
1,
new BigInteger(0x5)
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0002)),
2,
new BigInteger(0xA)
},

{
BigInteger.Parse("8000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
1,
new BigInteger(0x1)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
2,
new BigInteger(0x2)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
1,
new BigInteger(0x3)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
2,
new BigInteger(0x6)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
1,
new BigInteger(0x5)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
2,
new BigInteger(0xA)
},

{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("________E_0000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("________C_0000_0000_0000_0000_0000_0003".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("________E_0000_0000_0000_0000_0000_0003".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("________C_0000_0000_0000_0000_0000_0007".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("________E_0000_0000_0000_0000_0000_0005".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("________C_0000_0000_0000_0000_0000_000B".Replace("_", ""), NumberStyles.HexNumber)
},
};

[Theory]
[MemberData(nameof(NegativeNumber_TestData))]
public void NegativeNumber(BigInteger input, int rotateAmount, BigInteger expected)
{
Assert.Equal(expected, BigInteger.RotateLeft(input, rotateAmount));
}

[Fact]
public void PowerOfTwo()
{
Expand Down Expand Up @@ -334,6 +470,141 @@ public class RotateRightTest : RotateTestBase
{
public override string opstring => "bRotateRight";

public static TheoryData<BigInteger, int, BigInteger> NegativeNumber_TestData = new TheoryData<BigInteger, int, BigInteger>
{

{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0000)),
1,
new BigInteger(unchecked((long)0x7FFF_FFFF_8000_0000))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0000)),
2,
new BigInteger(unchecked((long)0x3FFF_FFFF_C000_0000))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0001)),
1,
new BigInteger(unchecked((int)0x8000_0000))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0001)),
2,
new BigInteger(unchecked((long)0x7FFF_FFFF_C000_0000))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0002)),
1,
new BigInteger(unchecked((long)0x7FFF_FFFF_8000_0001))
},
{
new BigInteger(unchecked((long)0xFFFF_FFFF_0000_0002)),
2,
new BigInteger(unchecked((long)0xBFFF_FFFF_C000_0000))
},

{
new BigInteger(unchecked((long)0x8000_0000_0000_0000)),
1,
new BigInteger(unchecked((long)0x4000_0000_0000_0000))
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0000)),
2,
new BigInteger(unchecked((long)0x2000_0000_0000_0000))
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0001)),
1,
new BigInteger(unchecked((long)0xC000_0000_0000_0000))
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0001)),
2,
new BigInteger(unchecked((long)0x6000_0000_0000_0000))
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0002)),
1,
new BigInteger(unchecked((long)0x4000_0000_0000_0001))
},
{
new BigInteger(unchecked((long)0x8000_0000_0000_0002)),
2,
new BigInteger(unchecked((long)0xA000_0000_0000_0000))
},

{
BigInteger.Parse("8000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("4000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("2000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("C000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("6000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("4000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("8000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("A000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},

{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("7FFF_FFFF_8000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("3FFF_FFFF_C000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("__________8000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("7FFF_FFFF_C000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
1,
BigInteger.Parse("7FFF_FFFF_8000_0000_0000_0000_0000_0001".Replace("_", ""), NumberStyles.HexNumber)
},
{
BigInteger.Parse("________F_0000_0000_0000_0000_0000_0002".Replace("_", ""), NumberStyles.HexNumber),
2,
BigInteger.Parse("BFFF_FFFF_C000_0000_0000_0000_0000_0000".Replace("_", ""), NumberStyles.HexNumber)
},
};

[Theory]
[MemberData(nameof(NegativeNumber_TestData))]
public void NegativeNumber(BigInteger input, int rotateAmount, BigInteger expected)
{
Assert.Equal(expected, BigInteger.RotateRight(input, rotateAmount));
}

[Fact]
public void PowerOfTwo()
{
Expand Down

0 comments on commit 66ecbda

Please sign in to comment.