blob: a6510f551b03fc43df67b2538c0181aef1e69d96 [file] [log] [blame]
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001/*
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
7package jsr166;
8
Narayan Kamath8e9a0e92015-04-28 11:40:00 +01009import java.util.ArrayList;
10import java.util.Arrays;
11import java.util.Collection;
12import java.util.Iterator;
13import java.util.Map;
14import java.util.NavigableMap;
15import java.util.Set;
16import java.util.SortedMap;
Calin Juravle8f0d92b2013-08-01 17:26:00 +010017import java.util.concurrent.ConcurrentNavigableMap;
18import java.util.concurrent.ConcurrentSkipListMap;
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010019
20import junit.framework.Test;
21import junit.framework.TestSuite;
Calin Juravle8f0d92b2013-08-01 17:26:00 +010022
23public class ConcurrentSkipListSubMapTest extends JSR166TestCase {
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010024 // android-note: Removed because the CTS runner does a bad job of
25 // retrying tests that have suite() declarations.
26 //
27 // public static void main(String[] args) {
28 // main(suite(), args);
29 // }
30 // public static Test suite() {
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +000031 // return new TestSuite(ConcurrentSkipListSubMapTest.class);
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010032 // }
Calin Juravle8f0d92b2013-08-01 17:26:00 +010033
34 /**
35 * Returns a new map from Integers 1-5 to Strings "A"-"E".
36 */
37 private static ConcurrentNavigableMap map5() {
38 ConcurrentSkipListMap map = new ConcurrentSkipListMap();
39 assertTrue(map.isEmpty());
40 map.put(zero, "Z");
41 map.put(one, "A");
42 map.put(five, "E");
43 map.put(three, "C");
44 map.put(two, "B");
45 map.put(four, "D");
46 map.put(seven, "F");
47 assertFalse(map.isEmpty());
48 assertEquals(7, map.size());
49 return map.subMap(one, true, seven, false);
50 }
51
52 /**
53 * Returns a new map from Integers -5 to -1 to Strings "A"-"E".
54 */
55 private static ConcurrentNavigableMap dmap5() {
56 ConcurrentSkipListMap map = new ConcurrentSkipListMap();
57 assertTrue(map.isEmpty());
58 map.put(m1, "A");
59 map.put(m5, "E");
60 map.put(m3, "C");
61 map.put(m2, "B");
62 map.put(m4, "D");
63 assertFalse(map.isEmpty());
64 assertEquals(5, map.size());
65 return map.descendingMap();
66 }
67
68 private static ConcurrentNavigableMap map0() {
69 ConcurrentSkipListMap map = new ConcurrentSkipListMap();
70 assertTrue(map.isEmpty());
71 return map.tailMap(one, true);
72 }
73
74 private static ConcurrentNavigableMap dmap0() {
75 ConcurrentSkipListMap map = new ConcurrentSkipListMap();
76 assertTrue(map.isEmpty());
77 return map;
78 }
79
80 /**
81 * clear removes all pairs
82 */
83 public void testClear() {
84 ConcurrentNavigableMap map = map5();
85 map.clear();
86 assertEquals(0, map.size());
87 }
88
89 /**
90 * Maps with same contents are equal
91 */
92 public void testEquals() {
93 ConcurrentNavigableMap map1 = map5();
94 ConcurrentNavigableMap map2 = map5();
95 assertEquals(map1, map2);
96 assertEquals(map2, map1);
97 map1.clear();
98 assertFalse(map1.equals(map2));
99 assertFalse(map2.equals(map1));
100 }
101
102 /**
103 * containsKey returns true for contained key
104 */
105 public void testContainsKey() {
106 ConcurrentNavigableMap map = map5();
107 assertTrue(map.containsKey(one));
108 assertFalse(map.containsKey(zero));
109 }
110
111 /**
112 * containsValue returns true for held values
113 */
114 public void testContainsValue() {
115 ConcurrentNavigableMap map = map5();
116 assertTrue(map.containsValue("A"));
117 assertFalse(map.containsValue("Z"));
118 }
119
120 /**
121 * get returns the correct element at the given key,
122 * or null if not present
123 */
124 public void testGet() {
125 ConcurrentNavigableMap map = map5();
126 assertEquals("A", (String)map.get(one));
127 ConcurrentNavigableMap empty = map0();
128 assertNull(empty.get(one));
129 }
130
131 /**
132 * isEmpty is true of empty map and false for non-empty
133 */
134 public void testIsEmpty() {
135 ConcurrentNavigableMap empty = map0();
136 ConcurrentNavigableMap map = map5();
137 assertTrue(empty.isEmpty());
138 assertFalse(map.isEmpty());
139 }
140
141 /**
142 * firstKey returns first key
143 */
144 public void testFirstKey() {
145 ConcurrentNavigableMap map = map5();
146 assertEquals(one, map.firstKey());
147 }
148
149 /**
150 * lastKey returns last key
151 */
152 public void testLastKey() {
153 ConcurrentNavigableMap map = map5();
154 assertEquals(five, map.lastKey());
155 }
156
157 /**
158 * keySet returns a Set containing all the keys
159 */
160 public void testKeySet() {
161 ConcurrentNavigableMap map = map5();
162 Set s = map.keySet();
163 assertEquals(5, s.size());
164 assertTrue(s.contains(one));
165 assertTrue(s.contains(two));
166 assertTrue(s.contains(three));
167 assertTrue(s.contains(four));
168 assertTrue(s.contains(five));
169 }
170
171 /**
172 * keySet is ordered
173 */
174 public void testKeySetOrder() {
175 ConcurrentNavigableMap map = map5();
176 Set s = map.keySet();
177 Iterator i = s.iterator();
178 Integer last = (Integer)i.next();
179 assertEquals(last, one);
180 while (i.hasNext()) {
181 Integer k = (Integer)i.next();
182 assertTrue(last.compareTo(k) < 0);
183 last = k;
184 }
185 }
186
187 /**
188 * values collection contains all values
189 */
190 public void testValues() {
191 ConcurrentNavigableMap map = map5();
192 Collection s = map.values();
193 assertEquals(5, s.size());
194 assertTrue(s.contains("A"));
195 assertTrue(s.contains("B"));
196 assertTrue(s.contains("C"));
197 assertTrue(s.contains("D"));
198 assertTrue(s.contains("E"));
199 }
200
201 /**
202 * keySet.toArray returns contains all keys
203 */
204 public void testKeySetToArray() {
205 ConcurrentNavigableMap map = map5();
206 Set s = map.keySet();
207 Object[] ar = s.toArray();
208 assertTrue(s.containsAll(Arrays.asList(ar)));
209 assertEquals(5, ar.length);
210 ar[0] = m10;
211 assertFalse(s.containsAll(Arrays.asList(ar)));
212 }
213
214 /**
215 * descendingkeySet.toArray returns contains all keys
216 */
217 public void testDescendingKeySetToArray() {
218 ConcurrentNavigableMap map = map5();
219 Set s = map.descendingKeySet();
220 Object[] ar = s.toArray();
221 assertEquals(5, ar.length);
222 assertTrue(s.containsAll(Arrays.asList(ar)));
223 ar[0] = m10;
224 assertFalse(s.containsAll(Arrays.asList(ar)));
225 }
226
227 /**
228 * Values.toArray contains all values
229 */
230 public void testValuesToArray() {
231 ConcurrentNavigableMap map = map5();
232 Collection v = map.values();
233 Object[] ar = v.toArray();
234 ArrayList s = new ArrayList(Arrays.asList(ar));
235 assertEquals(5, ar.length);
236 assertTrue(s.contains("A"));
237 assertTrue(s.contains("B"));
238 assertTrue(s.contains("C"));
239 assertTrue(s.contains("D"));
240 assertTrue(s.contains("E"));
241 }
242
243 /**
244 * entrySet contains all pairs
245 */
246 public void testEntrySet() {
247 ConcurrentNavigableMap map = map5();
248 Set s = map.entrySet();
249 assertEquals(5, s.size());
250 Iterator it = s.iterator();
251 while (it.hasNext()) {
252 Map.Entry e = (Map.Entry) it.next();
253 assertTrue(
254 (e.getKey().equals(one) && e.getValue().equals("A")) ||
255 (e.getKey().equals(two) && e.getValue().equals("B")) ||
256 (e.getKey().equals(three) && e.getValue().equals("C")) ||
257 (e.getKey().equals(four) && e.getValue().equals("D")) ||
258 (e.getKey().equals(five) && e.getValue().equals("E")));
259 }
260 }
261
262 /**
263 * putAll adds all key-value pairs from the given map
264 */
265 public void testPutAll() {
266 ConcurrentNavigableMap empty = map0();
267 ConcurrentNavigableMap map = map5();
268 empty.putAll(map);
269 assertEquals(5, empty.size());
270 assertTrue(empty.containsKey(one));
271 assertTrue(empty.containsKey(two));
272 assertTrue(empty.containsKey(three));
273 assertTrue(empty.containsKey(four));
274 assertTrue(empty.containsKey(five));
275 }
276
277 /**
278 * putIfAbsent works when the given key is not present
279 */
280 public void testPutIfAbsent() {
281 ConcurrentNavigableMap map = map5();
282 map.putIfAbsent(six, "Z");
283 assertTrue(map.containsKey(six));
284 }
285
286 /**
287 * putIfAbsent does not add the pair if the key is already present
288 */
289 public void testPutIfAbsent2() {
290 ConcurrentNavigableMap map = map5();
291 assertEquals("A", map.putIfAbsent(one, "Z"));
292 }
293
294 /**
295 * replace fails when the given key is not present
296 */
297 public void testReplace() {
298 ConcurrentNavigableMap map = map5();
299 assertNull(map.replace(six, "Z"));
300 assertFalse(map.containsKey(six));
301 }
302
303 /**
304 * replace succeeds if the key is already present
305 */
306 public void testReplace2() {
307 ConcurrentNavigableMap map = map5();
308 assertNotNull(map.replace(one, "Z"));
309 assertEquals("Z", map.get(one));
310 }
311
312 /**
313 * replace value fails when the given key not mapped to expected value
314 */
315 public void testReplaceValue() {
316 ConcurrentNavigableMap map = map5();
317 assertEquals("A", map.get(one));
318 assertFalse(map.replace(one, "Z", "Z"));
319 assertEquals("A", map.get(one));
320 }
321
322 /**
323 * replace value succeeds when the given key mapped to expected value
324 */
325 public void testReplaceValue2() {
326 ConcurrentNavigableMap map = map5();
327 assertEquals("A", map.get(one));
328 assertTrue(map.replace(one, "A", "Z"));
329 assertEquals("Z", map.get(one));
330 }
331
332 /**
333 * remove removes the correct key-value pair from the map
334 */
335 public void testRemove() {
336 ConcurrentNavigableMap map = map5();
337 map.remove(five);
338 assertEquals(4, map.size());
339 assertFalse(map.containsKey(five));
340 }
341
342 /**
343 * remove(key,value) removes only if pair present
344 */
345 public void testRemove2() {
346 ConcurrentNavigableMap map = map5();
347 assertTrue(map.containsKey(five));
348 assertEquals("E", map.get(five));
349 map.remove(five, "E");
350 assertEquals(4, map.size());
351 assertFalse(map.containsKey(five));
352 map.remove(four, "A");
353 assertEquals(4, map.size());
354 assertTrue(map.containsKey(four));
355 }
356
357 /**
358 * lowerEntry returns preceding entry.
359 */
360 public void testLowerEntry() {
361 ConcurrentNavigableMap map = map5();
362 Map.Entry e1 = map.lowerEntry(three);
363 assertEquals(two, e1.getKey());
364
365 Map.Entry e2 = map.lowerEntry(six);
366 assertEquals(five, e2.getKey());
367
368 Map.Entry e3 = map.lowerEntry(one);
369 assertNull(e3);
370
371 Map.Entry e4 = map.lowerEntry(zero);
372 assertNull(e4);
373 }
374
375 /**
376 * higherEntry returns next entry.
377 */
378 public void testHigherEntry() {
379 ConcurrentNavigableMap map = map5();
380 Map.Entry e1 = map.higherEntry(three);
381 assertEquals(four, e1.getKey());
382
383 Map.Entry e2 = map.higherEntry(zero);
384 assertEquals(one, e2.getKey());
385
386 Map.Entry e3 = map.higherEntry(five);
387 assertNull(e3);
388
389 Map.Entry e4 = map.higherEntry(six);
390 assertNull(e4);
391 }
392
393 /**
394 * floorEntry returns preceding entry.
395 */
396 public void testFloorEntry() {
397 ConcurrentNavigableMap map = map5();
398 Map.Entry e1 = map.floorEntry(three);
399 assertEquals(three, e1.getKey());
400
401 Map.Entry e2 = map.floorEntry(six);
402 assertEquals(five, e2.getKey());
403
404 Map.Entry e3 = map.floorEntry(one);
405 assertEquals(one, e3.getKey());
406
407 Map.Entry e4 = map.floorEntry(zero);
408 assertNull(e4);
409 }
410
411 /**
412 * ceilingEntry returns next entry.
413 */
414 public void testCeilingEntry() {
415 ConcurrentNavigableMap map = map5();
416 Map.Entry e1 = map.ceilingEntry(three);
417 assertEquals(three, e1.getKey());
418
419 Map.Entry e2 = map.ceilingEntry(zero);
420 assertEquals(one, e2.getKey());
421
422 Map.Entry e3 = map.ceilingEntry(five);
423 assertEquals(five, e3.getKey());
424
425 Map.Entry e4 = map.ceilingEntry(six);
426 assertNull(e4);
427 }
428
429 /**
430 * pollFirstEntry returns entries in order
431 */
432 public void testPollFirstEntry() {
433 ConcurrentNavigableMap map = map5();
434 Map.Entry e = map.pollFirstEntry();
435 assertEquals(one, e.getKey());
436 assertEquals("A", e.getValue());
437 e = map.pollFirstEntry();
438 assertEquals(two, e.getKey());
439 map.put(one, "A");
440 e = map.pollFirstEntry();
441 assertEquals(one, e.getKey());
442 assertEquals("A", e.getValue());
443 e = map.pollFirstEntry();
444 assertEquals(three, e.getKey());
445 map.remove(four);
446 e = map.pollFirstEntry();
447 assertEquals(five, e.getKey());
448 try {
449 e.setValue("A");
450 shouldThrow();
451 } catch (UnsupportedOperationException success) {}
452 e = map.pollFirstEntry();
453 assertNull(e);
454 }
455
456 /**
457 * pollLastEntry returns entries in order
458 */
459 public void testPollLastEntry() {
460 ConcurrentNavigableMap map = map5();
461 Map.Entry e = map.pollLastEntry();
462 assertEquals(five, e.getKey());
463 assertEquals("E", e.getValue());
464 e = map.pollLastEntry();
465 assertEquals(four, e.getKey());
466 map.put(five, "E");
467 e = map.pollLastEntry();
468 assertEquals(five, e.getKey());
469 assertEquals("E", e.getValue());
470 e = map.pollLastEntry();
471 assertEquals(three, e.getKey());
472 map.remove(two);
473 e = map.pollLastEntry();
474 assertEquals(one, e.getKey());
475 try {
476 e.setValue("E");
477 shouldThrow();
478 } catch (UnsupportedOperationException success) {}
479 e = map.pollLastEntry();
480 assertNull(e);
481 }
482
483 /**
484 * size returns the correct values
485 */
486 public void testSize() {
487 ConcurrentNavigableMap map = map5();
488 ConcurrentNavigableMap empty = map0();
489 assertEquals(0, empty.size());
490 assertEquals(5, map.size());
491 }
492
493 /**
494 * toString contains toString of elements
495 */
496 public void testToString() {
497 ConcurrentNavigableMap map = map5();
498 String s = map.toString();
499 for (int i = 1; i <= 5; ++i) {
500 assertTrue(s.contains(String.valueOf(i)));
501 }
502 }
503
504 // Exception tests
505
506 /**
507 * get(null) of nonempty map throws NPE
508 */
509 public void testGet_NullPointerException() {
510 try {
511 ConcurrentNavigableMap c = map5();
512 c.get(null);
513 shouldThrow();
514 } catch (NullPointerException success) {}
515 }
516
517 /**
518 * containsKey(null) of nonempty map throws NPE
519 */
520 public void testContainsKey_NullPointerException() {
521 try {
522 ConcurrentNavigableMap c = map5();
523 c.containsKey(null);
524 shouldThrow();
525 } catch (NullPointerException success) {}
526 }
527
528 /**
529 * containsValue(null) throws NPE
530 */
531 public void testContainsValue_NullPointerException() {
532 try {
533 ConcurrentNavigableMap c = map0();
534 c.containsValue(null);
535 shouldThrow();
536 } catch (NullPointerException success) {}
537 }
538
539 /**
540 * put(null,x) throws NPE
541 */
542 public void testPut1_NullPointerException() {
543 try {
544 ConcurrentNavigableMap c = map5();
545 c.put(null, "whatever");
546 shouldThrow();
547 } catch (NullPointerException success) {}
548 }
549
550 /**
551 * putIfAbsent(null, x) throws NPE
552 */
553 public void testPutIfAbsent1_NullPointerException() {
554 try {
555 ConcurrentNavigableMap c = map5();
556 c.putIfAbsent(null, "whatever");
557 shouldThrow();
558 } catch (NullPointerException success) {}
559 }
560
561 /**
562 * replace(null, x) throws NPE
563 */
564 public void testReplace_NullPointerException() {
565 try {
566 ConcurrentNavigableMap c = map5();
567 c.replace(null, "whatever");
568 shouldThrow();
569 } catch (NullPointerException success) {}
570 }
571
572 /**
573 * replace(null, x, y) throws NPE
574 */
575 public void testReplaceValue_NullPointerException() {
576 try {
577 ConcurrentNavigableMap c = map5();
578 c.replace(null, one, "whatever");
579 shouldThrow();
580 } catch (NullPointerException success) {}
581 }
582
583 /**
584 * remove(null) throws NPE
585 */
586 public void testRemove1_NullPointerException() {
587 try {
588 ConcurrentNavigableMap c = map5();
589 c.remove(null);
590 shouldThrow();
591 } catch (NullPointerException success) {}
592 }
593
594 /**
595 * remove(null, x) throws NPE
596 */
597 public void testRemove2_NullPointerException() {
598 try {
599 ConcurrentNavigableMap c = map5();
600 c.remove(null, "whatever");
601 shouldThrow();
602 } catch (NullPointerException success) {}
603 }
604
605 /**
606 * A deserialized map equals original
607 */
608 public void testSerialization() throws Exception {
609 NavigableMap x = map5();
610 NavigableMap y = serialClone(x);
611
612 assertNotSame(x, y);
613 assertEquals(x.size(), y.size());
614 assertEquals(x.toString(), y.toString());
615 assertEquals(x, y);
616 assertEquals(y, x);
617 }
618
619 /**
620 * subMap returns map with keys in requested range
621 */
622 public void testSubMapContents() {
623 ConcurrentNavigableMap map = map5();
624 SortedMap sm = map.subMap(two, four);
625 assertEquals(two, sm.firstKey());
626 assertEquals(three, sm.lastKey());
627 assertEquals(2, sm.size());
628 assertFalse(sm.containsKey(one));
629 assertTrue(sm.containsKey(two));
630 assertTrue(sm.containsKey(three));
631 assertFalse(sm.containsKey(four));
632 assertFalse(sm.containsKey(five));
633 Iterator i = sm.keySet().iterator();
634 Object k;
635 k = (Integer)(i.next());
636 assertEquals(two, k);
637 k = (Integer)(i.next());
638 assertEquals(three, k);
639 assertFalse(i.hasNext());
640 Iterator j = sm.keySet().iterator();
641 j.next();
642 j.remove();
643 assertFalse(map.containsKey(two));
644 assertEquals(4, map.size());
645 assertEquals(1, sm.size());
646 assertEquals(three, sm.firstKey());
647 assertEquals(three, sm.lastKey());
648 assertEquals("C", sm.remove(three));
649 assertTrue(sm.isEmpty());
650 assertEquals(3, map.size());
651 }
652
653 public void testSubMapContents2() {
654 ConcurrentNavigableMap map = map5();
655 SortedMap sm = map.subMap(two, three);
656 assertEquals(1, sm.size());
657 assertEquals(two, sm.firstKey());
658 assertEquals(two, sm.lastKey());
659 assertFalse(sm.containsKey(one));
660 assertTrue(sm.containsKey(two));
661 assertFalse(sm.containsKey(three));
662 assertFalse(sm.containsKey(four));
663 assertFalse(sm.containsKey(five));
664 Iterator i = sm.keySet().iterator();
665 Object k;
666 k = (Integer)(i.next());
667 assertEquals(two, k);
668 assertFalse(i.hasNext());
669 Iterator j = sm.keySet().iterator();
670 j.next();
671 j.remove();
672 assertFalse(map.containsKey(two));
673 assertEquals(4, map.size());
674 assertEquals(0, sm.size());
675 assertTrue(sm.isEmpty());
676 assertSame(sm.remove(three), null);
677 assertEquals(4, map.size());
678 }
679
680 /**
681 * headMap returns map with keys in requested range
682 */
683 public void testHeadMapContents() {
684 ConcurrentNavigableMap map = map5();
685 SortedMap sm = map.headMap(four);
686 assertTrue(sm.containsKey(one));
687 assertTrue(sm.containsKey(two));
688 assertTrue(sm.containsKey(three));
689 assertFalse(sm.containsKey(four));
690 assertFalse(sm.containsKey(five));
691 Iterator i = sm.keySet().iterator();
692 Object k;
693 k = (Integer)(i.next());
694 assertEquals(one, k);
695 k = (Integer)(i.next());
696 assertEquals(two, k);
697 k = (Integer)(i.next());
698 assertEquals(three, k);
699 assertFalse(i.hasNext());
700 sm.clear();
701 assertTrue(sm.isEmpty());
702 assertEquals(2, map.size());
703 assertEquals(four, map.firstKey());
704 }
705
706 /**
707 * headMap returns map with keys in requested range
708 */
709 public void testTailMapContents() {
710 ConcurrentNavigableMap map = map5();
711 SortedMap sm = map.tailMap(two);
712 assertFalse(sm.containsKey(one));
713 assertTrue(sm.containsKey(two));
714 assertTrue(sm.containsKey(three));
715 assertTrue(sm.containsKey(four));
716 assertTrue(sm.containsKey(five));
717 Iterator i = sm.keySet().iterator();
718 Object k;
719 k = (Integer)(i.next());
720 assertEquals(two, k);
721 k = (Integer)(i.next());
722 assertEquals(three, k);
723 k = (Integer)(i.next());
724 assertEquals(four, k);
725 k = (Integer)(i.next());
726 assertEquals(five, k);
727 assertFalse(i.hasNext());
728
729 Iterator ei = sm.entrySet().iterator();
730 Map.Entry e;
731 e = (Map.Entry)(ei.next());
732 assertEquals(two, e.getKey());
733 assertEquals("B", e.getValue());
734 e = (Map.Entry)(ei.next());
735 assertEquals(three, e.getKey());
736 assertEquals("C", e.getValue());
737 e = (Map.Entry)(ei.next());
738 assertEquals(four, e.getKey());
739 assertEquals("D", e.getValue());
740 e = (Map.Entry)(ei.next());
741 assertEquals(five, e.getKey());
742 assertEquals("E", e.getValue());
743 assertFalse(i.hasNext());
744
745 SortedMap ssm = sm.tailMap(four);
746 assertEquals(four, ssm.firstKey());
747 assertEquals(five, ssm.lastKey());
748 assertEquals("D", ssm.remove(four));
749 assertEquals(1, ssm.size());
750 assertEquals(3, sm.size());
751 assertEquals(4, map.size());
752 }
753
754 /**
755 * clear removes all pairs
756 */
757 public void testDescendingClear() {
758 ConcurrentNavigableMap map = dmap5();
759 map.clear();
760 assertEquals(0, map.size());
761 }
762
763 /**
764 * Maps with same contents are equal
765 */
766 public void testDescendingEquals() {
767 ConcurrentNavigableMap map1 = dmap5();
768 ConcurrentNavigableMap map2 = dmap5();
769 assertEquals(map1, map2);
770 assertEquals(map2, map1);
771 map1.clear();
772 assertFalse(map1.equals(map2));
773 assertFalse(map2.equals(map1));
774 }
775
776 /**
777 * containsKey returns true for contained key
778 */
779 public void testDescendingContainsKey() {
780 ConcurrentNavigableMap map = dmap5();
781 assertTrue(map.containsKey(m1));
782 assertFalse(map.containsKey(zero));
783 }
784
785 /**
786 * containsValue returns true for held values
787 */
788 public void testDescendingContainsValue() {
789 ConcurrentNavigableMap map = dmap5();
790 assertTrue(map.containsValue("A"));
791 assertFalse(map.containsValue("Z"));
792 }
793
794 /**
795 * get returns the correct element at the given key,
796 * or null if not present
797 */
798 public void testDescendingGet() {
799 ConcurrentNavigableMap map = dmap5();
800 assertEquals("A", (String)map.get(m1));
801 ConcurrentNavigableMap empty = dmap0();
802 assertNull(empty.get(m1));
803 }
804
805 /**
806 * isEmpty is true of empty map and false for non-empty
807 */
808 public void testDescendingIsEmpty() {
809 ConcurrentNavigableMap empty = dmap0();
810 ConcurrentNavigableMap map = dmap5();
811 assertTrue(empty.isEmpty());
812 assertFalse(map.isEmpty());
813 }
814
815 /**
816 * firstKey returns first key
817 */
818 public void testDescendingFirstKey() {
819 ConcurrentNavigableMap map = dmap5();
820 assertEquals(m1, map.firstKey());
821 }
822
823 /**
824 * lastKey returns last key
825 */
826 public void testDescendingLastKey() {
827 ConcurrentNavigableMap map = dmap5();
828 assertEquals(m5, map.lastKey());
829 }
830
831 /**
832 * keySet returns a Set containing all the keys
833 */
834 public void testDescendingKeySet() {
835 ConcurrentNavigableMap map = dmap5();
836 Set s = map.keySet();
837 assertEquals(5, s.size());
838 assertTrue(s.contains(m1));
839 assertTrue(s.contains(m2));
840 assertTrue(s.contains(m3));
841 assertTrue(s.contains(m4));
842 assertTrue(s.contains(m5));
843 }
844
845 /**
846 * keySet is ordered
847 */
848 public void testDescendingKeySetOrder() {
849 ConcurrentNavigableMap map = dmap5();
850 Set s = map.keySet();
851 Iterator i = s.iterator();
852 Integer last = (Integer)i.next();
853 assertEquals(last, m1);
854 while (i.hasNext()) {
855 Integer k = (Integer)i.next();
856 assertTrue(last.compareTo(k) > 0);
857 last = k;
858 }
859 }
860
861 /**
862 * values collection contains all values
863 */
864 public void testDescendingValues() {
865 ConcurrentNavigableMap map = dmap5();
866 Collection s = map.values();
867 assertEquals(5, s.size());
868 assertTrue(s.contains("A"));
869 assertTrue(s.contains("B"));
870 assertTrue(s.contains("C"));
871 assertTrue(s.contains("D"));
872 assertTrue(s.contains("E"));
873 }
874
875 /**
876 * keySet.toArray returns contains all keys
877 */
878 public void testDescendingAscendingKeySetToArray() {
879 ConcurrentNavigableMap map = dmap5();
880 Set s = map.keySet();
881 Object[] ar = s.toArray();
882 assertTrue(s.containsAll(Arrays.asList(ar)));
883 assertEquals(5, ar.length);
884 ar[0] = m10;
885 assertFalse(s.containsAll(Arrays.asList(ar)));
886 }
887
888 /**
889 * descendingkeySet.toArray returns contains all keys
890 */
891 public void testDescendingDescendingKeySetToArray() {
892 ConcurrentNavigableMap map = dmap5();
893 Set s = map.descendingKeySet();
894 Object[] ar = s.toArray();
895 assertEquals(5, ar.length);
896 assertTrue(s.containsAll(Arrays.asList(ar)));
897 ar[0] = m10;
898 assertFalse(s.containsAll(Arrays.asList(ar)));
899 }
900
901 /**
902 * Values.toArray contains all values
903 */
904 public void testDescendingValuesToArray() {
905 ConcurrentNavigableMap map = dmap5();
906 Collection v = map.values();
907 Object[] ar = v.toArray();
908 ArrayList s = new ArrayList(Arrays.asList(ar));
909 assertEquals(5, ar.length);
910 assertTrue(s.contains("A"));
911 assertTrue(s.contains("B"));
912 assertTrue(s.contains("C"));
913 assertTrue(s.contains("D"));
914 assertTrue(s.contains("E"));
915 }
916
917 /**
918 * entrySet contains all pairs
919 */
920 public void testDescendingEntrySet() {
921 ConcurrentNavigableMap map = dmap5();
922 Set s = map.entrySet();
923 assertEquals(5, s.size());
924 Iterator it = s.iterator();
925 while (it.hasNext()) {
926 Map.Entry e = (Map.Entry) it.next();
927 assertTrue(
928 (e.getKey().equals(m1) && e.getValue().equals("A")) ||
929 (e.getKey().equals(m2) && e.getValue().equals("B")) ||
930 (e.getKey().equals(m3) && e.getValue().equals("C")) ||
931 (e.getKey().equals(m4) && e.getValue().equals("D")) ||
932 (e.getKey().equals(m5) && e.getValue().equals("E")));
933 }
934 }
935
936 /**
937 * putAll adds all key-value pairs from the given map
938 */
939 public void testDescendingPutAll() {
940 ConcurrentNavigableMap empty = dmap0();
941 ConcurrentNavigableMap map = dmap5();
942 empty.putAll(map);
943 assertEquals(5, empty.size());
944 assertTrue(empty.containsKey(m1));
945 assertTrue(empty.containsKey(m2));
946 assertTrue(empty.containsKey(m3));
947 assertTrue(empty.containsKey(m4));
948 assertTrue(empty.containsKey(m5));
949 }
950
951 /**
952 * putIfAbsent works when the given key is not present
953 */
954 public void testDescendingPutIfAbsent() {
955 ConcurrentNavigableMap map = dmap5();
956 map.putIfAbsent(six, "Z");
957 assertTrue(map.containsKey(six));
958 }
959
960 /**
961 * putIfAbsent does not add the pair if the key is already present
962 */
963 public void testDescendingPutIfAbsent2() {
964 ConcurrentNavigableMap map = dmap5();
965 assertEquals("A", map.putIfAbsent(m1, "Z"));
966 }
967
968 /**
969 * replace fails when the given key is not present
970 */
971 public void testDescendingReplace() {
972 ConcurrentNavigableMap map = dmap5();
973 assertNull(map.replace(six, "Z"));
974 assertFalse(map.containsKey(six));
975 }
976
977 /**
978 * replace succeeds if the key is already present
979 */
980 public void testDescendingReplace2() {
981 ConcurrentNavigableMap map = dmap5();
982 assertNotNull(map.replace(m1, "Z"));
983 assertEquals("Z", map.get(m1));
984 }
985
986 /**
987 * replace value fails when the given key not mapped to expected value
988 */
989 public void testDescendingReplaceValue() {
990 ConcurrentNavigableMap map = dmap5();
991 assertEquals("A", map.get(m1));
992 assertFalse(map.replace(m1, "Z", "Z"));
993 assertEquals("A", map.get(m1));
994 }
995
996 /**
997 * replace value succeeds when the given key mapped to expected value
998 */
999 public void testDescendingReplaceValue2() {
1000 ConcurrentNavigableMap map = dmap5();
1001 assertEquals("A", map.get(m1));
1002 assertTrue(map.replace(m1, "A", "Z"));
1003 assertEquals("Z", map.get(m1));
1004 }
1005
1006 /**
1007 * remove removes the correct key-value pair from the map
1008 */
1009 public void testDescendingRemove() {
1010 ConcurrentNavigableMap map = dmap5();
1011 map.remove(m5);
1012 assertEquals(4, map.size());
1013 assertFalse(map.containsKey(m5));
1014 }
1015
1016 /**
1017 * remove(key,value) removes only if pair present
1018 */
1019 public void testDescendingRemove2() {
1020 ConcurrentNavigableMap map = dmap5();
1021 assertTrue(map.containsKey(m5));
1022 assertEquals("E", map.get(m5));
1023 map.remove(m5, "E");
1024 assertEquals(4, map.size());
1025 assertFalse(map.containsKey(m5));
1026 map.remove(m4, "A");
1027 assertEquals(4, map.size());
1028 assertTrue(map.containsKey(m4));
1029 }
1030
1031 /**
1032 * lowerEntry returns preceding entry.
1033 */
1034 public void testDescendingLowerEntry() {
1035 ConcurrentNavigableMap map = dmap5();
1036 Map.Entry e1 = map.lowerEntry(m3);
1037 assertEquals(m2, e1.getKey());
1038
1039 Map.Entry e2 = map.lowerEntry(m6);
1040 assertEquals(m5, e2.getKey());
1041
1042 Map.Entry e3 = map.lowerEntry(m1);
1043 assertNull(e3);
1044
1045 Map.Entry e4 = map.lowerEntry(zero);
1046 assertNull(e4);
1047 }
1048
1049 /**
1050 * higherEntry returns next entry.
1051 */
1052 public void testDescendingHigherEntry() {
1053 ConcurrentNavigableMap map = dmap5();
1054 Map.Entry e1 = map.higherEntry(m3);
1055 assertEquals(m4, e1.getKey());
1056
1057 Map.Entry e2 = map.higherEntry(zero);
1058 assertEquals(m1, e2.getKey());
1059
1060 Map.Entry e3 = map.higherEntry(m5);
1061 assertNull(e3);
1062
1063 Map.Entry e4 = map.higherEntry(m6);
1064 assertNull(e4);
1065 }
1066
1067 /**
1068 * floorEntry returns preceding entry.
1069 */
1070 public void testDescendingFloorEntry() {
1071 ConcurrentNavigableMap map = dmap5();
1072 Map.Entry e1 = map.floorEntry(m3);
1073 assertEquals(m3, e1.getKey());
1074
1075 Map.Entry e2 = map.floorEntry(m6);
1076 assertEquals(m5, e2.getKey());
1077
1078 Map.Entry e3 = map.floorEntry(m1);
1079 assertEquals(m1, e3.getKey());
1080
1081 Map.Entry e4 = map.floorEntry(zero);
1082 assertNull(e4);
1083 }
1084
1085 /**
1086 * ceilingEntry returns next entry.
1087 */
1088 public void testDescendingCeilingEntry() {
1089 ConcurrentNavigableMap map = dmap5();
1090 Map.Entry e1 = map.ceilingEntry(m3);
1091 assertEquals(m3, e1.getKey());
1092
1093 Map.Entry e2 = map.ceilingEntry(zero);
1094 assertEquals(m1, e2.getKey());
1095
1096 Map.Entry e3 = map.ceilingEntry(m5);
1097 assertEquals(m5, e3.getKey());
1098
1099 Map.Entry e4 = map.ceilingEntry(m6);
1100 assertNull(e4);
1101 }
1102
1103 /**
1104 * pollFirstEntry returns entries in order
1105 */
1106 public void testDescendingPollFirstEntry() {
1107 ConcurrentNavigableMap map = dmap5();
1108 Map.Entry e = map.pollFirstEntry();
1109 assertEquals(m1, e.getKey());
1110 assertEquals("A", e.getValue());
1111 e = map.pollFirstEntry();
1112 assertEquals(m2, e.getKey());
1113 map.put(m1, "A");
1114 e = map.pollFirstEntry();
1115 assertEquals(m1, e.getKey());
1116 assertEquals("A", e.getValue());
1117 e = map.pollFirstEntry();
1118 assertEquals(m3, e.getKey());
1119 map.remove(m4);
1120 e = map.pollFirstEntry();
1121 assertEquals(m5, e.getKey());
1122 try {
1123 e.setValue("A");
1124 shouldThrow();
1125 } catch (UnsupportedOperationException success) {}
1126 e = map.pollFirstEntry();
1127 assertNull(e);
1128 }
1129
1130 /**
1131 * pollLastEntry returns entries in order
1132 */
1133 public void testDescendingPollLastEntry() {
1134 ConcurrentNavigableMap map = dmap5();
1135 Map.Entry e = map.pollLastEntry();
1136 assertEquals(m5, e.getKey());
1137 assertEquals("E", e.getValue());
1138 e = map.pollLastEntry();
1139 assertEquals(m4, e.getKey());
1140 map.put(m5, "E");
1141 e = map.pollLastEntry();
1142 assertEquals(m5, e.getKey());
1143 assertEquals("E", e.getValue());
1144 e = map.pollLastEntry();
1145 assertEquals(m3, e.getKey());
1146 map.remove(m2);
1147 e = map.pollLastEntry();
1148 assertEquals(m1, e.getKey());
1149 try {
1150 e.setValue("E");
1151 shouldThrow();
1152 } catch (UnsupportedOperationException success) {}
1153 e = map.pollLastEntry();
1154 assertNull(e);
1155 }
1156
1157 /**
1158 * size returns the correct values
1159 */
1160 public void testDescendingSize() {
1161 ConcurrentNavigableMap map = dmap5();
1162 ConcurrentNavigableMap empty = dmap0();
1163 assertEquals(0, empty.size());
1164 assertEquals(5, map.size());
1165 }
1166
1167 /**
1168 * toString contains toString of elements
1169 */
1170 public void testDescendingToString() {
1171 ConcurrentNavigableMap map = dmap5();
1172 String s = map.toString();
1173 for (int i = 1; i <= 5; ++i) {
1174 assertTrue(s.contains(String.valueOf(i)));
1175 }
1176 }
1177
1178 // Exception testDescendings
1179
1180 /**
1181 * get(null) of empty map throws NPE
1182 */
1183 public void testDescendingGet_NullPointerException() {
1184 try {
1185 ConcurrentNavigableMap c = dmap5();
1186 c.get(null);
1187 shouldThrow();
1188 } catch (NullPointerException success) {}
1189 }
1190
1191 /**
1192 * containsKey(null) of empty map throws NPE
1193 */
1194 public void testDescendingContainsKey_NullPointerException() {
1195 try {
1196 ConcurrentNavigableMap c = dmap5();
1197 c.containsKey(null);
1198 shouldThrow();
1199 } catch (NullPointerException success) {}
1200 }
1201
1202 /**
1203 * containsValue(null) throws NPE
1204 */
1205 public void testDescendingContainsValue_NullPointerException() {
1206 try {
1207 ConcurrentNavigableMap c = dmap0();
1208 c.containsValue(null);
1209 shouldThrow();
1210 } catch (NullPointerException success) {}
1211 }
1212
1213 /**
1214 * put(null,x) throws NPE
1215 */
1216 public void testDescendingPut1_NullPointerException() {
1217 try {
1218 ConcurrentNavigableMap c = dmap5();
1219 c.put(null, "whatever");
1220 shouldThrow();
1221 } catch (NullPointerException success) {}
1222 }
1223
1224 /**
1225 * putIfAbsent(null, x) throws NPE
1226 */
1227 public void testDescendingPutIfAbsent1_NullPointerException() {
1228 try {
1229 ConcurrentNavigableMap c = dmap5();
1230 c.putIfAbsent(null, "whatever");
1231 shouldThrow();
1232 } catch (NullPointerException success) {}
1233 }
1234
1235 /**
1236 * replace(null, x) throws NPE
1237 */
1238 public void testDescendingReplace_NullPointerException() {
1239 try {
1240 ConcurrentNavigableMap c = dmap5();
1241 c.replace(null, "whatever");
1242 shouldThrow();
1243 } catch (NullPointerException success) {}
1244 }
1245
1246 /**
1247 * replace(null, x, y) throws NPE
1248 */
1249 public void testDescendingReplaceValue_NullPointerException() {
1250 try {
1251 ConcurrentNavigableMap c = dmap5();
1252 c.replace(null, m1, "whatever");
1253 shouldThrow();
1254 } catch (NullPointerException success) {}
1255 }
1256
1257 /**
1258 * remove(null) throws NPE
1259 */
1260 public void testDescendingRemove1_NullPointerException() {
1261 try {
1262 ConcurrentNavigableMap c = dmap5();
1263 c.remove(null);
1264 shouldThrow();
1265 } catch (NullPointerException success) {}
1266 }
1267
1268 /**
1269 * remove(null, x) throws NPE
1270 */
1271 public void testDescendingRemove2_NullPointerException() {
1272 try {
1273 ConcurrentNavigableMap c = dmap5();
1274 c.remove(null, "whatever");
1275 shouldThrow();
1276 } catch (NullPointerException success) {}
1277 }
1278
1279 /**
1280 * A deserialized map equals original
1281 */
1282 public void testDescendingSerialization() throws Exception {
1283 NavigableMap x = dmap5();
1284 NavigableMap y = serialClone(x);
1285
1286 assertNotSame(x, y);
1287 assertEquals(x.size(), y.size());
1288 assertEquals(x.toString(), y.toString());
1289 assertEquals(x, y);
1290 assertEquals(y, x);
1291 }
1292
1293 /**
1294 * subMap returns map with keys in requested range
1295 */
1296 public void testDescendingSubMapContents() {
1297 ConcurrentNavigableMap map = dmap5();
1298 SortedMap sm = map.subMap(m2, m4);
1299 assertEquals(m2, sm.firstKey());
1300 assertEquals(m3, sm.lastKey());
1301 assertEquals(2, sm.size());
1302 assertFalse(sm.containsKey(m1));
1303 assertTrue(sm.containsKey(m2));
1304 assertTrue(sm.containsKey(m3));
1305 assertFalse(sm.containsKey(m4));
1306 assertFalse(sm.containsKey(m5));
1307 Iterator i = sm.keySet().iterator();
1308 Object k;
1309 k = (Integer)(i.next());
1310 assertEquals(m2, k);
1311 k = (Integer)(i.next());
1312 assertEquals(m3, k);
1313 assertFalse(i.hasNext());
1314 Iterator j = sm.keySet().iterator();
1315 j.next();
1316 j.remove();
1317 assertFalse(map.containsKey(m2));
1318 assertEquals(4, map.size());
1319 assertEquals(1, sm.size());
1320 assertEquals(m3, sm.firstKey());
1321 assertEquals(m3, sm.lastKey());
1322 assertEquals("C", sm.remove(m3));
1323 assertTrue(sm.isEmpty());
1324 assertEquals(3, map.size());
1325 }
1326
1327 public void testDescendingSubMapContents2() {
1328 ConcurrentNavigableMap map = dmap5();
1329 SortedMap sm = map.subMap(m2, m3);
1330 assertEquals(1, sm.size());
1331 assertEquals(m2, sm.firstKey());
1332 assertEquals(m2, sm.lastKey());
1333 assertFalse(sm.containsKey(m1));
1334 assertTrue(sm.containsKey(m2));
1335 assertFalse(sm.containsKey(m3));
1336 assertFalse(sm.containsKey(m4));
1337 assertFalse(sm.containsKey(m5));
1338 Iterator i = sm.keySet().iterator();
1339 Object k;
1340 k = (Integer)(i.next());
1341 assertEquals(m2, k);
1342 assertFalse(i.hasNext());
1343 Iterator j = sm.keySet().iterator();
1344 j.next();
1345 j.remove();
1346 assertFalse(map.containsKey(m2));
1347 assertEquals(4, map.size());
1348 assertEquals(0, sm.size());
1349 assertTrue(sm.isEmpty());
1350 assertSame(sm.remove(m3), null);
1351 assertEquals(4, map.size());
1352 }
1353
1354 /**
1355 * headMap returns map with keys in requested range
1356 */
1357 public void testDescendingHeadMapContents() {
1358 ConcurrentNavigableMap map = dmap5();
1359 SortedMap sm = map.headMap(m4);
1360 assertTrue(sm.containsKey(m1));
1361 assertTrue(sm.containsKey(m2));
1362 assertTrue(sm.containsKey(m3));
1363 assertFalse(sm.containsKey(m4));
1364 assertFalse(sm.containsKey(m5));
1365 Iterator i = sm.keySet().iterator();
1366 Object k;
1367 k = (Integer)(i.next());
1368 assertEquals(m1, k);
1369 k = (Integer)(i.next());
1370 assertEquals(m2, k);
1371 k = (Integer)(i.next());
1372 assertEquals(m3, k);
1373 assertFalse(i.hasNext());
1374 sm.clear();
1375 assertTrue(sm.isEmpty());
1376 assertEquals(2, map.size());
1377 assertEquals(m4, map.firstKey());
1378 }
1379
1380 /**
1381 * headMap returns map with keys in requested range
1382 */
1383 public void testDescendingTailMapContents() {
1384 ConcurrentNavigableMap map = dmap5();
1385 SortedMap sm = map.tailMap(m2);
1386 assertFalse(sm.containsKey(m1));
1387 assertTrue(sm.containsKey(m2));
1388 assertTrue(sm.containsKey(m3));
1389 assertTrue(sm.containsKey(m4));
1390 assertTrue(sm.containsKey(m5));
1391 Iterator i = sm.keySet().iterator();
1392 Object k;
1393 k = (Integer)(i.next());
1394 assertEquals(m2, k);
1395 k = (Integer)(i.next());
1396 assertEquals(m3, k);
1397 k = (Integer)(i.next());
1398 assertEquals(m4, k);
1399 k = (Integer)(i.next());
1400 assertEquals(m5, k);
1401 assertFalse(i.hasNext());
1402
1403 Iterator ei = sm.entrySet().iterator();
1404 Map.Entry e;
1405 e = (Map.Entry)(ei.next());
1406 assertEquals(m2, e.getKey());
1407 assertEquals("B", e.getValue());
1408 e = (Map.Entry)(ei.next());
1409 assertEquals(m3, e.getKey());
1410 assertEquals("C", e.getValue());
1411 e = (Map.Entry)(ei.next());
1412 assertEquals(m4, e.getKey());
1413 assertEquals("D", e.getValue());
1414 e = (Map.Entry)(ei.next());
1415 assertEquals(m5, e.getKey());
1416 assertEquals("E", e.getValue());
1417 assertFalse(i.hasNext());
1418
1419 SortedMap ssm = sm.tailMap(m4);
1420 assertEquals(m4, ssm.firstKey());
1421 assertEquals(m5, ssm.lastKey());
1422 assertEquals("D", ssm.remove(m4));
1423 assertEquals(1, ssm.size());
1424 assertEquals(3, sm.size());
1425 assertEquals(4, map.size());
1426 }
1427
1428}