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