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 
main(String[] args)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 
testAndCheck(int[] lengths, long[] randoms)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 
testEmptyAndNullIntArray()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 
testEmptyAndNullLongArray()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 
testEmptyAndNullShortArray()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 
testEmptyAndNullCharArray()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 
testEmptyAndNullByteArray()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 
testEmptyAndNullFloatArray()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 
testEmptyAndNullDoubleArray()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 
testAndCheckSubArray(int length)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 
testAndCheckRange(int length)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 
testStable(int length, MyRandom random)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 
checkSorted(Pair[] a)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 
checkStable(Pair[] a)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 
build(int length, Random random)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> {
Pair(int key, int value)356         Pair(int key, int value) {
357             myKey = key;
358             myValue = value;
359         }
360 
getKey()361         int getKey() {
362             return myKey;
363         }
364 
getValue()365         int getValue() {
366             return myValue;
367         }
368 
compareTo(Pair pair)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
toString()380         public String toString() {
381             return "(" + myKey + ", " + myValue + ")";
382         }
383 
384         private int myKey;
385         private int myValue;
386     }
387 
388 
testAndCheckWithInsertionSort(int length, MyRandom random)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 
testMergeSort(int length)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 
testAndCheckWithCheckSum(int length, MyRandom random)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 
testAndCheckWithScrambling(int length, MyRandom random)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 
testAndCheckFloat(int length, MyRandom random)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 
testAndCheckDouble(int length, MyRandom random)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 
prepareSubArray(int[] a, int fromIndex, int toIndex, int m)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 
scramble(int[] a, Random random)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 
scramble(float[] a, Random random)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 
scramble(double[] a, Random random)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 
swap(int[] a, int i, int j)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 
swap(float[] a, int i, int j)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 
swap(double[] a, int i, int j)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 {
convert(int[] a)624             Object convert(int[] a) {
625                 return a.clone();
626             }
627         },
628         LONG {
convert(int[] a)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 {
convert(int[] a)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 {
convert(int[] a)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 {
convert(int[] a)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 {
convert(int[] a)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 {
convert(int[] a)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 {
convert(int[] a)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 
convert(int[] a)699         abstract Object convert(int[] a);
700 
toString()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 {
build(float[] x, int a, int g, int z, int n, int p, Random random)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 
build(float[] x, int a, int g, int z, int n, int p, Random random)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 {
build(double[] x, int a, int g, int z, int n, int p, Random random)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 
build(double[] x, int a, int g, int z, int n, int p, Random random)760         abstract void build(double[] x, int a, int g, int z, int n, int p, Random random);
761     }
762 
writeValue(float[] a, float value, int fromIndex, int count)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 
compare(float[] a, float[] b, int numNaN, int numNeg, int numNegZero)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 
writeValue(double[] a, double value, int fromIndex, int count)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 
compare(double[] a, double[] b, int numNaN, int numNeg, int numNegZero)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 {
build(int[] a, int m)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 {
build(int[] a, int m)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 
build(int[] a, int m)852         abstract void build(int[] a, int m);
853 
toString()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 {
build(int[] a, int m)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 {
build(int[] a, int m)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 
build(int[] a, int m)900         abstract void build(int[] a, int m);
901 
toString()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 {
build(int[] a, int m, Random 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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 {
build(int[] a, int m, Random random)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 
build(int[] a, int m, Random random)1016         abstract void build(int[] a, int m, Random random);
1017 
toString()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 
checkWithCheckSum(Object test, Object golden)1028     private static void checkWithCheckSum(Object test, Object golden) {
1029         checkSorted(test);
1030         checkCheckSum(test, golden);
1031     }
1032 
failed(String message)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 
failedSort(int index, String value1, String value2)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 
failedCompare(int index, String value1, String value2)1043     private static void failedCompare(int index, String value1, String value2) {
1044         failed("On position " + index + " must be " + value2 + " instead of " + value1);
1045     }
1046 
compare(Object test, Object golden)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 
compare(int[] a, int[] b)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 
compare(long[] a, long[] b)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 
compare(short[] a, short[] b)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 
compare(byte[] a, byte[] b)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 
compare(char[] a, char[] b)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 
compare(float[] a, float[] b)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 
compare(double[] a, double[] b)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 
compare(Integer[] a, Integer[] b)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 
checkSorted(Object object)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 
checkSorted(int[] a)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 
checkSorted(long[] a)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 
checkSorted(short[] a)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 
checkSorted(byte[] a)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 
checkSorted(char[] a)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 
checkSorted(float[] a)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 
checkSorted(double[] a)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 
checkSorted(Integer[] a)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 
checkCheckSum(Object test, Object golden)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 
checkSumXor(Object object)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 
checkSumXor(Integer[] a)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 
checkSumXor(int[] a)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 
checkSumXor(long[] a)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 
checkSumXor(short[] a)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 
checkSumXor(byte[] a)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 
checkSumXor(char[] a)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 
checkSumXor(float[] a)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 
checkSumXor(double[] a)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 
checkSumPlus(Object object)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 
checkSumPlus(int[] a)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 
checkSumPlus(long[] a)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 
checkSumPlus(short[] a)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 
checkSumPlus(byte[] a)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 
checkSumPlus(char[] a)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 
checkSumPlus(float[] a)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 
checkSumPlus(double[] a)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 
checkSumPlus(Integer[] a)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 
sortByInsertionSort(Object object)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 
sortByInsertionSort(int[] a)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 
sortByInsertionSort(long[] a)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 
sortByInsertionSort(short[] a)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 
sortByInsertionSort(byte[] a)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 
sortByInsertionSort(char[] a)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 
sortByInsertionSort(float[] a)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 
sortByInsertionSort(double[] a)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 
sortByInsertionSort(Integer[] a)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 
sort(Object object)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 
sortSubArray(Object object, int fromIndex, int toIndex)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 
checkSubArray(Object object, int fromIndex, int toIndex, int m)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 
checkSubArray(Integer[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(int[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(byte[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(long[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(char[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(short[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(float[] a, int fromIndex, int toIndex, int m)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 
checkSubArray(double[] a, int fromIndex, int toIndex, int m)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 
checkRange(Object object, int m)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 
checkRange(Integer[] a, int m)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 
checkRange(int[] a, int m)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 
checkRange(long[] a, int m)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 
checkRange(byte[] a, int m)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 
checkRange(short[] a, int m)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 
checkRange(char[] a, int m)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 
checkRange(float[] a, int m)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 
checkRange(double[] a, int m)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 
outArray(Object[] a)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 
outArray(int[] a)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 
outArray(float[] a)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 
outArray(double[] a)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 {
MyRandom(long seed)2054         MyRandom(long seed) {
2055             super(seed);
2056             mySeed = seed;
2057         }
2058 
getSeed()2059         long getSeed() {
2060             return mySeed;
2061         }
2062 
2063         private long mySeed;
2064     }
2065 
2066     private static String ourDescription;
2067 }
2068