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, 2 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.40: +6 -6 lines
Log Message:
use diamond <> pervasively

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.Comparator;
9 import java.util.Iterator;
10 import java.util.NavigableSet;
11 import java.util.SortedSet;
12 import java.util.concurrent.ConcurrentSkipListSet;
13
14 import junit.framework.Test;
15 import junit.framework.TestSuite;
16
17 public class ConcurrentSkipListSubSetTest extends JSR166TestCase {
18 public static void main(String[] args) {
19 main(suite(), args);
20 }
21 public static Test suite() {
22 return new TestSuite(ConcurrentSkipListSubSetTest.class);
23 }
24
25 static class MyReverseComparator implements Comparator {
26 @SuppressWarnings("unchecked")
27 public int compare(Object x, Object y) {
28 return ((Comparable)y).compareTo(x);
29 }
30 }
31
32 /**
33 * Returns a new set of given size containing consecutive
34 * Items 0 ... n - 1.
35 */
36 private static NavigableSet<Item> populatedSet(int n) {
37 ConcurrentSkipListSet<Item> q = new ConcurrentSkipListSet<>();
38 assertTrue(q.isEmpty());
39
40 for (int i = n - 1; i >= 0; i -= 2)
41 mustAdd(q, i);
42 for (int i = (n & 1); i < n; i += 2)
43 mustAdd(q, i);
44 mustAdd(q, -n);
45 mustAdd(q, n);
46 NavigableSet<Item> s = q.subSet(itemFor(0), true, itemFor(n), false);
47 assertFalse(s.isEmpty());
48 mustEqual(n, s.size());
49 return s;
50 }
51
52 /**
53 * Returns a new set of first 5 ints.
54 */
55 private static NavigableSet<Item> set5() {
56 ConcurrentSkipListSet<Item> q = new ConcurrentSkipListSet<>();
57 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 NavigableSet<Item> s = q.subSet(one, true, seven, false);
66 mustEqual(5, s.size());
67 return s;
68 }
69
70 /**
71 * Returns a new set of first 5 negative ints.
72 */
73 private static NavigableSet<Item> dset5() {
74 ConcurrentSkipListSet<Item> q = new ConcurrentSkipListSet<>();
75 assertTrue(q.isEmpty());
76 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 return s;
84 }
85
86 private static NavigableSet<Item> set0() {
87 ConcurrentSkipListSet<Item> set = new ConcurrentSkipListSet<>();
88 assertTrue(set.isEmpty());
89 return set.tailSet(minusOne, true);
90 }
91
92 private static NavigableSet<Item> dset0() {
93 ConcurrentSkipListSet<Item> set = new ConcurrentSkipListSet<>();
94 assertTrue(set.isEmpty());
95 return set;
96 }
97
98 /**
99 * A new set has unbounded capacity
100 */
101 public void testConstructor1() {
102 mustEqual(0, set0().size());
103 }
104
105 /**
106 * isEmpty is true before add, false after
107 */
108 public void testEmpty() {
109 NavigableSet<Item> q = set0();
110 assertTrue(q.isEmpty());
111 mustAdd(q, one);
112 assertFalse(q.isEmpty());
113 mustAdd(q, two);
114 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 NavigableSet<Item> q = populatedSet(SIZE);
124 for (int i = 0; i < SIZE; ++i) {
125 mustEqual(SIZE - i, q.size());
126 q.pollFirst();
127 }
128 for (int i = 0; i < SIZE; ++i) {
129 mustEqual(i, q.size());
130 mustAdd(q, i);
131 }
132 }
133
134 /**
135 * add(null) throws NPE
136 */
137 public void testAddNull() {
138 NavigableSet<Item> q = set0();
139 try {
140 q.add(null);
141 shouldThrow();
142 } catch (NullPointerException success) {}
143 }
144
145 /**
146 * Add of comparable element succeeds
147 */
148 public void testAdd() {
149 NavigableSet<Item> q = set0();
150 assertTrue(q.add(six));
151 }
152
153 /**
154 * Add of duplicate element fails
155 */
156 public void testAddDup() {
157 NavigableSet<Item> q = set0();
158 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 ConcurrentSkipListSet<Object> src = new ConcurrentSkipListSet<>();
167 NavigableSet<Object> q = src.tailSet(minusOne, true);
168 try {
169 q.add(new Object());
170 q.add(new Object());
171 shouldThrow();
172 } catch (ClassCastException success) {}
173 }
174
175 /**
176 * addAll(null) throws NPE
177 */
178 public void testAddAll1() {
179 NavigableSet<Item> q = set0();
180 try {
181 q.addAll(null);
182 shouldThrow();
183 } catch (NullPointerException success) {}
184 }
185
186 /**
187 * addAll of a collection with null elements throws NPE
188 */
189 public void testAddAll2() {
190 NavigableSet<Item> q = set0();
191 Item[] items = new Item[SIZE];
192 try {
193 q.addAll(Arrays.asList(items));
194 shouldThrow();
195 } catch (NullPointerException success) {}
196 }
197
198 /**
199 * addAll of a collection with any null elements throws NPE after
200 * possibly adding some elements
201 */
202 public void testAddAll3() {
203 NavigableSet<Item> q = set0();
204 Item[] items = new Item[2]; items[0] = zero;
205 try {
206 q.addAll(Arrays.asList(items));
207 shouldThrow();
208 } catch (NullPointerException success) {}
209 }
210
211 /**
212 * Set contains all elements of successful addAll
213 */
214 public void testAddAll5() {
215 Item[] empty = new Item[0];
216 Item[] items = new Item[SIZE];
217 for (int i = 0; i < SIZE; ++i)
218 items[i] = itemFor(SIZE - 1 - i);
219 NavigableSet<Item> q = set0();
220 assertFalse(q.addAll(Arrays.asList(empty)));
221 assertTrue(q.addAll(Arrays.asList(items)));
222 for (int i = 0; i < SIZE; ++i)
223 mustEqual(i, q.pollFirst());
224 }
225
226 /**
227 * poll succeeds unless empty
228 */
229 public void testPoll() {
230 NavigableSet<Item> q = populatedSet(SIZE);
231 for (int i = 0; i < SIZE; ++i) {
232 mustEqual(i, q.pollFirst());
233 }
234 assertNull(q.pollFirst());
235 }
236
237 /**
238 * remove(x) removes x and returns true if present
239 */
240 public void testRemoveElement() {
241 NavigableSet<Item> q = populatedSet(SIZE);
242 for (int i = 1; i < SIZE; i += 2) {
243 mustContain(q, i);
244 mustRemove(q, i);
245 mustNotContain(q, i);
246 mustContain(q, i - 1);
247 }
248 for (int i = 0; i < SIZE; i += 2) {
249 mustContain(q, i);
250 mustRemove(q, i);
251 mustNotContain(q, i);
252 mustNotRemove(q, i + 1);
253 mustNotContain(q, i + 1);
254 }
255 assertTrue(q.isEmpty());
256 }
257
258 /**
259 * contains(x) reports true when elements added but not yet removed
260 */
261 public void testContains() {
262 NavigableSet<Item> q = populatedSet(SIZE);
263 for (int i = 0; i < SIZE; ++i) {
264 mustContain(q, i);
265 q.pollFirst();
266 mustNotContain(q, i);
267 }
268 }
269
270 /**
271 * clear removes all elements
272 */
273 public void testClear() {
274 NavigableSet<Item> q = populatedSet(SIZE);
275 q.clear();
276 assertTrue(q.isEmpty());
277 mustEqual(0, q.size());
278 mustAdd(q, one);
279 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 NavigableSet<Item> q = populatedSet(SIZE);
289 NavigableSet<Item> p = set0();
290 for (int i = 0; i < SIZE; ++i) {
291 assertTrue(q.containsAll(p));
292 assertFalse(p.containsAll(q));
293 mustAdd(p, i);
294 }
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 NavigableSet<Item> q = populatedSet(SIZE);
303 NavigableSet<Item> p = populatedSet(SIZE);
304 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 mustEqual(SIZE - i, q.size());
313 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 NavigableSet<Item> q = populatedSet(SIZE);
323 NavigableSet<Item> p = populatedSet(i);
324 assertTrue(q.removeAll(p));
325 mustEqual(SIZE - i, q.size());
326 for (int j = 0; j < i; ++j) {
327 mustNotContain(q, p.pollFirst());
328 }
329 }
330 }
331
332 /**
333 * lower returns preceding element
334 */
335 public void testLower() {
336 NavigableSet<Item> q = set5();
337 Object e1 = q.lower(three);
338 mustEqual(two, e1);
339
340 Object e2 = q.lower(six);
341 mustEqual(five, e2);
342
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 NavigableSet<Item> q = set5();
355 Object e1 = q.higher(three);
356 mustEqual(four, e1);
357
358 Object e2 = q.higher(zero);
359 mustEqual(one, e2);
360
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 NavigableSet<Item> q = set5();
373 Object e1 = q.floor(three);
374 mustEqual(three, e1);
375
376 Object e2 = q.floor(six);
377 mustEqual(five, e2);
378
379 Object e3 = q.floor(one);
380 mustEqual(one, e3);
381
382 Object e4 = q.floor(zero);
383 assertNull(e4);
384 }
385
386 /**
387 * ceiling returns next element
388 */
389 public void testCeiling() {
390 NavigableSet<Item> q = set5();
391 Object e1 = q.ceiling(three);
392 mustEqual(three, e1);
393
394 Object e2 = q.ceiling(zero);
395 mustEqual(one, e2);
396
397 Object e3 = q.ceiling(five);
398 mustEqual(five, e3);
399
400 Object e4 = q.ceiling(six);
401 assertNull(e4);
402 }
403
404 /**
405 * toArray contains all elements in sorted order
406 */
407 public void testToArray() {
408 NavigableSet<Item> q = populatedSet(SIZE);
409 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 }
415
416 /**
417 * toArray(a) contains all elements in sorted order
418 */
419 public void testToArray2() {
420 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 assertSame(o, q.pollFirst());
426 assertTrue(q.isEmpty());
427 }
428
429 /**
430 * iterator iterates through all elements
431 */
432 public void testIterator() {
433 NavigableSet<Item> q = populatedSet(SIZE);
434 Iterator<? extends Item> it = q.iterator();
435 int i;
436 for (i = 0; it.hasNext(); i++)
437 assertTrue(q.contains(it.next()));
438 mustEqual(i, SIZE);
439 assertIteratorExhausted(it);
440 }
441
442 /**
443 * iterator of empty set has no elements
444 */
445 public void testEmptyIterator() {
446 assertIteratorExhausted(set0().iterator());
447 }
448
449 /**
450 * iterator.remove removes current element
451 */
452 public void testIteratorRemove() {
453 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 it.next();
459 it.remove();
460
461 it = q.iterator();
462 mustEqual(it.next(), two);
463 mustEqual(it.next(), three);
464 assertFalse(it.hasNext());
465 }
466
467 /**
468 * toString contains toStrings of elements
469 */
470 public void testToString() {
471 NavigableSet<Item> q = populatedSet(SIZE);
472 String s = q.toString();
473 for (int i = 0; i < SIZE; ++i) {
474 assertTrue(s.contains(String.valueOf(i)));
475 }
476 }
477
478 /**
479 * A deserialized/reserialized set equals original
480 */
481 public void testSerialization() throws Exception {
482 NavigableSet<Item> x = populatedSet(SIZE);
483 NavigableSet<Item> y = serialClone(x);
484
485 assertNotSame(y, x);
486 mustEqual(x.size(), y.size());
487 mustEqual(x, y);
488 mustEqual(y, x);
489 while (!x.isEmpty()) {
490 assertFalse(y.isEmpty());
491 mustEqual(x.pollFirst(), y.pollFirst());
492 }
493 assertTrue(y.isEmpty());
494 }
495
496 /**
497 * subSet returns set with keys in requested range
498 */
499 public void testSubSetContents() {
500 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 assertFalse(i.hasNext());
516 Iterator<? extends Item> j = sm.iterator();
517 j.next();
518 j.remove();
519 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 assertTrue(sm.isEmpty());
526 mustEqual(3, set.size());
527 }
528
529 public void testSubSetContents2() {
530 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 assertFalse(i.hasNext());
544 Iterator<? extends Item> j = sm.iterator();
545 j.next();
546 j.remove();
547 mustNotContain(set, two);
548 mustEqual(4, set.size());
549 mustEqual(0, sm.size());
550 assertTrue(sm.isEmpty());
551 assertFalse(sm.remove(three));
552 mustEqual(4, set.size());
553 }
554
555 /**
556 * headSet returns set with keys in requested range
557 */
558 public void testHeadSetContents() {
559 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 assertFalse(i.hasNext());
574 sm.clear();
575 assertTrue(sm.isEmpty());
576 mustEqual(2, set.size());
577 mustEqual(four, set.first());
578 }
579
580 /**
581 * tailSet returns set with keys in requested range
582 */
583 public void testTailSetContents() {
584 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 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 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 assertFalse(i.hasNext());
606
607 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 }
615
616 /**
617 * size changes when elements added and removed
618 */
619 public void testDescendingSize() {
620 NavigableSet<Item> q = populatedSet(SIZE);
621 for (int i = 0; i < SIZE; ++i) {
622 mustEqual(SIZE - i, q.size());
623 q.pollFirst();
624 }
625 for (int i = 0; i < SIZE; ++i) {
626 mustEqual(i, q.size());
627 mustAdd(q, i);
628 }
629 }
630
631 /**
632 * add(null) throws NPE
633 */
634 public void testDescendingAddNull() {
635 NavigableSet<Item> q = dset0();
636 try {
637 q.add(null);
638 shouldThrow();
639 } catch (NullPointerException success) {}
640 }
641
642 /**
643 * Add of comparable element succeeds
644 */
645 public void testDescendingAdd() {
646 NavigableSet<Item> q = dset0();
647 assertTrue(q.add(minusSix));
648 }
649
650 /**
651 * Add of duplicate element fails
652 */
653 public void testDescendingAddDup() {
654 NavigableSet<Item> q = dset0();
655 assertTrue(q.add(minusSix));
656 assertFalse(q.add(minusSix));
657 }
658
659 /**
660 * Add of non-Comparable throws CCE
661 */
662 public void testDescendingAddNonComparable() {
663 NavigableSet<Object> q = new ConcurrentSkipListSet<>();
664 try {
665 q.add(new Object());
666 q.add(new Object());
667 shouldThrow();
668 } catch (ClassCastException success) {}
669 }
670
671 /**
672 * addAll(null) throws NPE
673 */
674 public void testDescendingAddAll1() {
675 NavigableSet<Item> q = dset0();
676 try {
677 q.addAll(null);
678 shouldThrow();
679 } catch (NullPointerException success) {}
680 }
681
682 /**
683 * addAll of a collection with null elements throws NPE
684 */
685 public void testDescendingAddAll2() {
686 NavigableSet<Item> q = dset0();
687 Item[] items = new Item[1];
688 try {
689 q.addAll(Arrays.asList(items));
690 shouldThrow();
691 } catch (NullPointerException success) {}
692 }
693
694 /**
695 * addAll of a collection with any null elements throws NPE after
696 * possibly adding some elements
697 */
698 public void testDescendingAddAll3() {
699 NavigableSet<Item> q = dset0();
700 Item[] items = new Item[2]; items[0] = zero;
701 try {
702 q.addAll(Arrays.asList(items));
703 shouldThrow();
704 } catch (NullPointerException success) {}
705 }
706
707 /**
708 * Set contains all elements of successful addAll
709 */
710 public void testDescendingAddAll5() {
711 Item[] empty = new Item[0];
712 Item[] items = new Item[SIZE];
713 for (int i = 0; i < SIZE; ++i)
714 items[i] = itemFor(SIZE - 1 - i);
715 NavigableSet<Item> q = dset0();
716 assertFalse(q.addAll(Arrays.asList(empty)));
717 assertTrue(q.addAll(Arrays.asList(items)));
718 for (int i = 0; i < SIZE; ++i)
719 mustEqual(i, q.pollFirst());
720 }
721
722 /**
723 * poll succeeds unless empty
724 */
725 public void testDescendingPoll() {
726 NavigableSet<Item> q = populatedSet(SIZE);
727 for (int i = 0; i < SIZE; ++i) {
728 mustEqual(i, q.pollFirst());
729 }
730 assertNull(q.pollFirst());
731 }
732
733 /**
734 * remove(x) removes x and returns true if present
735 */
736 public void testDescendingRemoveElement() {
737 NavigableSet<Item> q = populatedSet(SIZE);
738 for (int i = 1; i < SIZE; i += 2) {
739 mustRemove(q, i);
740 }
741 for (int i = 0; i < SIZE; i += 2 ) {
742 mustRemove(q, i);
743 mustNotRemove(q, i + 1);
744 }
745 assertTrue(q.isEmpty());
746 }
747
748 /**
749 * contains(x) reports true when elements added but not yet removed
750 */
751 public void testDescendingContains() {
752 NavigableSet<Item> q = populatedSet(SIZE);
753 for (int i = 0; i < SIZE; ++i) {
754 mustContain(q, i);
755 q.pollFirst();
756 mustNotContain(q, i);
757 }
758 }
759
760 /**
761 * clear removes all elements
762 */
763 public void testDescendingClear() {
764 NavigableSet<Item> q = populatedSet(SIZE);
765 q.clear();
766 assertTrue(q.isEmpty());
767 mustEqual(0, q.size());
768 mustAdd(q, one);
769 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 NavigableSet<Item> q = populatedSet(SIZE);
779 NavigableSet<Item> p = dset0();
780 for (int i = 0; i < SIZE; ++i) {
781 assertTrue(q.containsAll(p));
782 assertFalse(p.containsAll(q));
783 mustAdd(p, i);
784 }
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 NavigableSet<Item> q = populatedSet(SIZE);
793 NavigableSet<Item> p = populatedSet(SIZE);
794 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 mustEqual(SIZE - i, q.size());
803 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 NavigableSet<Item> q = populatedSet(SIZE);
813 NavigableSet<Item> p = populatedSet(i);
814 assertTrue(q.removeAll(p));
815 mustEqual(SIZE - i, q.size());
816 for (int j = 0; j < i; ++j) {
817 mustNotContain(q, p.pollFirst());
818 }
819 }
820 }
821
822 /**
823 * lower returns preceding element
824 */
825 public void testDescendingLower() {
826 NavigableSet<Item> q = dset5();
827 Object e1 = q.lower(minusThree);
828 mustEqual(minusTwo, e1);
829
830 Object e2 = q.lower(minusSix);
831 mustEqual(minusFive, e2);
832
833 Object e3 = q.lower(minusOne);
834 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 NavigableSet<Item> q = dset5();
845 Object e1 = q.higher(minusThree);
846 mustEqual(minusFour, e1);
847
848 Object e2 = q.higher(zero);
849 mustEqual(minusOne, e2);
850
851 Object e3 = q.higher(minusFive);
852 assertNull(e3);
853
854 Object e4 = q.higher(minusSix);
855 assertNull(e4);
856 }
857
858 /**
859 * floor returns preceding element
860 */
861 public void testDescendingFloor() {
862 NavigableSet<Item> q = dset5();
863 Object e1 = q.floor(minusThree);
864 mustEqual(minusThree, e1);
865
866 Object e2 = q.floor(minusSix);
867 mustEqual(minusFive, e2);
868
869 Object e3 = q.floor(minusOne);
870 mustEqual(minusOne, e3);
871
872 Object e4 = q.floor(zero);
873 assertNull(e4);
874 }
875
876 /**
877 * ceiling returns next element
878 */
879 public void testDescendingCeiling() {
880 NavigableSet<Item> q = dset5();
881 Object e1 = q.ceiling(minusThree);
882 mustEqual(minusThree, e1);
883
884 Object e2 = q.ceiling(zero);
885 mustEqual(minusOne, e2);
886
887 Object e3 = q.ceiling(minusFive);
888 mustEqual(minusFive, e3);
889
890 Object e4 = q.ceiling(minusSix);
891 assertNull(e4);
892 }
893
894 /**
895 * toArray contains all elements
896 */
897 public void testDescendingToArray() {
898 NavigableSet<Item> q = populatedSet(SIZE);
899 Object[] o = q.toArray();
900 Arrays.sort(o);
901 for (int i = 0; i < o.length; i++)
902 mustEqual(o[i], q.pollFirst());
903 }
904
905 /**
906 * toArray(a) contains all elements
907 */
908 public void testDescendingToArray2() {
909 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 }
916
917 /**
918 * iterator iterates through all elements
919 */
920 public void testDescendingIterator() {
921 NavigableSet<Item> q = populatedSet(SIZE);
922 int i = 0;
923 Iterator<? extends Item> it = q.iterator();
924 while (it.hasNext()) {
925 mustContain(q, it.next());
926 ++i;
927 }
928 mustEqual(i, SIZE);
929 }
930
931 /**
932 * iterator of empty set has no elements
933 */
934 public void testDescendingEmptyIterator() {
935 NavigableSet<Item> q = dset0();
936 int i = 0;
937 Iterator<? extends Item> it = q.iterator();
938 while (it.hasNext()) {
939 mustContain(q, it.next());
940 ++i;
941 }
942 mustEqual(0, i);
943 }
944
945 /**
946 * iterator.remove removes current element
947 */
948 public void testDescendingIteratorRemove() {
949 final NavigableSet<Item> q = dset0();
950 q.add(two);
951 q.add(one);
952 q.add(three);
953
954 Iterator<? extends Item> it = q.iterator();
955 it.next();
956 it.remove();
957
958 it = q.iterator();
959 mustEqual(it.next(), two);
960 mustEqual(it.next(), three);
961 assertFalse(it.hasNext());
962 }
963
964 /**
965 * toString contains toStrings of elements
966 */
967 public void testDescendingToString() {
968 NavigableSet<Item> q = populatedSet(SIZE);
969 String s = q.toString();
970 for (int i = 0; i < SIZE; ++i) {
971 assertTrue(s.contains(String.valueOf(i)));
972 }
973 }
974
975 /**
976 * A deserialized/reserialized set equals original
977 */
978 public void testDescendingSerialization() throws Exception {
979 NavigableSet<Item> x = dset5();
980 NavigableSet<Item> y = serialClone(x);
981
982 assertNotSame(y, x);
983 mustEqual(x.size(), y.size());
984 mustEqual(x, y);
985 mustEqual(y, x);
986 while (!x.isEmpty()) {
987 assertFalse(y.isEmpty());
988 mustEqual(x.pollFirst(), y.pollFirst());
989 }
990 assertTrue(y.isEmpty());
991 }
992
993 /**
994 * subSet returns set with keys in requested range
995 */
996 public void testDescendingSubSetContents() {
997 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 assertFalse(i.hasNext());
1013 Iterator<? extends Item> j = sm.iterator();
1014 j.next();
1015 j.remove();
1016 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 assertTrue(sm.isEmpty());
1023 mustEqual(3, set.size());
1024 }
1025
1026 public void testDescendingSubSetContents2() {
1027 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 assertFalse(i.hasNext());
1041 Iterator<? extends Item> j = sm.iterator();
1042 j.next();
1043 j.remove();
1044 mustNotContain(set, minusTwo);
1045 mustEqual(4, set.size());
1046 mustEqual(0, sm.size());
1047 assertTrue(sm.isEmpty());
1048 mustNotRemove(sm, minusThree);
1049 mustEqual(4, set.size());
1050 }
1051
1052 /**
1053 * headSet returns set with keys in requested range
1054 */
1055 public void testDescendingHeadSetContents() {
1056 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 assertFalse(i.hasNext());
1071 sm.clear();
1072 assertTrue(sm.isEmpty());
1073 mustEqual(2, set.size());
1074 mustEqual(minusFour, set.first());
1075 }
1076
1077 /**
1078 * tailSet returns set with keys in requested range
1079 */
1080 public void testDescendingTailSetContents() {
1081 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 assertFalse(i.hasNext());
1098
1099 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 }
1107
1108 }