1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations under
15 * the License.
16 */
17
18package org.apache.harmony.tests.java.util;
19
20import junit.framework.TestCase;
21import org.apache.harmony.testframework.serialization.SerializationTest;
22import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
23import tests.util.SerializationTester;
24import java.io.Serializable;
25import java.util.ArrayList;
26import java.util.Arrays;
27import java.util.Collection;
28import java.util.Collections;
29import java.util.Comparator;
30import java.util.HashMap;
31import java.util.HashSet;
32import java.util.LinkedList;
33import java.util.List;
34import java.util.Map;
35import java.util.RandomAccess;
36import java.util.Set;
37import java.util.SortedMap;
38import java.util.SortedSet;
39import java.util.TreeMap;
40import java.util.TreeSet;
41import java.util.Vector;
42
43public class Collections2Test extends TestCase {
44
45    private static final SerializableAssert comparator = new SerializableAssert() {
46        public void assertDeserialized(Serializable reference, Serializable test) {
47            assertSame(reference, test);
48        }
49    };
50
51    /**
52     * java.util.Collections#binarySearch(java.util.List,
53     *java.lang.Object, java.util.Comparator)
54     */
55    public void test_binarySearchLjava_util_ListLjava_lang_ObjectLjava_util_Comparator() {
56        // Regression for HARMONY-94
57        LinkedList<Integer> lst = new LinkedList<Integer>();
58        lst.add(new Integer(30));
59        Collections.sort(lst, null);
60        int index = Collections.binarySearch(lst, new Integer(2), null);
61        assertEquals(-1, index);
62    }
63
64    /**
65     * java.util.Collections#binarySearch(java.util.List,
66     *java.lang.Object)
67     */
68    @SuppressWarnings("unchecked")
69    public void test_binarySearchLjava_util_ListLjava_lang_Object() {
70        // regression for Harmony-1367
71        List localList = new LinkedList();
72        assertEquals(-1, Collections.binarySearch(localList, new Object()));
73        localList.add(new Object());
74        try {
75            Collections.binarySearch(localList, new Integer(1));
76            fail("Should throw ClassCastException");
77        } catch (ClassCastException e) {
78            // expected
79        }
80    }
81
82    /**
83     * java.util.Collections#rotate(java.util.List, int)
84     */
85    public void test_rotateLjava_util_ListI() {
86        // Regression for HARMONY-19 Rotate an *empty* list
87        Collections.rotate(new ArrayList<Object>(), 25);
88
89        // Regression for HARMONY-20
90        List<String> list = new ArrayList<String>();
91        list.add(0, "zero");
92        list.add(1, "one");
93        list.add(2, "two");
94        list.add(3, "three");
95        list.add(4, "four");
96
97        Collections.rotate(list, Integer.MIN_VALUE);
98        assertEquals("Rotated incorrectly at position 0, ", "three",
99                list.get(0));
100        assertEquals("Rotated incorrectly at position 1, ", "four",
101                list.get(1));
102        assertEquals("Rotated incorrectly at position 2, ", "zero",
103                list.get(2));
104        assertEquals("Rotated incorrectly at position 3, ", "one",
105                list.get(3));
106        assertEquals("Rotated incorrectly at position 4, ", "two",
107                list.get(4));
108    }
109
110    /**
111     * java.util.Collections#synchronizedCollection(java.util.Collection)
112     */
113    public void test_synchronizedCollectionLjava_util_Collection() {
114        try {
115            // Regression for HARMONY-93
116            Collections.synchronizedCollection(null);
117            fail("Assert 0: synchronizedCollection(null) must throw NPE");
118        } catch (NullPointerException e) {
119            // expected
120        }
121    }
122
123    /**
124     * java.util.Collections#synchronizedSortedMap(java.util.SortedMap)
125     */
126    public void test_synchronizedSortedMapLjava_util_SortedMap() {
127        try {
128            // Regression for HARMONY-93
129            Collections.synchronizedSortedMap(null);
130            fail("Assert 0: synchronizedSortedMap(null) must throw NPE");
131        } catch (NullPointerException e) {
132            // expected
133        }
134    }
135
136    /**
137     * java.util.Collections#synchronizedMap(java.util.Map)
138     */
139    public void test_synchronizedMapLjava_util_Map() {
140        try {
141            // Regression for HARMONY-93
142            Collections.synchronizedMap(null);
143            fail("Assert 0: synchronizedMap(map) must throw NPE");
144        } catch (NullPointerException e) {
145            // expected
146        }
147    }
148
149    /**
150     * java.util.Collections#synchronizedSet(java.util.Set)
151     */
152    public void test_synchronizedSetLjava_util_Set() {
153        try {
154            // Regression for HARMONY-93
155            Collections.synchronizedSet(null);
156            fail("Assert 0: synchronizedSet(set) must throw NPE");
157        } catch (NullPointerException e) {
158            // expected
159        }
160    }
161
162    /**
163     * java.util.Collections#synchronizedSortedSet(java.util.SortedSet)
164     */
165    public void test_synchronizedSortedSetLjava_util_SortedSet() {
166        try {
167            // Regression for HARMONY-93
168            Collections.synchronizedSortedSet(null);
169            fail("Assert 0: synchronizedSortedSet(null) must throw NPE");
170        } catch (NullPointerException e) {
171            // expected
172        }
173    }
174
175    /**
176     * java.util.Collections#unmodifiableCollection(java.util.Collection)
177     */
178    public void test_unmodifiableCollectionLjava_util_Collection() {
179        try {
180            // Regression for HARMONY-93
181            Collections.unmodifiableCollection(null);
182            fail("Assert 0: unmodifiableCollection(null) must throw NPE");
183        } catch (NullPointerException e) {
184            // expected
185        }
186    }
187
188    /**
189     * java.util.Collections#unmodifiableMap(java.util.Map)
190     */
191    public void test_unmodifiableMapLjava_util_Map() {
192        try {
193            // Regression for HARMONY-93
194            Collections.unmodifiableMap(null);
195            fail("Assert 0: unmodifiableMap(null) must throw NPE");
196        } catch (NullPointerException e) {
197            // expected
198        }
199    }
200
201    /**
202     * java.util.Collections#unmodifiableSet(java.util.Set)
203     */
204    public void test_unmodifiableSetLjava_util_Set() {
205        try {
206            // Regression for HARMONY-93
207            Collections.unmodifiableSet(null);
208            fail("Assert 0: unmodifiableSet(null) must throw NPE");
209        } catch (NullPointerException e) {
210            // expected
211        }
212    }
213
214    /**
215     * java.util.Collections#unmodifiableSortedMap(java.util.SortedMap)
216     */
217    public void test_unmodifiableSortedMapLjava_util_SortedMap() {
218        try {
219            // Regression for HARMONY-93
220            Collections.unmodifiableSortedMap(null);
221            fail("Assert 0: unmodifiableSortedMap(null) must throw NPE");
222        } catch (NullPointerException e) {
223            // expected
224        }
225    }
226
227    /**
228     * java.util.Collections#unmodifiableSortedSet(java.util.SortedSet)
229     */
230    public void test_unmodifiableSortedSetLjava_util_SortedSet() {
231        try {
232            // Regression for HARMONY-93
233            Collections.unmodifiableSortedSet(null);
234            fail("Assert 0: unmodifiableSortedSet(null) must throw NPE");
235        } catch (NullPointerException e) {
236            // expected
237        }
238    }
239
240    /**
241     * java.util.Collections#frequency(java.util.Collection, Object)
242     */
243    public void test_frequencyLjava_util_CollectionLint() {
244        try {
245            Collections.frequency(null, null);
246            fail("Assert 0: frequency(null,<any>) must throw NPE");
247        } catch (NullPointerException e) {
248        }
249
250        List<String> strings = Arrays.asList(new String[] { "1", "2", "3", "1", "1" });
251
252        assertEquals("Assert 1: did not find three \"1\" strings", 3,
253                Collections.frequency(strings, "1"));
254
255        assertEquals("Assert 2: did not find one \"2\" strings", 1, Collections
256                .frequency(strings, "2"));
257
258        assertEquals("Assert 3: did not find three \"3\" strings", 1,
259                Collections.frequency(strings, "3"));
260
261        assertEquals("Assert 4: matched on null when there are none", 0,
262                Collections.frequency(strings, null));
263
264        List<Object> objects = Arrays.asList(new Object[] { new Integer(1), null, null,
265                new Long(1) });
266
267        assertEquals("Assert 5: did not find one Integer(1)", 1, Collections
268                .frequency(objects, new Integer(1)));
269
270        assertEquals("Assert 6: did not find one Long(1)", 1, Collections
271                .frequency(objects, new Long(1)));
272
273        assertEquals("Assert 7: did not find two null references", 2,
274                Collections.frequency(objects, null));
275    }
276
277    /**
278     * java.util.Collections#reverseOrder()
279     */
280    public void test_reverseOrder() {
281        Comparator<String> roc = Collections.reverseOrder();
282        assertNotNull("Assert 0: comparator must not be null", roc);
283
284        assertTrue("Assert 1: comparator must implement Serializable",
285                roc instanceof Serializable);
286
287        String[] fixtureDesc = new String[] { "2", "1", "0" };
288        String[] numbers = new String[] { "0", "1", "2" };
289        Arrays.sort(numbers, roc);
290        assertTrue("Assert 2: the arrays are not equal, the sort failed",
291                Arrays.equals(fixtureDesc, numbers));
292    }
293
294    /**
295     * java.util.Collections#reverseOrder(java.util.Comparator)
296     */
297    public void test_reverseOrderLjava_util_Comparator() {
298        Comparator<String> roc = Collections
299                .reverseOrder(String.CASE_INSENSITIVE_ORDER);
300        assertNotNull("Assert 0: comparator must not be null", roc);
301
302        assertTrue("Assert 1: comparator must implement Serializable",
303                roc instanceof Serializable);
304
305        String[] fixtureDesc = new String[] { "2", "1", "0" };
306        String[] numbers = new String[] { "0", "1", "2" };
307        Arrays.sort(numbers, roc);
308        assertTrue("Assert 2: the arrays are not equal, the sort failed",
309                Arrays.equals(fixtureDesc, numbers));
310
311        roc = Collections.reverseOrder(null);
312        assertNotNull("Assert 3: comparator must not be null", roc);
313
314        assertTrue("Assert 4: comparator must implement Serializable",
315                roc instanceof Serializable);
316
317        numbers = new String[] { "0", "1", "2" };
318        Arrays.sort(numbers, roc);
319        assertTrue("Assert 5: the arrays are not equal, the sort failed",
320                Arrays.equals(fixtureDesc, numbers));
321    }
322
323    public void test_AddAll() {
324        List<Object> l = new ArrayList<Object>();
325        assertFalse(Collections.addAll(l, new Object[] { }));
326        assertTrue(l.isEmpty());
327        assertTrue(Collections.addAll(l, new Object[] { new Integer(1),
328                new Integer(2), new Integer(3) }));
329        assertFalse(l.isEmpty());
330        assertTrue(l.equals(Arrays.asList(new Object[] { new Integer(1),
331                new Integer(2), new Integer(3) })));
332    }
333
334    public void test_Disjoint() {
335        Object[] arr1 = new Object[10];
336        for (int i = 0; i < arr1.length; i++) {
337            arr1[i] = new Integer(i);
338        }
339        Object[] arr2 = new Object[20];
340        for (int i = 0; i < arr2.length; i++) {
341            arr2[i] = new Integer(100 + i);
342        }
343        Collection<Object> c1 = new ArrayList<Object>();
344        Collection<Object> c2 = new ArrayList<Object>();
345        Collections.addAll(c1, arr1);
346        Collections.addAll(c2, arr2);
347        assertTrue(Collections.disjoint(c1, c2));
348        c1.add(arr2[10]);
349        assertFalse(Collections.disjoint(c1, c2));
350
351        c1 = new LinkedList<Object>();
352        c2 = new LinkedList<Object>();
353        Collections.addAll(c1, arr1);
354        Collections.addAll(c2, arr2);
355        assertTrue(Collections.disjoint(c1, c2));
356        c1.add(arr2[10]);
357        assertFalse(Collections.disjoint(c1, c2));
358
359        c1 = new TreeSet<Object>();
360        c2 = new TreeSet<Object>();
361        Collections.addAll(c1, arr1);
362        Collections.addAll(c2, arr2);
363        assertTrue(Collections.disjoint(c1, c2));
364        c1.add(arr2[10]);
365        assertFalse(Collections.disjoint(c1, c2));
366
367        c1 = new HashSet<Object>();
368        c2 = new HashSet<Object>();
369        Collections.addAll(c1, arr1);
370        Collections.addAll(c2, arr2);
371        assertTrue(Collections.disjoint(c1, c2));
372        c1.add(arr2[10]);
373        assertFalse(Collections.disjoint(c1, c2));
374
375        c1 = new LinkedList<Object>();
376        c2 = new TreeSet<Object>();
377        Collections.addAll(c1, arr1);
378        Collections.addAll(c2, arr2);
379        assertTrue(Collections.disjoint(c1, c2));
380        c1.add(arr2[10]);
381        assertFalse(Collections.disjoint(c1, c2));
382
383        c1 = new Vector<Object>();
384        c2 = new HashSet<Object>();
385        Collections.addAll(c1, arr1);
386        Collections.addAll(c2, arr2);
387        assertTrue(Collections.disjoint(c1, c2));
388        c1.add(arr2[10]);
389        assertFalse(Collections.disjoint(c1, c2));
390
391    }
392
393    /**
394     * java.util.Collections.EmptyList#readResolve()
395     */
396    public void test_EmptyList_readResolve() throws Exception {
397        SerializationTest.verifySelf(Collections.EMPTY_LIST, comparator);
398    }
399
400    /**
401     * java.util.Collections.EmptyMap#readResolve()
402     */
403    public void test_EmptyMap_readResolve() throws Exception {
404        SerializationTest.verifySelf(Collections.EMPTY_MAP, comparator);
405    }
406
407    /**
408     * java.util.Collections.EmptySet#readResolve()
409     */
410    public void test_EmptySet_readResolve() throws Exception {
411        SerializationTest.verifySelf(Collections.EMPTY_SET, comparator);
412    }
413
414    public void test_checkedCollectionSerializationCompatability() throws Exception {
415        Collection<String> c = Collections.emptySet();
416        c = Collections.checkedCollection(c, String.class);
417        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedCollection.golden.ser");
418    }
419
420    public void test_checkedListRandomAccessSerializationCompatability() throws Exception {
421        List<String> c = new ArrayList<String>();
422        assertTrue(c instanceof RandomAccess);
423        c = Collections.checkedList(c, String.class);
424        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedListRandomAccess.golden.ser");
425    }
426
427    public void test_checkedListSerializationCompatability() throws Exception {
428        List<String> c = new LinkedList<String>();
429        assertFalse(c instanceof RandomAccess);
430        c = Collections.checkedList(c, String.class);
431        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedList.golden.ser");
432    }
433
434    public void test_checkedSetSerializationCompatability() throws Exception {
435        Set<String> c = new HashSet<String>();
436        assertFalse(c instanceof SortedSet);
437        c = Collections.checkedSet(c, String.class);
438        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedSet.golden.ser");
439    }
440
441    public void test_checkedMapSerializationCompatability() throws Exception {
442        Map<String, String> c = new HashMap<String, String>();
443        assertFalse(c instanceof SortedMap);
444        c = Collections.checkedMap(c, String.class, String.class);
445        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedMap.golden.ser");
446    }
447
448    public void test_checkedSortedSetSerializationCompatability() throws Exception {
449        SortedSet<String> c = new TreeSet<String>();
450        c = Collections.checkedSortedSet(c, String.class);
451        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedSortedSet.golden.ser");
452    }
453
454    public void test_checkedSortedMapSerializationCompatability() throws Exception {
455        SortedMap<String, String> c = new TreeMap<String, String>();
456        c = Collections.checkedSortedMap(c, String.class, String.class);
457        SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedSortedMap.golden.ser");
458    }
459
460    public void test_emptyList() {
461        List<Object> emptyList = Collections.emptyList();
462        assertEquals(0, emptyList.size());
463        assertTrue(emptyList instanceof RandomAccess);
464    }
465
466    // Regression test for http://issues.apache.org/jira/browse/HARMONY-6122
467    public void test_Collections_swap_IndexOutOfBoundsException() {
468        try {
469            Collections.swap(new ArrayList<Object>(), -1, 3);
470            fail("IOOBE expected");
471        } catch (IndexOutOfBoundsException e) {
472        }
473
474        List<Object> list = new ArrayList<Object>();
475        list.add("0");
476        try {
477            Collections.swap(list, 0, -1);
478            fail("IOOBE expected");
479        } catch (IndexOutOfBoundsException e) {
480        }
481
482        try {
483            Collections.swap(list, 0, 3);
484            fail("IOOBE expected");
485        } catch (IndexOutOfBoundsException e) {
486        }
487
488        try {
489            Collections.swap(new ArrayList<Object>(), 3, 3);
490            fail("IOOBE expected");
491        } catch (IndexOutOfBoundsException e) {
492        }
493    }
494
495}
496