ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentSkipListSubMapTest.java
Revision: 1.17
Committed: Tue Mar 15 19:47:06 2011 UTC (13 years, 1 month ago) by jsr166
Branch: MAIN
CVS Tags: release-1_7_0
Changes since 1.16: +1 -1 lines
Log Message:
Update Creative Commons license URL in legal notices

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