1 /*
2  * Copyright (c) 1998, 2014, 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 /* @test
25  * @bug 4098239 4107540 4080736 4261102 4274710 4305272
26  *      4979017 4979028 4979031 5030267 6222207 8040806
27  * @summary Test the operation of the methods of BitSet class
28  * @author Mike McCloskey, Martin Buchholz
29  * @run main/othervm BSMethods
30  * @key randomness
31  */
32 
33 import java.util.*;
34 
35 /**
36  * This is a simple test class created to run tests on the BitSet class.
37  *
38  */
39 public class BSMethods {
40 
41     private static Random generator = new Random();
42     private static boolean failure = false;
43 
fail(String diagnostic)44     private static void fail(String diagnostic) {
45         new Error(diagnostic).printStackTrace();
46         failure = true;
47     }
48 
check(boolean condition)49     private static void check(boolean condition) {
50         check(condition, "something's fishy");
51     }
52 
check(boolean condition, String diagnostic)53     private static void check(boolean condition, String diagnostic) {
54         if (! condition)
55             fail(diagnostic);
56     }
57 
checkEmpty(BitSet s)58     private static void checkEmpty(BitSet s) {
59         check(s.isEmpty(), "isEmpty");
60         check(s.length() == 0, "length");
61         check(s.cardinality() == 0, "cardinality");
62         check(s.equals(new BitSet())   , "equals");
63         check(s.equals(new BitSet(0))  , "equals");
64         check(s.equals(new BitSet(127)), "equals");
65         check(s.equals(new BitSet(128)), "equals");
66         check(s.nextSetBit(0)   == -1, "nextSetBit");
67         check(s.nextSetBit(127) == -1, "nextSetBit");
68         check(s.nextSetBit(128) == -1, "nextSetBit");
69         check(s.nextClearBit(0)   == 0,   "nextClearBit");
70         check(s.nextClearBit(127) == 127, "nextClearBit");
71         check(s.nextClearBit(128) == 128, "nextClearBit");
72         check(s.toString().equals("{}"), "toString");
73         check(! s.get(0), "get");
74     }
75 
makeSet(int... elts)76     private static BitSet makeSet(int... elts) {
77         BitSet s = new BitSet();
78         for (int elt : elts)
79             s.set(elt);
80         return s;
81     }
82 
checkEquality(BitSet s, BitSet t)83     private static void checkEquality(BitSet s, BitSet t) {
84         checkSanity(s, t);
85         check(s.equals(t), "equals");
86         check(s.toString().equals(t.toString()), "equal strings");
87         check(s.length() == t.length(), "equal lengths");
88         check(s.cardinality() == t.cardinality(), "equal cardinalities");
89     }
90 
checkSanity(BitSet... sets)91     private static void checkSanity(BitSet... sets) {
92         for (BitSet s : sets) {
93             int len = s.length();
94             int cardinality1 = s.cardinality();
95             int cardinality2 = 0;
96             for (int i = s.nextSetBit(0); i >= 0; i = s.nextSetBit(i+1)) {
97                 check(s.get(i));
98                 cardinality2++;
99             }
100             check(s.nextSetBit(len) == -1, "last set bit");
101             check(s.nextClearBit(len) == len, "last set bit");
102             check(s.isEmpty() == (len == 0), "emptiness");
103             check(cardinality1 == cardinality2, "cardinalities");
104             check(len <= s.size(), "length <= size");
105             check(len >= 0, "length >= 0");
106             check(cardinality1 >= 0, "cardinality >= 0");
107         }
108     }
109 
main(String[] args)110     public static void main(String[] args) {
111 
112         //testFlipTime();
113 
114         // These are the single bit versions
115         testSetGetClearFlip();
116 
117         // Test the ranged versions
118         testClear();
119 
120         testFlip();
121         testSet();
122         testGet();
123 
124         // BitSet interaction calls
125         testAndNot();
126         testAnd();
127         testOr();
128         testXor();
129 
130         // Miscellaneous calls
131         testLength();
132         testEquals();
133         testNextSetBit();
134         testNextClearBit();
135         testIntersects();
136         testCardinality();
137         testEmpty();
138         testEmpty2();
139         testToString();
140         testLogicalIdentities();
141 
142         if (failure)
143             throw new RuntimeException("One or more BitSet failures.");
144     }
145 
report(String testName, int failCount)146     private static void report(String testName, int failCount) {
147         System.err.println(testName+": " +
148                            (failCount==0 ? "Passed":"Failed("+failCount+")"));
149         if (failCount > 0)
150             failure = true;
151     }
152 
testFlipTime()153     private static void testFlipTime() {
154         // Make a fairly random bitset
155         BitSet b1 = new BitSet();
156         b1.set(1000);
157         long startTime = System.currentTimeMillis();
158         for(int x=0; x<100000; x++) {
159             b1.flip(100, 900);
160         }
161         long endTime = System.currentTimeMillis();
162         long total = endTime - startTime;
163         System.out.println("Multiple word flip Time "+total);
164 
165         startTime = System.currentTimeMillis();
166         for(int x=0; x<100000; x++) {
167             b1.flip(2, 44);
168         }
169         endTime = System.currentTimeMillis();
170         total = endTime - startTime;
171         System.out.println("Single word flip Time "+total);
172     }
173 
testNextSetBit()174     private static void testNextSetBit() {
175         int failCount = 0;
176 
177         for (int i=0; i<100; i++) {
178             int numberOfSetBits = generator.nextInt(100) + 1;
179             BitSet testSet = new BitSet();
180             int[] history = new int[numberOfSetBits];
181 
182             // Set some random bits and remember them
183             int nextBitToSet = 0;
184             for (int x=0; x<numberOfSetBits; x++) {
185                 nextBitToSet += generator.nextInt(30)+1;
186                 history[x] = nextBitToSet;
187                 testSet.set(nextBitToSet);
188             }
189 
190             // Verify their retrieval using nextSetBit()
191             int historyIndex = 0;
192             for(int x=testSet.nextSetBit(0); x>=0; x=testSet.nextSetBit(x+1)) {
193                 if (x != history[historyIndex++])
194                     failCount++;
195             }
196 
197             checkSanity(testSet);
198         }
199 
200         report("NextSetBit                  ", failCount);
201     }
202 
testNextClearBit()203     private static void testNextClearBit() {
204         int failCount = 0;
205 
206         for (int i=0; i<1000; i++) {
207             BitSet b = new BitSet(256);
208             int[] history = new int[10];
209 
210             // Set all the bits
211             for (int x=0; x<256; x++)
212                 b.set(x);
213 
214             // Clear some random bits and remember them
215             int nextBitToClear = 0;
216             for (int x=0; x<10; x++) {
217                 nextBitToClear += generator.nextInt(24)+1;
218                 history[x] = nextBitToClear;
219                 b.clear(nextBitToClear);
220             }
221 
222             // Verify their retrieval using nextClearBit()
223             int historyIndex = 0;
224             for(int x=b.nextClearBit(0); x<256; x=b.nextClearBit(x+1)) {
225                 if (x != history[historyIndex++])
226                     failCount++;
227             }
228 
229             checkSanity(b);
230         }
231 
232         // regression test for 4350178
233         BitSet bs  = new BitSet();
234         if (bs.nextClearBit(0) != 0)
235                 failCount++;
236         for (int i = 0; i < 64; i++) {
237             bs.set(i);
238             if (bs.nextClearBit(0) != i+1)
239                 failCount++;
240         }
241 
242         checkSanity(bs);
243 
244         report("NextClearBit                ", failCount);
245     }
246 
testSetGetClearFlip()247     private static void testSetGetClearFlip() {
248         int failCount = 0;
249 
250         for (int i=0; i<100; i++) {
251             BitSet testSet = new BitSet();
252             HashSet<Integer> history = new HashSet<Integer>();
253 
254             // Set a random number of bits in random places
255             // up to a random maximum
256             int nextBitToSet = 0;
257             int numberOfSetBits = generator.nextInt(100) + 1;
258             int highestPossibleSetBit = generator.nextInt(1000) + 1;
259             for (int x=0; x<numberOfSetBits; x++) {
260                 nextBitToSet = generator.nextInt(highestPossibleSetBit);
261                 history.add(new Integer(nextBitToSet));
262                 testSet.set(nextBitToSet);
263             }
264 
265             // Make sure each bit is set appropriately
266             for (int x=0; x<highestPossibleSetBit; x++) {
267                 if (testSet.get(x) != history.contains(new Integer(x)))
268                     failCount++;
269             }
270 
271             // Clear the bits
272             Iterator<Integer> setBitIterator = history.iterator();
273             while (setBitIterator.hasNext()) {
274                 Integer setBit = setBitIterator.next();
275                 testSet.clear(setBit.intValue());
276             }
277 
278             // Verify they were cleared
279             for (int x=0; x<highestPossibleSetBit; x++)
280                 if (testSet.get(x))
281                     failCount++;
282             if(testSet.length() != 0)
283                 failCount++;
284 
285             // Set them with set(int, boolean)
286             setBitIterator = history.iterator();
287             while (setBitIterator.hasNext()) {
288                 Integer setBit = setBitIterator.next();
289                 testSet.set(setBit.intValue(), true);
290             }
291 
292             // Make sure each bit is set appropriately
293             for (int x=0; x<highestPossibleSetBit; x++) {
294                 if (testSet.get(x) != history.contains(new Integer(x)))
295                     failCount++;
296             }
297 
298             // Clear them with set(int, boolean)
299             setBitIterator = history.iterator();
300             while (setBitIterator.hasNext()) {
301                 Integer setBit = (Integer)setBitIterator.next();
302                 testSet.set(setBit.intValue(), false);
303             }
304 
305             // Verify they were cleared
306             for (int x=0; x<highestPossibleSetBit; x++)
307                 if (testSet.get(x))
308                     failCount++;
309             if(testSet.length() != 0)
310                 failCount++;
311 
312             // Flip them on
313             setBitIterator = history.iterator();
314             while (setBitIterator.hasNext()) {
315                 Integer setBit = (Integer)setBitIterator.next();
316                 testSet.flip(setBit.intValue());
317             }
318 
319             // Verify they were flipped
320             for (int x=0; x<highestPossibleSetBit; x++) {
321                 if (testSet.get(x) != history.contains(new Integer(x)))
322                     failCount++;
323             }
324 
325             // Flip them off
326             setBitIterator = history.iterator();
327             while (setBitIterator.hasNext()) {
328                 Integer setBit = (Integer)setBitIterator.next();
329                 testSet.flip(setBit.intValue());
330             }
331 
332             // Verify they were flipped
333             for (int x=0; x<highestPossibleSetBit; x++)
334                 if (testSet.get(x))
335                     failCount++;
336             if(testSet.length() != 0)
337                 failCount++;
338 
339             checkSanity(testSet);
340         }
341 
342         report("SetGetClearFlip             ", failCount);
343     }
344 
testAndNot()345     private static void testAndNot() {
346         int failCount = 0;
347 
348         for (int i=0; i<100; i++) {
349             BitSet b1 = new BitSet(256);
350             BitSet b2 = new BitSet(256);
351 
352             // Set some random bits in first set and remember them
353             int nextBitToSet = 0;
354             for (int x=0; x<10; x++)
355                 b1.set(generator.nextInt(255));
356 
357             // Set some random bits in second set and remember them
358             for (int x=10; x<20; x++)
359                 b2.set(generator.nextInt(255));
360 
361             // andNot the sets together
362             BitSet b3 = (BitSet)b1.clone();
363             b3.andNot(b2);
364 
365             // Examine each bit of b3 for errors
366             for(int x=0; x<256; x++) {
367                 boolean bit1 = b1.get(x);
368                 boolean bit2 = b2.get(x);
369                 boolean bit3 = b3.get(x);
370                 if (!(bit3 == (bit1 & (!bit2))))
371                     failCount++;
372             }
373             checkSanity(b1, b2, b3);
374         }
375 
376         report("AndNot                      ", failCount);
377     }
378 
testAnd()379     private static void testAnd() {
380         int failCount = 0;
381 
382         for (int i=0; i<100; i++) {
383             BitSet b1 = new BitSet(256);
384             BitSet b2 = new BitSet(256);
385 
386             // Set some random bits in first set and remember them
387             int nextBitToSet = 0;
388             for (int x=0; x<10; x++)
389                 b1.set(generator.nextInt(255));
390 
391             // Set more random bits in second set and remember them
392             for (int x=10; x<20; x++)
393                 b2.set(generator.nextInt(255));
394 
395             // And the sets together
396             BitSet b3 = (BitSet)b1.clone();
397             b3.and(b2);
398 
399             // Examine each bit of b3 for errors
400             for(int x=0; x<256; x++) {
401                 boolean bit1 = b1.get(x);
402                 boolean bit2 = b2.get(x);
403                 boolean bit3 = b3.get(x);
404                 if (!(bit3 == (bit1 & bit2)))
405                     failCount++;
406             }
407             checkSanity(b1, b2, b3);
408         }
409 
410         // `and' that happens to clear the last word
411         BitSet b4 = makeSet(2, 127);
412         b4.and(makeSet(2, 64));
413         checkSanity(b4);
414         if (!(b4.equals(makeSet(2))))
415             failCount++;
416 
417         report("And                         ", failCount);
418     }
419 
testOr()420     private static void testOr() {
421         int failCount = 0;
422 
423         for (int i=0; i<100; i++) {
424             BitSet b1 = new BitSet(256);
425             BitSet b2 = new BitSet(256);
426             int[] history = new int[20];
427 
428             // Set some random bits in first set and remember them
429             int nextBitToSet = 0;
430             for (int x=0; x<10; x++) {
431                 nextBitToSet = generator.nextInt(255);
432                 history[x] = nextBitToSet;
433                 b1.set(nextBitToSet);
434             }
435 
436             // Set more random bits in second set and remember them
437             for (int x=10; x<20; x++) {
438                 nextBitToSet = generator.nextInt(255);
439                 history[x] = nextBitToSet;
440                 b2.set(nextBitToSet);
441             }
442 
443             // Or the sets together
444             BitSet b3 = (BitSet)b1.clone();
445             b3.or(b2);
446 
447             // Verify the set bits of b3 from the history
448             int historyIndex = 0;
449             for(int x=0; x<20; x++) {
450                 if (!b3.get(history[x]))
451                     failCount++;
452             }
453 
454             // Examine each bit of b3 for errors
455             for(int x=0; x<256; x++) {
456                 boolean bit1 = b1.get(x);
457                 boolean bit2 = b2.get(x);
458                 boolean bit3 = b3.get(x);
459                 if (!(bit3 == (bit1 | bit2)))
460                     failCount++;
461             }
462             checkSanity(b1, b2, b3);
463         }
464 
465         report("Or                          ", failCount);
466     }
467 
testXor()468     private static void testXor() {
469         int failCount = 0;
470 
471         for (int i=0; i<100; i++) {
472             BitSet b1 = new BitSet(256);
473             BitSet b2 = new BitSet(256);
474 
475             // Set some random bits in first set and remember them
476             int nextBitToSet = 0;
477             for (int x=0; x<10; x++)
478                 b1.set(generator.nextInt(255));
479 
480             // Set more random bits in second set and remember them
481             for (int x=10; x<20; x++)
482                 b2.set(generator.nextInt(255));
483 
484             // Xor the sets together
485             BitSet b3 = (BitSet)b1.clone();
486             b3.xor(b2);
487 
488             // Examine each bit of b3 for errors
489             for(int x=0; x<256; x++) {
490                 boolean bit1 = b1.get(x);
491                 boolean bit2 = b2.get(x);
492                 boolean bit3 = b3.get(x);
493                 if (!(bit3 == (bit1 ^ bit2)))
494                     failCount++;
495             }
496             checkSanity(b1, b2, b3);
497             b3.xor(b3); checkEmpty(b3);
498         }
499 
500         // xor that happens to clear the last word
501         BitSet b4 = makeSet(2, 64, 127);
502         b4.xor(makeSet(64, 127));
503         checkSanity(b4);
504         if (!(b4.equals(makeSet(2))))
505             failCount++;
506 
507         report("Xor                         ", failCount);
508     }
509 
testEquals()510     private static void testEquals() {
511         int failCount = 0;
512 
513         for (int i=0; i<100; i++) {
514             // Create BitSets of different sizes
515             BitSet b1 = new BitSet(generator.nextInt(1000)+1);
516             BitSet b2 = new BitSet(generator.nextInt(1000)+1);
517 
518             // Set some random bits
519             int nextBitToSet = 0;
520             for (int x=0; x<10; x++) {
521                 nextBitToSet += generator.nextInt(50)+1;
522                 b1.set(nextBitToSet);
523                 b2.set(nextBitToSet);
524             }
525 
526             // Verify their equality despite different storage sizes
527             if (!b1.equals(b2))
528                 failCount++;
529             checkEquality(b1,b2);
530         }
531 
532         report("Equals                      ", failCount);
533     }
534 
testLength()535     private static void testLength() {
536         int failCount = 0;
537 
538         // Test length after set
539         for (int i=0; i<100; i++) {
540             BitSet b1 = new BitSet(256);
541             int highestSetBit = 0;
542 
543             for(int x=0; x<100; x++) {
544                 int nextBitToSet = generator.nextInt(255);
545                 if (nextBitToSet > highestSetBit)
546                     highestSetBit = nextBitToSet;
547                 b1.set(nextBitToSet);
548                 if (b1.length() != highestSetBit + 1)
549                     failCount++;
550             }
551             checkSanity(b1);
552         }
553 
554         // Test length after flip
555         for (int i=0; i<100; i++) {
556             BitSet b1 = new BitSet(256);
557             for(int x=0; x<100; x++) {
558                 // Flip a random range twice
559                 int rangeStart = generator.nextInt(100);
560                 int rangeEnd = rangeStart + generator.nextInt(100);
561                 b1.flip(rangeStart);
562                 b1.flip(rangeStart);
563                 if (b1.length() != 0)
564                     failCount++;
565                 b1.flip(rangeStart, rangeEnd);
566                 b1.flip(rangeStart, rangeEnd);
567                 if (b1.length() != 0)
568                     failCount++;
569             }
570             checkSanity(b1);
571         }
572 
573         // Test length after or
574         for (int i=0; i<100; i++) {
575             BitSet b1 = new BitSet(256);
576             BitSet b2 = new BitSet(256);
577             int bit1 = generator.nextInt(100);
578             int bit2 = generator.nextInt(100);
579             int highestSetBit = (bit1 > bit2) ? bit1 : bit2;
580             b1.set(bit1);
581             b2.set(bit2);
582             b1.or(b2);
583             if (b1.length() != highestSetBit + 1)
584                 failCount++;
585             checkSanity(b1, b2);
586         }
587 
588         report("Length                      ", failCount);
589     }
590 
testClear()591     private static void testClear() {
592         int failCount = 0;
593 
594         for (int i=0; i<1000; i++) {
595             BitSet b1 = new BitSet();
596 
597             // Make a fairly random bitset
598             int numberOfSetBits = generator.nextInt(100) + 1;
599             int highestPossibleSetBit = generator.nextInt(1000) + 1;
600 
601             for (int x=0; x<numberOfSetBits; x++)
602                 b1.set(generator.nextInt(highestPossibleSetBit));
603 
604             BitSet b2 = (BitSet)b1.clone();
605 
606             // Clear out a random range
607             int rangeStart = generator.nextInt(100);
608             int rangeEnd = rangeStart + generator.nextInt(100);
609 
610             // Use the clear(int, int) call on b1
611             b1.clear(rangeStart, rangeEnd);
612 
613             // Use a loop on b2
614             for (int x=rangeStart; x<rangeEnd; x++)
615                 b2.clear(x);
616 
617             // Verify their equality
618             if (!b1.equals(b2)) {
619                 System.out.println("rangeStart = " + rangeStart);
620                 System.out.println("rangeEnd = " + rangeEnd);
621                 System.out.println("b1 = " + b1);
622                 System.out.println("b2 = " + b2);
623                 failCount++;
624             }
625             checkEquality(b1,b2);
626         }
627 
628         report("Clear                       ", failCount);
629     }
630 
testSet()631     private static void testSet() {
632         int failCount = 0;
633 
634         // Test set(int, int)
635         for (int i=0; i<1000; i++) {
636             BitSet b1 = new BitSet();
637 
638             // Make a fairly random bitset
639             int numberOfSetBits = generator.nextInt(100) + 1;
640             int highestPossibleSetBit = generator.nextInt(1000) + 1;
641 
642             for (int x=0; x<numberOfSetBits; x++)
643                 b1.set(generator.nextInt(highestPossibleSetBit));
644 
645             BitSet b2 = (BitSet)b1.clone();
646 
647             // Set a random range
648             int rangeStart = generator.nextInt(100);
649             int rangeEnd = rangeStart + generator.nextInt(100);
650 
651             // Use the set(int, int) call on b1
652             b1.set(rangeStart, rangeEnd);
653 
654             // Use a loop on b2
655             for (int x=rangeStart; x<rangeEnd; x++)
656                 b2.set(x);
657 
658             // Verify their equality
659             if (!b1.equals(b2)) {
660                 System.out.println("Set 1");
661                 System.out.println("rangeStart = " + rangeStart);
662                 System.out.println("rangeEnd = " + rangeEnd);
663                 System.out.println("b1 = " + b1);
664                 System.out.println("b2 = " + b2);
665                 failCount++;
666             }
667             checkEquality(b1,b2);
668         }
669 
670         // Test set(int, int, boolean)
671         for (int i=0; i<100; i++) {
672             BitSet b1 = new BitSet();
673 
674             // Make a fairly random bitset
675             int numberOfSetBits = generator.nextInt(100) + 1;
676             int highestPossibleSetBit = generator.nextInt(1000) + 1;
677 
678             for (int x=0; x<numberOfSetBits; x++)
679                 b1.set(generator.nextInt(highestPossibleSetBit));
680 
681             BitSet b2 = (BitSet)b1.clone();
682             boolean setOrClear = generator.nextBoolean();
683 
684             // Set a random range
685             int rangeStart = generator.nextInt(100);
686             int rangeEnd = rangeStart + generator.nextInt(100);
687 
688             // Use the set(int, int, boolean) call on b1
689             b1.set(rangeStart, rangeEnd, setOrClear);
690 
691             // Use a loop on b2
692             for (int x=rangeStart; x<rangeEnd; x++)
693                 b2.set(x, setOrClear);
694 
695             // Verify their equality
696             if (!b1.equals(b2)) {
697                 System.out.println("Set 2");
698                 System.out.println("b1 = " + b1);
699                 System.out.println("b2 = " + b2);
700                 failCount++;
701             }
702             checkEquality(b1,b2);
703         }
704 
705         report("Set                         ", failCount);
706     }
707 
testFlip()708     private static void testFlip() {
709         int failCount = 0;
710 
711         for (int i=0; i<1000; i++) {
712             BitSet b1 = new BitSet();
713 
714             // Make a fairly random bitset
715             int numberOfSetBits = generator.nextInt(100) + 1;
716             int highestPossibleSetBit = generator.nextInt(1000) + 1;
717 
718             for (int x=0; x<numberOfSetBits; x++)
719                 b1.set(generator.nextInt(highestPossibleSetBit));
720 
721             BitSet b2 = (BitSet)b1.clone();
722 
723             // Flip a random range
724             int rangeStart = generator.nextInt(100);
725             int rangeEnd = rangeStart + generator.nextInt(100);
726 
727             // Use the flip(int, int) call on b1
728             b1.flip(rangeStart, rangeEnd);
729 
730             // Use a loop on b2
731             for (int x=rangeStart; x<rangeEnd; x++)
732                 b2.flip(x);
733 
734             // Verify their equality
735             if (!b1.equals(b2))
736                 failCount++;
737             checkEquality(b1,b2);
738         }
739 
740         report("Flip                        ", failCount);
741     }
742 
testGet()743     private static void testGet() {
744         int failCount = 0;
745 
746         for (int i=0; i<1000; i++) {
747             BitSet b1 = new BitSet();
748 
749             // Make a fairly random bitset
750             int numberOfSetBits = generator.nextInt(100) + 1;
751             int highestPossibleSetBit = generator.nextInt(1000) + 1;
752 
753             for (int x=0; x<numberOfSetBits; x++)
754                 b1.set(generator.nextInt(highestPossibleSetBit));
755 
756             // Get a new set from a random range
757             int rangeStart = generator.nextInt(100);
758             int rangeEnd = rangeStart + generator.nextInt(100);
759 
760             BitSet b2 = b1.get(rangeStart, rangeEnd);
761 
762             BitSet b3 = new BitSet();
763             for(int x=rangeStart; x<rangeEnd; x++)
764                 b3.set(x-rangeStart, b1.get(x));
765 
766             // Verify their equality
767             if (!b2.equals(b3)) {
768                 System.out.println("start="+rangeStart);
769                 System.out.println("end="+rangeEnd);
770                 System.out.println(b1);
771                 System.out.println(b2);
772                 System.out.println(b3);
773                 failCount++;
774             }
775             checkEquality(b2,b3);
776         }
777 
778         report("Get                         ", failCount);
779     }
780 
781 
testIntersects()782     private static void testIntersects() {
783         int failCount = 0;
784 
785         for (int i=0; i<100; i++) {
786             BitSet b1 = new BitSet(256);
787             BitSet b2 = new BitSet(256);
788 
789             // Set some random bits in first set
790             int nextBitToSet = 0;
791             for (int x=0; x<30; x++) {
792                 nextBitToSet = generator.nextInt(255);
793                 b1.set(nextBitToSet);
794             }
795 
796             // Set more random bits in second set
797             for (int x=0; x<30; x++) {
798                 nextBitToSet = generator.nextInt(255);
799                 b2.set(nextBitToSet);
800             }
801 
802             // Make sure they intersect
803             nextBitToSet = generator.nextInt(255);
804             b1.set(nextBitToSet);
805             b2.set(nextBitToSet);
806 
807             if (!b1.intersects(b2))
808                 failCount++;
809 
810             // Remove the common set bits
811             b1.andNot(b2);
812 
813             // Make sure they don't intersect
814             if (b1.intersects(b2))
815                 failCount++;
816 
817             checkSanity(b1, b2);
818         }
819 
820         report("Intersects                  ", failCount);
821     }
822 
testCardinality()823     private static void testCardinality() {
824         int failCount = 0;
825 
826         for (int i=0; i<100; i++) {
827             BitSet b1 = new BitSet(256);
828 
829             // Set a random number of increasing bits
830             int nextBitToSet = 0;
831             int iterations = generator.nextInt(20)+1;
832             for (int x=0; x<iterations; x++) {
833                 nextBitToSet += generator.nextInt(20)+1;
834                 b1.set(nextBitToSet);
835             }
836 
837             if (b1.cardinality() != iterations) {
838                 System.out.println("Iterations is "+iterations);
839                 System.out.println("Cardinality is "+b1.cardinality());
840                 failCount++;
841             }
842 
843             checkSanity(b1);
844         }
845 
846         report("Cardinality                 ", failCount);
847     }
848 
testEmpty()849     private static void testEmpty() {
850         int failCount = 0;
851 
852         BitSet b1 = new BitSet();
853         if (!b1.isEmpty())
854             failCount++;
855 
856         int nextBitToSet = 0;
857         int numberOfSetBits = generator.nextInt(100) + 1;
858         int highestPossibleSetBit = generator.nextInt(1000) + 1;
859         for (int x=0; x<numberOfSetBits; x++) {
860             nextBitToSet = generator.nextInt(highestPossibleSetBit);
861             b1.set(nextBitToSet);
862             if (b1.isEmpty())
863                 failCount++;
864             b1.clear(nextBitToSet);
865             if (!b1.isEmpty())
866                 failCount++;
867         }
868 
869         report("Empty                       ", failCount);
870     }
871 
testEmpty2()872     private static void testEmpty2() {
873         {BitSet t = new BitSet(); t.set(100); t.clear(3,600); checkEmpty(t);}
874         checkEmpty(new BitSet(0));
875         checkEmpty(new BitSet(342));
876         BitSet s = new BitSet(0);
877         checkEmpty(s);
878         s.clear(92);      checkEmpty(s);
879         s.clear(127,127); checkEmpty(s);
880         s.set(127,127);   checkEmpty(s);
881         s.set(128,128);   checkEmpty(s);
882         BitSet empty = new BitSet();
883         {BitSet t = new BitSet(); t.and   (empty);     checkEmpty(t);}
884         {BitSet t = new BitSet(); t.or    (empty);     checkEmpty(t);}
885         {BitSet t = new BitSet(); t.xor   (empty);     checkEmpty(t);}
886         {BitSet t = new BitSet(); t.andNot(empty);     checkEmpty(t);}
887         {BitSet t = new BitSet(); t.and   (t);         checkEmpty(t);}
888         {BitSet t = new BitSet(); t.or    (t);         checkEmpty(t);}
889         {BitSet t = new BitSet(); t.xor   (t);         checkEmpty(t);}
890         {BitSet t = new BitSet(); t.andNot(t);         checkEmpty(t);}
891         {BitSet t = new BitSet(); t.and(makeSet(1));   checkEmpty(t);}
892         {BitSet t = new BitSet(); t.and(makeSet(127)); checkEmpty(t);}
893         {BitSet t = new BitSet(); t.and(makeSet(128)); checkEmpty(t);}
894         {BitSet t = new BitSet(); t.flip(7);t.flip(7); checkEmpty(t);}
895         {BitSet t = new BitSet(); checkEmpty(t.get(200,300));}
896         {BitSet t = makeSet(2,5); check(t.get(2,6).equals(makeSet(0,3)),"");}
897     }
898 
testToString()899     private static void testToString() {
900         check(new BitSet().toString().equals("{}"));
901         check(makeSet(2,3,42,43,234).toString().equals("{2, 3, 42, 43, 234}"));
902 
903         final long MB = 1024*1024;
904         if (Runtime.getRuntime().maxMemory() >= 512*MB) {
905             // only run it if we have enough memory
906             try {
907                 check(makeSet(Integer.MAX_VALUE-1).toString().equals(
908                         "{" + (Integer.MAX_VALUE-1) + "}"));
909                 check(makeSet(Integer.MAX_VALUE).toString().equals(
910                         "{" + Integer.MAX_VALUE + "}"));
911                 check(makeSet(0, 1, Integer.MAX_VALUE-1, Integer.MAX_VALUE).toString().equals(
912                         "{0, 1, " + (Integer.MAX_VALUE-1) + ", " + Integer.MAX_VALUE + "}"));
913             } catch (IndexOutOfBoundsException exc) {
914                 fail("toString() with indices near MAX_VALUE");
915             }
916         }
917     }
918 
testLogicalIdentities()919     private static void testLogicalIdentities() {
920         int failCount = 0;
921 
922         // Verify that (!b1)|(!b2) == !(b1&b2)
923         for (int i=0; i<50; i++) {
924             // Construct two fairly random bitsets
925             BitSet b1 = new BitSet();
926             BitSet b2 = new BitSet();
927 
928             int numberOfSetBits = generator.nextInt(100) + 1;
929             int highestPossibleSetBit = generator.nextInt(1000) + 1;
930 
931             for (int x=0; x<numberOfSetBits; x++) {
932                 b1.set(generator.nextInt(highestPossibleSetBit));
933                 b2.set(generator.nextInt(highestPossibleSetBit));
934             }
935 
936             BitSet b3 = (BitSet) b1.clone();
937             BitSet b4 = (BitSet) b2.clone();
938 
939             for (int x=0; x<highestPossibleSetBit; x++) {
940                 b1.flip(x);
941                 b2.flip(x);
942             }
943             b1.or(b2);
944             b3.and(b4);
945             for (int x=0; x<highestPossibleSetBit; x++)
946                 b3.flip(x);
947             if (!b1.equals(b3))
948                 failCount++;
949             checkSanity(b1, b2, b3, b4);
950         }
951 
952         // Verify that (b1&(!b2)|(b2&(!b1) == b1^b2
953         for (int i=0; i<50; i++) {
954             // Construct two fairly random bitsets
955             BitSet b1 = new BitSet();
956             BitSet b2 = new BitSet();
957 
958             int numberOfSetBits = generator.nextInt(100) + 1;
959             int highestPossibleSetBit = generator.nextInt(1000) + 1;
960 
961             for (int x=0; x<numberOfSetBits; x++) {
962                 b1.set(generator.nextInt(highestPossibleSetBit));
963                 b2.set(generator.nextInt(highestPossibleSetBit));
964             }
965 
966             BitSet b3 = (BitSet) b1.clone();
967             BitSet b4 = (BitSet) b2.clone();
968             BitSet b5 = (BitSet) b1.clone();
969             BitSet b6 = (BitSet) b2.clone();
970 
971             for (int x=0; x<highestPossibleSetBit; x++)
972                 b2.flip(x);
973             b1.and(b2);
974             for (int x=0; x<highestPossibleSetBit; x++)
975                 b3.flip(x);
976             b3.and(b4);
977             b1.or(b3);
978             b5.xor(b6);
979             if (!b1.equals(b5))
980                 failCount++;
981             checkSanity(b1, b2, b3, b4, b5, b6);
982         }
983         report("Logical Identities          ", failCount);
984     }
985 
986 }
987