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