test/jdk/java/util/Arrays/ParallelSorting.java
branchaefimov-dns-client-branch
changeset 59099 fcdb8e7ead8f
parent 58984 15e026239a6c
parent 59075 355f4f42dda5
child 59100 b92aac38b046
equal deleted inserted replaced
58984:15e026239a6c 59099:fcdb8e7ead8f
     1 /*
       
     2  * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 
       
    24 /* Adapted from test/java/util/Arrays/Sorting.java
       
    25  *
       
    26  * Where that test checks Arrays.sort against manual quicksort routines,
       
    27  * this test checks parallelSort against either Arrays.sort or manual
       
    28  * quicksort routines.
       
    29  */
       
    30 
       
    31 /*
       
    32  * @test
       
    33  * @bug 8003981
       
    34  * @run main ParallelSorting -shortrun
       
    35  * @summary Exercise Arrays.parallelSort (adapted from test Sorting)
       
    36  *
       
    37  * @author Vladimir Yaroslavskiy
       
    38  * @author Jon Bentley
       
    39  * @author Josh Bloch
       
    40  */
       
    41 
       
    42 import java.util.Arrays;
       
    43 import java.util.Random;
       
    44 import java.io.PrintStream;
       
    45 import java.util.Comparator;
       
    46 
       
    47 public class ParallelSorting {
       
    48     private static final PrintStream out = System.out;
       
    49     private static final PrintStream err = System.err;
       
    50 
       
    51     // Array lengths used in a long run (default)
       
    52     private static final int[] LONG_RUN_LENGTHS = {
       
    53         1000, 10000, 100000, 1000000 };
       
    54 
       
    55     // Array lengths used in a short run
       
    56     private static final int[] SHORT_RUN_LENGTHS = {
       
    57         5000, 9000, 10000, 12000 };
       
    58 
       
    59     // Random initial values used in a long run (default)
       
    60     private static final long[] LONG_RUN_RANDOMS = { 666, 0xC0FFEE, 999 };
       
    61 
       
    62     // Random initial values used in a short run
       
    63     private static final long[] SHORT_RUN_RANDOMS = { 666 };
       
    64 
       
    65     public static void main(String[] args) {
       
    66         boolean shortRun = args.length > 0 && args[0].equals("-shortrun");
       
    67         long start = System.currentTimeMillis();
       
    68 
       
    69         if (shortRun) {
       
    70             testAndCheck(SHORT_RUN_LENGTHS, SHORT_RUN_RANDOMS);
       
    71         } else {
       
    72             testAndCheck(LONG_RUN_LENGTHS, LONG_RUN_RANDOMS);
       
    73         }
       
    74         long end = System.currentTimeMillis();
       
    75 
       
    76         out.format("PASSED in %d sec.\n", Math.round((end - start) / 1E3));
       
    77     }
       
    78 
       
    79     private static void testAndCheck(int[] lengths, long[] randoms) {
       
    80         testEmptyAndNullIntArray();
       
    81         testEmptyAndNullLongArray();
       
    82         testEmptyAndNullShortArray();
       
    83         testEmptyAndNullCharArray();
       
    84         testEmptyAndNullByteArray();
       
    85         testEmptyAndNullFloatArray();
       
    86         testEmptyAndNullDoubleArray();
       
    87 
       
    88         for (int length : lengths) {
       
    89             testMergeSort(length);
       
    90             testAndCheckRange(length);
       
    91             testAndCheckSubArray(length);
       
    92         }
       
    93         for (long seed : randoms) {
       
    94             for (int length : lengths) {
       
    95                 testAndCheckWithInsertionSort(length, new MyRandom(seed));
       
    96                 testAndCheckWithCheckSum(length, new MyRandom(seed));
       
    97                 testAndCheckWithScrambling(length, new MyRandom(seed));
       
    98                 testAndCheckFloat(length, new MyRandom(seed));
       
    99                 testAndCheckDouble(length, new MyRandom(seed));
       
   100                 testStable(length, new MyRandom(seed));
       
   101             }
       
   102         }
       
   103     }
       
   104 
       
   105     private static void testEmptyAndNullIntArray() {
       
   106         ourDescription = "Check empty and null array";
       
   107         Arrays.parallelSort(new int[]{});
       
   108         Arrays.parallelSort(new int[]{}, 0, 0);
       
   109 
       
   110         try {
       
   111             Arrays.parallelSort((int[]) null);
       
   112         } catch (NullPointerException expected) {
       
   113             try {
       
   114                 Arrays.parallelSort((int[]) null, 0, 0);
       
   115             } catch (NullPointerException expected2) {
       
   116                 return;
       
   117             }
       
   118             failed("Arrays.parallelSort(int[],fromIndex,toIndex) shouldn't " +
       
   119                 "catch null array");
       
   120         }
       
   121         failed("Arrays.parallelSort(int[]) shouldn't catch null array");
       
   122     }
       
   123 
       
   124     private static void testEmptyAndNullLongArray() {
       
   125         ourDescription = "Check empty and null array";
       
   126         Arrays.parallelSort(new long[]{});
       
   127         Arrays.parallelSort(new long[]{}, 0, 0);
       
   128 
       
   129         try {
       
   130             Arrays.parallelSort((long[]) null);
       
   131         } catch (NullPointerException expected) {
       
   132             try {
       
   133                 Arrays.parallelSort((long[]) null, 0, 0);
       
   134             } catch (NullPointerException expected2) {
       
   135                 return;
       
   136             }
       
   137             failed("Arrays.parallelSort(long[],fromIndex,toIndex) shouldn't " +
       
   138                 "catch null array");
       
   139         }
       
   140         failed("Arrays.parallelSort(long[]) shouldn't catch null array");
       
   141     }
       
   142 
       
   143     private static void testEmptyAndNullShortArray() {
       
   144         ourDescription = "Check empty and null array";
       
   145         Arrays.parallelSort(new short[]{});
       
   146         Arrays.parallelSort(new short[]{}, 0, 0);
       
   147 
       
   148         try {
       
   149             Arrays.parallelSort((short[]) null);
       
   150         } catch (NullPointerException expected) {
       
   151             try {
       
   152                 Arrays.parallelSort((short[]) null, 0, 0);
       
   153             } catch (NullPointerException expected2) {
       
   154                 return;
       
   155             }
       
   156             failed("Arrays.parallelSort(short[],fromIndex,toIndex) shouldn't " +
       
   157                 "catch null array");
       
   158         }
       
   159         failed("Arrays.parallelSort(short[]) shouldn't catch null array");
       
   160     }
       
   161 
       
   162     private static void testEmptyAndNullCharArray() {
       
   163         ourDescription = "Check empty and null array";
       
   164         Arrays.parallelSort(new char[]{});
       
   165         Arrays.parallelSort(new char[]{}, 0, 0);
       
   166 
       
   167         try {
       
   168             Arrays.parallelSort((char[]) null);
       
   169         } catch (NullPointerException expected) {
       
   170             try {
       
   171                 Arrays.parallelSort((char[]) null, 0, 0);
       
   172             } catch (NullPointerException expected2) {
       
   173                 return;
       
   174             }
       
   175             failed("Arrays.parallelSort(char[],fromIndex,toIndex) shouldn't " +
       
   176                 "catch null array");
       
   177         }
       
   178         failed("Arrays.parallelSort(char[]) shouldn't catch null array");
       
   179     }
       
   180 
       
   181     private static void testEmptyAndNullByteArray() {
       
   182         ourDescription = "Check empty and null array";
       
   183         Arrays.parallelSort(new byte[]{});
       
   184         Arrays.parallelSort(new byte[]{}, 0, 0);
       
   185 
       
   186         try {
       
   187             Arrays.parallelSort((byte[]) null);
       
   188         } catch (NullPointerException expected) {
       
   189             try {
       
   190                 Arrays.parallelSort((byte[]) null, 0, 0);
       
   191             } catch (NullPointerException expected2) {
       
   192                 return;
       
   193             }
       
   194             failed("Arrays.parallelSort(byte[],fromIndex,toIndex) shouldn't " +
       
   195                 "catch null array");
       
   196         }
       
   197         failed("Arrays.parallelSort(byte[]) shouldn't catch null array");
       
   198     }
       
   199 
       
   200     private static void testEmptyAndNullFloatArray() {
       
   201         ourDescription = "Check empty and null array";
       
   202         Arrays.parallelSort(new float[]{});
       
   203         Arrays.parallelSort(new float[]{}, 0, 0);
       
   204 
       
   205         try {
       
   206             Arrays.parallelSort((float[]) null);
       
   207         } catch (NullPointerException expected) {
       
   208             try {
       
   209                 Arrays.parallelSort((float[]) null, 0, 0);
       
   210             } catch (NullPointerException expected2) {
       
   211                 return;
       
   212             }
       
   213             failed("Arrays.parallelSort(float[],fromIndex,toIndex) shouldn't " +
       
   214                 "catch null array");
       
   215         }
       
   216         failed("Arrays.parallelSort(float[]) shouldn't catch null array");
       
   217     }
       
   218 
       
   219     private static void testEmptyAndNullDoubleArray() {
       
   220         ourDescription = "Check empty and null array";
       
   221         Arrays.parallelSort(new double[]{});
       
   222         Arrays.parallelSort(new double[]{}, 0, 0);
       
   223 
       
   224         try {
       
   225             Arrays.parallelSort((double[]) null);
       
   226         } catch (NullPointerException expected) {
       
   227             try {
       
   228                 Arrays.parallelSort((double[]) null, 0, 0);
       
   229             } catch (NullPointerException expected2) {
       
   230                 return;
       
   231             }
       
   232             failed("Arrays.parallelSort(double[],fromIndex,toIndex) shouldn't " +
       
   233                 "catch null array");
       
   234         }
       
   235         failed("Arrays.parallelSort(double[]) shouldn't catch null array");
       
   236     }
       
   237 
       
   238     private static void testAndCheckSubArray(int length) {
       
   239         ourDescription = "Check sorting of subarray";
       
   240         int[] golden = new int[length];
       
   241         boolean newLine = false;
       
   242 
       
   243         for (int m = 1; m < length / 2; m *= 2) {
       
   244             newLine = true;
       
   245             int fromIndex = m;
       
   246             int toIndex = length - m;
       
   247 
       
   248             prepareSubArray(golden, fromIndex, toIndex, m);
       
   249             int[] test = golden.clone();
       
   250 
       
   251             for (TypeConverter converter : TypeConverter.values()) {
       
   252                 out.println("Test 'subarray': " + converter +
       
   253                    " length = " + length + ", m = " + m);
       
   254                 Object convertedGolden = converter.convert(golden);
       
   255                 Object convertedTest = converter.convert(test);
       
   256                 sortSubArray(convertedTest, fromIndex, toIndex);
       
   257                 checkSubArray(convertedTest, fromIndex, toIndex, m);
       
   258             }
       
   259         }
       
   260         if (newLine) {
       
   261             out.println();
       
   262         }
       
   263     }
       
   264 
       
   265     private static void testAndCheckRange(int length) {
       
   266         ourDescription = "Check range check";
       
   267         int[] golden = new int[length];
       
   268 
       
   269         for (int m = 1; m < 2 * length; m *= 2) {
       
   270             for (int i = 1; i <= length; i++) {
       
   271                 golden[i - 1] = i % m + m % i;
       
   272             }
       
   273             for (TypeConverter converter : TypeConverter.values()) {
       
   274                 out.println("Test 'range': " + converter +
       
   275                    ", length = " + length + ", m = " + m);
       
   276                 Object convertedGolden = converter.convert(golden);
       
   277                 checkRange(convertedGolden, m);
       
   278             }
       
   279         }
       
   280         out.println();
       
   281     }
       
   282 
       
   283     private static void testStable(int length, MyRandom random) {
       
   284         ourDescription = "Check if sorting is stable";
       
   285         Pair[] a = build(length, random);
       
   286 
       
   287         out.println("Test 'stable': " + "random = " + random.getSeed() +
       
   288             ", length = " + length);
       
   289         Arrays.parallelSort(a);
       
   290         checkSorted(a);
       
   291         checkStable(a);
       
   292         out.println();
       
   293 
       
   294         a = build(length, random);
       
   295 
       
   296         out.println("Test 'stable' comparator: " + "random = " + random.getSeed() +
       
   297             ", length = " + length);
       
   298         Arrays.parallelSort(a, pairCmp);
       
   299         checkSorted(a);
       
   300         checkStable(a);
       
   301         out.println();
       
   302 
       
   303     }
       
   304 
       
   305     private static void checkSorted(Pair[] a) {
       
   306         for (int i = 0; i < a.length - 1; i++) {
       
   307             if (a[i].getKey() > a[i + 1].getKey()) {
       
   308                 failedSort(i, "" + a[i].getKey(), "" + a[i + 1].getKey());
       
   309             }
       
   310         }
       
   311     }
       
   312 
       
   313     private static void checkStable(Pair[] a) {
       
   314         for (int i = 0; i < a.length / 4; ) {
       
   315             int key1 = a[i].getKey();
       
   316             int value1 = a[i++].getValue();
       
   317             int key2 = a[i].getKey();
       
   318             int value2 = a[i++].getValue();
       
   319             int key3 = a[i].getKey();
       
   320             int value3 = a[i++].getValue();
       
   321             int key4 = a[i].getKey();
       
   322             int value4 = a[i++].getValue();
       
   323 
       
   324             if (!(key1 == key2 && key2 == key3 && key3 == key4)) {
       
   325                 failed("On position " + i + " keys are different " +
       
   326                     key1 + ", " + key2 + ", " + key3 + ", " + key4);
       
   327             }
       
   328             if (!(value1 < value2 && value2 < value3 && value3 < value4)) {
       
   329                 failed("Sorting is not stable at position " + i +
       
   330                     ". Second values have been changed: " +  value1 + ", " +
       
   331                     value2 + ", " + value3 + ", " + value4);
       
   332             }
       
   333         }
       
   334     }
       
   335 
       
   336     private static Pair[] build(int length, Random random) {
       
   337         Pair[] a = new Pair[length * 4];
       
   338 
       
   339         for (int i = 0; i < a.length; ) {
       
   340             int key = random.nextInt();
       
   341             a[i++] = new Pair(key, 1);
       
   342             a[i++] = new Pair(key, 2);
       
   343             a[i++] = new Pair(key, 3);
       
   344             a[i++] = new Pair(key, 4);
       
   345         }
       
   346         return a;
       
   347     }
       
   348 
       
   349     private static Comparator<Pair> pairCmp = new Comparator<Pair>() {
       
   350         public int compare(Pair p1, Pair p2) {
       
   351             return p1.compareTo(p2);
       
   352         }
       
   353     };
       
   354 
       
   355     private static final class Pair implements Comparable<Pair> {
       
   356         Pair(int key, int value) {
       
   357             myKey = key;
       
   358             myValue = value;
       
   359         }
       
   360 
       
   361         int getKey() {
       
   362             return myKey;
       
   363         }
       
   364 
       
   365         int getValue() {
       
   366             return myValue;
       
   367         }
       
   368 
       
   369         public int compareTo(Pair pair) {
       
   370             if (myKey < pair.myKey) {
       
   371                 return -1;
       
   372             }
       
   373             if (myKey > pair.myKey) {
       
   374                 return 1;
       
   375             }
       
   376             return 0;
       
   377         }
       
   378 
       
   379         @Override
       
   380         public String toString() {
       
   381             return "(" + myKey + ", " + myValue + ")";
       
   382         }
       
   383 
       
   384         private int myKey;
       
   385         private int myValue;
       
   386     }
       
   387 
       
   388 
       
   389     private static void testAndCheckWithInsertionSort(int length, MyRandom random) {
       
   390         if (length > 1000) {
       
   391             return;
       
   392         }
       
   393         ourDescription = "Check sorting with insertion sort";
       
   394         int[] golden = new int[length];
       
   395 
       
   396         for (int m = 1; m < 2 * length; m *= 2) {
       
   397             for (UnsortedBuilder builder : UnsortedBuilder.values()) {
       
   398                 builder.build(golden, m, random);
       
   399                 int[] test = golden.clone();
       
   400 
       
   401                 for (TypeConverter converter : TypeConverter.values()) {
       
   402                     out.println("Test 'insertion sort': " + converter +
       
   403                         " " + builder + "random = " + random.getSeed() +
       
   404                         ", length = " + length + ", m = " + m);
       
   405                     Object convertedGolden = converter.convert(golden);
       
   406                     Object convertedTest1 = converter.convert(test);
       
   407                     Object convertedTest2 = converter.convert(test);
       
   408                     sort(convertedTest1);
       
   409                     sortByInsertionSort(convertedTest2);
       
   410                     compare(convertedTest1, convertedTest2);
       
   411                 }
       
   412             }
       
   413         }
       
   414         out.println();
       
   415     }
       
   416 
       
   417     private static void testMergeSort(int length) {
       
   418         if (length < 1000) {
       
   419             return;
       
   420         }
       
   421         ourDescription = "Check merge sorting";
       
   422         int[] golden = new int[length];
       
   423         int period = 67; // java.util.DualPivotQuicksort.MAX_RUN_COUNT
       
   424 
       
   425         for (int m = period - 2; m <= period + 2; m++) {
       
   426             for (MergeBuilder builder : MergeBuilder.values()) {
       
   427                 builder.build(golden, m);
       
   428                 int[] test = golden.clone();
       
   429 
       
   430                 for (TypeConverter converter : TypeConverter.values()) {
       
   431                     out.println("Test 'merge sort': " + converter + " " +
       
   432                         builder + "length = " + length + ", m = " + m);
       
   433                     Object convertedGolden = converter.convert(golden);
       
   434                     sort(convertedGolden);
       
   435                     checkSorted(convertedGolden);
       
   436                 }
       
   437             }
       
   438         }
       
   439         out.println();
       
   440     }
       
   441 
       
   442     private static void testAndCheckWithCheckSum(int length, MyRandom random) {
       
   443         ourDescription = "Check sorting with check sum";
       
   444         int[] golden = new int[length];
       
   445 
       
   446         for (int m = 1; m < 2 * length; m *= 2) {
       
   447             for (UnsortedBuilder builder : UnsortedBuilder.values()) {
       
   448                 builder.build(golden, m, random);
       
   449                 int[] test = golden.clone();
       
   450 
       
   451                 for (TypeConverter converter : TypeConverter.values()) {
       
   452                     out.println("Test 'check sum': " + converter +
       
   453                         " " + builder + "random = " + random.getSeed() +
       
   454                         ", length = " + length + ", m = " + m);
       
   455                     Object convertedGolden = converter.convert(golden);
       
   456                     Object convertedTest = converter.convert(test);
       
   457                     sort(convertedTest);
       
   458                     checkWithCheckSum(convertedTest, convertedGolden);
       
   459                 }
       
   460             }
       
   461         }
       
   462         out.println();
       
   463     }
       
   464 
       
   465     private static void testAndCheckWithScrambling(int length, MyRandom random) {
       
   466         ourDescription = "Check sorting with scrambling";
       
   467         int[] golden = new int[length];
       
   468 
       
   469         for (int m = 1; m <= 7; m++) {
       
   470             if (m > length) {
       
   471                 break;
       
   472             }
       
   473             for (SortedBuilder builder : SortedBuilder.values()) {
       
   474                 builder.build(golden, m);
       
   475                 int[] test = golden.clone();
       
   476                 scramble(test, random);
       
   477 
       
   478                 for (TypeConverter converter : TypeConverter.values()) {
       
   479                     out.println("Test 'scrambling': " + converter +
       
   480                        " " + builder + "random = " + random.getSeed() +
       
   481                        ", length = " + length + ", m = " + m);
       
   482                     Object convertedGolden = converter.convert(golden);
       
   483                     Object convertedTest = converter.convert(test);
       
   484                     sort(convertedTest);
       
   485                     compare(convertedTest, convertedGolden);
       
   486                 }
       
   487             }
       
   488         }
       
   489         out.println();
       
   490     }
       
   491 
       
   492     private static void testAndCheckFloat(int length, MyRandom random) {
       
   493         ourDescription = "Check float sorting";
       
   494         float[] golden = new float[length];
       
   495         final int MAX = 10;
       
   496         boolean newLine = false;
       
   497 
       
   498         for (int a = 0; a <= MAX; a++) {
       
   499             for (int g = 0; g <= MAX; g++) {
       
   500                 for (int z = 0; z <= MAX; z++) {
       
   501                     for (int n = 0; n <= MAX; n++) {
       
   502                         for (int p = 0; p <= MAX; p++) {
       
   503                             if (a + g + z + n + p > length) {
       
   504                                 continue;
       
   505                             }
       
   506                             if (a + g + z + n + p < length) {
       
   507                                 continue;
       
   508                             }
       
   509                             for (FloatBuilder builder : FloatBuilder.values()) {
       
   510                                 out.println("Test 'float': random = " + random.getSeed() +
       
   511                                    ", length = " + length + ", a = " + a + ", g = " +
       
   512                                    g + ", z = " + z + ", n = " + n + ", p = " + p);
       
   513                                 builder.build(golden, a, g, z, n, p, random);
       
   514                                 float[] test = golden.clone();
       
   515                                 scramble(test, random);
       
   516                                 sort(test);
       
   517                                 compare(test, golden, a, n, g);
       
   518                             }
       
   519                             newLine = true;
       
   520                         }
       
   521                     }
       
   522                 }
       
   523             }
       
   524         }
       
   525         if (newLine) {
       
   526             out.println();
       
   527         }
       
   528     }
       
   529 
       
   530     private static void testAndCheckDouble(int length, MyRandom random) {
       
   531         ourDescription = "Check double sorting";
       
   532         double[] golden = new double[length];
       
   533         final int MAX = 10;
       
   534         boolean newLine = false;
       
   535 
       
   536         for (int a = 0; a <= MAX; a++) {
       
   537             for (int g = 0; g <= MAX; g++) {
       
   538                 for (int z = 0; z <= MAX; z++) {
       
   539                     for (int n = 0; n <= MAX; n++) {
       
   540                         for (int p = 0; p <= MAX; p++) {
       
   541                             if (a + g + z + n + p > length) {
       
   542                                 continue;
       
   543                             }
       
   544                             if (a + g + z + n + p < length) {
       
   545                                 continue;
       
   546                             }
       
   547                             for (DoubleBuilder builder : DoubleBuilder.values()) {
       
   548                                 out.println("Test 'double': random = " + random.getSeed() +
       
   549                                    ", length = " + length + ", a = " + a + ", g = " +
       
   550                                    g + ", z = " + z + ", n = " + n + ", p = " + p);
       
   551                                 builder.build(golden, a, g, z, n, p, random);
       
   552                                 double[] test = golden.clone();
       
   553                                 scramble(test, random);
       
   554                                 sort(test);
       
   555                                 compare(test, golden, a, n, g);
       
   556                             }
       
   557                             newLine = true;
       
   558                         }
       
   559                     }
       
   560                 }
       
   561             }
       
   562         }
       
   563         if (newLine) {
       
   564             out.println();
       
   565         }
       
   566     }
       
   567 
       
   568     private static void prepareSubArray(int[] a, int fromIndex, int toIndex, int m) {
       
   569         for (int i = 0; i < fromIndex; i++) {
       
   570             a[i] = 0xDEDA;
       
   571         }
       
   572         int middle = (fromIndex + toIndex) >>> 1;
       
   573         int k = 0;
       
   574 
       
   575         for (int i = fromIndex; i < middle; i++) {
       
   576             a[i] = k++;
       
   577         }
       
   578         for (int i = middle; i < toIndex; i++) {
       
   579             a[i] = k--;
       
   580         }
       
   581         for (int i = toIndex; i < a.length; i++) {
       
   582             a[i] = 0xBABA;
       
   583         }
       
   584     }
       
   585 
       
   586     private static void scramble(int[] a, Random random) {
       
   587         for (int i = 0; i < a.length * 7; i++) {
       
   588             swap(a, random.nextInt(a.length), random.nextInt(a.length));
       
   589         }
       
   590     }
       
   591 
       
   592     private static void scramble(float[] a, Random random) {
       
   593         for (int i = 0; i < a.length * 7; i++) {
       
   594             swap(a, random.nextInt(a.length), random.nextInt(a.length));
       
   595         }
       
   596     }
       
   597 
       
   598     private static void scramble(double[] a, Random random) {
       
   599         for (int i = 0; i < a.length * 7; i++) {
       
   600             swap(a, random.nextInt(a.length), random.nextInt(a.length));
       
   601         }
       
   602     }
       
   603 
       
   604     private static void swap(int[] a, int i, int j) {
       
   605         int t = a[i];
       
   606         a[i] = a[j];
       
   607         a[j] = t;
       
   608     }
       
   609 
       
   610     private static void swap(float[] a, int i, int j) {
       
   611         float t = a[i];
       
   612         a[i] = a[j];
       
   613         a[j] = t;
       
   614     }
       
   615 
       
   616     private static void swap(double[] a, int i, int j) {
       
   617         double t = a[i];
       
   618         a[i] = a[j];
       
   619         a[j] = t;
       
   620     }
       
   621 
       
   622     private static enum TypeConverter {
       
   623         INT {
       
   624             Object convert(int[] a) {
       
   625                 return a.clone();
       
   626             }
       
   627         },
       
   628         LONG {
       
   629             Object convert(int[] a) {
       
   630                 long[] b = new long[a.length];
       
   631 
       
   632                 for (int i = 0; i < a.length; i++) {
       
   633                     b[i] = (long) a[i];
       
   634                 }
       
   635                 return b;
       
   636             }
       
   637         },
       
   638         BYTE {
       
   639             Object convert(int[] a) {
       
   640                 byte[] b = new byte[a.length];
       
   641 
       
   642                 for (int i = 0; i < a.length; i++) {
       
   643                     b[i] = (byte) a[i];
       
   644                 }
       
   645                 return b;
       
   646             }
       
   647         },
       
   648         SHORT {
       
   649             Object convert(int[] a) {
       
   650                 short[] b = new short[a.length];
       
   651 
       
   652                 for (int i = 0; i < a.length; i++) {
       
   653                     b[i] = (short) a[i];
       
   654                 }
       
   655                 return b;
       
   656             }
       
   657         },
       
   658         CHAR {
       
   659             Object convert(int[] a) {
       
   660                 char[] b = new char[a.length];
       
   661 
       
   662                 for (int i = 0; i < a.length; i++) {
       
   663                     b[i] = (char) a[i];
       
   664                 }
       
   665                 return b;
       
   666             }
       
   667         },
       
   668         FLOAT {
       
   669             Object convert(int[] a) {
       
   670                 float[] b = new float[a.length];
       
   671 
       
   672                 for (int i = 0; i < a.length; i++) {
       
   673                     b[i] = (float) a[i];
       
   674                 }
       
   675                 return b;
       
   676             }
       
   677         },
       
   678         DOUBLE {
       
   679             Object convert(int[] a) {
       
   680                 double[] b = new double[a.length];
       
   681 
       
   682                 for (int i = 0; i < a.length; i++) {
       
   683                     b[i] = (double) a[i];
       
   684                 }
       
   685                 return b;
       
   686             }
       
   687         },
       
   688         INTEGER {
       
   689             Object convert(int[] a) {
       
   690                 Integer[] b = new Integer[a.length];
       
   691 
       
   692                 for (int i = 0; i < a.length; i++) {
       
   693                     b[i] = new Integer(a[i]);
       
   694                 }
       
   695                 return b;
       
   696             }
       
   697         };
       
   698 
       
   699         abstract Object convert(int[] a);
       
   700 
       
   701         @Override public String toString() {
       
   702             String name = name();
       
   703 
       
   704             for (int i = name.length(); i < 9; i++) {
       
   705                 name += " ";
       
   706             }
       
   707             return name;
       
   708         }
       
   709     }
       
   710 
       
   711     private static enum FloatBuilder {
       
   712         SIMPLE {
       
   713             void build(float[] x, int a, int g, int z, int n, int p, Random random) {
       
   714                 int fromIndex = 0;
       
   715                 float negativeValue = -random.nextFloat();
       
   716                 float positiveValue =  random.nextFloat();
       
   717 
       
   718                 writeValue(x, negativeValue, fromIndex, n);
       
   719                 fromIndex += n;
       
   720 
       
   721                 writeValue(x, -0.0f, fromIndex, g);
       
   722                 fromIndex += g;
       
   723 
       
   724                 writeValue(x, 0.0f, fromIndex, z);
       
   725                 fromIndex += z;
       
   726 
       
   727                 writeValue(x, positiveValue, fromIndex, p);
       
   728                 fromIndex += p;
       
   729 
       
   730                 writeValue(x, Float.NaN, fromIndex, a);
       
   731             }
       
   732         };
       
   733 
       
   734         abstract void build(float[] x, int a, int g, int z, int n, int p, Random random);
       
   735     }
       
   736 
       
   737     private static enum DoubleBuilder {
       
   738         SIMPLE {
       
   739             void build(double[] x, int a, int g, int z, int n, int p, Random random) {
       
   740                 int fromIndex = 0;
       
   741                 double negativeValue = -random.nextFloat();
       
   742                 double positiveValue =  random.nextFloat();
       
   743 
       
   744                 writeValue(x, negativeValue, fromIndex, n);
       
   745                 fromIndex += n;
       
   746 
       
   747                 writeValue(x, -0.0d, fromIndex, g);
       
   748                 fromIndex += g;
       
   749 
       
   750                 writeValue(x, 0.0d, fromIndex, z);
       
   751                 fromIndex += z;
       
   752 
       
   753                 writeValue(x, positiveValue, fromIndex, p);
       
   754                 fromIndex += p;
       
   755 
       
   756                 writeValue(x, Double.NaN, fromIndex, a);
       
   757             }
       
   758         };
       
   759 
       
   760         abstract void build(double[] x, int a, int g, int z, int n, int p, Random random);
       
   761     }
       
   762 
       
   763     private static void writeValue(float[] a, float value, int fromIndex, int count) {
       
   764         for (int i = fromIndex; i < fromIndex + count; i++) {
       
   765             a[i] = value;
       
   766         }
       
   767     }
       
   768 
       
   769     private static void compare(float[] a, float[] b, int numNaN, int numNeg, int numNegZero) {
       
   770         for (int i = a.length - numNaN; i < a.length; i++) {
       
   771             if (a[i] == a[i]) {
       
   772                 failed("On position " + i + " must be NaN instead of " + a[i]);
       
   773             }
       
   774         }
       
   775         final int NEGATIVE_ZERO = Float.floatToIntBits(-0.0f);
       
   776 
       
   777         for (int i = numNeg; i < numNeg + numNegZero; i++) {
       
   778             if (NEGATIVE_ZERO != Float.floatToIntBits(a[i])) {
       
   779                 failed("On position " + i + " must be -0.0 instead of " + a[i]);
       
   780             }
       
   781         }
       
   782         for (int i = 0; i < a.length - numNaN; i++) {
       
   783             if (a[i] != b[i]) {
       
   784                 failedCompare(i, "" + a[i], "" + b[i]);
       
   785             }
       
   786         }
       
   787     }
       
   788 
       
   789     private static void writeValue(double[] a, double value, int fromIndex, int count) {
       
   790         for (int i = fromIndex; i < fromIndex + count; i++) {
       
   791             a[i] = value;
       
   792         }
       
   793     }
       
   794 
       
   795     private static void compare(double[] a, double[] b, int numNaN, int numNeg, int numNegZero) {
       
   796         for (int i = a.length - numNaN; i < a.length; i++) {
       
   797             if (a[i] == a[i]) {
       
   798                 failed("On position " + i + " must be NaN instead of " + a[i]);
       
   799             }
       
   800         }
       
   801         final long NEGATIVE_ZERO = Double.doubleToLongBits(-0.0d);
       
   802 
       
   803         for (int i = numNeg; i < numNeg + numNegZero; i++) {
       
   804             if (NEGATIVE_ZERO != Double.doubleToLongBits(a[i])) {
       
   805                 failed("On position " + i + " must be -0.0 instead of " + a[i]);
       
   806             }
       
   807         }
       
   808         for (int i = 0; i < a.length - numNaN; i++) {
       
   809             if (a[i] != b[i]) {
       
   810                 failedCompare(i, "" + a[i], "" + b[i]);
       
   811             }
       
   812         }
       
   813     }
       
   814 
       
   815     private static enum SortedBuilder {
       
   816         REPEATED {
       
   817             void build(int[] a, int m) {
       
   818                 int period = a.length / m;
       
   819                 int i = 0;
       
   820                 int k = 0;
       
   821 
       
   822                 while (true) {
       
   823                     for (int t = 1; t <= period; t++) {
       
   824                         if (i >= a.length) {
       
   825                             return;
       
   826                         }
       
   827                         a[i++] = k;
       
   828                     }
       
   829                     if (i >= a.length) {
       
   830                         return;
       
   831                     }
       
   832                     k++;
       
   833                 }
       
   834             }
       
   835         },
       
   836         ORGAN_PIPES {
       
   837             void build(int[] a, int m) {
       
   838                 int i = 0;
       
   839                 int k = m;
       
   840 
       
   841                 while (true) {
       
   842                     for (int t = 1; t <= m; t++) {
       
   843                         if (i >= a.length) {
       
   844                             return;
       
   845                         }
       
   846                         a[i++] = k;
       
   847                     }
       
   848                 }
       
   849             }
       
   850         };
       
   851 
       
   852         abstract void build(int[] a, int m);
       
   853 
       
   854         @Override public String toString() {
       
   855             String name = name();
       
   856 
       
   857             for (int i = name.length(); i < 12; i++) {
       
   858                 name += " ";
       
   859             }
       
   860             return name;
       
   861         }
       
   862     }
       
   863 
       
   864     private static enum MergeBuilder {
       
   865         ASCENDING {
       
   866             void build(int[] a, int m) {
       
   867                 int period = a.length / m;
       
   868                 int v = 1, i = 0;
       
   869 
       
   870                 for (int k = 0; k < m; k++) {
       
   871                     v = 1;
       
   872                     for (int p = 0; p < period; p++) {
       
   873                         a[i++] = v++;
       
   874                     }
       
   875                 }
       
   876                 for (int j = i; j < a.length - 1; j++) {
       
   877                     a[j] = v++;
       
   878                 }
       
   879                 a[a.length - 1] = 0;
       
   880             }
       
   881         },
       
   882         DESCENDING {
       
   883             void build(int[] a, int m) {
       
   884                 int period = a.length / m;
       
   885                 int v = -1, i = 0;
       
   886 
       
   887                 for (int k = 0; k < m; k++) {
       
   888                     v = -1;
       
   889                     for (int p = 0; p < period; p++) {
       
   890                         a[i++] = v--;
       
   891                     }
       
   892                 }
       
   893                 for (int j = i; j < a.length - 1; j++) {
       
   894                     a[j] = v--;
       
   895                 }
       
   896                 a[a.length - 1] = 0;
       
   897             }
       
   898         };
       
   899 
       
   900         abstract void build(int[] a, int m);
       
   901 
       
   902         @Override public String toString() {
       
   903             String name = name();
       
   904 
       
   905             for (int i = name.length(); i < 12; i++) {
       
   906                 name += " ";
       
   907             }
       
   908             return name;
       
   909         }
       
   910     }
       
   911 
       
   912     private static enum UnsortedBuilder {
       
   913         RANDOM {
       
   914             void build(int[] a, int m, Random random) {
       
   915                 for (int i = 0; i < a.length; i++) {
       
   916                     a[i] = random.nextInt();
       
   917                 }
       
   918             }
       
   919         },
       
   920         ASCENDING {
       
   921             void build(int[] a, int m, Random random) {
       
   922                 for (int i = 0; i < a.length; i++) {
       
   923                     a[i] = m + i;
       
   924                 }
       
   925             }
       
   926         },
       
   927         DESCENDING {
       
   928             void build(int[] a, int m, Random random) {
       
   929                 for (int i = 0; i < a.length; i++) {
       
   930                     a[i] = a.length - m - i;
       
   931                 }
       
   932             }
       
   933         },
       
   934         ALL_EQUAL {
       
   935             void build(int[] a, int m, Random random) {
       
   936                 for (int i = 0; i < a.length; i++) {
       
   937                     a[i] = m;
       
   938                 }
       
   939             }
       
   940         },
       
   941         SAW {
       
   942             void build(int[] a, int m, Random random) {
       
   943                 int incCount = 1;
       
   944                 int decCount = a.length;
       
   945                 int i = 0;
       
   946                 int period = m--;
       
   947 
       
   948                 while (true) {
       
   949                     for (int k = 1; k <= period; k++) {
       
   950                         if (i >= a.length) {
       
   951                             return;
       
   952                         }
       
   953                         a[i++] = incCount++;
       
   954                     }
       
   955                     period += m;
       
   956 
       
   957                     for (int k = 1; k <= period; k++) {
       
   958                         if (i >= a.length) {
       
   959                             return;
       
   960                         }
       
   961                         a[i++] = decCount--;
       
   962                     }
       
   963                     period += m;
       
   964                 }
       
   965             }
       
   966         },
       
   967         REPEATED {
       
   968             void build(int[] a, int m, Random random) {
       
   969                 for (int i = 0; i < a.length; i++) {
       
   970                     a[i] = i % m;
       
   971                 }
       
   972             }
       
   973         },
       
   974         DUPLICATED {
       
   975             void build(int[] a, int m, Random random) {
       
   976                 for (int i = 0; i < a.length; i++) {
       
   977                     a[i] = random.nextInt(m);
       
   978                 }
       
   979             }
       
   980         },
       
   981         ORGAN_PIPES {
       
   982             void build(int[] a, int m, Random random) {
       
   983                 int middle = a.length / (m + 1);
       
   984 
       
   985                 for (int i = 0; i < middle; i++) {
       
   986                     a[i] = i;
       
   987                 }
       
   988                 for (int i = middle; i < a.length; i++) {
       
   989                     a[i] = a.length - i - 1;
       
   990                 }
       
   991             }
       
   992         },
       
   993         STAGGER {
       
   994             void build(int[] a, int m, Random random) {
       
   995                 for (int i = 0; i < a.length; i++) {
       
   996                     a[i] = (i * m + i) % a.length;
       
   997                 }
       
   998             }
       
   999         },
       
  1000         PLATEAU {
       
  1001             void build(int[] a, int m, Random random) {
       
  1002                 for (int i = 0; i < a.length; i++) {
       
  1003                     a[i] = Math.min(i, m);
       
  1004                 }
       
  1005             }
       
  1006         },
       
  1007         SHUFFLE {
       
  1008             void build(int[] a, int m, Random random) {
       
  1009                 int x = 0, y = 0;
       
  1010                 for (int i = 0; i < a.length; i++) {
       
  1011                     a[i] = random.nextBoolean() ? (x += 2) : (y += 2);
       
  1012                 }
       
  1013             }
       
  1014         };
       
  1015 
       
  1016         abstract void build(int[] a, int m, Random random);
       
  1017 
       
  1018         @Override public String toString() {
       
  1019             String name = name();
       
  1020 
       
  1021             for (int i = name.length(); i < 12; i++) {
       
  1022                 name += " ";
       
  1023             }
       
  1024             return name;
       
  1025         }
       
  1026     }
       
  1027 
       
  1028     private static void checkWithCheckSum(Object test, Object golden) {
       
  1029         checkSorted(test);
       
  1030         checkCheckSum(test, golden);
       
  1031     }
       
  1032 
       
  1033     private static void failed(String message) {
       
  1034         err.format("\n*** TEST FAILED - %s.\n\n%s.\n\n", ourDescription, message);
       
  1035         throw new RuntimeException("Test failed - see log file for details");
       
  1036     }
       
  1037 
       
  1038     private static void failedSort(int index, String value1, String value2) {
       
  1039         failed("Array is not sorted at " + index + "-th position: " +
       
  1040             value1 + " and " + value2);
       
  1041     }
       
  1042 
       
  1043     private static void failedCompare(int index, String value1, String value2) {
       
  1044         failed("On position " + index + " must be " + value2 + " instead of " + value1);
       
  1045     }
       
  1046 
       
  1047     private static void compare(Object test, Object golden) {
       
  1048         if (test instanceof int[]) {
       
  1049             compare((int[]) test, (int[]) golden);
       
  1050         } else if (test instanceof long[]) {
       
  1051             compare((long[]) test, (long[]) golden);
       
  1052         } else if (test instanceof short[]) {
       
  1053             compare((short[]) test, (short[]) golden);
       
  1054         } else if (test instanceof byte[]) {
       
  1055             compare((byte[]) test, (byte[]) golden);
       
  1056         } else if (test instanceof char[]) {
       
  1057             compare((char[]) test, (char[]) golden);
       
  1058         } else if (test instanceof float[]) {
       
  1059             compare((float[]) test, (float[]) golden);
       
  1060         } else if (test instanceof double[]) {
       
  1061             compare((double[]) test, (double[]) golden);
       
  1062         } else if (test instanceof Integer[]) {
       
  1063             compare((Integer[]) test, (Integer[]) golden);
       
  1064         } else {
       
  1065             failed("Unknow type of array: " + test + " of class " +
       
  1066                 test.getClass().getName());
       
  1067         }
       
  1068     }
       
  1069 
       
  1070     private static void compare(int[] a, int[] b) {
       
  1071         for (int i = 0; i < a.length; i++) {
       
  1072             if (a[i] != b[i]) {
       
  1073                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1074             }
       
  1075         }
       
  1076     }
       
  1077 
       
  1078     private static void compare(long[] a, long[] b) {
       
  1079         for (int i = 0; i < a.length; i++) {
       
  1080             if (a[i] != b[i]) {
       
  1081                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1082             }
       
  1083         }
       
  1084     }
       
  1085 
       
  1086     private static void compare(short[] a, short[] b) {
       
  1087         for (int i = 0; i < a.length; i++) {
       
  1088             if (a[i] != b[i]) {
       
  1089                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1090             }
       
  1091         }
       
  1092     }
       
  1093 
       
  1094     private static void compare(byte[] a, byte[] b) {
       
  1095         for (int i = 0; i < a.length; i++) {
       
  1096             if (a[i] != b[i]) {
       
  1097                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1098             }
       
  1099         }
       
  1100     }
       
  1101 
       
  1102     private static void compare(char[] a, char[] b) {
       
  1103         for (int i = 0; i < a.length; i++) {
       
  1104             if (a[i] != b[i]) {
       
  1105                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1106             }
       
  1107         }
       
  1108     }
       
  1109 
       
  1110     private static void compare(float[] a, float[] b) {
       
  1111         for (int i = 0; i < a.length; i++) {
       
  1112             if (a[i] != b[i]) {
       
  1113                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1114             }
       
  1115         }
       
  1116     }
       
  1117 
       
  1118     private static void compare(double[] a, double[] b) {
       
  1119         for (int i = 0; i < a.length; i++) {
       
  1120             if (a[i] != b[i]) {
       
  1121                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1122             }
       
  1123         }
       
  1124     }
       
  1125 
       
  1126     private static void compare(Integer[] a, Integer[] b) {
       
  1127         for (int i = 0; i < a.length; i++) {
       
  1128             if (a[i].compareTo(b[i]) != 0) {
       
  1129                 failedCompare(i, "" + a[i], "" + b[i]);
       
  1130             }
       
  1131         }
       
  1132     }
       
  1133 
       
  1134     private static void checkSorted(Object object) {
       
  1135         if (object instanceof int[]) {
       
  1136             checkSorted((int[]) object);
       
  1137         } else if (object instanceof long[]) {
       
  1138             checkSorted((long[]) object);
       
  1139         } else if (object instanceof short[]) {
       
  1140             checkSorted((short[]) object);
       
  1141         } else if (object instanceof byte[]) {
       
  1142             checkSorted((byte[]) object);
       
  1143         } else if (object instanceof char[]) {
       
  1144             checkSorted((char[]) object);
       
  1145         } else if (object instanceof float[]) {
       
  1146             checkSorted((float[]) object);
       
  1147         } else if (object instanceof double[]) {
       
  1148             checkSorted((double[]) object);
       
  1149         } else if (object instanceof Integer[]) {
       
  1150             checkSorted((Integer[]) object);
       
  1151         } else {
       
  1152             failed("Unknow type of array: " + object + " of class " +
       
  1153                 object.getClass().getName());
       
  1154         }
       
  1155     }
       
  1156 
       
  1157     private static void checkSorted(int[] a) {
       
  1158         for (int i = 0; i < a.length - 1; i++) {
       
  1159             if (a[i] > a[i + 1]) {
       
  1160                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1161             }
       
  1162         }
       
  1163     }
       
  1164 
       
  1165     private static void checkSorted(long[] a) {
       
  1166         for (int i = 0; i < a.length - 1; i++) {
       
  1167             if (a[i] > a[i + 1]) {
       
  1168                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1169             }
       
  1170         }
       
  1171     }
       
  1172 
       
  1173     private static void checkSorted(short[] a) {
       
  1174         for (int i = 0; i < a.length - 1; i++) {
       
  1175             if (a[i] > a[i + 1]) {
       
  1176                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1177             }
       
  1178         }
       
  1179     }
       
  1180 
       
  1181     private static void checkSorted(byte[] a) {
       
  1182         for (int i = 0; i < a.length - 1; i++) {
       
  1183             if (a[i] > a[i + 1]) {
       
  1184                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1185             }
       
  1186         }
       
  1187     }
       
  1188 
       
  1189     private static void checkSorted(char[] a) {
       
  1190         for (int i = 0; i < a.length - 1; i++) {
       
  1191             if (a[i] > a[i + 1]) {
       
  1192                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1193             }
       
  1194         }
       
  1195     }
       
  1196 
       
  1197     private static void checkSorted(float[] a) {
       
  1198         for (int i = 0; i < a.length - 1; i++) {
       
  1199             if (a[i] > a[i + 1]) {
       
  1200                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1201             }
       
  1202         }
       
  1203     }
       
  1204 
       
  1205     private static void checkSorted(double[] a) {
       
  1206         for (int i = 0; i < a.length - 1; i++) {
       
  1207             if (a[i] > a[i + 1]) {
       
  1208                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1209             }
       
  1210         }
       
  1211     }
       
  1212 
       
  1213     private static void checkSorted(Integer[] a) {
       
  1214         for (int i = 0; i < a.length - 1; i++) {
       
  1215             if (a[i].intValue() > a[i + 1].intValue()) {
       
  1216                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1217             }
       
  1218         }
       
  1219     }
       
  1220 
       
  1221     private static void checkCheckSum(Object test, Object golden) {
       
  1222         if (checkSumXor(test) != checkSumXor(golden)) {
       
  1223             failed("Original and sorted arrays are not identical [xor]");
       
  1224         }
       
  1225         if (checkSumPlus(test) != checkSumPlus(golden)) {
       
  1226             failed("Original and sorted arrays are not identical [plus]");
       
  1227         }
       
  1228     }
       
  1229 
       
  1230     private static int checkSumXor(Object object) {
       
  1231         if (object instanceof int[]) {
       
  1232             return checkSumXor((int[]) object);
       
  1233         } else if (object instanceof long[]) {
       
  1234             return checkSumXor((long[]) object);
       
  1235         } else if (object instanceof short[]) {
       
  1236             return checkSumXor((short[]) object);
       
  1237         } else if (object instanceof byte[]) {
       
  1238             return checkSumXor((byte[]) object);
       
  1239         } else if (object instanceof char[]) {
       
  1240             return checkSumXor((char[]) object);
       
  1241         } else if (object instanceof float[]) {
       
  1242             return checkSumXor((float[]) object);
       
  1243         } else if (object instanceof double[]) {
       
  1244             return checkSumXor((double[]) object);
       
  1245         } else if (object instanceof Integer[]) {
       
  1246             return checkSumXor((Integer[]) object);
       
  1247         } else {
       
  1248             failed("Unknow type of array: " + object + " of class " +
       
  1249                 object.getClass().getName());
       
  1250             return -1;
       
  1251         }
       
  1252     }
       
  1253 
       
  1254     private static int checkSumXor(Integer[] a) {
       
  1255         int checkSum = 0;
       
  1256 
       
  1257         for (Integer e : a) {
       
  1258             checkSum ^= e.intValue();
       
  1259         }
       
  1260         return checkSum;
       
  1261     }
       
  1262 
       
  1263     private static int checkSumXor(int[] a) {
       
  1264         int checkSum = 0;
       
  1265 
       
  1266         for (int e : a) {
       
  1267             checkSum ^= e;
       
  1268         }
       
  1269         return checkSum;
       
  1270     }
       
  1271 
       
  1272     private static int checkSumXor(long[] a) {
       
  1273         long checkSum = 0;
       
  1274 
       
  1275         for (long e : a) {
       
  1276             checkSum ^= e;
       
  1277         }
       
  1278         return (int) checkSum;
       
  1279     }
       
  1280 
       
  1281     private static int checkSumXor(short[] a) {
       
  1282         short checkSum = 0;
       
  1283 
       
  1284         for (short e : a) {
       
  1285             checkSum ^= e;
       
  1286         }
       
  1287         return (int) checkSum;
       
  1288     }
       
  1289 
       
  1290     private static int checkSumXor(byte[] a) {
       
  1291         byte checkSum = 0;
       
  1292 
       
  1293         for (byte e : a) {
       
  1294             checkSum ^= e;
       
  1295         }
       
  1296         return (int) checkSum;
       
  1297     }
       
  1298 
       
  1299     private static int checkSumXor(char[] a) {
       
  1300         char checkSum = 0;
       
  1301 
       
  1302         for (char e : a) {
       
  1303             checkSum ^= e;
       
  1304         }
       
  1305         return (int) checkSum;
       
  1306     }
       
  1307 
       
  1308     private static int checkSumXor(float[] a) {
       
  1309         int checkSum = 0;
       
  1310 
       
  1311         for (float e : a) {
       
  1312             checkSum ^= (int) e;
       
  1313         }
       
  1314         return checkSum;
       
  1315     }
       
  1316 
       
  1317     private static int checkSumXor(double[] a) {
       
  1318         int checkSum = 0;
       
  1319 
       
  1320         for (double e : a) {
       
  1321             checkSum ^= (int) e;
       
  1322         }
       
  1323         return checkSum;
       
  1324     }
       
  1325 
       
  1326     private static int checkSumPlus(Object object) {
       
  1327         if (object instanceof int[]) {
       
  1328             return checkSumPlus((int[]) object);
       
  1329         } else if (object instanceof long[]) {
       
  1330             return checkSumPlus((long[]) object);
       
  1331         } else if (object instanceof short[]) {
       
  1332             return checkSumPlus((short[]) object);
       
  1333         } else if (object instanceof byte[]) {
       
  1334             return checkSumPlus((byte[]) object);
       
  1335         } else if (object instanceof char[]) {
       
  1336             return checkSumPlus((char[]) object);
       
  1337         } else if (object instanceof float[]) {
       
  1338             return checkSumPlus((float[]) object);
       
  1339         } else if (object instanceof double[]) {
       
  1340             return checkSumPlus((double[]) object);
       
  1341         } else if (object instanceof Integer[]) {
       
  1342             return checkSumPlus((Integer[]) object);
       
  1343         } else {
       
  1344             failed("Unknow type of array: " + object + " of class " +
       
  1345                 object.getClass().getName());
       
  1346             return -1;
       
  1347         }
       
  1348     }
       
  1349 
       
  1350     private static int checkSumPlus(int[] a) {
       
  1351         int checkSum = 0;
       
  1352 
       
  1353         for (int e : a) {
       
  1354             checkSum += e;
       
  1355         }
       
  1356         return checkSum;
       
  1357     }
       
  1358 
       
  1359     private static int checkSumPlus(long[] a) {
       
  1360         long checkSum = 0;
       
  1361 
       
  1362         for (long e : a) {
       
  1363             checkSum += e;
       
  1364         }
       
  1365         return (int) checkSum;
       
  1366     }
       
  1367 
       
  1368     private static int checkSumPlus(short[] a) {
       
  1369         short checkSum = 0;
       
  1370 
       
  1371         for (short e : a) {
       
  1372             checkSum += e;
       
  1373         }
       
  1374         return (int) checkSum;
       
  1375     }
       
  1376 
       
  1377     private static int checkSumPlus(byte[] a) {
       
  1378         byte checkSum = 0;
       
  1379 
       
  1380         for (byte e : a) {
       
  1381             checkSum += e;
       
  1382         }
       
  1383         return (int) checkSum;
       
  1384     }
       
  1385 
       
  1386     private static int checkSumPlus(char[] a) {
       
  1387         char checkSum = 0;
       
  1388 
       
  1389         for (char e : a) {
       
  1390             checkSum += e;
       
  1391         }
       
  1392         return (int) checkSum;
       
  1393     }
       
  1394 
       
  1395     private static int checkSumPlus(float[] a) {
       
  1396         int checkSum = 0;
       
  1397 
       
  1398         for (float e : a) {
       
  1399             checkSum += (int) e;
       
  1400         }
       
  1401         return checkSum;
       
  1402     }
       
  1403 
       
  1404     private static int checkSumPlus(double[] a) {
       
  1405         int checkSum = 0;
       
  1406 
       
  1407         for (double e : a) {
       
  1408             checkSum += (int) e;
       
  1409         }
       
  1410         return checkSum;
       
  1411     }
       
  1412 
       
  1413     private static int checkSumPlus(Integer[] a) {
       
  1414         int checkSum = 0;
       
  1415 
       
  1416         for (Integer e : a) {
       
  1417             checkSum += e.intValue();
       
  1418         }
       
  1419         return checkSum;
       
  1420     }
       
  1421 
       
  1422     private static void sortByInsertionSort(Object object) {
       
  1423         if (object instanceof int[]) {
       
  1424             sortByInsertionSort((int[]) object);
       
  1425         } else if (object instanceof long[]) {
       
  1426             sortByInsertionSort((long[]) object);
       
  1427         } else if (object instanceof short[]) {
       
  1428             sortByInsertionSort((short[]) object);
       
  1429         } else if (object instanceof byte[]) {
       
  1430             sortByInsertionSort((byte[]) object);
       
  1431         } else if (object instanceof char[]) {
       
  1432             sortByInsertionSort((char[]) object);
       
  1433         } else if (object instanceof float[]) {
       
  1434             sortByInsertionSort((float[]) object);
       
  1435         } else if (object instanceof double[]) {
       
  1436             sortByInsertionSort((double[]) object);
       
  1437         } else if (object instanceof Integer[]) {
       
  1438             sortByInsertionSort((Integer[]) object);
       
  1439         } else {
       
  1440             failed("Unknow type of array: " + object + " of class " +
       
  1441                 object.getClass().getName());
       
  1442         }
       
  1443     }
       
  1444 
       
  1445     private static void sortByInsertionSort(int[] a) {
       
  1446         for (int j, i = 1; i < a.length; i++) {
       
  1447             int ai = a[i];
       
  1448             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1449                 a[j + 1] = a[j];
       
  1450             }
       
  1451             a[j + 1] = ai;
       
  1452         }
       
  1453     }
       
  1454 
       
  1455     private static void sortByInsertionSort(long[] a) {
       
  1456         for (int j, i = 1; i < a.length; i++) {
       
  1457             long ai = a[i];
       
  1458             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1459                 a[j + 1] = a[j];
       
  1460             }
       
  1461             a[j + 1] = ai;
       
  1462         }
       
  1463     }
       
  1464 
       
  1465     private static void sortByInsertionSort(short[] a) {
       
  1466         for (int j, i = 1; i < a.length; i++) {
       
  1467             short ai = a[i];
       
  1468             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1469                 a[j + 1] = a[j];
       
  1470             }
       
  1471             a[j + 1] = ai;
       
  1472         }
       
  1473     }
       
  1474 
       
  1475     private static void sortByInsertionSort(byte[] a) {
       
  1476         for (int j, i = 1; i < a.length; i++) {
       
  1477             byte ai = a[i];
       
  1478             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1479                 a[j + 1] = a[j];
       
  1480             }
       
  1481             a[j + 1] = ai;
       
  1482         }
       
  1483     }
       
  1484 
       
  1485     private static void sortByInsertionSort(char[] a) {
       
  1486         for (int j, i = 1; i < a.length; i++) {
       
  1487             char ai = a[i];
       
  1488             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1489                 a[j + 1] = a[j];
       
  1490             }
       
  1491             a[j + 1] = ai;
       
  1492         }
       
  1493     }
       
  1494 
       
  1495     private static void sortByInsertionSort(float[] a) {
       
  1496         for (int j, i = 1; i < a.length; i++) {
       
  1497             float ai = a[i];
       
  1498             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1499                 a[j + 1] = a[j];
       
  1500             }
       
  1501             a[j + 1] = ai;
       
  1502         }
       
  1503     }
       
  1504 
       
  1505     private static void sortByInsertionSort(double[] a) {
       
  1506         for (int j, i = 1; i < a.length; i++) {
       
  1507             double ai = a[i];
       
  1508             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1509                 a[j + 1] = a[j];
       
  1510             }
       
  1511             a[j + 1] = ai;
       
  1512         }
       
  1513     }
       
  1514 
       
  1515     private static void sortByInsertionSort(Integer[] a) {
       
  1516         for (int j, i = 1; i < a.length; i++) {
       
  1517             Integer ai = a[i];
       
  1518             for (j = i - 1; j >= 0 && ai < a[j]; j--) {
       
  1519                 a[j + 1] = a[j];
       
  1520             }
       
  1521             a[j + 1] = ai;
       
  1522         }
       
  1523     }
       
  1524 
       
  1525     private static void sort(Object object) {
       
  1526         if (object instanceof int[]) {
       
  1527             Arrays.parallelSort((int[]) object);
       
  1528         } else if (object instanceof long[]) {
       
  1529             Arrays.parallelSort((long[]) object);
       
  1530         } else if (object instanceof short[]) {
       
  1531             Arrays.parallelSort((short[]) object);
       
  1532         } else if (object instanceof byte[]) {
       
  1533             Arrays.parallelSort((byte[]) object);
       
  1534         } else if (object instanceof char[]) {
       
  1535             Arrays.parallelSort((char[]) object);
       
  1536         } else if (object instanceof float[]) {
       
  1537             Arrays.parallelSort((float[]) object);
       
  1538         } else if (object instanceof double[]) {
       
  1539             Arrays.parallelSort((double[]) object);
       
  1540         } else if (object instanceof Integer[]) {
       
  1541             Arrays.parallelSort((Integer[]) object);
       
  1542         } else {
       
  1543             failed("Unknow type of array: " + object + " of class " +
       
  1544                 object.getClass().getName());
       
  1545         }
       
  1546     }
       
  1547 
       
  1548     private static void sortSubArray(Object object, int fromIndex, int toIndex) {
       
  1549         if (object instanceof int[]) {
       
  1550             Arrays.parallelSort((int[]) object, fromIndex, toIndex);
       
  1551         } else if (object instanceof long[]) {
       
  1552             Arrays.parallelSort((long[]) object, fromIndex, toIndex);
       
  1553         } else if (object instanceof short[]) {
       
  1554             Arrays.parallelSort((short[]) object, fromIndex, toIndex);
       
  1555         } else if (object instanceof byte[]) {
       
  1556             Arrays.parallelSort((byte[]) object, fromIndex, toIndex);
       
  1557         } else if (object instanceof char[]) {
       
  1558             Arrays.parallelSort((char[]) object, fromIndex, toIndex);
       
  1559         } else if (object instanceof float[]) {
       
  1560             Arrays.parallelSort((float[]) object, fromIndex, toIndex);
       
  1561         } else if (object instanceof double[]) {
       
  1562             Arrays.parallelSort((double[]) object, fromIndex, toIndex);
       
  1563         } else if (object instanceof Integer[]) {
       
  1564             Arrays.parallelSort((Integer[]) object, fromIndex, toIndex);
       
  1565         } else {
       
  1566             failed("Unknow type of array: " + object + " of class " +
       
  1567                 object.getClass().getName());
       
  1568         }
       
  1569     }
       
  1570 
       
  1571     private static void checkSubArray(Object object, int fromIndex, int toIndex, int m) {
       
  1572         if (object instanceof int[]) {
       
  1573             checkSubArray((int[]) object, fromIndex, toIndex, m);
       
  1574         } else if (object instanceof long[]) {
       
  1575             checkSubArray((long[]) object, fromIndex, toIndex, m);
       
  1576         } else if (object instanceof short[]) {
       
  1577             checkSubArray((short[]) object, fromIndex, toIndex, m);
       
  1578         } else if (object instanceof byte[]) {
       
  1579             checkSubArray((byte[]) object, fromIndex, toIndex, m);
       
  1580         } else if (object instanceof char[]) {
       
  1581             checkSubArray((char[]) object, fromIndex, toIndex, m);
       
  1582         } else if (object instanceof float[]) {
       
  1583             checkSubArray((float[]) object, fromIndex, toIndex, m);
       
  1584         } else if (object instanceof double[]) {
       
  1585             checkSubArray((double[]) object, fromIndex, toIndex, m);
       
  1586         } else if (object instanceof Integer[]) {
       
  1587             checkSubArray((Integer[]) object, fromIndex, toIndex, m);
       
  1588         } else {
       
  1589             failed("Unknow type of array: " + object + " of class " +
       
  1590                 object.getClass().getName());
       
  1591         }
       
  1592     }
       
  1593 
       
  1594     private static void checkSubArray(Integer[] a, int fromIndex, int toIndex, int m) {
       
  1595         for (int i = 0; i < fromIndex; i++) {
       
  1596             if (a[i].intValue() != 0xDEDA) {
       
  1597                 failed("Range sort changes left element on position " + i +
       
  1598                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1599             }
       
  1600         }
       
  1601 
       
  1602         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1603             if (a[i].intValue() > a[i + 1].intValue()) {
       
  1604                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1605             }
       
  1606         }
       
  1607 
       
  1608         for (int i = toIndex; i < a.length; i++) {
       
  1609             if (a[i].intValue() != 0xBABA) {
       
  1610                 failed("Range sort changes right element on position " + i +
       
  1611                     ": " + a[i] + ", must be " + 0xBABA);
       
  1612             }
       
  1613         }
       
  1614     }
       
  1615 
       
  1616     private static void checkSubArray(int[] a, int fromIndex, int toIndex, int m) {
       
  1617         for (int i = 0; i < fromIndex; i++) {
       
  1618             if (a[i] != 0xDEDA) {
       
  1619                 failed("Range sort changes left element on position " + i +
       
  1620                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1621             }
       
  1622         }
       
  1623 
       
  1624         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1625             if (a[i] > a[i + 1]) {
       
  1626                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1627             }
       
  1628         }
       
  1629 
       
  1630         for (int i = toIndex; i < a.length; i++) {
       
  1631             if (a[i] != 0xBABA) {
       
  1632                 failed("Range sort changes right element on position " + i +
       
  1633                     ": " + a[i] + ", must be " + 0xBABA);
       
  1634             }
       
  1635         }
       
  1636     }
       
  1637 
       
  1638     private static void checkSubArray(byte[] a, int fromIndex, int toIndex, int m) {
       
  1639         for (int i = 0; i < fromIndex; i++) {
       
  1640             if (a[i] != (byte) 0xDEDA) {
       
  1641                 failed("Range sort changes left element on position " + i +
       
  1642                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1643             }
       
  1644         }
       
  1645 
       
  1646         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1647             if (a[i] > a[i + 1]) {
       
  1648                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1649             }
       
  1650         }
       
  1651 
       
  1652         for (int i = toIndex; i < a.length; i++) {
       
  1653             if (a[i] != (byte) 0xBABA) {
       
  1654                 failed("Range sort changes right element on position " + i +
       
  1655                     ": " + a[i] + ", must be " + 0xBABA);
       
  1656             }
       
  1657         }
       
  1658     }
       
  1659 
       
  1660     private static void checkSubArray(long[] a, int fromIndex, int toIndex, int m) {
       
  1661         for (int i = 0; i < fromIndex; i++) {
       
  1662             if (a[i] != (long) 0xDEDA) {
       
  1663                 failed("Range sort changes left element on position " + i +
       
  1664                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1665             }
       
  1666         }
       
  1667 
       
  1668         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1669             if (a[i] > a[i + 1]) {
       
  1670                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1671             }
       
  1672         }
       
  1673 
       
  1674         for (int i = toIndex; i < a.length; i++) {
       
  1675             if (a[i] != (long) 0xBABA) {
       
  1676                 failed("Range sort changes right element on position " + i +
       
  1677                     ": " + a[i] + ", must be " + 0xBABA);
       
  1678             }
       
  1679         }
       
  1680     }
       
  1681 
       
  1682     private static void checkSubArray(char[] a, int fromIndex, int toIndex, int m) {
       
  1683         for (int i = 0; i < fromIndex; i++) {
       
  1684             if (a[i] != (char) 0xDEDA) {
       
  1685                 failed("Range sort changes left element on position " + i +
       
  1686                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1687             }
       
  1688         }
       
  1689 
       
  1690         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1691             if (a[i] > a[i + 1]) {
       
  1692                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1693             }
       
  1694         }
       
  1695 
       
  1696         for (int i = toIndex; i < a.length; i++) {
       
  1697             if (a[i] != (char) 0xBABA) {
       
  1698                 failed("Range sort changes right element on position " + i +
       
  1699                     ": " + a[i] + ", must be " + 0xBABA);
       
  1700             }
       
  1701         }
       
  1702     }
       
  1703 
       
  1704     private static void checkSubArray(short[] a, int fromIndex, int toIndex, int m) {
       
  1705         for (int i = 0; i < fromIndex; i++) {
       
  1706             if (a[i] != (short) 0xDEDA) {
       
  1707                 failed("Range sort changes left element on position " + i +
       
  1708                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1709             }
       
  1710         }
       
  1711 
       
  1712         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1713             if (a[i] > a[i + 1]) {
       
  1714                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1715             }
       
  1716         }
       
  1717 
       
  1718         for (int i = toIndex; i < a.length; i++) {
       
  1719             if (a[i] != (short) 0xBABA) {
       
  1720                 failed("Range sort changes right element on position " + i +
       
  1721                     ": " + a[i] + ", must be " + 0xBABA);
       
  1722             }
       
  1723         }
       
  1724     }
       
  1725 
       
  1726     private static void checkSubArray(float[] a, int fromIndex, int toIndex, int m) {
       
  1727         for (int i = 0; i < fromIndex; i++) {
       
  1728             if (a[i] != (float) 0xDEDA) {
       
  1729                 failed("Range sort changes left element on position " + i +
       
  1730                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1731             }
       
  1732         }
       
  1733 
       
  1734         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1735             if (a[i] > a[i + 1]) {
       
  1736                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1737             }
       
  1738         }
       
  1739 
       
  1740         for (int i = toIndex; i < a.length; i++) {
       
  1741             if (a[i] != (float) 0xBABA) {
       
  1742                 failed("Range sort changes right element on position " + i +
       
  1743                     ": " + a[i] + ", must be " + 0xBABA);
       
  1744             }
       
  1745         }
       
  1746     }
       
  1747 
       
  1748     private static void checkSubArray(double[] a, int fromIndex, int toIndex, int m) {
       
  1749         for (int i = 0; i < fromIndex; i++) {
       
  1750             if (a[i] != (double) 0xDEDA) {
       
  1751                 failed("Range sort changes left element on position " + i +
       
  1752                     ": " + a[i] + ", must be " + 0xDEDA);
       
  1753             }
       
  1754         }
       
  1755 
       
  1756         for (int i = fromIndex; i < toIndex - 1; i++) {
       
  1757             if (a[i] > a[i + 1]) {
       
  1758                 failedSort(i, "" + a[i], "" + a[i + 1]);
       
  1759             }
       
  1760         }
       
  1761 
       
  1762         for (int i = toIndex; i < a.length; i++) {
       
  1763             if (a[i] != (double) 0xBABA) {
       
  1764                 failed("Range sort changes right element on position " + i +
       
  1765                     ": " + a[i] + ", must be " + 0xBABA);
       
  1766             }
       
  1767         }
       
  1768     }
       
  1769 
       
  1770     private static void checkRange(Object object, int m) {
       
  1771         if (object instanceof int[]) {
       
  1772             checkRange((int[]) object, m);
       
  1773         } else if (object instanceof long[]) {
       
  1774             checkRange((long[]) object, m);
       
  1775         } else if (object instanceof short[]) {
       
  1776             checkRange((short[]) object, m);
       
  1777         } else if (object instanceof byte[]) {
       
  1778             checkRange((byte[]) object, m);
       
  1779         } else if (object instanceof char[]) {
       
  1780             checkRange((char[]) object, m);
       
  1781         } else if (object instanceof float[]) {
       
  1782             checkRange((float[]) object, m);
       
  1783         } else if (object instanceof double[]) {
       
  1784             checkRange((double[]) object, m);
       
  1785         } else if (object instanceof Integer[]) {
       
  1786             checkRange((Integer[]) object, m);
       
  1787         } else {
       
  1788             failed("Unknow type of array: " + object + " of class " +
       
  1789                 object.getClass().getName());
       
  1790         }
       
  1791     }
       
  1792 
       
  1793     private static void checkRange(Integer[] a, int m) {
       
  1794         try {
       
  1795             Arrays.parallelSort(a, m + 1, m);
       
  1796 
       
  1797             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1798                 " as expected: fromIndex = " + (m + 1) +
       
  1799                 " toIndex = " + m);
       
  1800         }
       
  1801         catch (IllegalArgumentException iae) {
       
  1802             try {
       
  1803                 Arrays.parallelSort(a, -m, a.length);
       
  1804 
       
  1805                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1806                     " as expected: fromIndex = " + (-m));
       
  1807             }
       
  1808             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1809                 try {
       
  1810                     Arrays.parallelSort(a, 0, a.length + m);
       
  1811 
       
  1812                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1813                         " as expected: toIndex = " + (a.length + m));
       
  1814                 }
       
  1815                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1816                     return;
       
  1817                 }
       
  1818             }
       
  1819         }
       
  1820     }
       
  1821 
       
  1822     private static void checkRange(int[] a, int m) {
       
  1823         try {
       
  1824             Arrays.parallelSort(a, m + 1, m);
       
  1825 
       
  1826             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1827                 " as expected: fromIndex = " + (m + 1) +
       
  1828                 " toIndex = " + m);
       
  1829         }
       
  1830         catch (IllegalArgumentException iae) {
       
  1831             try {
       
  1832                 Arrays.parallelSort(a, -m, a.length);
       
  1833 
       
  1834                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1835                     " as expected: fromIndex = " + (-m));
       
  1836             }
       
  1837             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1838                 try {
       
  1839                     Arrays.parallelSort(a, 0, a.length + m);
       
  1840 
       
  1841                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1842                         " as expected: toIndex = " + (a.length + m));
       
  1843                 }
       
  1844                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1845                     return;
       
  1846                 }
       
  1847             }
       
  1848         }
       
  1849     }
       
  1850 
       
  1851     private static void checkRange(long[] a, int m) {
       
  1852         try {
       
  1853             Arrays.parallelSort(a, m + 1, m);
       
  1854 
       
  1855             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1856                 " as expected: fromIndex = " + (m + 1) +
       
  1857                 " toIndex = " + m);
       
  1858         }
       
  1859         catch (IllegalArgumentException iae) {
       
  1860             try {
       
  1861                 Arrays.parallelSort(a, -m, a.length);
       
  1862 
       
  1863                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1864                     " as expected: fromIndex = " + (-m));
       
  1865             }
       
  1866             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1867                 try {
       
  1868                     Arrays.parallelSort(a, 0, a.length + m);
       
  1869 
       
  1870                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1871                         " as expected: toIndex = " + (a.length + m));
       
  1872                 }
       
  1873                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1874                     return;
       
  1875                 }
       
  1876             }
       
  1877         }
       
  1878     }
       
  1879 
       
  1880     private static void checkRange(byte[] a, int m) {
       
  1881         try {
       
  1882             Arrays.parallelSort(a, m + 1, m);
       
  1883 
       
  1884             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1885                 " as expected: fromIndex = " + (m + 1) +
       
  1886                 " toIndex = " + m);
       
  1887         }
       
  1888         catch (IllegalArgumentException iae) {
       
  1889             try {
       
  1890                 Arrays.parallelSort(a, -m, a.length);
       
  1891 
       
  1892                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1893                     " as expected: fromIndex = " + (-m));
       
  1894             }
       
  1895             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1896                 try {
       
  1897                     Arrays.parallelSort(a, 0, a.length + m);
       
  1898 
       
  1899                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1900                         " as expected: toIndex = " + (a.length + m));
       
  1901                 }
       
  1902                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1903                     return;
       
  1904                 }
       
  1905             }
       
  1906         }
       
  1907     }
       
  1908 
       
  1909     private static void checkRange(short[] a, int m) {
       
  1910         try {
       
  1911             Arrays.parallelSort(a, m + 1, m);
       
  1912 
       
  1913             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1914                 " as expected: fromIndex = " + (m + 1) +
       
  1915                 " toIndex = " + m);
       
  1916         }
       
  1917         catch (IllegalArgumentException iae) {
       
  1918             try {
       
  1919                 Arrays.parallelSort(a, -m, a.length);
       
  1920 
       
  1921                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1922                     " as expected: fromIndex = " + (-m));
       
  1923             }
       
  1924             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1925                 try {
       
  1926                     Arrays.parallelSort(a, 0, a.length + m);
       
  1927 
       
  1928                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1929                         " as expected: toIndex = " + (a.length + m));
       
  1930                 }
       
  1931                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1932                     return;
       
  1933                 }
       
  1934             }
       
  1935         }
       
  1936     }
       
  1937 
       
  1938     private static void checkRange(char[] a, int m) {
       
  1939         try {
       
  1940             Arrays.parallelSort(a, m + 1, m);
       
  1941 
       
  1942             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1943                 " as expected: fromIndex = " + (m + 1) +
       
  1944                 " toIndex = " + m);
       
  1945         }
       
  1946         catch (IllegalArgumentException iae) {
       
  1947             try {
       
  1948                 Arrays.parallelSort(a, -m, a.length);
       
  1949 
       
  1950                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1951                     " as expected: fromIndex = " + (-m));
       
  1952             }
       
  1953             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1954                 try {
       
  1955                     Arrays.parallelSort(a, 0, a.length + m);
       
  1956 
       
  1957                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1958                         " as expected: toIndex = " + (a.length + m));
       
  1959                 }
       
  1960                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1961                     return;
       
  1962                 }
       
  1963             }
       
  1964         }
       
  1965     }
       
  1966 
       
  1967     private static void checkRange(float[] a, int m) {
       
  1968         try {
       
  1969             Arrays.parallelSort(a, m + 1, m);
       
  1970 
       
  1971             failed("ParallelSort does not throw IllegalArgumentException " +
       
  1972                 " as expected: fromIndex = " + (m + 1) +
       
  1973                 " toIndex = " + m);
       
  1974         }
       
  1975         catch (IllegalArgumentException iae) {
       
  1976             try {
       
  1977                 Arrays.parallelSort(a, -m, a.length);
       
  1978 
       
  1979                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1980                     " as expected: fromIndex = " + (-m));
       
  1981             }
       
  1982             catch (ArrayIndexOutOfBoundsException aoe) {
       
  1983                 try {
       
  1984                     Arrays.parallelSort(a, 0, a.length + m);
       
  1985 
       
  1986                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  1987                         " as expected: toIndex = " + (a.length + m));
       
  1988                 }
       
  1989                 catch (ArrayIndexOutOfBoundsException aie) {
       
  1990                     return;
       
  1991                 }
       
  1992             }
       
  1993         }
       
  1994     }
       
  1995 
       
  1996     private static void checkRange(double[] a, int m) {
       
  1997         try {
       
  1998             Arrays.parallelSort(a, m + 1, m);
       
  1999 
       
  2000             failed("ParallelSort does not throw IllegalArgumentException " +
       
  2001                 " as expected: fromIndex = " + (m + 1) +
       
  2002                 " toIndex = " + m);
       
  2003         }
       
  2004         catch (IllegalArgumentException iae) {
       
  2005             try {
       
  2006                 Arrays.parallelSort(a, -m, a.length);
       
  2007 
       
  2008                 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  2009                     " as expected: fromIndex = " + (-m));
       
  2010             }
       
  2011             catch (ArrayIndexOutOfBoundsException aoe) {
       
  2012                 try {
       
  2013                     Arrays.parallelSort(a, 0, a.length + m);
       
  2014 
       
  2015                     failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " +
       
  2016                         " as expected: toIndex = " + (a.length + m));
       
  2017                 }
       
  2018                 catch (ArrayIndexOutOfBoundsException aie) {
       
  2019                     return;
       
  2020                 }
       
  2021             }
       
  2022         }
       
  2023     }
       
  2024 
       
  2025     private static void outArray(Object[] a) {
       
  2026         for (int i = 0; i < a.length; i++) {
       
  2027             out.print(a[i] + " ");
       
  2028         }
       
  2029         out.println();
       
  2030     }
       
  2031 
       
  2032     private static void outArray(int[] a) {
       
  2033         for (int i = 0; i < a.length; i++) {
       
  2034             out.print(a[i] + " ");
       
  2035         }
       
  2036         out.println();
       
  2037     }
       
  2038 
       
  2039     private static void outArray(float[] a) {
       
  2040         for (int i = 0; i < a.length; i++) {
       
  2041             out.print(a[i] + " ");
       
  2042         }
       
  2043         out.println();
       
  2044     }
       
  2045 
       
  2046     private static void outArray(double[] a) {
       
  2047         for (int i = 0; i < a.length; i++) {
       
  2048             out.print(a[i] + " ");
       
  2049         }
       
  2050         out.println();
       
  2051     }
       
  2052 
       
  2053     private static class MyRandom extends Random {
       
  2054         MyRandom(long seed) {
       
  2055             super(seed);
       
  2056             mySeed = seed;
       
  2057         }
       
  2058 
       
  2059         long getSeed() {
       
  2060             return mySeed;
       
  2061         }
       
  2062 
       
  2063         private long mySeed;
       
  2064     }
       
  2065 
       
  2066     private static String ourDescription;
       
  2067 }