ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/TreeSetTest.java
Revision: 1.38
Committed: Sat Apr 25 04:55:31 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.37: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 */
6
7 import java.util.Arrays;
8 import java.util.BitSet;
9 import java.util.Collection;
10 import java.util.Comparator;
11 import java.util.Iterator;
12 import java.util.NavigableSet;
13 import java.util.NoSuchElementException;
14 import java.util.Random;
15 import java.util.Set;
16 import java.util.SortedSet;
17 import java.util.TreeSet;
18
19 import junit.framework.Test;
20 import junit.framework.TestSuite;
21
22 public class TreeSetTest extends JSR166TestCase {
23 public static void main(String[] args) {
24 main(suite(), args);
25 }
26 public static Test suite() {
27 return new TestSuite(TreeSetTest.class);
28 }
29
30 static class MyReverseComparator implements Comparator {
31 public int compare(Object x, Object y) {
32 return ((Comparable)y).compareTo(x);
33 }
34 }
35
36 /**
37 * The number of elements to place in collections, arrays, etc.
38 */
39 static final int SIZE = 20;
40
41 /**
42 * Returns a new set of given size containing consecutive
43 * Integers 0 ... n.
44 */
45 private TreeSet<Integer> populatedSet(int n) {
46 TreeSet<Integer> q = new TreeSet<Integer>();
47 assertTrue(q.isEmpty());
48 for (int i = n-1; i >= 0; i -= 2)
49 assertTrue(q.add(new Integer(i)));
50 for (int i = (n & 1); i < n; i += 2)
51 assertTrue(q.add(new Integer(i)));
52 assertFalse(q.isEmpty());
53 assertEquals(n, q.size());
54 return q;
55 }
56
57 /**
58 * Returns a new set of first 5 ints.
59 */
60 private TreeSet set5() {
61 TreeSet q = new TreeSet();
62 assertTrue(q.isEmpty());
63 q.add(one);
64 q.add(two);
65 q.add(three);
66 q.add(four);
67 q.add(five);
68 assertEquals(5, q.size());
69 return q;
70 }
71
72 /**
73 * A new set has unbounded capacity
74 */
75 public void testConstructor1() {
76 assertEquals(0, new TreeSet().size());
77 }
78
79 /**
80 * Initializing from null Collection throws NPE
81 */
82 public void testConstructor3() {
83 try {
84 new TreeSet((Collection)null);
85 shouldThrow();
86 } catch (NullPointerException success) {}
87 }
88
89 /**
90 * Initializing from Collection of null elements throws NPE
91 */
92 public void testConstructor4() {
93 try {
94 Integer[] ints = new Integer[SIZE];
95 new TreeSet(Arrays.asList(ints));
96 shouldThrow();
97 } catch (NullPointerException success) {}
98 }
99
100 /**
101 * Initializing from Collection with some null elements throws NPE
102 */
103 public void testConstructor5() {
104 try {
105 Integer[] ints = new Integer[SIZE];
106 for (int i = 0; i < SIZE-1; ++i)
107 ints[i] = new Integer(i);
108 new TreeSet(Arrays.asList(ints));
109 shouldThrow();
110 } catch (NullPointerException success) {}
111 }
112
113 /**
114 * Set contains all elements of collection used to initialize
115 */
116 public void testConstructor6() {
117 Integer[] ints = new Integer[SIZE];
118 for (int i = 0; i < SIZE; ++i)
119 ints[i] = new Integer(i);
120 TreeSet q = new TreeSet(Arrays.asList(ints));
121 for (int i = 0; i < SIZE; ++i)
122 assertEquals(ints[i], q.pollFirst());
123 }
124
125 /**
126 * The comparator used in constructor is used
127 */
128 public void testConstructor7() {
129 MyReverseComparator cmp = new MyReverseComparator();
130 TreeSet q = new TreeSet(cmp);
131 assertEquals(cmp, q.comparator());
132 Integer[] ints = new Integer[SIZE];
133 for (int i = 0; i < SIZE; ++i)
134 ints[i] = new Integer(i);
135 q.addAll(Arrays.asList(ints));
136 for (int i = SIZE-1; i >= 0; --i)
137 assertEquals(ints[i], q.pollFirst());
138 }
139
140 /**
141 * isEmpty is true before add, false after
142 */
143 public void testEmpty() {
144 TreeSet q = new TreeSet();
145 assertTrue(q.isEmpty());
146 q.add(new Integer(1));
147 assertFalse(q.isEmpty());
148 q.add(new Integer(2));
149 q.pollFirst();
150 q.pollFirst();
151 assertTrue(q.isEmpty());
152 }
153
154 /**
155 * size changes when elements added and removed
156 */
157 public void testSize() {
158 TreeSet q = populatedSet(SIZE);
159 for (int i = 0; i < SIZE; ++i) {
160 assertEquals(SIZE-i, q.size());
161 q.pollFirst();
162 }
163 for (int i = 0; i < SIZE; ++i) {
164 assertEquals(i, q.size());
165 q.add(new Integer(i));
166 }
167 }
168
169 /**
170 * add(null) throws NPE if nonempty
171 */
172 public void testAddNull() {
173 TreeSet q = populatedSet(SIZE);
174 try {
175 q.add(null);
176 shouldThrow();
177 } catch (NullPointerException success) {}
178 }
179
180 /**
181 * Add of comparable element succeeds
182 */
183 public void testAdd() {
184 TreeSet q = new TreeSet();
185 assertTrue(q.add(zero));
186 assertTrue(q.add(one));
187 }
188
189 /**
190 * Add of duplicate element fails
191 */
192 public void testAddDup() {
193 TreeSet q = new TreeSet();
194 assertTrue(q.add(zero));
195 assertFalse(q.add(zero));
196 }
197
198 /**
199 * Add of non-Comparable throws CCE
200 */
201 public void testAddNonComparable() {
202 TreeSet q = new TreeSet();
203 try {
204 q.add(new Object());
205 q.add(new Object());
206 shouldThrow();
207 } catch (ClassCastException success) {}
208 }
209
210 /**
211 * addAll(null) throws NPE
212 */
213 public void testAddAll1() {
214 TreeSet q = new TreeSet();
215 try {
216 q.addAll(null);
217 shouldThrow();
218 } catch (NullPointerException success) {}
219 }
220
221 /**
222 * addAll of a collection with null elements throws NPE
223 */
224 public void testAddAll2() {
225 TreeSet q = new TreeSet();
226 Integer[] ints = new Integer[SIZE];
227 try {
228 q.addAll(Arrays.asList(ints));
229 shouldThrow();
230 } catch (NullPointerException success) {}
231 }
232
233 /**
234 * addAll of a collection with any null elements throws NPE after
235 * possibly adding some elements
236 */
237 public void testAddAll3() {
238 TreeSet q = new TreeSet();
239 Integer[] ints = new Integer[SIZE];
240 for (int i = 0; i < SIZE-1; ++i)
241 ints[i] = new Integer(i);
242 try {
243 q.addAll(Arrays.asList(ints));
244 shouldThrow();
245 } catch (NullPointerException success) {}
246 }
247
248 /**
249 * Set contains all elements of successful addAll
250 */
251 public void testAddAll5() {
252 Integer[] empty = new Integer[0];
253 Integer[] ints = new Integer[SIZE];
254 for (int i = 0; i < SIZE; ++i)
255 ints[i] = new Integer(SIZE-1-i);
256 TreeSet q = new TreeSet();
257 assertFalse(q.addAll(Arrays.asList(empty)));
258 assertTrue(q.addAll(Arrays.asList(ints)));
259 for (int i = 0; i < SIZE; ++i)
260 assertEquals(new Integer(i), q.pollFirst());
261 }
262
263 /**
264 * pollFirst succeeds unless empty
265 */
266 public void testPollFirst() {
267 TreeSet q = populatedSet(SIZE);
268 for (int i = 0; i < SIZE; ++i) {
269 assertEquals(i, q.pollFirst());
270 }
271 assertNull(q.pollFirst());
272 }
273
274 /**
275 * pollLast succeeds unless empty
276 */
277 public void testPollLast() {
278 TreeSet q = populatedSet(SIZE);
279 for (int i = SIZE-1; i >= 0; --i) {
280 assertEquals(i, q.pollLast());
281 }
282 assertNull(q.pollFirst());
283 }
284
285 /**
286 * remove(x) removes x and returns true if present
287 */
288 public void testRemoveElement() {
289 TreeSet q = populatedSet(SIZE);
290 for (int i = 1; i < SIZE; i += 2) {
291 assertTrue(q.contains(i));
292 assertTrue(q.remove(i));
293 assertFalse(q.contains(i));
294 assertTrue(q.contains(i-1));
295 }
296 for (int i = 0; i < SIZE; i += 2) {
297 assertTrue(q.contains(i));
298 assertTrue(q.remove(i));
299 assertFalse(q.contains(i));
300 assertFalse(q.remove(i+1));
301 assertFalse(q.contains(i+1));
302 }
303 assertTrue(q.isEmpty());
304 }
305
306 /**
307 * contains(x) reports true when elements added but not yet removed
308 */
309 public void testContains() {
310 TreeSet q = populatedSet(SIZE);
311 for (int i = 0; i < SIZE; ++i) {
312 assertTrue(q.contains(new Integer(i)));
313 q.pollFirst();
314 assertFalse(q.contains(new Integer(i)));
315 }
316 }
317
318 /**
319 * clear removes all elements
320 */
321 public void testClear() {
322 TreeSet q = populatedSet(SIZE);
323 q.clear();
324 assertTrue(q.isEmpty());
325 assertEquals(0, q.size());
326 q.add(new Integer(1));
327 assertFalse(q.isEmpty());
328 q.clear();
329 assertTrue(q.isEmpty());
330 }
331
332 /**
333 * containsAll(c) is true when c contains a subset of elements
334 */
335 public void testContainsAll() {
336 TreeSet q = populatedSet(SIZE);
337 TreeSet p = new TreeSet();
338 for (int i = 0; i < SIZE; ++i) {
339 assertTrue(q.containsAll(p));
340 assertFalse(p.containsAll(q));
341 p.add(new Integer(i));
342 }
343 assertTrue(p.containsAll(q));
344 }
345
346 /**
347 * retainAll(c) retains only those elements of c and reports true if changed
348 */
349 public void testRetainAll() {
350 TreeSet q = populatedSet(SIZE);
351 TreeSet p = populatedSet(SIZE);
352 for (int i = 0; i < SIZE; ++i) {
353 boolean changed = q.retainAll(p);
354 if (i == 0)
355 assertFalse(changed);
356 else
357 assertTrue(changed);
358
359 assertTrue(q.containsAll(p));
360 assertEquals(SIZE-i, q.size());
361 p.pollFirst();
362 }
363 }
364
365 /**
366 * removeAll(c) removes only those elements of c and reports true if changed
367 */
368 public void testRemoveAll() {
369 for (int i = 1; i < SIZE; ++i) {
370 TreeSet q = populatedSet(SIZE);
371 TreeSet p = populatedSet(i);
372 assertTrue(q.removeAll(p));
373 assertEquals(SIZE-i, q.size());
374 for (int j = 0; j < i; ++j) {
375 Integer x = (Integer)(p.pollFirst());
376 assertFalse(q.contains(x));
377 }
378 }
379 }
380
381 /**
382 * lower returns preceding element
383 */
384 public void testLower() {
385 TreeSet q = set5();
386 Object e1 = q.lower(three);
387 assertEquals(two, e1);
388
389 Object e2 = q.lower(six);
390 assertEquals(five, e2);
391
392 Object e3 = q.lower(one);
393 assertNull(e3);
394
395 Object e4 = q.lower(zero);
396 assertNull(e4);
397 }
398
399 /**
400 * higher returns next element
401 */
402 public void testHigher() {
403 TreeSet q = set5();
404 Object e1 = q.higher(three);
405 assertEquals(four, e1);
406
407 Object e2 = q.higher(zero);
408 assertEquals(one, e2);
409
410 Object e3 = q.higher(five);
411 assertNull(e3);
412
413 Object e4 = q.higher(six);
414 assertNull(e4);
415 }
416
417 /**
418 * floor returns preceding element
419 */
420 public void testFloor() {
421 TreeSet q = set5();
422 Object e1 = q.floor(three);
423 assertEquals(three, e1);
424
425 Object e2 = q.floor(six);
426 assertEquals(five, e2);
427
428 Object e3 = q.floor(one);
429 assertEquals(one, e3);
430
431 Object e4 = q.floor(zero);
432 assertNull(e4);
433 }
434
435 /**
436 * ceiling returns next element
437 */
438 public void testCeiling() {
439 TreeSet q = set5();
440 Object e1 = q.ceiling(three);
441 assertEquals(three, e1);
442
443 Object e2 = q.ceiling(zero);
444 assertEquals(one, e2);
445
446 Object e3 = q.ceiling(five);
447 assertEquals(five, e3);
448
449 Object e4 = q.ceiling(six);
450 assertNull(e4);
451 }
452
453 /**
454 * toArray contains all elements in sorted order
455 */
456 public void testToArray() {
457 TreeSet q = populatedSet(SIZE);
458 Object[] o = q.toArray();
459 for (int i = 0; i < o.length; i++)
460 assertSame(o[i], q.pollFirst());
461 }
462
463 /**
464 * toArray(a) contains all elements in sorted order
465 */
466 public void testToArray2() {
467 TreeSet<Integer> q = populatedSet(SIZE);
468 Integer[] ints = new Integer[SIZE];
469 Integer[] array = q.toArray(ints);
470 assertSame(ints, array);
471 for (int i = 0; i < ints.length; i++)
472 assertSame(ints[i], q.pollFirst());
473 }
474
475 /**
476 * iterator iterates through all elements
477 */
478 public void testIterator() {
479 TreeSet q = populatedSet(SIZE);
480 Iterator it = q.iterator();
481 int i;
482 for (i = 0; it.hasNext(); i++)
483 assertTrue(q.contains(it.next()));
484 assertEquals(i, SIZE);
485 assertIteratorExhausted(it);
486 }
487
488 /**
489 * iterator of empty set has no elements
490 */
491 public void testEmptyIterator() {
492 assertIteratorExhausted(new TreeSet().iterator());
493 }
494
495 /**
496 * iterator.remove removes current element
497 */
498 public void testIteratorRemove() {
499 final TreeSet q = new TreeSet();
500 q.add(new Integer(2));
501 q.add(new Integer(1));
502 q.add(new Integer(3));
503
504 Iterator it = q.iterator();
505 it.next();
506 it.remove();
507
508 it = q.iterator();
509 assertEquals(it.next(), new Integer(2));
510 assertEquals(it.next(), new Integer(3));
511 assertFalse(it.hasNext());
512 }
513
514 /**
515 * toString contains toStrings of elements
516 */
517 public void testToString() {
518 TreeSet q = populatedSet(SIZE);
519 String s = q.toString();
520 for (int i = 0; i < SIZE; ++i) {
521 assertTrue(s.contains(String.valueOf(i)));
522 }
523 }
524
525 /**
526 * A deserialized serialized set has same elements
527 */
528 public void testSerialization() throws Exception {
529 NavigableSet x = populatedSet(SIZE);
530 NavigableSet y = serialClone(x);
531
532 assertNotSame(x, y);
533 assertEquals(x.size(), y.size());
534 assertEquals(x, y);
535 assertEquals(y, x);
536 while (!x.isEmpty()) {
537 assertFalse(y.isEmpty());
538 assertEquals(x.pollFirst(), y.pollFirst());
539 }
540 assertTrue(y.isEmpty());
541 }
542
543 /**
544 * subSet returns set with keys in requested range
545 */
546 public void testSubSetContents() {
547 TreeSet set = set5();
548 SortedSet sm = set.subSet(two, four);
549 assertEquals(two, sm.first());
550 assertEquals(three, sm.last());
551 assertEquals(2, sm.size());
552 assertFalse(sm.contains(one));
553 assertTrue(sm.contains(two));
554 assertTrue(sm.contains(three));
555 assertFalse(sm.contains(four));
556 assertFalse(sm.contains(five));
557 Iterator i = sm.iterator();
558 Object k;
559 k = (Integer)(i.next());
560 assertEquals(two, k);
561 k = (Integer)(i.next());
562 assertEquals(three, k);
563 assertFalse(i.hasNext());
564 Iterator j = sm.iterator();
565 j.next();
566 j.remove();
567 assertFalse(set.contains(two));
568 assertEquals(4, set.size());
569 assertEquals(1, sm.size());
570 assertEquals(three, sm.first());
571 assertEquals(three, sm.last());
572 assertTrue(sm.remove(three));
573 assertTrue(sm.isEmpty());
574 assertEquals(3, set.size());
575 }
576
577 public void testSubSetContents2() {
578 TreeSet set = set5();
579 SortedSet sm = set.subSet(two, three);
580 assertEquals(1, sm.size());
581 assertEquals(two, sm.first());
582 assertEquals(two, sm.last());
583 assertFalse(sm.contains(one));
584 assertTrue(sm.contains(two));
585 assertFalse(sm.contains(three));
586 assertFalse(sm.contains(four));
587 assertFalse(sm.contains(five));
588 Iterator i = sm.iterator();
589 Object k;
590 k = (Integer)(i.next());
591 assertEquals(two, k);
592 assertFalse(i.hasNext());
593 Iterator j = sm.iterator();
594 j.next();
595 j.remove();
596 assertFalse(set.contains(two));
597 assertEquals(4, set.size());
598 assertEquals(0, sm.size());
599 assertTrue(sm.isEmpty());
600 assertFalse(sm.remove(three));
601 assertEquals(4, set.size());
602 }
603
604 /**
605 * headSet returns set with keys in requested range
606 */
607 public void testHeadSetContents() {
608 TreeSet set = set5();
609 SortedSet sm = set.headSet(four);
610 assertTrue(sm.contains(one));
611 assertTrue(sm.contains(two));
612 assertTrue(sm.contains(three));
613 assertFalse(sm.contains(four));
614 assertFalse(sm.contains(five));
615 Iterator i = sm.iterator();
616 Object k;
617 k = (Integer)(i.next());
618 assertEquals(one, k);
619 k = (Integer)(i.next());
620 assertEquals(two, k);
621 k = (Integer)(i.next());
622 assertEquals(three, k);
623 assertFalse(i.hasNext());
624 sm.clear();
625 assertTrue(sm.isEmpty());
626 assertEquals(2, set.size());
627 assertEquals(four, set.first());
628 }
629
630 /**
631 * tailSet returns set with keys in requested range
632 */
633 public void testTailSetContents() {
634 TreeSet set = set5();
635 SortedSet sm = set.tailSet(two);
636 assertFalse(sm.contains(one));
637 assertTrue(sm.contains(two));
638 assertTrue(sm.contains(three));
639 assertTrue(sm.contains(four));
640 assertTrue(sm.contains(five));
641 Iterator i = sm.iterator();
642 Object k;
643 k = (Integer)(i.next());
644 assertEquals(two, k);
645 k = (Integer)(i.next());
646 assertEquals(three, k);
647 k = (Integer)(i.next());
648 assertEquals(four, k);
649 k = (Integer)(i.next());
650 assertEquals(five, k);
651 assertFalse(i.hasNext());
652
653 SortedSet ssm = sm.tailSet(four);
654 assertEquals(four, ssm.first());
655 assertEquals(five, ssm.last());
656 assertTrue(ssm.remove(four));
657 assertEquals(1, ssm.size());
658 assertEquals(3, sm.size());
659 assertEquals(4, set.size());
660 }
661
662 Random rnd = new Random(666);
663 BitSet bs;
664
665 /**
666 * Subsets of subsets subdivide correctly
667 */
668 public void testRecursiveSubSets() throws Exception {
669 int setSize = expensiveTests ? 1000 : 100;
670 Class cl = TreeSet.class;
671
672 NavigableSet<Integer> set = newSet(cl);
673 bs = new BitSet(setSize);
674
675 populate(set, setSize);
676 check(set, 0, setSize - 1, true);
677 check(set.descendingSet(), 0, setSize - 1, false);
678
679 mutateSet(set, 0, setSize - 1);
680 check(set, 0, setSize - 1, true);
681 check(set.descendingSet(), 0, setSize - 1, false);
682
683 bashSubSet(set.subSet(0, true, setSize, false),
684 0, setSize - 1, true);
685 }
686
687 /**
688 * addAll is idempotent
689 */
690 public void testAddAll_idempotent() throws Exception {
691 Set x = populatedSet(SIZE);
692 Set y = new TreeSet(x);
693 y.addAll(x);
694 assertEquals(x, y);
695 assertEquals(y, x);
696 }
697
698 static NavigableSet<Integer> newSet(Class cl) throws Exception {
699 NavigableSet<Integer> result = (NavigableSet<Integer>) cl.newInstance();
700 assertEquals(0, result.size());
701 assertFalse(result.iterator().hasNext());
702 return result;
703 }
704
705 void populate(NavigableSet<Integer> set, int limit) {
706 for (int i = 0, n = 2 * limit / 3; i < n; i++) {
707 int element = rnd.nextInt(limit);
708 put(set, element);
709 }
710 }
711
712 void mutateSet(NavigableSet<Integer> set, int min, int max) {
713 int size = set.size();
714 int rangeSize = max - min + 1;
715
716 // Remove a bunch of entries directly
717 for (int i = 0, n = rangeSize / 2; i < n; i++) {
718 remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
719 }
720
721 // Remove a bunch of entries with iterator
722 for (Iterator<Integer> it = set.iterator(); it.hasNext(); ) {
723 if (rnd.nextBoolean()) {
724 bs.clear(it.next());
725 it.remove();
726 }
727 }
728
729 // Add entries till we're back to original size
730 while (set.size() < size) {
731 int element = min + rnd.nextInt(rangeSize);
732 assertTrue(element >= min && element <= max);
733 put(set, element);
734 }
735 }
736
737 void mutateSubSet(NavigableSet<Integer> set, int min, int max) {
738 int size = set.size();
739 int rangeSize = max - min + 1;
740
741 // Remove a bunch of entries directly
742 for (int i = 0, n = rangeSize / 2; i < n; i++) {
743 remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
744 }
745
746 // Remove a bunch of entries with iterator
747 for (Iterator<Integer> it = set.iterator(); it.hasNext(); ) {
748 if (rnd.nextBoolean()) {
749 bs.clear(it.next());
750 it.remove();
751 }
752 }
753
754 // Add entries till we're back to original size
755 while (set.size() < size) {
756 int element = min - 5 + rnd.nextInt(rangeSize + 10);
757 if (element >= min && element <= max) {
758 put(set, element);
759 } else {
760 try {
761 set.add(element);
762 shouldThrow();
763 } catch (IllegalArgumentException success) {}
764 }
765 }
766 }
767
768 void put(NavigableSet<Integer> set, int element) {
769 if (set.add(element))
770 bs.set(element);
771 }
772
773 void remove(NavigableSet<Integer> set, int element) {
774 if (set.remove(element))
775 bs.clear(element);
776 }
777
778 void bashSubSet(NavigableSet<Integer> set,
779 int min, int max, boolean ascending) {
780 check(set, min, max, ascending);
781 check(set.descendingSet(), min, max, !ascending);
782
783 mutateSubSet(set, min, max);
784 check(set, min, max, ascending);
785 check(set.descendingSet(), min, max, !ascending);
786
787 // Recurse
788 if (max - min < 2)
789 return;
790 int midPoint = (min + max) / 2;
791
792 // headSet - pick direction and endpoint inclusion randomly
793 boolean incl = rnd.nextBoolean();
794 NavigableSet<Integer> hm = set.headSet(midPoint, incl);
795 if (ascending) {
796 if (rnd.nextBoolean())
797 bashSubSet(hm, min, midPoint - (incl ? 0 : 1), true);
798 else
799 bashSubSet(hm.descendingSet(), min, midPoint - (incl ? 0 : 1),
800 false);
801 } else {
802 if (rnd.nextBoolean())
803 bashSubSet(hm, midPoint + (incl ? 0 : 1), max, false);
804 else
805 bashSubSet(hm.descendingSet(), midPoint + (incl ? 0 : 1), max,
806 true);
807 }
808
809 // tailSet - pick direction and endpoint inclusion randomly
810 incl = rnd.nextBoolean();
811 NavigableSet<Integer> tm = set.tailSet(midPoint,incl);
812 if (ascending) {
813 if (rnd.nextBoolean())
814 bashSubSet(tm, midPoint + (incl ? 0 : 1), max, true);
815 else
816 bashSubSet(tm.descendingSet(), midPoint + (incl ? 0 : 1), max,
817 false);
818 } else {
819 if (rnd.nextBoolean()) {
820 bashSubSet(tm, min, midPoint - (incl ? 0 : 1), false);
821 } else {
822 bashSubSet(tm.descendingSet(), min, midPoint - (incl ? 0 : 1),
823 true);
824 }
825 }
826
827 // subSet - pick direction and endpoint inclusion randomly
828 int rangeSize = max - min + 1;
829 int[] endpoints = new int[2];
830 endpoints[0] = min + rnd.nextInt(rangeSize);
831 endpoints[1] = min + rnd.nextInt(rangeSize);
832 Arrays.sort(endpoints);
833 boolean lowIncl = rnd.nextBoolean();
834 boolean highIncl = rnd.nextBoolean();
835 if (ascending) {
836 NavigableSet<Integer> sm = set.subSet(
837 endpoints[0], lowIncl, endpoints[1], highIncl);
838 if (rnd.nextBoolean())
839 bashSubSet(sm, endpoints[0] + (lowIncl ? 0 : 1),
840 endpoints[1] - (highIncl ? 0 : 1), true);
841 else
842 bashSubSet(sm.descendingSet(), endpoints[0] + (lowIncl ? 0 : 1),
843 endpoints[1] - (highIncl ? 0 : 1), false);
844 } else {
845 NavigableSet<Integer> sm = set.subSet(
846 endpoints[1], highIncl, endpoints[0], lowIncl);
847 if (rnd.nextBoolean())
848 bashSubSet(sm, endpoints[0] + (lowIncl ? 0 : 1),
849 endpoints[1] - (highIncl ? 0 : 1), false);
850 else
851 bashSubSet(sm.descendingSet(), endpoints[0] + (lowIncl ? 0 : 1),
852 endpoints[1] - (highIncl ? 0 : 1), true);
853 }
854 }
855
856 /**
857 * min and max are both inclusive. If max < min, interval is empty.
858 */
859 void check(NavigableSet<Integer> set,
860 final int min, final int max, final boolean ascending) {
861 class ReferenceSet {
862 int lower(int element) {
863 return ascending ?
864 lowerAscending(element) : higherAscending(element);
865 }
866 int floor(int element) {
867 return ascending ?
868 floorAscending(element) : ceilingAscending(element);
869 }
870 int ceiling(int element) {
871 return ascending ?
872 ceilingAscending(element) : floorAscending(element);
873 }
874 int higher(int element) {
875 return ascending ?
876 higherAscending(element) : lowerAscending(element);
877 }
878 int first() {
879 return ascending ? firstAscending() : lastAscending();
880 }
881 int last() {
882 return ascending ? lastAscending() : firstAscending();
883 }
884 int lowerAscending(int element) {
885 return floorAscending(element - 1);
886 }
887 int floorAscending(int element) {
888 if (element < min)
889 return -1;
890 else if (element > max)
891 element = max;
892
893 // BitSet should support this! Test would run much faster
894 while (element >= min) {
895 if (bs.get(element))
896 return element;
897 element--;
898 }
899 return -1;
900 }
901 int ceilingAscending(int element) {
902 if (element < min)
903 element = min;
904 else if (element > max)
905 return -1;
906 int result = bs.nextSetBit(element);
907 return result > max ? -1 : result;
908 }
909 int higherAscending(int element) {
910 return ceilingAscending(element + 1);
911 }
912 private int firstAscending() {
913 int result = ceilingAscending(min);
914 return result > max ? -1 : result;
915 }
916 private int lastAscending() {
917 int result = floorAscending(max);
918 return result < min ? -1 : result;
919 }
920 }
921 ReferenceSet rs = new ReferenceSet();
922
923 // Test contents using containsElement
924 int size = 0;
925 for (int i = min; i <= max; i++) {
926 boolean bsContainsI = bs.get(i);
927 assertEquals(bsContainsI, set.contains(i));
928 if (bsContainsI)
929 size++;
930 }
931 assertEquals(size, set.size());
932
933 // Test contents using contains elementSet iterator
934 int size2 = 0;
935 int previousElement = -1;
936 for (int element : set) {
937 assertTrue(bs.get(element));
938 size2++;
939 assertTrue(previousElement < 0 || (ascending ?
940 element - previousElement > 0 : element - previousElement < 0));
941 previousElement = element;
942 }
943 assertEquals(size2, size);
944
945 // Test navigation ops
946 for (int element = min - 1; element <= max + 1; element++) {
947 assertEq(set.lower(element), rs.lower(element));
948 assertEq(set.floor(element), rs.floor(element));
949 assertEq(set.higher(element), rs.higher(element));
950 assertEq(set.ceiling(element), rs.ceiling(element));
951 }
952
953 // Test extrema
954 if (set.size() != 0) {
955 assertEq(set.first(), rs.first());
956 assertEq(set.last(), rs.last());
957 } else {
958 assertEq(rs.first(), -1);
959 assertEq(rs.last(), -1);
960 try {
961 set.first();
962 shouldThrow();
963 } catch (NoSuchElementException success) {}
964 try {
965 set.last();
966 shouldThrow();
967 } catch (NoSuchElementException success) {}
968 }
969 }
970
971 static void assertEq(Integer i, int j) {
972 if (i == null)
973 assertEquals(j, -1);
974 else
975 assertEquals((int) i, j);
976 }
977
978 static boolean eq(Integer i, int j) {
979 return i == null ? j == -1 : i == j;
980 }
981
982 }