blob: e5cce1c8619b1a46927087d4e9cc2f553d2c0fbd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.harmony.tests.java.util;
import junit.framework.TestCase;
import org.apache.harmony.testframework.serialization.SerializationTest;
import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
import tests.util.SerializationTester;
import java.io.Serializable;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.RandomAccess;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
public class Collections2Test extends TestCase {
private static final SerializableAssert comparator = new SerializableAssert() {
public void assertDeserialized(Serializable reference, Serializable test) {
assertSame(reference, test);
}
};
/**
* java.util.Collections#binarySearch(java.util.List,
*java.lang.Object, java.util.Comparator)
*/
public void test_binarySearchLjava_util_ListLjava_lang_ObjectLjava_util_Comparator() {
// Regression for HARMONY-94
LinkedList<Integer> lst = new LinkedList<Integer>();
lst.add(new Integer(30));
Collections.sort(lst, null);
int index = Collections.binarySearch(lst, new Integer(2), null);
assertEquals(-1, index);
}
/**
* java.util.Collections#binarySearch(java.util.List,
*java.lang.Object)
*/
@SuppressWarnings("unchecked")
public void test_binarySearchLjava_util_ListLjava_lang_Object() {
// regression for Harmony-1367
List localList = new LinkedList();
assertEquals(-1, Collections.binarySearch(localList, new Object()));
localList.add(new Object());
try {
Collections.binarySearch(localList, new Integer(1));
fail("Should throw ClassCastException");
} catch (ClassCastException e) {
// expected
}
}
/**
* java.util.Collections#rotate(java.util.List, int)
*/
public void test_rotateLjava_util_ListI() {
// Regression for HARMONY-19 Rotate an *empty* list
Collections.rotate(new ArrayList<Object>(), 25);
// Regression for HARMONY-20
List<String> list = new ArrayList<String>();
list.add(0, "zero");
list.add(1, "one");
list.add(2, "two");
list.add(3, "three");
list.add(4, "four");
Collections.rotate(list, Integer.MIN_VALUE);
assertEquals("Rotated incorrectly at position 0, ", "three",
list.get(0));
assertEquals("Rotated incorrectly at position 1, ", "four",
list.get(1));
assertEquals("Rotated incorrectly at position 2, ", "zero",
list.get(2));
assertEquals("Rotated incorrectly at position 3, ", "one",
list.get(3));
assertEquals("Rotated incorrectly at position 4, ", "two",
list.get(4));
}
/**
* java.util.Collections#synchronizedCollection(java.util.Collection)
*/
public void test_synchronizedCollectionLjava_util_Collection() {
try {
// Regression for HARMONY-93
Collections.synchronizedCollection(null);
fail("Assert 0: synchronizedCollection(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#synchronizedSortedMap(java.util.SortedMap)
*/
public void test_synchronizedSortedMapLjava_util_SortedMap() {
try {
// Regression for HARMONY-93
Collections.synchronizedSortedMap(null);
fail("Assert 0: synchronizedSortedMap(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#synchronizedMap(java.util.Map)
*/
public void test_synchronizedMapLjava_util_Map() {
try {
// Regression for HARMONY-93
Collections.synchronizedMap(null);
fail("Assert 0: synchronizedMap(map) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#synchronizedSet(java.util.Set)
*/
public void test_synchronizedSetLjava_util_Set() {
try {
// Regression for HARMONY-93
Collections.synchronizedSet(null);
fail("Assert 0: synchronizedSet(set) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#synchronizedSortedSet(java.util.SortedSet)
*/
public void test_synchronizedSortedSetLjava_util_SortedSet() {
try {
// Regression for HARMONY-93
Collections.synchronizedSortedSet(null);
fail("Assert 0: synchronizedSortedSet(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#unmodifiableCollection(java.util.Collection)
*/
public void test_unmodifiableCollectionLjava_util_Collection() {
try {
// Regression for HARMONY-93
Collections.unmodifiableCollection(null);
fail("Assert 0: unmodifiableCollection(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#unmodifiableMap(java.util.Map)
*/
public void test_unmodifiableMapLjava_util_Map() {
try {
// Regression for HARMONY-93
Collections.unmodifiableMap(null);
fail("Assert 0: unmodifiableMap(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#unmodifiableSet(java.util.Set)
*/
public void test_unmodifiableSetLjava_util_Set() {
try {
// Regression for HARMONY-93
Collections.unmodifiableSet(null);
fail("Assert 0: unmodifiableSet(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#unmodifiableSortedMap(java.util.SortedMap)
*/
public void test_unmodifiableSortedMapLjava_util_SortedMap() {
try {
// Regression for HARMONY-93
Collections.unmodifiableSortedMap(null);
fail("Assert 0: unmodifiableSortedMap(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#unmodifiableSortedSet(java.util.SortedSet)
*/
public void test_unmodifiableSortedSetLjava_util_SortedSet() {
try {
// Regression for HARMONY-93
Collections.unmodifiableSortedSet(null);
fail("Assert 0: unmodifiableSortedSet(null) must throw NPE");
} catch (NullPointerException e) {
// expected
}
}
/**
* java.util.Collections#frequency(java.util.Collection, Object)
*/
public void test_frequencyLjava_util_CollectionLint() {
try {
Collections.frequency(null, null);
fail("Assert 0: frequency(null,<any>) must throw NPE");
} catch (NullPointerException e) {
}
List<String> strings = Arrays.asList(new String[] { "1", "2", "3", "1", "1" });
assertEquals("Assert 1: did not find three \"1\" strings", 3,
Collections.frequency(strings, "1"));
assertEquals("Assert 2: did not find one \"2\" strings", 1, Collections
.frequency(strings, "2"));
assertEquals("Assert 3: did not find three \"3\" strings", 1,
Collections.frequency(strings, "3"));
assertEquals("Assert 4: matched on null when there are none", 0,
Collections.frequency(strings, null));
List<Object> objects = Arrays.asList(new Object[] { new Integer(1), null, null,
new Long(1) });
assertEquals("Assert 5: did not find one Integer(1)", 1, Collections
.frequency(objects, new Integer(1)));
assertEquals("Assert 6: did not find one Long(1)", 1, Collections
.frequency(objects, new Long(1)));
assertEquals("Assert 7: did not find two null references", 2,
Collections.frequency(objects, null));
}
/**
* java.util.Collections#reverseOrder()
*/
public void test_reverseOrder() {
Comparator<String> roc = Collections.reverseOrder();
assertNotNull("Assert 0: comparator must not be null", roc);
assertTrue("Assert 1: comparator must implement Serializable",
roc instanceof Serializable);
String[] fixtureDesc = new String[] { "2", "1", "0" };
String[] numbers = new String[] { "0", "1", "2" };
Arrays.sort(numbers, roc);
assertTrue("Assert 2: the arrays are not equal, the sort failed",
Arrays.equals(fixtureDesc, numbers));
}
/**
* java.util.Collections#reverseOrder(java.util.Comparator)
*/
public void test_reverseOrderLjava_util_Comparator() {
Comparator<String> roc = Collections
.reverseOrder(String.CASE_INSENSITIVE_ORDER);
assertNotNull("Assert 0: comparator must not be null", roc);
assertTrue("Assert 1: comparator must implement Serializable",
roc instanceof Serializable);
String[] fixtureDesc = new String[] { "2", "1", "0" };
String[] numbers = new String[] { "0", "1", "2" };
Arrays.sort(numbers, roc);
assertTrue("Assert 2: the arrays are not equal, the sort failed",
Arrays.equals(fixtureDesc, numbers));
roc = Collections.reverseOrder(null);
assertNotNull("Assert 3: comparator must not be null", roc);
assertTrue("Assert 4: comparator must implement Serializable",
roc instanceof Serializable);
numbers = new String[] { "0", "1", "2" };
Arrays.sort(numbers, roc);
assertTrue("Assert 5: the arrays are not equal, the sort failed",
Arrays.equals(fixtureDesc, numbers));
}
public void test_AddAll() {
List<Object> l = new ArrayList<Object>();
assertFalse(Collections.addAll(l, new Object[] { }));
assertTrue(l.isEmpty());
assertTrue(Collections.addAll(l, new Object[] { new Integer(1),
new Integer(2), new Integer(3) }));
assertFalse(l.isEmpty());
assertTrue(l.equals(Arrays.asList(new Object[] { new Integer(1),
new Integer(2), new Integer(3) })));
}
public void test_Disjoint() {
Object[] arr1 = new Object[10];
for (int i = 0; i < arr1.length; i++) {
arr1[i] = new Integer(i);
}
Object[] arr2 = new Object[20];
for (int i = 0; i < arr2.length; i++) {
arr2[i] = new Integer(100 + i);
}
Collection<Object> c1 = new ArrayList<Object>();
Collection<Object> c2 = new ArrayList<Object>();
Collections.addAll(c1, arr1);
Collections.addAll(c2, arr2);
assertTrue(Collections.disjoint(c1, c2));
c1.add(arr2[10]);
assertFalse(Collections.disjoint(c1, c2));
c1 = new LinkedList<Object>();
c2 = new LinkedList<Object>();
Collections.addAll(c1, arr1);
Collections.addAll(c2, arr2);
assertTrue(Collections.disjoint(c1, c2));
c1.add(arr2[10]);
assertFalse(Collections.disjoint(c1, c2));
c1 = new TreeSet<Object>();
c2 = new TreeSet<Object>();
Collections.addAll(c1, arr1);
Collections.addAll(c2, arr2);
assertTrue(Collections.disjoint(c1, c2));
c1.add(arr2[10]);
assertFalse(Collections.disjoint(c1, c2));
c1 = new HashSet<Object>();
c2 = new HashSet<Object>();
Collections.addAll(c1, arr1);
Collections.addAll(c2, arr2);
assertTrue(Collections.disjoint(c1, c2));
c1.add(arr2[10]);
assertFalse(Collections.disjoint(c1, c2));
c1 = new LinkedList<Object>();
c2 = new TreeSet<Object>();
Collections.addAll(c1, arr1);
Collections.addAll(c2, arr2);
assertTrue(Collections.disjoint(c1, c2));
c1.add(arr2[10]);
assertFalse(Collections.disjoint(c1, c2));
c1 = new Vector<Object>();
c2 = new HashSet<Object>();
Collections.addAll(c1, arr1);
Collections.addAll(c2, arr2);
assertTrue(Collections.disjoint(c1, c2));
c1.add(arr2[10]);
assertFalse(Collections.disjoint(c1, c2));
}
/**
* java.util.Collections.EmptyList#readResolve()
*/
public void test_EmptyList_readResolve() throws Exception {
SerializationTest.verifySelf(Collections.EMPTY_LIST, comparator);
}
/**
* java.util.Collections.EmptyMap#readResolve()
*/
public void test_EmptyMap_readResolve() throws Exception {
SerializationTest.verifySelf(Collections.EMPTY_MAP, comparator);
}
/**
* java.util.Collections.EmptySet#readResolve()
*/
public void test_EmptySet_readResolve() throws Exception {
SerializationTest.verifySelf(Collections.EMPTY_SET, comparator);
}
public void test_checkedCollectionSerializationCompatability() throws Exception {
Collection<String> c = Collections.emptySet();
c = Collections.checkedCollection(c, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedCollection.golden.ser");
}
public void test_checkedListRandomAccessSerializationCompatability() throws Exception {
List<String> c = new ArrayList<String>();
assertTrue(c instanceof RandomAccess);
c = Collections.checkedList(c, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedListRandomAccess.golden.ser");
}
public void test_checkedListSerializationCompatability() throws Exception {
List<String> c = new LinkedList<String>();
assertFalse(c instanceof RandomAccess);
c = Collections.checkedList(c, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedList.golden.ser");
}
public void test_checkedSetSerializationCompatability() throws Exception {
Set<String> c = new HashSet<String>();
assertFalse(c instanceof SortedSet);
c = Collections.checkedSet(c, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedSet.golden.ser");
}
public void test_checkedMapSerializationCompatability() throws Exception {
Map<String, String> c = new HashMap<String, String>();
assertFalse(c instanceof SortedMap);
c = Collections.checkedMap(c, String.class, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedMap.golden.ser");
}
public void test_checkedSortedSetSerializationCompatability() throws Exception {
SortedSet<String> c = new TreeSet<String>();
c = Collections.checkedSortedSet(c, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedSortedSet.golden.ser");
}
public void test_checkedSortedMapSerializationCompatability() throws Exception {
SortedMap<String, String> c = new TreeMap<String, String>();
c = Collections.checkedSortedMap(c, String.class, String.class);
SerializationTester.assertCompabilityEquals(c, "serialization/org/apache/harmony/tests/java/util/Collections_CheckedSortedMap.golden.ser");
}
public void test_emptyList() {
List<Object> emptyList = Collections.emptyList();
assertEquals(0, emptyList.size());
assertTrue(emptyList instanceof RandomAccess);
}
// Regression test for http://issues.apache.org/jira/browse/HARMONY-6122
public void test_Collections_swap_IndexOutOfBoundsException() {
try {
Collections.swap(new ArrayList<Object>(), -1, 3);
fail("IOOBE expected");
} catch (IndexOutOfBoundsException e) {
}
List<Object> list = new ArrayList<Object>();
list.add("0");
try {
Collections.swap(list, 0, -1);
fail("IOOBE expected");
} catch (IndexOutOfBoundsException e) {
}
try {
Collections.swap(list, 0, 3);
fail("IOOBE expected");
} catch (IndexOutOfBoundsException e) {
}
try {
Collections.swap(new ArrayList<Object>(), 3, 3);
fail("IOOBE expected");
} catch (IndexOutOfBoundsException e) {
}
}
void testCollectionForEach(Collection<Integer> collection) {
ArrayList<Integer> output = new ArrayList<Integer>();
collection.forEach(k -> output.add(k));
assertEquals(new ArrayList<>(collection), output);
}
public void test_Collection_forEach() {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
testCollectionForEach(Collections.unmodifiableCollection(list));
testCollectionForEach(Collections.synchronizedCollection(list));
testCollectionForEach(Collections.checkedCollection(list, Integer.class));
testCollectionForEach(Collections.singletonList(new Integer(0)));
}
void testMapForEach(Map<String,String> map) {
HashMap<String, String> output = new HashMap<String, String>();
map.forEach((k, v) -> output.put(k, v));
assertEquals(map, output);
output.clear();
map.entrySet().forEach(entry -> output.put(entry.getKey(), entry.getValue()));
assertEquals(map, output);
HashSet<String> setOutput = new HashSet<>();
map.values().forEach(value -> setOutput.add(value));
assertEquals(new HashSet<>(map.values()), setOutput);
setOutput.clear();
map.keySet().forEach((k) -> setOutput.add(k));
assertEquals(map.keySet(), setOutput);
}
public void test_Map_forEach() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
testMapForEach(Collections.unmodifiableMap(map));
testMapForEach(Collections.synchronizedMap(map));
testMapForEach(Collections.checkedMap(map, String.class, String.class));
testMapForEach(Collections.singletonMap("one", "1"));
}
void testSetForEach(Set<Integer> set) {
HashSet<Integer> output = new HashSet<Integer>();
set.forEach(k -> output.add(k));
assertEquals(set.size(), output.size());
for (Integer key : set) {
assertTrue(output.contains(key));
}
}
public void test_Set_forEach() {
HashSet<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
testSetForEach(Collections.unmodifiableSet(set));
testSetForEach(Collections.synchronizedSet(set));
testSetForEach(Collections.checkedSet(set, Integer.class));
testSetForEach(Collections.singleton(1));
Set<Integer> fromMap = Collections.newSetFromMap(new HashMap<Integer, Boolean>());
fromMap.add(1);
fromMap.add(2);
fromMap.add(3);
testSetForEach(fromMap);
}
public void test_Queue_forEach() {
Deque<Integer> deque = new ArrayDeque<Integer>();
deque.addFirst(2);
deque.addFirst(1);
deque.addFirst(0);
Queue<Integer> queue = Collections.asLifoQueue(deque);
ArrayList<Integer> output = new ArrayList<Integer>();
queue.forEach(v -> output.add(v));
assertEquals(3, output.size());
assertEquals(0, (int)output.get(0));
assertEquals(1, (int)output.get(1));
assertEquals(2, (int)output.get(2));
}
}