--- /dev/null Mon Jan 26 16:14:25 2009 +++ new/test/java/math/BigInteger/BigIntegerTest.java Mon Jan 26 16:14:24 2009 @@ -0,0 +1,792 @@ +/* + * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 + * @summary tests methods in BigInteger + * @run main/timeout=400 BigIntegerTest + * @author madbot + */ + +import java.util.Random; +import java.math.BigInteger; +import java.io.*; + +/** + * This is a simple test class created to ensure that the results + * generated by BigInteger adhere to certain identities. Passing + * this test is a strong assurance that the BigInteger operations + * are working correctly. + * + * Three arguments may be specified which give the number of + * decimal digits you desire in the three batches of test numbers. + * + * The tests are performed on arrays of random numbers which are + * generated by a Random class as well as special cases which + * throw in boundary numbers such as 0, 1, maximum sized, etc. + * + */ +public class BigIntegerTest { + static Random rnd = new Random(); + 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>= 1; + } + + if (bigX.bitCount() != bitCount) { + //System.err.println(x+": "+bitCount+", "+bigX.bitCount()); + failCount++; + } + } + report("Bit Count", failCount); + } + + public static void bitLength() { + int failCount = 0; + + for (int i=0; i0) + 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(); + + if (failure) + throw new RuntimeException("Failure in BigIntegerTest."); + } + + /* + * Get a random or boundary-case number. This is designed to provide + * a lot of numbers that will find failure points, such as max sized + * numbers, empty BigIntegers, etc. + * + * If order is less than 2, order is changed to 2. + */ + private static BigInteger fetchNumber(int order) { + boolean negative = rnd.nextBoolean(); + int numType = rnd.nextInt(6); + BigInteger result = null; + if (order < 2) order = 2; + + switch (numType) { + case 0: // Empty + result = BigInteger.ZERO; + break; + + case 1: // One + result = BigInteger.ONE; + break; + + case 2: // All bits set in number + int numBytes = (order+7)/8; + byte[] fullBits = new byte[numBytes]; + for(int i=0; i 0) + failure = true; + } +}