ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentSkipListSubSetTest.java
Revision: 1.41
Committed: Wed Jan 27 01:57:24 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.40: +6 -6 lines
Log Message:
use diamond <> pervasively

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.18 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.1 */
6    
7 jsr166 1.20 import java.util.Arrays;
8     import java.util.Comparator;
9     import java.util.Iterator;
10     import java.util.NavigableSet;
11     import java.util.SortedSet;
12     import java.util.concurrent.ConcurrentSkipListSet;
13 dl 1.1
14 jsr166 1.26 import junit.framework.Test;
15     import junit.framework.TestSuite;
16    
17 dl 1.1 public class ConcurrentSkipListSubSetTest extends JSR166TestCase {
18     public static void main(String[] args) {
19 jsr166 1.32 main(suite(), args);
20 dl 1.1 }
21     public static Test suite() {
22 jsr166 1.8 return new TestSuite(ConcurrentSkipListSubSetTest.class);
23 dl 1.1 }
24    
25 jsr166 1.5 static class MyReverseComparator implements Comparator {
26 dl 1.40 @SuppressWarnings("unchecked")
27 dl 1.1 public int compare(Object x, Object y) {
28 jsr166 1.11 return ((Comparable)y).compareTo(x);
29 dl 1.1 }
30     }
31    
32     /**
33 jsr166 1.23 * Returns a new set of given size containing consecutive
34 dl 1.40 * Items 0 ... n - 1.
35 dl 1.1 */
36 dl 1.40 private static NavigableSet<Item> populatedSet(int n) {
37     ConcurrentSkipListSet<Item> q = new ConcurrentSkipListSet<>();
38 dl 1.1 assertTrue(q.isEmpty());
39    
40 jsr166 1.34 for (int i = n - 1; i >= 0; i -= 2)
41 dl 1.40 mustAdd(q, i);
42 jsr166 1.27 for (int i = (n & 1); i < n; i += 2)
43 dl 1.40 mustAdd(q, i);
44     mustAdd(q, -n);
45     mustAdd(q, n);
46     NavigableSet<Item> s = q.subSet(itemFor(0), true, itemFor(n), false);
47 dl 1.1 assertFalse(s.isEmpty());
48 dl 1.40 mustEqual(n, s.size());
49 dl 1.1 return s;
50     }
51    
52     /**
53 jsr166 1.23 * Returns a new set of first 5 ints.
54 dl 1.1 */
55 dl 1.40 private static NavigableSet<Item> set5() {
56 jsr166 1.41 ConcurrentSkipListSet<Item> q = new ConcurrentSkipListSet<>();
57 dl 1.1 assertTrue(q.isEmpty());
58     q.add(one);
59     q.add(two);
60     q.add(three);
61     q.add(four);
62     q.add(five);
63     q.add(zero);
64     q.add(seven);
65 dl 1.40 NavigableSet<Item> s = q.subSet(one, true, seven, false);
66     mustEqual(5, s.size());
67 dl 1.4 return s;
68     }
69    
70     /**
71 jsr166 1.23 * Returns a new set of first 5 negative ints.
72 dl 1.4 */
73 dl 1.40 private static NavigableSet<Item> dset5() {
74 jsr166 1.41 ConcurrentSkipListSet<Item> q = new ConcurrentSkipListSet<>();
75 dl 1.4 assertTrue(q.isEmpty());
76 dl 1.40 q.add(minusOne);
77     q.add(minusTwo);
78     q.add(minusThree);
79     q.add(minusFour);
80     q.add(minusFive);
81     NavigableSet<Item> s = q.descendingSet();
82     mustEqual(5, s.size());
83 dl 1.1 return s;
84     }
85    
86 dl 1.40 private static NavigableSet<Item> set0() {
87 jsr166 1.41 ConcurrentSkipListSet<Item> set = new ConcurrentSkipListSet<>();
88 dl 1.1 assertTrue(set.isEmpty());
89 dl 1.40 return set.tailSet(minusOne, true);
90 dl 1.4 }
91    
92 dl 1.40 private static NavigableSet<Item> dset0() {
93 jsr166 1.41 ConcurrentSkipListSet<Item> set = new ConcurrentSkipListSet<>();
94 dl 1.4 assertTrue(set.isEmpty());
95     return set;
96 dl 1.1 }
97 jsr166 1.5
98 dl 1.1 /**
99     * A new set has unbounded capacity
100     */
101     public void testConstructor1() {
102 dl 1.40 mustEqual(0, set0().size());
103 dl 1.1 }
104    
105     /**
106     * isEmpty is true before add, false after
107     */
108     public void testEmpty() {
109 dl 1.40 NavigableSet<Item> q = set0();
110 dl 1.1 assertTrue(q.isEmpty());
111 dl 1.40 mustAdd(q, one);
112 dl 1.1 assertFalse(q.isEmpty());
113 dl 1.40 mustAdd(q, two);
114 dl 1.1 q.pollFirst();
115     q.pollFirst();
116     assertTrue(q.isEmpty());
117     }
118    
119     /**
120     * size changes when elements added and removed
121     */
122     public void testSize() {
123 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
124 dl 1.1 for (int i = 0; i < SIZE; ++i) {
125 dl 1.40 mustEqual(SIZE - i, q.size());
126 dl 1.1 q.pollFirst();
127     }
128     for (int i = 0; i < SIZE; ++i) {
129 dl 1.40 mustEqual(i, q.size());
130     mustAdd(q, i);
131 dl 1.1 }
132     }
133    
134     /**
135     * add(null) throws NPE
136     */
137     public void testAddNull() {
138 dl 1.40 NavigableSet<Item> q = set0();
139 jsr166 1.8 try {
140 dl 1.1 q.add(null);
141     shouldThrow();
142 jsr166 1.9 } catch (NullPointerException success) {}
143 dl 1.1 }
144    
145     /**
146     * Add of comparable element succeeds
147     */
148     public void testAdd() {
149 dl 1.40 NavigableSet<Item> q = set0();
150 dl 1.1 assertTrue(q.add(six));
151     }
152    
153     /**
154     * Add of duplicate element fails
155     */
156     public void testAddDup() {
157 dl 1.40 NavigableSet<Item> q = set0();
158 dl 1.1 assertTrue(q.add(six));
159     assertFalse(q.add(six));
160     }
161    
162     /**
163     * Add of non-Comparable throws CCE
164     */
165     public void testAddNonComparable() {
166 jsr166 1.41 ConcurrentSkipListSet<Object> src = new ConcurrentSkipListSet<>();
167 dl 1.40 NavigableSet<Object> q = src.tailSet(minusOne, true);
168 dl 1.1 try {
169     q.add(new Object());
170     q.add(new Object());
171     shouldThrow();
172 jsr166 1.9 } catch (ClassCastException success) {}
173 dl 1.1 }
174    
175     /**
176     * addAll(null) throws NPE
177     */
178     public void testAddAll1() {
179 dl 1.40 NavigableSet<Item> q = set0();
180 dl 1.1 try {
181     q.addAll(null);
182     shouldThrow();
183 jsr166 1.9 } catch (NullPointerException success) {}
184 dl 1.1 }
185 jsr166 1.14
186 dl 1.1 /**
187     * addAll of a collection with null elements throws NPE
188     */
189     public void testAddAll2() {
190 dl 1.40 NavigableSet<Item> q = set0();
191     Item[] items = new Item[SIZE];
192 dl 1.1 try {
193 dl 1.40 q.addAll(Arrays.asList(items));
194 dl 1.1 shouldThrow();
195 jsr166 1.9 } catch (NullPointerException success) {}
196 dl 1.1 }
197 jsr166 1.14
198 dl 1.1 /**
199     * addAll of a collection with any null elements throws NPE after
200     * possibly adding some elements
201     */
202     public void testAddAll3() {
203 dl 1.40 NavigableSet<Item> q = set0();
204     Item[] items = new Item[2]; items[0] = zero;
205 dl 1.1 try {
206 dl 1.40 q.addAll(Arrays.asList(items));
207 dl 1.1 shouldThrow();
208 jsr166 1.9 } catch (NullPointerException success) {}
209 dl 1.1 }
210    
211     /**
212     * Set contains all elements of successful addAll
213     */
214     public void testAddAll5() {
215 dl 1.40 Item[] empty = new Item[0];
216     Item[] items = new Item[SIZE];
217 jsr166 1.10 for (int i = 0; i < SIZE; ++i)
218 dl 1.40 items[i] = itemFor(SIZE - 1 - i);
219     NavigableSet<Item> q = set0();
220 jsr166 1.10 assertFalse(q.addAll(Arrays.asList(empty)));
221 dl 1.40 assertTrue(q.addAll(Arrays.asList(items)));
222 jsr166 1.10 for (int i = 0; i < SIZE; ++i)
223 dl 1.40 mustEqual(i, q.pollFirst());
224 dl 1.1 }
225    
226     /**
227     * poll succeeds unless empty
228     */
229     public void testPoll() {
230 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
231 dl 1.1 for (int i = 0; i < SIZE; ++i) {
232 dl 1.40 mustEqual(i, q.pollFirst());
233 dl 1.1 }
234 jsr166 1.8 assertNull(q.pollFirst());
235 dl 1.1 }
236    
237     /**
238     * remove(x) removes x and returns true if present
239     */
240     public void testRemoveElement() {
241 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
242 jsr166 1.27 for (int i = 1; i < SIZE; i += 2) {
243 dl 1.40 mustContain(q, i);
244     mustRemove(q, i);
245     mustNotContain(q, i);
246     mustContain(q, i - 1);
247 dl 1.1 }
248 jsr166 1.27 for (int i = 0; i < SIZE; i += 2) {
249 dl 1.40 mustContain(q, i);
250     mustRemove(q, i);
251     mustNotContain(q, i);
252     mustNotRemove(q, i + 1);
253     mustNotContain(q, i + 1);
254 dl 1.1 }
255     assertTrue(q.isEmpty());
256     }
257 jsr166 1.5
258 dl 1.1 /**
259     * contains(x) reports true when elements added but not yet removed
260     */
261     public void testContains() {
262 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
263 dl 1.1 for (int i = 0; i < SIZE; ++i) {
264 dl 1.40 mustContain(q, i);
265 dl 1.1 q.pollFirst();
266 dl 1.40 mustNotContain(q, i);
267 dl 1.1 }
268     }
269    
270     /**
271     * clear removes all elements
272     */
273     public void testClear() {
274 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
275 dl 1.1 q.clear();
276     assertTrue(q.isEmpty());
277 dl 1.40 mustEqual(0, q.size());
278     mustAdd(q, one);
279 dl 1.1 assertFalse(q.isEmpty());
280     q.clear();
281     assertTrue(q.isEmpty());
282     }
283    
284     /**
285     * containsAll(c) is true when c contains a subset of elements
286     */
287     public void testContainsAll() {
288 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
289     NavigableSet<Item> p = set0();
290 dl 1.1 for (int i = 0; i < SIZE; ++i) {
291     assertTrue(q.containsAll(p));
292     assertFalse(p.containsAll(q));
293 dl 1.40 mustAdd(p, i);
294 dl 1.1 }
295     assertTrue(p.containsAll(q));
296     }
297    
298     /**
299     * retainAll(c) retains only those elements of c and reports true if changed
300     */
301     public void testRetainAll() {
302 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
303     NavigableSet<Item> p = populatedSet(SIZE);
304 dl 1.1 for (int i = 0; i < SIZE; ++i) {
305     boolean changed = q.retainAll(p);
306     if (i == 0)
307     assertFalse(changed);
308     else
309     assertTrue(changed);
310    
311     assertTrue(q.containsAll(p));
312 dl 1.40 mustEqual(SIZE - i, q.size());
313 dl 1.1 p.pollFirst();
314     }
315     }
316    
317     /**
318     * removeAll(c) removes only those elements of c and reports true if changed
319     */
320     public void testRemoveAll() {
321     for (int i = 1; i < SIZE; ++i) {
322 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
323     NavigableSet<Item> p = populatedSet(i);
324 dl 1.1 assertTrue(q.removeAll(p));
325 dl 1.40 mustEqual(SIZE - i, q.size());
326 dl 1.1 for (int j = 0; j < i; ++j) {
327 dl 1.40 mustNotContain(q, p.pollFirst());
328 dl 1.1 }
329     }
330     }
331    
332     /**
333     * lower returns preceding element
334     */
335     public void testLower() {
336 dl 1.40 NavigableSet<Item> q = set5();
337 dl 1.1 Object e1 = q.lower(three);
338 dl 1.40 mustEqual(two, e1);
339 dl 1.1
340     Object e2 = q.lower(six);
341 dl 1.40 mustEqual(five, e2);
342 dl 1.1
343     Object e3 = q.lower(one);
344     assertNull(e3);
345    
346     Object e4 = q.lower(zero);
347     assertNull(e4);
348     }
349    
350     /**
351     * higher returns next element
352     */
353     public void testHigher() {
354 dl 1.40 NavigableSet<Item> q = set5();
355 dl 1.1 Object e1 = q.higher(three);
356 dl 1.40 mustEqual(four, e1);
357 dl 1.1
358     Object e2 = q.higher(zero);
359 dl 1.40 mustEqual(one, e2);
360 dl 1.1
361     Object e3 = q.higher(five);
362     assertNull(e3);
363    
364     Object e4 = q.higher(six);
365     assertNull(e4);
366     }
367    
368     /**
369     * floor returns preceding element
370     */
371     public void testFloor() {
372 dl 1.40 NavigableSet<Item> q = set5();
373 dl 1.1 Object e1 = q.floor(three);
374 dl 1.40 mustEqual(three, e1);
375 dl 1.1
376     Object e2 = q.floor(six);
377 dl 1.40 mustEqual(five, e2);
378 dl 1.1
379     Object e3 = q.floor(one);
380 dl 1.40 mustEqual(one, e3);
381 dl 1.1
382     Object e4 = q.floor(zero);
383     assertNull(e4);
384     }
385    
386     /**
387     * ceiling returns next element
388     */
389     public void testCeiling() {
390 dl 1.40 NavigableSet<Item> q = set5();
391 dl 1.1 Object e1 = q.ceiling(three);
392 dl 1.40 mustEqual(three, e1);
393 dl 1.1
394     Object e2 = q.ceiling(zero);
395 dl 1.40 mustEqual(one, e2);
396 dl 1.1
397     Object e3 = q.ceiling(five);
398 dl 1.40 mustEqual(five, e3);
399 dl 1.1
400     Object e4 = q.ceiling(six);
401     assertNull(e4);
402     }
403    
404     /**
405 jsr166 1.15 * toArray contains all elements in sorted order
406 dl 1.1 */
407     public void testToArray() {
408 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
409 jsr166 1.39 Object[] a = q.toArray();
410     assertSame(Object[].class, a.getClass());
411     for (Object o : a)
412     assertSame(o, q.pollFirst());
413     assertTrue(q.isEmpty());
414 dl 1.1 }
415    
416     /**
417 jsr166 1.15 * toArray(a) contains all elements in sorted order
418 dl 1.1 */
419     public void testToArray2() {
420 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
421     Item[] items = new Item[SIZE];
422     Item[] array = q.toArray(items);
423     assertSame(items, array);
424     for (Item o : items)
425 jsr166 1.39 assertSame(o, q.pollFirst());
426     assertTrue(q.isEmpty());
427 dl 1.1 }
428 jsr166 1.5
429 dl 1.1 /**
430     * iterator iterates through all elements
431     */
432     public void testIterator() {
433 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
434     Iterator<? extends Item> it = q.iterator();
435 jsr166 1.29 int i;
436     for (i = 0; it.hasNext(); i++)
437 dl 1.1 assertTrue(q.contains(it.next()));
438 dl 1.40 mustEqual(i, SIZE);
439 jsr166 1.29 assertIteratorExhausted(it);
440 dl 1.1 }
441    
442     /**
443     * iterator of empty set has no elements
444     */
445     public void testEmptyIterator() {
446 jsr166 1.29 assertIteratorExhausted(set0().iterator());
447 dl 1.1 }
448    
449     /**
450     * iterator.remove removes current element
451     */
452 jsr166 1.13 public void testIteratorRemove() {
453 dl 1.40 final NavigableSet<Item> q = set0();
454     mustAdd(q, two);
455     mustAdd(q, one);
456     mustAdd(q, three);
457     Iterator<? extends Item> it = q.iterator();
458 dl 1.1 it.next();
459     it.remove();
460    
461     it = q.iterator();
462 dl 1.40 mustEqual(it.next(), two);
463     mustEqual(it.next(), three);
464 dl 1.1 assertFalse(it.hasNext());
465     }
466    
467     /**
468     * toString contains toStrings of elements
469     */
470     public void testToString() {
471 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
472 dl 1.1 String s = q.toString();
473     for (int i = 0; i < SIZE; ++i) {
474 jsr166 1.19 assertTrue(s.contains(String.valueOf(i)));
475 dl 1.1 }
476 jsr166 1.5 }
477 dl 1.1
478     /**
479 jsr166 1.37 * A deserialized/reserialized set equals original
480 dl 1.1 */
481 jsr166 1.9 public void testSerialization() throws Exception {
482 dl 1.40 NavigableSet<Item> x = populatedSet(SIZE);
483     NavigableSet<Item> y = serialClone(x);
484 jsr166 1.20
485 jsr166 1.24 assertNotSame(y, x);
486 dl 1.40 mustEqual(x.size(), y.size());
487     mustEqual(x, y);
488     mustEqual(y, x);
489 jsr166 1.20 while (!x.isEmpty()) {
490     assertFalse(y.isEmpty());
491 dl 1.40 mustEqual(x.pollFirst(), y.pollFirst());
492 jsr166 1.20 }
493     assertTrue(y.isEmpty());
494 dl 1.1 }
495    
496     /**
497     * subSet returns set with keys in requested range
498     */
499     public void testSubSetContents() {
500 dl 1.40 NavigableSet<Item> set = set5();
501     SortedSet<Item> sm = set.subSet(two, four);
502     mustEqual(two, sm.first());
503     mustEqual(three, sm.last());
504     mustEqual(2, sm.size());
505     mustNotContain(sm, one);
506     mustContain(sm, two);
507     mustContain(sm, three);
508     mustNotContain(sm, four);
509     mustNotContain(sm, five);
510     Iterator<? extends Item> i = sm.iterator();
511     Item k = i.next();
512     mustEqual(two, k);
513     k = i.next();
514     mustEqual(three, k);
515 dl 1.1 assertFalse(i.hasNext());
516 dl 1.40 Iterator<? extends Item> j = sm.iterator();
517 dl 1.1 j.next();
518     j.remove();
519 dl 1.40 mustNotContain(set, two);
520     mustEqual(4, set.size());
521     mustEqual(1, sm.size());
522     mustEqual(three, sm.first());
523     mustEqual(three, sm.last());
524     mustRemove(sm, three);
525 dl 1.1 assertTrue(sm.isEmpty());
526 dl 1.40 mustEqual(3, set.size());
527 dl 1.1 }
528    
529     public void testSubSetContents2() {
530 dl 1.40 NavigableSet<Item> set = set5();
531     SortedSet<Item> sm = set.subSet(two, three);
532     mustEqual(1, sm.size());
533     mustEqual(two, sm.first());
534     mustEqual(two, sm.last());
535     mustNotContain(sm, one);
536     mustContain(sm, two);
537     mustNotContain(sm, three);
538     mustNotContain(sm, four);
539     mustNotContain(sm, five);
540     Iterator<? extends Item> i = sm.iterator();
541     Item k = i.next();
542     mustEqual(two, k);
543 dl 1.1 assertFalse(i.hasNext());
544 dl 1.40 Iterator<? extends Item> j = sm.iterator();
545 dl 1.1 j.next();
546     j.remove();
547 dl 1.40 mustNotContain(set, two);
548     mustEqual(4, set.size());
549     mustEqual(0, sm.size());
550 dl 1.1 assertTrue(sm.isEmpty());
551     assertFalse(sm.remove(three));
552 dl 1.40 mustEqual(4, set.size());
553 dl 1.1 }
554    
555     /**
556     * headSet returns set with keys in requested range
557     */
558     public void testHeadSetContents() {
559 dl 1.40 NavigableSet<Item> set = set5();
560     SortedSet<Item> sm = set.headSet(four);
561     mustContain(sm, one);
562     mustContain(sm, two);
563     mustContain(sm, three);
564     mustNotContain(sm, four);
565     mustNotContain(sm, five);
566     Iterator<? extends Item> i = sm.iterator();
567     Item k = i.next();
568     mustEqual(one, k);
569     k = i.next();
570     mustEqual(two, k);
571     k = i.next();
572     mustEqual(three, k);
573 dl 1.1 assertFalse(i.hasNext());
574     sm.clear();
575     assertTrue(sm.isEmpty());
576 dl 1.40 mustEqual(2, set.size());
577     mustEqual(four, set.first());
578 dl 1.1 }
579    
580     /**
581     * tailSet returns set with keys in requested range
582     */
583     public void testTailSetContents() {
584 dl 1.40 NavigableSet<Item> set = set5();
585     SortedSet<Item> sm = set.tailSet(two);
586     mustNotContain(sm, one);
587     mustContain(sm, two);
588     mustContain(sm, three);
589     mustContain(sm, four);
590     mustContain(sm, five);
591 dl 1.1 assertFalse(sm.contains(one));
592     assertTrue(sm.contains(two));
593     assertTrue(sm.contains(three));
594     assertTrue(sm.contains(four));
595     assertTrue(sm.contains(five));
596 dl 1.40 Iterator<? extends Item> i = sm.iterator();
597     Item k = i.next();
598     mustEqual(two, k);
599     k = i.next();
600     mustEqual(three, k);
601     k = i.next();
602     mustEqual(four, k);
603     k = i.next();
604     mustEqual(five, k);
605 dl 1.1 assertFalse(i.hasNext());
606    
607 dl 1.40 SortedSet<Item> ssm = sm.tailSet(four);
608     mustEqual(four, ssm.first());
609     mustEqual(five, ssm.last());
610     mustRemove(ssm, four);
611     mustEqual(1, ssm.size());
612     mustEqual(3, sm.size());
613     mustEqual(4, set.size());
614 dl 1.1 }
615    
616 dl 1.4 /**
617     * size changes when elements added and removed
618     */
619     public void testDescendingSize() {
620 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
621 dl 1.4 for (int i = 0; i < SIZE; ++i) {
622 dl 1.40 mustEqual(SIZE - i, q.size());
623 dl 1.4 q.pollFirst();
624     }
625     for (int i = 0; i < SIZE; ++i) {
626 dl 1.40 mustEqual(i, q.size());
627     mustAdd(q, i);
628 dl 1.4 }
629     }
630    
631     /**
632     * add(null) throws NPE
633     */
634     public void testDescendingAddNull() {
635 dl 1.40 NavigableSet<Item> q = dset0();
636 jsr166 1.8 try {
637 dl 1.4 q.add(null);
638     shouldThrow();
639 jsr166 1.9 } catch (NullPointerException success) {}
640 dl 1.4 }
641    
642     /**
643     * Add of comparable element succeeds
644     */
645     public void testDescendingAdd() {
646 dl 1.40 NavigableSet<Item> q = dset0();
647     assertTrue(q.add(minusSix));
648 dl 1.4 }
649    
650     /**
651     * Add of duplicate element fails
652     */
653     public void testDescendingAddDup() {
654 dl 1.40 NavigableSet<Item> q = dset0();
655     assertTrue(q.add(minusSix));
656     assertFalse(q.add(minusSix));
657 dl 1.4 }
658    
659     /**
660     * Add of non-Comparable throws CCE
661     */
662     public void testDescendingAddNonComparable() {
663 jsr166 1.41 NavigableSet<Object> q = new ConcurrentSkipListSet<>();
664 dl 1.4 try {
665     q.add(new Object());
666     q.add(new Object());
667     shouldThrow();
668 jsr166 1.9 } catch (ClassCastException success) {}
669 dl 1.4 }
670    
671     /**
672     * addAll(null) throws NPE
673     */
674     public void testDescendingAddAll1() {
675 dl 1.40 NavigableSet<Item> q = dset0();
676 dl 1.4 try {
677     q.addAll(null);
678     shouldThrow();
679 jsr166 1.9 } catch (NullPointerException success) {}
680 dl 1.4 }
681 jsr166 1.14
682 dl 1.4 /**
683     * addAll of a collection with null elements throws NPE
684     */
685     public void testDescendingAddAll2() {
686 dl 1.40 NavigableSet<Item> q = dset0();
687     Item[] items = new Item[1];
688 dl 1.4 try {
689 dl 1.40 q.addAll(Arrays.asList(items));
690 dl 1.4 shouldThrow();
691 jsr166 1.9 } catch (NullPointerException success) {}
692 dl 1.4 }
693 jsr166 1.14
694 dl 1.4 /**
695     * addAll of a collection with any null elements throws NPE after
696     * possibly adding some elements
697     */
698     public void testDescendingAddAll3() {
699 dl 1.40 NavigableSet<Item> q = dset0();
700     Item[] items = new Item[2]; items[0] = zero;
701 dl 1.4 try {
702 dl 1.40 q.addAll(Arrays.asList(items));
703 dl 1.4 shouldThrow();
704 jsr166 1.9 } catch (NullPointerException success) {}
705 dl 1.4 }
706    
707     /**
708     * Set contains all elements of successful addAll
709     */
710     public void testDescendingAddAll5() {
711 dl 1.40 Item[] empty = new Item[0];
712     Item[] items = new Item[SIZE];
713 jsr166 1.10 for (int i = 0; i < SIZE; ++i)
714 dl 1.40 items[i] = itemFor(SIZE - 1 - i);
715     NavigableSet<Item> q = dset0();
716 jsr166 1.10 assertFalse(q.addAll(Arrays.asList(empty)));
717 dl 1.40 assertTrue(q.addAll(Arrays.asList(items)));
718 jsr166 1.10 for (int i = 0; i < SIZE; ++i)
719 dl 1.40 mustEqual(i, q.pollFirst());
720 dl 1.4 }
721    
722     /**
723     * poll succeeds unless empty
724     */
725     public void testDescendingPoll() {
726 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
727 dl 1.4 for (int i = 0; i < SIZE; ++i) {
728 dl 1.40 mustEqual(i, q.pollFirst());
729 dl 1.4 }
730 jsr166 1.8 assertNull(q.pollFirst());
731 dl 1.4 }
732    
733     /**
734     * remove(x) removes x and returns true if present
735     */
736     public void testDescendingRemoveElement() {
737 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
738 jsr166 1.27 for (int i = 1; i < SIZE; i += 2) {
739 dl 1.40 mustRemove(q, i);
740 dl 1.4 }
741 jsr166 1.27 for (int i = 0; i < SIZE; i += 2 ) {
742 dl 1.40 mustRemove(q, i);
743     mustNotRemove(q, i + 1);
744 dl 1.4 }
745     assertTrue(q.isEmpty());
746     }
747 jsr166 1.5
748 dl 1.4 /**
749     * contains(x) reports true when elements added but not yet removed
750     */
751     public void testDescendingContains() {
752 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
753 dl 1.4 for (int i = 0; i < SIZE; ++i) {
754 dl 1.40 mustContain(q, i);
755 dl 1.4 q.pollFirst();
756 dl 1.40 mustNotContain(q, i);
757 dl 1.4 }
758     }
759    
760     /**
761     * clear removes all elements
762     */
763     public void testDescendingClear() {
764 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
765 dl 1.4 q.clear();
766     assertTrue(q.isEmpty());
767 dl 1.40 mustEqual(0, q.size());
768     mustAdd(q, one);
769 dl 1.4 assertFalse(q.isEmpty());
770     q.clear();
771     assertTrue(q.isEmpty());
772     }
773    
774     /**
775     * containsAll(c) is true when c contains a subset of elements
776     */
777     public void testDescendingContainsAll() {
778 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
779     NavigableSet<Item> p = dset0();
780 dl 1.4 for (int i = 0; i < SIZE; ++i) {
781     assertTrue(q.containsAll(p));
782     assertFalse(p.containsAll(q));
783 dl 1.40 mustAdd(p, i);
784 dl 1.4 }
785     assertTrue(p.containsAll(q));
786     }
787    
788     /**
789     * retainAll(c) retains only those elements of c and reports true if changed
790     */
791     public void testDescendingRetainAll() {
792 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
793     NavigableSet<Item> p = populatedSet(SIZE);
794 dl 1.4 for (int i = 0; i < SIZE; ++i) {
795     boolean changed = q.retainAll(p);
796     if (i == 0)
797     assertFalse(changed);
798     else
799     assertTrue(changed);
800    
801     assertTrue(q.containsAll(p));
802 dl 1.40 mustEqual(SIZE - i, q.size());
803 dl 1.4 p.pollFirst();
804     }
805     }
806    
807     /**
808     * removeAll(c) removes only those elements of c and reports true if changed
809     */
810     public void testDescendingRemoveAll() {
811     for (int i = 1; i < SIZE; ++i) {
812 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
813     NavigableSet<Item> p = populatedSet(i);
814 dl 1.4 assertTrue(q.removeAll(p));
815 dl 1.40 mustEqual(SIZE - i, q.size());
816 dl 1.4 for (int j = 0; j < i; ++j) {
817 dl 1.40 mustNotContain(q, p.pollFirst());
818 dl 1.4 }
819     }
820     }
821    
822     /**
823     * lower returns preceding element
824     */
825     public void testDescendingLower() {
826 dl 1.40 NavigableSet<Item> q = dset5();
827     Object e1 = q.lower(minusThree);
828     mustEqual(minusTwo, e1);
829 dl 1.4
830 dl 1.40 Object e2 = q.lower(minusSix);
831     mustEqual(minusFive, e2);
832 dl 1.4
833 dl 1.40 Object e3 = q.lower(minusOne);
834 dl 1.4 assertNull(e3);
835    
836     Object e4 = q.lower(zero);
837     assertNull(e4);
838     }
839    
840     /**
841     * higher returns next element
842     */
843     public void testDescendingHigher() {
844 dl 1.40 NavigableSet<Item> q = dset5();
845     Object e1 = q.higher(minusThree);
846     mustEqual(minusFour, e1);
847 dl 1.4
848     Object e2 = q.higher(zero);
849 dl 1.40 mustEqual(minusOne, e2);
850 dl 1.4
851 dl 1.40 Object e3 = q.higher(minusFive);
852 dl 1.4 assertNull(e3);
853    
854 dl 1.40 Object e4 = q.higher(minusSix);
855 dl 1.4 assertNull(e4);
856     }
857    
858     /**
859     * floor returns preceding element
860     */
861     public void testDescendingFloor() {
862 dl 1.40 NavigableSet<Item> q = dset5();
863     Object e1 = q.floor(minusThree);
864     mustEqual(minusThree, e1);
865 dl 1.4
866 dl 1.40 Object e2 = q.floor(minusSix);
867     mustEqual(minusFive, e2);
868 dl 1.4
869 dl 1.40 Object e3 = q.floor(minusOne);
870     mustEqual(minusOne, e3);
871 dl 1.4
872     Object e4 = q.floor(zero);
873     assertNull(e4);
874     }
875    
876     /**
877     * ceiling returns next element
878     */
879     public void testDescendingCeiling() {
880 dl 1.40 NavigableSet<Item> q = dset5();
881     Object e1 = q.ceiling(minusThree);
882     mustEqual(minusThree, e1);
883 dl 1.4
884     Object e2 = q.ceiling(zero);
885 dl 1.40 mustEqual(minusOne, e2);
886 dl 1.4
887 dl 1.40 Object e3 = q.ceiling(minusFive);
888     mustEqual(minusFive, e3);
889 dl 1.4
890 dl 1.40 Object e4 = q.ceiling(minusSix);
891 dl 1.4 assertNull(e4);
892     }
893    
894     /**
895     * toArray contains all elements
896     */
897     public void testDescendingToArray() {
898 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
899 jsr166 1.8 Object[] o = q.toArray();
900 dl 1.4 Arrays.sort(o);
901 jsr166 1.8 for (int i = 0; i < o.length; i++)
902 dl 1.40 mustEqual(o[i], q.pollFirst());
903 dl 1.4 }
904    
905     /**
906     * toArray(a) contains all elements
907     */
908     public void testDescendingToArray2() {
909 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
910     Item[] items = new Item[SIZE];
911     assertSame(items, q.toArray(items));
912     Arrays.sort(items);
913     for (int i = 0; i < items.length; i++)
914     mustEqual(items[i], q.pollFirst());
915 dl 1.4 }
916 jsr166 1.5
917 dl 1.4 /**
918     * iterator iterates through all elements
919     */
920     public void testDescendingIterator() {
921 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
922 dl 1.4 int i = 0;
923 dl 1.40 Iterator<? extends Item> it = q.iterator();
924 jsr166 1.6 while (it.hasNext()) {
925 dl 1.40 mustContain(q, it.next());
926 dl 1.4 ++i;
927     }
928 dl 1.40 mustEqual(i, SIZE);
929 dl 1.4 }
930    
931     /**
932     * iterator of empty set has no elements
933     */
934     public void testDescendingEmptyIterator() {
935 dl 1.40 NavigableSet<Item> q = dset0();
936 dl 1.4 int i = 0;
937 dl 1.40 Iterator<? extends Item> it = q.iterator();
938 jsr166 1.6 while (it.hasNext()) {
939 dl 1.40 mustContain(q, it.next());
940 dl 1.4 ++i;
941     }
942 dl 1.40 mustEqual(0, i);
943 dl 1.4 }
944    
945     /**
946     * iterator.remove removes current element
947     */
948 jsr166 1.13 public void testDescendingIteratorRemove() {
949 dl 1.40 final NavigableSet<Item> q = dset0();
950     q.add(two);
951     q.add(one);
952     q.add(three);
953 dl 1.4
954 dl 1.40 Iterator<? extends Item> it = q.iterator();
955 dl 1.4 it.next();
956     it.remove();
957    
958     it = q.iterator();
959 dl 1.40 mustEqual(it.next(), two);
960     mustEqual(it.next(), three);
961 dl 1.4 assertFalse(it.hasNext());
962     }
963    
964     /**
965     * toString contains toStrings of elements
966     */
967     public void testDescendingToString() {
968 dl 1.40 NavigableSet<Item> q = populatedSet(SIZE);
969 dl 1.4 String s = q.toString();
970     for (int i = 0; i < SIZE; ++i) {
971 jsr166 1.19 assertTrue(s.contains(String.valueOf(i)));
972 dl 1.4 }
973 jsr166 1.5 }
974 dl 1.4
975     /**
976 jsr166 1.37 * A deserialized/reserialized set equals original
977 dl 1.4 */
978 jsr166 1.9 public void testDescendingSerialization() throws Exception {
979 dl 1.40 NavigableSet<Item> x = dset5();
980     NavigableSet<Item> y = serialClone(x);
981 jsr166 1.20
982 jsr166 1.24 assertNotSame(y, x);
983 dl 1.40 mustEqual(x.size(), y.size());
984     mustEqual(x, y);
985     mustEqual(y, x);
986 jsr166 1.20 while (!x.isEmpty()) {
987     assertFalse(y.isEmpty());
988 dl 1.40 mustEqual(x.pollFirst(), y.pollFirst());
989 jsr166 1.20 }
990     assertTrue(y.isEmpty());
991 dl 1.4 }
992    
993     /**
994     * subSet returns set with keys in requested range
995     */
996     public void testDescendingSubSetContents() {
997 dl 1.40 NavigableSet<Item> set = dset5();
998     SortedSet<Item> sm = set.subSet(minusTwo, minusFour);
999     mustEqual(minusTwo, sm.first());
1000     mustEqual(minusThree, sm.last());
1001     mustEqual(2, sm.size());
1002     mustNotContain(sm, minusOne);
1003     mustContain(sm, minusTwo);
1004     mustContain(sm, minusThree);
1005     mustNotContain(sm, minusFour);
1006     mustNotContain(sm, minusFive);
1007     Iterator<? extends Item> i = sm.iterator();
1008     Item k = i.next();
1009     mustEqual(minusTwo, k);
1010     k = i.next();
1011     mustEqual(minusThree, k);
1012 dl 1.4 assertFalse(i.hasNext());
1013 dl 1.40 Iterator<? extends Item> j = sm.iterator();
1014 dl 1.4 j.next();
1015     j.remove();
1016 dl 1.40 mustNotContain(set, minusTwo);
1017     mustEqual(4, set.size());
1018     mustEqual(1, sm.size());
1019     mustEqual(minusThree, sm.first());
1020     mustEqual(minusThree, sm.last());
1021     mustRemove(sm, minusThree);
1022 dl 1.4 assertTrue(sm.isEmpty());
1023 dl 1.40 mustEqual(3, set.size());
1024 dl 1.4 }
1025    
1026     public void testDescendingSubSetContents2() {
1027 dl 1.40 NavigableSet<Item> set = dset5();
1028     SortedSet<Item> sm = set.subSet(minusTwo, minusThree);
1029     mustEqual(1, sm.size());
1030     mustEqual(minusTwo, sm.first());
1031     mustEqual(minusTwo, sm.last());
1032     mustNotContain(sm, minusOne);
1033     mustContain(sm, minusTwo);
1034     mustNotContain(sm, minusThree);
1035     mustNotContain(sm, minusFour);
1036     mustNotContain(sm, minusFive);
1037     Iterator<? extends Item> i = sm.iterator();
1038     Item k = i.next();
1039     mustEqual(minusTwo, k);
1040 dl 1.4 assertFalse(i.hasNext());
1041 dl 1.40 Iterator<? extends Item> j = sm.iterator();
1042 dl 1.4 j.next();
1043     j.remove();
1044 dl 1.40 mustNotContain(set, minusTwo);
1045     mustEqual(4, set.size());
1046     mustEqual(0, sm.size());
1047 dl 1.4 assertTrue(sm.isEmpty());
1048 dl 1.40 mustNotRemove(sm, minusThree);
1049     mustEqual(4, set.size());
1050 dl 1.4 }
1051    
1052     /**
1053     * headSet returns set with keys in requested range
1054     */
1055     public void testDescendingHeadSetContents() {
1056 dl 1.40 NavigableSet<Item> set = dset5();
1057     SortedSet<Item> sm = set.headSet(minusFour);
1058     mustContain(sm, minusOne);
1059     mustContain(sm, minusTwo);
1060     mustContain(sm, minusThree);
1061     mustNotContain(sm, minusFour);
1062     mustNotContain(sm, minusFive);
1063     Iterator<? extends Item> i = sm.iterator();
1064     Item k = i.next();
1065     mustEqual(minusOne, k);
1066     k = i.next();
1067     mustEqual(minusTwo, k);
1068     k = i.next();
1069     mustEqual(minusThree, k);
1070 dl 1.4 assertFalse(i.hasNext());
1071     sm.clear();
1072     assertTrue(sm.isEmpty());
1073 dl 1.40 mustEqual(2, set.size());
1074     mustEqual(minusFour, set.first());
1075 dl 1.4 }
1076    
1077     /**
1078     * tailSet returns set with keys in requested range
1079     */
1080     public void testDescendingTailSetContents() {
1081 dl 1.40 NavigableSet<Item> set = dset5();
1082     SortedSet<Item> sm = set.tailSet(minusTwo);
1083     mustNotContain(sm, minusOne);
1084     mustContain(sm, minusTwo);
1085     mustContain(sm, minusThree);
1086     mustContain(sm, minusFour);
1087     mustContain(sm, minusFive);
1088     Iterator<? extends Item> i = sm.iterator();
1089     Item k = i.next();
1090     mustEqual(minusTwo, k);
1091     k = i.next();
1092     mustEqual(minusThree, k);
1093     k = i.next();
1094     mustEqual(minusFour, k);
1095     k = i.next();
1096     mustEqual(minusFive, k);
1097 dl 1.4 assertFalse(i.hasNext());
1098    
1099 dl 1.40 SortedSet<Item> ssm = sm.tailSet(minusFour);
1100     mustEqual(minusFour, ssm.first());
1101     mustEqual(minusFive, ssm.last());
1102     mustRemove(ssm, minusFour);
1103     mustEqual(1, ssm.size());
1104     mustEqual(3, sm.size());
1105     mustEqual(4, set.size());
1106 dl 1.4 }
1107    
1108 dl 1.1 }