ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/TreeSetTest.java
Revision: 1.34
Committed: Sat Jan 17 22:55:06 2015 UTC (9 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.33: +4 -12 lines
Log Message:
add more tests of exhausted iterators

File Contents

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