Unit test patch for https://gist.github.com/1576016 (original) (raw)

--- jdk8/test/java/math/BigInteger/BigIntegerTest.java 2012-01-09 20:27:23.000000000 -0700

+++ src/test/java/BigIntegerTest.java 2012-01-09 21:25:25.000000000 -0700

@@ -52,17 +52,12 @@

static int size = 1000; // numbers per batch

static boolean failure = false;

- // Some variables for sizing test numbers in bits

- private static int order1 = 100;

- private static int order2 = 60;

- private static int order3 = 30;

-

- public static void pow() {

int failCount1 = 0;

for (int i=0; i<size; i++) {

int power = rnd.nextInt(6) +2;

- BigInteger x = fetchNumber(order1);

BigInteger y = x.pow(power);

BigInteger z = x;

@@ -75,16 +70,16 @@

report("pow", failCount1);

}

- public static void arithmetic() {

int failCount = 0;

for (int i=0; i<size; i++) {

- BigInteger x = fetchNumber(order1);

while(x.compareTo(BigInteger.ZERO) != 1)

- x = fetchNumber(order1);

- BigInteger y = fetchNumber(order1/2);

while(x.compareTo(y) == -1)

- y = fetchNumber(order1/2);

if (y.equals(BigInteger.ZERO))

y = y.add(BigInteger.ONE);

@@ -95,16 +90,16 @@

if (!baz.equals(BigInteger.ZERO))

failCount++;

}

- report("Arithmetic I", failCount);

failCount = 0;

for (int i=0; i<100; i++) {

- BigInteger x = fetchNumber(order1);

while(x.compareTo(BigInteger.ZERO) != 1)

- x = fetchNumber(order1);

- BigInteger y = fetchNumber(order1/2);

while(x.compareTo(y) == -1)

- y = fetchNumber(order1/2);

if (y.equals(BigInteger.ZERO))

y = y.add(BigInteger.ONE);

@@ -115,7 +110,7 @@

if (!baz[0].equals(BigInteger.ZERO))

failCount++;

}

- report("Arithmetic II", failCount);

}

public static void bitCount() {

@@ -160,11 +155,11 @@

report("BitLength", failCount);

}

- public static void bitOps() {

int failCount1 = 0, failCount2 = 0, failCount3 = 0;

for (int i=0; i<size*5; i++) {

- BigInteger x = fetchNumber(order1);

BigInteger y;

/* Test setBit and clearBit (and testBit) */

@@ -194,7 +189,7 @@

report("flipBit/testBit", failCount2);

for (int i=0; i<size*5; i++) {

- BigInteger x = fetchNumber(order1);

/* Test getLowestSetBit() */

int k = x.getLowestSetBit();

@@ -213,13 +208,13 @@

report("getLowestSetBit", failCount3);

}

- public static void bitwise() {

/* Test identity x^y == x|y &~ x&y */

int failCount = 0;

for (int i=0; i<size; i++) {

- BigInteger x = fetchNumber(order1);

- BigInteger y = fetchNumber(order1);

BigInteger z = x.xor(y);

BigInteger w = x.or(y).andNot(x.and(y));

if (!z.equals(w))

@@ -230,8 +225,8 @@

/* Test identity x &~ y == ~(~x | y) */

failCount = 0;

for (int i=0; i<size; i++) {

- BigInteger x = fetchNumber(order1);

- BigInteger y = fetchNumber(order1);

BigInteger z = x.andNot(y);

BigInteger w = x.not().or(y).not();

if (!z.equals(w))

@@ -240,13 +235,13 @@

report("Logic (&~ | ~)", failCount);

}

- public static void shift() {

int failCount1 = 0;

int failCount2 = 0;

int failCount3 = 0;

for (int i=0; i<100; i++) {

- BigInteger x = fetchNumber(order1);

int n = Math.abs(rnd.nextInt()%200);

if (!x.shiftLeft(n).equals

@@ -279,13 +274,13 @@

report("baz shiftLeft/Right", failCount3);

}

- public static void divideAndRemainder() {

int failCount1 = 0;

for (int i=0; i<size; i++) {

- BigInteger x = fetchNumber(order1).abs();

while(x.compareTo(BigInteger.valueOf(3L)) != 1)

- x = fetchNumber(order1).abs();

BigInteger z = x.divide(BigInteger.valueOf(2L));

BigInteger y[] = x.divideAndRemainder(x);

if (!y[0].equals(BigInteger.ONE)) {

@@ -306,7 +301,7 @@

System.err.println(" y :"+y);

}

}

- report("divideAndRemainder I", failCount1);

}

public static void stringConv() {

@@ -331,13 +326,13 @@

report("String Conversion", failCount);

}

- public static void byteArrayConv() {

int failCount = 0;

for (int i=0; i<size; i++) {

- BigInteger x = fetchNumber(order1);

while (x.equals(BigInteger.ZERO))

- x = fetchNumber(order1);

BigInteger y = new BigInteger(x.toByteArray());

if (!x.equals(y)) {

failCount++;

@@ -348,16 +343,16 @@

report("Array Conversion", failCount);

}

- public static void modInv() {

int failCount = 0, successCount = 0, nonInvCount = 0;

for (int i=0; i<size; i++) {

- BigInteger x = fetchNumber(order1);

while(x.equals(BigInteger.ZERO))

- x = fetchNumber(order1);

- BigInteger m = fetchNumber(order1).abs();

while(m.compareTo(BigInteger.ONE) != 1)

- m = fetchNumber(order1).abs();

try {

BigInteger inv = x.modInverse(m);

@@ -374,10 +369,10 @@

nonInvCount++;

}

}

- report("Modular Inverse", failCount);

}

- public static void modExp() {

int failCount = 0;

for (int i=0; i<size/10; i++) {

@@ -404,7 +399,7 @@

// This test is based on Fermat's theorem

// which is not ideal because base must not be multiple of modulus

// and modulus must be a prime or pseudoprime (Carmichael number)

- public static void modExp2() {

int failCount = 0;

for (int i=0; i<10; i++) {

@@ -412,11 +407,11 @@

while(m.compareTo(BigInteger.ONE) != 1)

m = new BigInteger(100, 5, rnd);

BigInteger exp = m.subtract(BigInteger.ONE);

- BigInteger base = fetchNumber(order1).abs();

while(base.compareTo(m) != -1)

- base = fetchNumber(order1).abs();

while(base.equals(BigInteger.ZERO))

- base = fetchNumber(order1).abs();

BigInteger one = base.modPow(exp, m);

if (!one.equals(BigInteger.ONE)) {

@@ -704,32 +699,49 @@

*/

public static void main(String[] args) throws Exception {

if (args.length >0)

order1 = (int)((Integer.parseInt(args[0]))* 3.333);

if (args.length >1)

order2 = (int)((Integer.parseInt(args[1]))* 3.333);

if (args.length >2)

order3 = (int)((Integer.parseInt(args[2]))* 3.333);

prime();

nextProbablePrime();

- arithmetic();

- divideAndRemainder();

- pow();

bitCount();

bitLength();

- bitOps();

- bitwise();

- shift();

- byteArrayConv();

- modInv();

- modExp();

- modExp2();

stringConv();

serialize();

@@ -747,7 +759,7 @@

*/

private static BigInteger fetchNumber(int order) {

boolean negative = rnd.nextBoolean();

- int numType = rnd.nextInt(6);

BigInteger result = null;

if (order < 2) order = 2;

@@ -783,6 +795,19 @@

result = result.or(temp);

}

break;

default: // random bits

result = new BigInteger(order, rnd);