ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/TreeSetTest.java
Revision: 1.1
Committed: Tue Dec 28 16:15:59 2004 UTC (19 years, 4 months ago) by dl
Branch: MAIN
Log Message:
Integrate tests for jsr166x classes

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     * http://creativecommons.org/licenses/publicdomain
5     */
6    
7     import junit.framework.*;
8     import java.util.*;
9     import java.util.concurrent.*;
10     import java.io.*;
11    
12     public class TreeSetTest extends JSR166TestCase {
13     public static void main(String[] args) {
14     junit.textui.TestRunner.run (suite());
15     }
16     public static Test suite() {
17     return new TestSuite(TreeSetTest.class);
18     }
19    
20     static class MyReverseComparator implements Comparator {
21     public int compare(Object x, Object y) {
22     int i = ((Integer)x).intValue();
23     int j = ((Integer)y).intValue();
24     if (i < j) return 1;
25     if (i > j) return -1;
26     return 0;
27     }
28     }
29    
30     /**
31     * The number of elements to place in collections, arrays, etc.
32     */
33     static final int SIZE = 20;
34    
35     /**
36     * Create a set of given size containing consecutive
37     * Integers 0 ... n.
38     */
39     private TreeSet populatedSet(int n) {
40     TreeSet q = new TreeSet();
41     assertTrue(q.isEmpty());
42     for(int i = n-1; i >= 0; i-=2)
43     assertTrue(q.add(new Integer(i)));
44     for(int i = (n & 1); i < n; i+=2)
45     assertTrue(q.add(new Integer(i)));
46     assertFalse(q.isEmpty());
47     assertEquals(n, q.size());
48     return q;
49     }
50    
51     /**
52     * Create set of first 5 ints
53     */
54     private TreeSet set5() {
55     TreeSet q = new TreeSet();
56     assertTrue(q.isEmpty());
57     q.add(one);
58     q.add(two);
59     q.add(three);
60     q.add(four);
61     q.add(five);
62     assertEquals(5, q.size());
63     return q;
64     }
65    
66     /**
67     * A new set has unbounded capacity
68     */
69     public void testConstructor1() {
70     assertEquals(0, new TreeSet().size());
71     }
72    
73     /**
74     * Initializing from null Collection throws NPE
75     */
76     public void testConstructor3() {
77     try {
78     TreeSet q = new TreeSet((Collection)null);
79     shouldThrow();
80     }
81     catch (NullPointerException success) {}
82     }
83    
84     /**
85     * Initializing from Collection of null elements throws NPE
86     */
87     public void testConstructor4() {
88     try {
89     Integer[] ints = new Integer[SIZE];
90     TreeSet q = new TreeSet(Arrays.asList(ints));
91     shouldThrow();
92     }
93     catch (NullPointerException success) {}
94     }
95    
96     /**
97     * Initializing from Collection with some null elements throws NPE
98     */
99     public void testConstructor5() {
100     try {
101     Integer[] ints = new Integer[SIZE];
102     for (int i = 0; i < SIZE-1; ++i)
103     ints[i] = new Integer(i);
104     TreeSet q = new TreeSet(Arrays.asList(ints));
105     shouldThrow();
106     }
107     catch (NullPointerException success) {}
108     }
109    
110     /**
111     * Set contains all elements of collection used to initialize
112     */
113     public void testConstructor6() {
114     try {
115     Integer[] ints = new Integer[SIZE];
116     for (int i = 0; i < SIZE; ++i)
117     ints[i] = new Integer(i);
118     TreeSet q = new TreeSet(Arrays.asList(ints));
119     for (int i = 0; i < SIZE; ++i)
120     assertEquals(ints[i], q.pollFirst());
121     }
122     finally {}
123     }
124    
125     /**
126     * The comparator used in constructor is used
127     */
128     public void testConstructor7() {
129     try {
130     MyReverseComparator cmp = new MyReverseComparator();
131     TreeSet q = new TreeSet(cmp);
132     assertEquals(cmp, q.comparator());
133     Integer[] ints = new Integer[SIZE];
134     for (int i = 0; i < SIZE; ++i)
135     ints[i] = new Integer(i);
136     q.addAll(Arrays.asList(ints));
137     for (int i = SIZE-1; i >= 0; --i)
138     assertEquals(ints[i], q.pollFirst());
139     }
140     finally {}
141     }
142    
143     /**
144     * isEmpty is true before add, false after
145     */
146     public void testEmpty() {
147     TreeSet q = new TreeSet();
148     assertTrue(q.isEmpty());
149     q.add(new Integer(1));
150     assertFalse(q.isEmpty());
151     q.add(new Integer(2));
152     q.pollFirst();
153     q.pollFirst();
154     assertTrue(q.isEmpty());
155     }
156    
157     /**
158     * size changes when elements added and removed
159     */
160     public void testSize() {
161     TreeSet q = populatedSet(SIZE);
162     for (int i = 0; i < SIZE; ++i) {
163     assertEquals(SIZE-i, q.size());
164     q.pollFirst();
165     }
166     for (int i = 0; i < SIZE; ++i) {
167     assertEquals(i, q.size());
168     q.add(new Integer(i));
169     }
170     }
171    
172     /**
173     * add(null) throws NPE if nonempty
174     */
175     public void testAddNull() {
176     try {
177     TreeSet q = populatedSet(SIZE);
178     q.add(null);
179     shouldThrow();
180     } catch (NullPointerException success) { }
181     }
182    
183     /**
184     * Add of comparable element succeeds
185     */
186     public void testAdd() {
187     TreeSet q = new TreeSet();
188     assertTrue(q.add(zero));
189     assertTrue(q.add(one));
190     }
191    
192     /**
193     * Add of duplicate element fails
194     */
195     public void testAddDup() {
196     TreeSet q = new TreeSet();
197     assertTrue(q.add(zero));
198     assertFalse(q.add(zero));
199     }
200    
201     /**
202     * Add of non-Comparable throws CCE
203     */
204     public void testAddNonComparable() {
205     try {
206     TreeSet q = new TreeSet();
207     q.add(new Object());
208     q.add(new Object());
209     q.add(new Object());
210     shouldThrow();
211     }
212     catch(ClassCastException success) {}
213     }
214    
215     /**
216     * addAll(null) throws NPE
217     */
218     public void testAddAll1() {
219     try {
220     TreeSet q = new TreeSet();
221     q.addAll(null);
222     shouldThrow();
223     }
224     catch (NullPointerException success) {}
225     }
226     /**
227     * addAll of a collection with null elements throws NPE
228     */
229     public void testAddAll2() {
230     try {
231     TreeSet q = new TreeSet();
232     Integer[] ints = new Integer[SIZE];
233     q.addAll(Arrays.asList(ints));
234     shouldThrow();
235     }
236     catch (NullPointerException success) {}
237     }
238     /**
239     * addAll of a collection with any null elements throws NPE after
240     * possibly adding some elements
241     */
242     public void testAddAll3() {
243     try {
244     TreeSet q = new TreeSet();
245     Integer[] ints = new Integer[SIZE];
246     for (int i = 0; i < SIZE-1; ++i)
247     ints[i] = new Integer(i);
248     q.addAll(Arrays.asList(ints));
249     shouldThrow();
250     }
251     catch (NullPointerException success) {}
252     }
253    
254     /**
255     * Set contains all elements of successful addAll
256     */
257     public void testAddAll5() {
258     try {
259     Integer[] empty = new Integer[0];
260     Integer[] ints = new Integer[SIZE];
261     for (int i = 0; i < SIZE; ++i)
262     ints[i] = new Integer(SIZE-1-i);
263     TreeSet q = new TreeSet();
264     assertFalse(q.addAll(Arrays.asList(empty)));
265     assertTrue(q.addAll(Arrays.asList(ints)));
266     for (int i = 0; i < SIZE; ++i)
267     assertEquals(new Integer(i), q.pollFirst());
268     }
269     finally {}
270     }
271    
272     /**
273     * pollFirst succeeds unless empty
274     */
275     public void testPollFirst() {
276     TreeSet q = populatedSet(SIZE);
277     for (int i = 0; i < SIZE; ++i) {
278     assertEquals(i, ((Integer)q.pollFirst()).intValue());
279     }
280     assertNull(q.pollFirst());
281     }
282    
283     /**
284     * pollLast succeeds unless empty
285     */
286     public void testPollLast() {
287     TreeSet q = populatedSet(SIZE);
288     for (int i = SIZE-1; i >= 0; --i) {
289     assertEquals(i, ((Integer)q.pollLast()).intValue());
290     }
291     assertNull(q.pollFirst());
292     }
293    
294    
295     /**
296     * remove(x) removes x and returns true if present
297     */
298     public void testRemoveElement() {
299     TreeSet q = populatedSet(SIZE);
300     for (int i = 1; i < SIZE; i+=2) {
301     assertTrue(q.remove(new Integer(i)));
302     }
303     for (int i = 0; i < SIZE; i+=2) {
304     assertTrue(q.remove(new Integer(i)));
305     assertFalse(q.remove(new Integer(i+1)));
306     }
307     assertTrue(q.isEmpty());
308     }
309    
310     /**
311     * contains(x) reports true when elements added but not yet removed
312     */
313     public void testContains() {
314     TreeSet q = populatedSet(SIZE);
315     for (int i = 0; i < SIZE; ++i) {
316     assertTrue(q.contains(new Integer(i)));
317     q.pollFirst();
318     assertFalse(q.contains(new Integer(i)));
319     }
320     }
321    
322     /**
323     * clear removes all elements
324     */
325     public void testClear() {
326     TreeSet q = populatedSet(SIZE);
327     q.clear();
328     assertTrue(q.isEmpty());
329     assertEquals(0, q.size());
330     q.add(new Integer(1));
331     assertFalse(q.isEmpty());
332     q.clear();
333     assertTrue(q.isEmpty());
334     }
335    
336     /**
337     * containsAll(c) is true when c contains a subset of elements
338     */
339     public void testContainsAll() {
340     TreeSet q = populatedSet(SIZE);
341     TreeSet p = new TreeSet();
342     for (int i = 0; i < SIZE; ++i) {
343     assertTrue(q.containsAll(p));
344     assertFalse(p.containsAll(q));
345     p.add(new Integer(i));
346     }
347     assertTrue(p.containsAll(q));
348     }
349    
350     /**
351     * retainAll(c) retains only those elements of c and reports true if changed
352     */
353     public void testRetainAll() {
354     TreeSet q = populatedSet(SIZE);
355     TreeSet p = populatedSet(SIZE);
356     for (int i = 0; i < SIZE; ++i) {
357     boolean changed = q.retainAll(p);
358     if (i == 0)
359     assertFalse(changed);
360     else
361     assertTrue(changed);
362    
363     assertTrue(q.containsAll(p));
364     assertEquals(SIZE-i, q.size());
365     p.pollFirst();
366     }
367     }
368    
369     /**
370     * removeAll(c) removes only those elements of c and reports true if changed
371     */
372     public void testRemoveAll() {
373     for (int i = 1; i < SIZE; ++i) {
374     TreeSet q = populatedSet(SIZE);
375     TreeSet p = populatedSet(i);
376     assertTrue(q.removeAll(p));
377     assertEquals(SIZE-i, q.size());
378     for (int j = 0; j < i; ++j) {
379     Integer I = (Integer)(p.pollFirst());
380     assertFalse(q.contains(I));
381     }
382     }
383     }
384    
385    
386    
387     /**
388     * lower returns preceding element
389     */
390     public void testLower() {
391     TreeSet q = set5();
392     Object e1 = q.lower(three);
393     assertEquals(two, e1);
394    
395     Object e2 = q.lower(six);
396     assertEquals(five, e2);
397    
398     Object e3 = q.lower(one);
399     assertNull(e3);
400    
401     Object e4 = q.lower(zero);
402     assertNull(e4);
403    
404     }
405    
406     /**
407     * higher returns next element
408     */
409     public void testHigher() {
410     TreeSet q = set5();
411     Object e1 = q.higher(three);
412     assertEquals(four, e1);
413    
414     Object e2 = q.higher(zero);
415     assertEquals(one, e2);
416    
417     Object e3 = q.higher(five);
418     assertNull(e3);
419    
420     Object e4 = q.higher(six);
421     assertNull(e4);
422    
423     }
424    
425     /**
426     * floor returns preceding element
427     */
428     public void testFloor() {
429     TreeSet q = set5();
430     Object e1 = q.floor(three);
431     assertEquals(three, e1);
432    
433     Object e2 = q.floor(six);
434     assertEquals(five, e2);
435    
436     Object e3 = q.floor(one);
437     assertEquals(one, e3);
438    
439     Object e4 = q.floor(zero);
440     assertNull(e4);
441    
442     }
443    
444     /**
445     * ceiling returns next element
446     */
447     public void testCeiling() {
448     TreeSet q = set5();
449     Object e1 = q.ceiling(three);
450     assertEquals(three, e1);
451    
452     Object e2 = q.ceiling(zero);
453     assertEquals(one, e2);
454    
455     Object e3 = q.ceiling(five);
456     assertEquals(five, e3);
457    
458     Object e4 = q.ceiling(six);
459     assertNull(e4);
460    
461     }
462    
463     /**
464     * toArray contains all elements
465     */
466     public void testToArray() {
467     TreeSet q = populatedSet(SIZE);
468     Object[] o = q.toArray();
469     Arrays.sort(o);
470     for(int i = 0; i < o.length; i++)
471     assertEquals(o[i], q.pollFirst());
472     }
473    
474     /**
475     * toArray(a) contains all elements
476     */
477     public void testToArray2() {
478     TreeSet q = populatedSet(SIZE);
479     Integer[] ints = new Integer[SIZE];
480     ints = (Integer[])q.toArray(ints);
481     Arrays.sort(ints);
482     for(int i = 0; i < ints.length; i++)
483     assertEquals(ints[i], q.pollFirst());
484     }
485    
486     /**
487     * iterator iterates through all elements
488     */
489     public void testIterator() {
490     TreeSet q = populatedSet(SIZE);
491     int i = 0;
492     Iterator it = q.iterator();
493     while(it.hasNext()) {
494     assertTrue(q.contains(it.next()));
495     ++i;
496     }
497     assertEquals(i, SIZE);
498     }
499    
500     /**
501     * iterator of empty set has no elements
502     */
503     public void testEmptyIterator() {
504     TreeSet q = new TreeSet();
505     int i = 0;
506     Iterator it = q.iterator();
507     while(it.hasNext()) {
508     assertTrue(q.contains(it.next()));
509     ++i;
510     }
511     assertEquals(i, 0);
512     }
513    
514     /**
515     * iterator.remove removes current element
516     */
517     public void testIteratorRemove () {
518     final TreeSet q = new TreeSet();
519     q.add(new Integer(2));
520     q.add(new Integer(1));
521     q.add(new Integer(3));
522    
523     Iterator it = q.iterator();
524     it.next();
525     it.remove();
526    
527     it = q.iterator();
528     assertEquals(it.next(), new Integer(2));
529     assertEquals(it.next(), new Integer(3));
530     assertFalse(it.hasNext());
531     }
532    
533    
534     /**
535     * toString contains toStrings of elements
536     */
537     public void testToString() {
538     TreeSet q = populatedSet(SIZE);
539     String s = q.toString();
540     for (int i = 0; i < SIZE; ++i) {
541     assertTrue(s.indexOf(String.valueOf(i)) >= 0);
542     }
543     }
544    
545     /**
546     * A deserialized serialized set has same elements
547     */
548     public void testSerialization() {
549     TreeSet q = populatedSet(SIZE);
550     try {
551     ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
552     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
553     out.writeObject(q);
554     out.close();
555    
556     ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
557     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
558     TreeSet r = (TreeSet)in.readObject();
559     assertEquals(q.size(), r.size());
560     while (!q.isEmpty())
561     assertEquals(q.pollFirst(), r.pollFirst());
562     } catch(Exception e){
563     e.printStackTrace();
564     unexpectedException();
565     }
566     }
567    
568     /**
569     * subSet returns set with keys in requested range
570     */
571     public void testSubSetContents() {
572     TreeSet set = set5();
573     SortedSet sm = set.subSet(two, four);
574     assertEquals(two, sm.first());
575     assertEquals(three, sm.last());
576     assertEquals(2, sm.size());
577     assertFalse(sm.contains(one));
578     assertTrue(sm.contains(two));
579     assertTrue(sm.contains(three));
580     assertFalse(sm.contains(four));
581     assertFalse(sm.contains(five));
582     Iterator i = sm.iterator();
583     Object k;
584     k = (Integer)(i.next());
585     assertEquals(two, k);
586     k = (Integer)(i.next());
587     assertEquals(three, k);
588     assertFalse(i.hasNext());
589     Iterator j = sm.iterator();
590     j.next();
591     j.remove();
592     assertFalse(set.contains(two));
593     assertEquals(4, set.size());
594     assertEquals(1, sm.size());
595     assertEquals(three, sm.first());
596     assertEquals(three, sm.last());
597     assertTrue(sm.remove(three));
598     assertTrue(sm.isEmpty());
599     assertEquals(3, set.size());
600     }
601    
602     public void testSubSetContents2() {
603     TreeSet set = set5();
604     SortedSet sm = set.subSet(two, three);
605     assertEquals(1, sm.size());
606     assertEquals(two, sm.first());
607     assertEquals(two, sm.last());
608     assertFalse(sm.contains(one));
609     assertTrue(sm.contains(two));
610     assertFalse(sm.contains(three));
611     assertFalse(sm.contains(four));
612     assertFalse(sm.contains(five));
613     Iterator i = sm.iterator();
614     Object k;
615     k = (Integer)(i.next());
616     assertEquals(two, k);
617     assertFalse(i.hasNext());
618     Iterator j = sm.iterator();
619     j.next();
620     j.remove();
621     assertFalse(set.contains(two));
622     assertEquals(4, set.size());
623     assertEquals(0, sm.size());
624     assertTrue(sm.isEmpty());
625     assertFalse(sm.remove(three));
626     assertEquals(4, set.size());
627     }
628    
629     /**
630     * headSet returns set with keys in requested range
631     */
632     public void testHeadSetContents() {
633     TreeSet set = set5();
634     SortedSet sm = set.headSet(four);
635     assertTrue(sm.contains(one));
636     assertTrue(sm.contains(two));
637     assertTrue(sm.contains(three));
638     assertFalse(sm.contains(four));
639     assertFalse(sm.contains(five));
640     Iterator i = sm.iterator();
641     Object k;
642     k = (Integer)(i.next());
643     assertEquals(one, k);
644     k = (Integer)(i.next());
645     assertEquals(two, k);
646     k = (Integer)(i.next());
647     assertEquals(three, k);
648     assertFalse(i.hasNext());
649     sm.clear();
650     assertTrue(sm.isEmpty());
651     assertEquals(2, set.size());
652     assertEquals(four, set.first());
653     }
654    
655     /**
656     * tailSet returns set with keys in requested range
657     */
658     public void testTailSetContents() {
659     TreeSet set = set5();
660     SortedSet sm = set.tailSet(two);
661     assertFalse(sm.contains(one));
662     assertTrue(sm.contains(two));
663     assertTrue(sm.contains(three));
664     assertTrue(sm.contains(four));
665     assertTrue(sm.contains(five));
666     Iterator i = sm.iterator();
667     Object k;
668     k = (Integer)(i.next());
669     assertEquals(two, k);
670     k = (Integer)(i.next());
671     assertEquals(three, k);
672     k = (Integer)(i.next());
673     assertEquals(four, k);
674     k = (Integer)(i.next());
675     assertEquals(five, k);
676     assertFalse(i.hasNext());
677    
678     SortedSet ssm = sm.tailSet(four);
679     assertEquals(four, ssm.first());
680     assertEquals(five, ssm.last());
681     assertTrue(ssm.remove(four));
682     assertEquals(1, ssm.size());
683     assertEquals(3, sm.size());
684     assertEquals(4, set.size());
685     }
686    
687     }