blob: 86478dc939736885378ed467795a40bc7d7b09eb [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.commons.collections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.Vector;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.commons.collections.bag.HashBag;
import org.apache.commons.collections.buffer.BoundedFifoBuffer;
import org.apache.commons.collections.collection.AbstractTestCollection;
import org.apache.commons.collections.collection.PredicatedCollection;
import org.apache.commons.collections.collection.SynchronizedCollection;
import org.apache.commons.collections.collection.TransformedCollection;
import org.apache.commons.collections.collection.UnmodifiableCollection;
/**
* Tests for CollectionUtils.
*
* @author Rodney Waldhoff
* @author Matthew Hawthorne
* @author Stephen Colebourne
* @author Phil Steitz
* @author Steven Melzer
* @author Neil O'Toole
* @author Stephen Smith
*
* @version $Revision$ $Date$
*/
public class TestCollectionUtils extends TestCase {
public TestCollectionUtils(String testName) {
super(testName);
}
public static Test suite() {
return new TestSuite(TestCollectionUtils.class);
}
public static void main(String args[]) {
String[] testCaseName = { TestCollectionUtils.class.getName() };
junit.textui.TestRunner.main(testCaseName);
}
private Collection collectionA = null;
private Collection collectionB = null;
public void setUp() {
collectionA = new ArrayList();
collectionA.add("a");
collectionA.add("b");
collectionA.add("b");
collectionA.add("c");
collectionA.add("c");
collectionA.add("c");
collectionA.add("d");
collectionA.add("d");
collectionA.add("d");
collectionA.add("d");
collectionB = new LinkedList();
collectionB.add("e");
collectionB.add("d");
collectionB.add("d");
collectionB.add("c");
collectionB.add("c");
collectionB.add("c");
collectionB.add("b");
collectionB.add("b");
collectionB.add("b");
collectionB.add("b");
}
public void testGetCardinalityMap() {
Map freq = CollectionUtils.getCardinalityMap(collectionA);
assertEquals(new Integer(1),freq.get("a"));
assertEquals(new Integer(2),freq.get("b"));
assertEquals(new Integer(3),freq.get("c"));
assertEquals(new Integer(4),freq.get("d"));
assertNull(freq.get("e"));
freq = CollectionUtils.getCardinalityMap(collectionB);
assertNull(freq.get("a"));
assertEquals(new Integer(4),freq.get("b"));
assertEquals(new Integer(3),freq.get("c"));
assertEquals(new Integer(2),freq.get("d"));
assertEquals(new Integer(1),freq.get("e"));
}
public void testCardinality() {
assertEquals(1, CollectionUtils.cardinality("a", collectionA));
assertEquals(2, CollectionUtils.cardinality("b", collectionA));
assertEquals(3, CollectionUtils.cardinality("c", collectionA));
assertEquals(4, CollectionUtils.cardinality("d", collectionA));
assertEquals(0, CollectionUtils.cardinality("e", collectionA));
assertEquals(0, CollectionUtils.cardinality("a", collectionB));
assertEquals(4, CollectionUtils.cardinality("b", collectionB));
assertEquals(3, CollectionUtils.cardinality("c", collectionB));
assertEquals(2, CollectionUtils.cardinality("d", collectionB));
assertEquals(1, CollectionUtils.cardinality("e", collectionB));
Set set = new HashSet();
set.add("A");
set.add("C");
set.add("E");
set.add("E");
assertEquals(1, CollectionUtils.cardinality("A", set));
assertEquals(0, CollectionUtils.cardinality("B", set));
assertEquals(1, CollectionUtils.cardinality("C", set));
assertEquals(0, CollectionUtils.cardinality("D", set));
assertEquals(1, CollectionUtils.cardinality("E", set));
Bag bag = new HashBag();
bag.add("A", 3);
bag.add("C");
bag.add("E");
bag.add("E");
assertEquals(3, CollectionUtils.cardinality("A", bag));
assertEquals(0, CollectionUtils.cardinality("B", bag));
assertEquals(1, CollectionUtils.cardinality("C", bag));
assertEquals(0, CollectionUtils.cardinality("D", bag));
assertEquals(2, CollectionUtils.cardinality("E", bag));
}
public void testCardinalityOfNull() {
List list = new ArrayList();
assertEquals(0,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertNull(freq.get(null));
}
list.add("A");
assertEquals(0,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertNull(freq.get(null));
}
list.add(null);
assertEquals(1,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertEquals(new Integer(1),freq.get(null));
}
list.add("B");
assertEquals(1,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertEquals(new Integer(1),freq.get(null));
}
list.add(null);
assertEquals(2,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertEquals(new Integer(2),freq.get(null));
}
list.add("B");
assertEquals(2,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertEquals(new Integer(2),freq.get(null));
}
list.add(null);
assertEquals(3,CollectionUtils.cardinality(null,list));
{
Map freq = CollectionUtils.getCardinalityMap(list);
assertEquals(new Integer(3),freq.get(null));
}
}
public void testContainsAny() {
Collection empty = new ArrayList(0);
Collection one = new ArrayList(1);
one.add("1");
Collection two = new ArrayList(1);
two.add("2");
Collection three = new ArrayList(1);
three.add("3");
Collection odds = new ArrayList(2);
odds.add("1");
odds.add("3");
assertTrue("containsAny({1},{1,3}) should return true.",
CollectionUtils.containsAny(one,odds));
assertTrue("containsAny({1,3},{1}) should return true.",
CollectionUtils.containsAny(odds,one));
assertTrue("containsAny({3},{1,3}) should return true.",
CollectionUtils.containsAny(three,odds));
assertTrue("containsAny({1,3},{3}) should return true.",
CollectionUtils.containsAny(odds,three));
assertTrue("containsAny({2},{2}) should return true.",
CollectionUtils.containsAny(two,two));
assertTrue("containsAny({1,3},{1,3}) should return true.",
CollectionUtils.containsAny(odds,odds));
assertTrue("containsAny({2},{1,3}) should return false.",
!CollectionUtils.containsAny(two,odds));
assertTrue("containsAny({1,3},{2}) should return false.",
!CollectionUtils.containsAny(odds,two));
assertTrue("containsAny({1},{3}) should return false.",
!CollectionUtils.containsAny(one,three));
assertTrue("containsAny({3},{1}) should return false.",
!CollectionUtils.containsAny(three,one));
assertTrue("containsAny({1,3},{}) should return false.",
!CollectionUtils.containsAny(odds,empty));
assertTrue("containsAny({},{1,3}) should return false.",
!CollectionUtils.containsAny(empty,odds));
assertTrue("containsAny({},{}) should return false.",
!CollectionUtils.containsAny(empty,empty));
}
public void testUnion() {
Collection col = CollectionUtils.union(collectionA,collectionB);
Map freq = CollectionUtils.getCardinalityMap(col);
assertEquals(new Integer(1),freq.get("a"));
assertEquals(new Integer(4),freq.get("b"));
assertEquals(new Integer(3),freq.get("c"));
assertEquals(new Integer(4),freq.get("d"));
assertEquals(new Integer(1),freq.get("e"));
Collection col2 = CollectionUtils.union(collectionB,collectionA);
Map freq2 = CollectionUtils.getCardinalityMap(col2);
assertEquals(new Integer(1),freq2.get("a"));
assertEquals(new Integer(4),freq2.get("b"));
assertEquals(new Integer(3),freq2.get("c"));
assertEquals(new Integer(4),freq2.get("d"));
assertEquals(new Integer(1),freq2.get("e"));
}
public void testIntersection() {
Collection col = CollectionUtils.intersection(collectionA,collectionB);
Map freq = CollectionUtils.getCardinalityMap(col);
assertNull(freq.get("a"));
assertEquals(new Integer(2),freq.get("b"));
assertEquals(new Integer(3),freq.get("c"));
assertEquals(new Integer(2),freq.get("d"));
assertNull(freq.get("e"));
Collection col2 = CollectionUtils.intersection(collectionB,collectionA);
Map freq2 = CollectionUtils.getCardinalityMap(col2);
assertNull(freq2.get("a"));
assertEquals(new Integer(2),freq2.get("b"));
assertEquals(new Integer(3),freq2.get("c"));
assertEquals(new Integer(2),freq2.get("d"));
assertNull(freq2.get("e"));
}
public void testDisjunction() {
Collection col = CollectionUtils.disjunction(collectionA,collectionB);
Map freq = CollectionUtils.getCardinalityMap(col);
assertEquals(new Integer(1),freq.get("a"));
assertEquals(new Integer(2),freq.get("b"));
assertNull(freq.get("c"));
assertEquals(new Integer(2),freq.get("d"));
assertEquals(new Integer(1),freq.get("e"));
Collection col2 = CollectionUtils.disjunction(collectionB,collectionA);
Map freq2 = CollectionUtils.getCardinalityMap(col2);
assertEquals(new Integer(1),freq2.get("a"));
assertEquals(new Integer(2),freq2.get("b"));
assertNull(freq2.get("c"));
assertEquals(new Integer(2),freq2.get("d"));
assertEquals(new Integer(1),freq2.get("e"));
}
public void testDisjunctionAsUnionMinusIntersection() {
Collection dis = CollectionUtils.disjunction(collectionA,collectionB);
Collection un = CollectionUtils.union(collectionA,collectionB);
Collection inter = CollectionUtils.intersection(collectionA,collectionB);
assertTrue(CollectionUtils.isEqualCollection(dis,CollectionUtils.subtract(un,inter)));
}
public void testDisjunctionAsSymmetricDifference() {
Collection dis = CollectionUtils.disjunction(collectionA,collectionB);
Collection amb = CollectionUtils.subtract(collectionA,collectionB);
Collection bma = CollectionUtils.subtract(collectionB,collectionA);
assertTrue(CollectionUtils.isEqualCollection(dis,CollectionUtils.union(amb,bma)));
}
public void testSubtract() {
Collection col = CollectionUtils.subtract(collectionA,collectionB);
Map freq = CollectionUtils.getCardinalityMap(col);
assertEquals(new Integer(1),freq.get("a"));
assertNull(freq.get("b"));
assertNull(freq.get("c"));
assertEquals(new Integer(2),freq.get("d"));
assertNull(freq.get("e"));
Collection col2 = CollectionUtils.subtract(collectionB,collectionA);
Map freq2 = CollectionUtils.getCardinalityMap(col2);
assertEquals(new Integer(1),freq2.get("e"));
assertNull(freq2.get("d"));
assertNull(freq2.get("c"));
assertEquals(new Integer(2),freq2.get("b"));
assertNull(freq2.get("a"));
}
public void testIsSubCollectionOfSelf() {
assertTrue(CollectionUtils.isSubCollection(collectionA,collectionA));
assertTrue(CollectionUtils.isSubCollection(collectionB,collectionB));
}
public void testIsSubCollection() {
assertTrue(!CollectionUtils.isSubCollection(collectionA,collectionB));
assertTrue(!CollectionUtils.isSubCollection(collectionB,collectionA));
}
public void testIsSubCollection2() {
Collection c = new ArrayList();
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("a");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("b");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("b");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("c");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("c");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("c");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("d");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("d");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("d");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA,c));
c.add("d");
assertTrue(CollectionUtils.isSubCollection(c,collectionA));
assertTrue(CollectionUtils.isSubCollection(collectionA,c));
c.add("e");
assertTrue(!CollectionUtils.isSubCollection(c,collectionA));
assertTrue(CollectionUtils.isSubCollection(collectionA,c));
}
public void testIsEqualCollectionToSelf() {
assertTrue(CollectionUtils.isEqualCollection(collectionA,collectionA));
assertTrue(CollectionUtils.isEqualCollection(collectionB,collectionB));
}
public void testIsEqualCollection() {
assertTrue(!CollectionUtils.isEqualCollection(collectionA,collectionB));
assertTrue(!CollectionUtils.isEqualCollection(collectionB,collectionA));
}
public void testIsEqualCollection2() {
Collection a = new ArrayList();
Collection b = new ArrayList();
assertTrue(CollectionUtils.isEqualCollection(a,b));
assertTrue(CollectionUtils.isEqualCollection(b,a));
a.add("1");
assertTrue(!CollectionUtils.isEqualCollection(a,b));
assertTrue(!CollectionUtils.isEqualCollection(b,a));
b.add("1");
assertTrue(CollectionUtils.isEqualCollection(a,b));
assertTrue(CollectionUtils.isEqualCollection(b,a));
a.add("2");
assertTrue(!CollectionUtils.isEqualCollection(a,b));
assertTrue(!CollectionUtils.isEqualCollection(b,a));
b.add("2");
assertTrue(CollectionUtils.isEqualCollection(a,b));
assertTrue(CollectionUtils.isEqualCollection(b,a));
a.add("1");
assertTrue(!CollectionUtils.isEqualCollection(a,b));
assertTrue(!CollectionUtils.isEqualCollection(b,a));
b.add("1");
assertTrue(CollectionUtils.isEqualCollection(a,b));
assertTrue(CollectionUtils.isEqualCollection(b,a));
}
public void testIsProperSubCollection() {
Collection a = new ArrayList();
Collection b = new ArrayList();
assertTrue(!CollectionUtils.isProperSubCollection(a,b));
b.add("1");
assertTrue(CollectionUtils.isProperSubCollection(a,b));
assertTrue(!CollectionUtils.isProperSubCollection(b,a));
assertTrue(!CollectionUtils.isProperSubCollection(b,b));
assertTrue(!CollectionUtils.isProperSubCollection(a,a));
a.add("1");
a.add("2");
b.add("2");
assertTrue(!CollectionUtils.isProperSubCollection(b,a));
assertTrue(!CollectionUtils.isProperSubCollection(a,b));
a.add("1");
assertTrue(CollectionUtils.isProperSubCollection(b,a));
assertTrue(CollectionUtils.isProperSubCollection(
CollectionUtils.intersection(collectionA, collectionB), collectionA));
assertTrue(CollectionUtils.isProperSubCollection(
CollectionUtils.subtract(a, b), a));
assertTrue(!CollectionUtils.isProperSubCollection(
a, CollectionUtils.subtract(a, b)));
}
public void testFind() {
Predicate testPredicate = PredicateUtils.equalPredicate("d");
Object test = CollectionUtils.find(collectionA, testPredicate);
assertTrue(test.equals("d"));
testPredicate = PredicateUtils.equalPredicate("de");
test = CollectionUtils.find(collectionA, testPredicate);
assertTrue(test == null);
assertEquals(CollectionUtils.find(null,testPredicate), null);
assertEquals(CollectionUtils.find(collectionA, null), null);
}
public void testForAllDo() {
Closure testClosure = ClosureUtils.invokerClosure("clear");
Collection col = new ArrayList();
col.add(collectionA);
col.add(collectionB);
CollectionUtils.forAllDo(col, testClosure);
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
CollectionUtils.forAllDo(col, null);
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
CollectionUtils.forAllDo(null, testClosure);
col.add(null);
// null should be OK
CollectionUtils.forAllDo(col, testClosure);
col.add("x");
// This will lead to FunctorException
try {
CollectionUtils.forAllDo(col, testClosure);
fail("Expecting FunctorException");
} catch (FunctorException ex) {
// expected from invoker -- method not found
}
}
public void testIndex() {
// normal map behavior when index is an Integer and a key
Map map = new HashMap();
map.put(new Integer(0), "zero");
map.put(new Integer(-1), "minusOne");
Object test = CollectionUtils.index(map, 0);
assertTrue(test.equals("zero"));
test = CollectionUtils.index(map, new Integer(-1));
assertTrue(test.equals("minusOne"));
// map, non-integer key that does not exist -- map returned
test = CollectionUtils.index(map, "missing");
assertTrue(test.equals(map));
// map, integer not a key, valid index -- "some" element of keyset returned
test = CollectionUtils.index(map, new Integer(1));
assertTrue(map.keySet().contains(test));
// map, integer not a key, not valid index -- "dead" keyset iterator returned
test = CollectionUtils.index(map, new Integer(4));
assertTrue((test instanceof Iterator) && !((Iterator) test).hasNext());
// sorted map, integer not a key, valid index -- ith key returned
SortedMap map2 = new TreeMap();
map2.put(new Integer(23), "u");
map2.put(new Integer(21), "x");
map2.put(new Integer(17), "v");
map2.put(new Integer(42), "w");
Integer val = (Integer) CollectionUtils.index(map2, 0);
assertTrue(val.intValue() == 17);
val = (Integer) CollectionUtils.index(map2, 1);
assertTrue(val.intValue() == 21);
val = (Integer) CollectionUtils.index(map2, 2);
assertTrue(val.intValue() == 23);
val = (Integer) CollectionUtils.index(map2, 3);
assertTrue(val.intValue() == 42);
// list, entry exists
List list = new ArrayList();
list.add("zero");
list.add("one");
test = CollectionUtils.index(list, 0);
assertTrue(test.equals("zero"));
test = CollectionUtils.index(list, 1);
assertTrue(test.equals("one"));
// list, non-existent entry -- IndexOutOfBoundsException
try {
test = CollectionUtils.index(list, 2);
fail("Expecting IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException e) {
// expected
}
// iterator, entry exists
Iterator iterator = list.iterator();
test = CollectionUtils.index(iterator,0);
assertTrue(test.equals("zero"));
iterator = list.iterator();
test = CollectionUtils.index(iterator,1);
assertTrue(test.equals("one"));
// iterator, non-existent entry -- "dead" iterator returned
test = CollectionUtils.index(iterator,3);
assertTrue(test.equals(iterator) && !iterator.hasNext());
// Enumeration, entry exists
Vector vector = new Vector(list);
Enumeration en = vector.elements();
test = CollectionUtils.index(en,0);
assertTrue(test.equals("zero"));
en = vector.elements();
test = CollectionUtils.index(en,1);
assertTrue(test.equals("one"));
// Enumeration, non-existent entry -- "dead" enumerator returned
test = CollectionUtils.index(en,3);
assertTrue(test.equals(en) && !en.hasMoreElements());
// Collection, entry exists
Bag bag = new HashBag();
bag.add("element", 1);
test = CollectionUtils.index(bag, 0);
assertTrue(test.equals("element"));
// Collection, non-existent entry -- "dead" iterator returned
test = CollectionUtils.index(bag, 2);
assertTrue((test instanceof Iterator) && !((Iterator) test).hasNext());
// Object array, entry exists
Object[] objArray = new Object[2];
objArray[0] = "zero";
objArray[1] = "one";
test = CollectionUtils.index(objArray,0);
assertTrue(test.equals("zero"));
test = CollectionUtils.index(objArray,1);
assertTrue(test.equals("one"));
// Object array, non-existent entry -- ArrayIndexOutOfBoundsException
try {
test = CollectionUtils.index(objArray,2);
fail("Expecting ArrayIndexOutOfBoundsException.");
} catch (ArrayIndexOutOfBoundsException ex) {
// expected
}
// Non-collection object -- returned unchanged
Object obj = new Object();
test = CollectionUtils.index(obj, obj);
assertTrue(test.equals(obj));
}
public void testGet() {
{
// Unordered map, entries exist
Map expected = new HashMap();
expected.put("zeroKey", "zero");
expected.put("oneKey", "one");
Map found = new HashMap();
Map.Entry entry = (Map.Entry)(CollectionUtils.get(expected, 0));
found.put(entry.getKey(),entry.getValue());
entry = (Map.Entry)(CollectionUtils.get(expected, 1));
found.put(entry.getKey(),entry.getValue());
assertEquals(expected,found);
// Map index out of range
try {
CollectionUtils.get(expected, 2);
fail("Expecting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
CollectionUtils.get(expected, -2);
fail("Expecting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException e) {
// expected
}
}
{
// Sorted map, entries exist, should respect order
SortedMap map = new TreeMap();
map.put("zeroKey", "zero");
map.put("oneKey", "one");
Object test = CollectionUtils.get(map, 1);
assertEquals("zeroKey",((Map.Entry) test).getKey());
assertEquals("zero",((Map.Entry) test).getValue());
test = CollectionUtils.get(map, 0);
assertEquals("oneKey",((Map.Entry) test).getKey());
assertEquals("one",((Map.Entry) test).getValue());
}
{
// List, entry exists
List list = new ArrayList();
list.add("zero");
list.add("one");
assertEquals("zero",CollectionUtils.get(list, 0));
assertEquals("one",CollectionUtils.get(list, 1));
// list, non-existent entry -- IndexOutOfBoundsException
try {
CollectionUtils.get(list, 2);
fail("Expecting IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException e) {
// expected
}
// Iterator, entry exists
Iterator iterator = list.iterator();
assertEquals("zero",CollectionUtils.get(iterator,0));
iterator = list.iterator();
assertEquals("one",CollectionUtils.get(iterator,1));
// Iterator, non-existent entry
try {
CollectionUtils.get(iterator,3);
fail("Expecting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException e) {
// expected
}
assertTrue(!iterator.hasNext());
}
{
// Enumeration, entry exists
Vector vector = new Vector();
vector.addElement("zero");
vector.addElement("one");
Enumeration en = vector.elements();
assertEquals("zero",CollectionUtils.get(en,0));
en = vector.elements();
assertEquals("one",CollectionUtils.get(en,1));
// Enumerator, non-existent entry
try {
CollectionUtils.get(en,3);
fail("Expecting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException e) {
// expected
}
assertTrue(!en.hasMoreElements());
}
{
// Collection, entry exists
Bag bag = new HashBag();
bag.add("element", 1);
assertEquals("element",CollectionUtils.get(bag, 0));
// Collection, non-existent entry
try {
CollectionUtils.get(bag, 1);
fail("Expceting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException e) {
// expected
}
}
{
// Object array, entry exists
Object[] objArray = new Object[2];
objArray[0] = "zero";
objArray[1] = "one";
assertEquals("zero",CollectionUtils.get(objArray,0));
assertEquals("one",CollectionUtils.get(objArray,1));
// Object array, non-existent entry -- ArrayIndexOutOfBoundsException
try {
CollectionUtils.get(objArray,2);
fail("Expecting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException ex) {
// expected
}
}
{
// Primitive array, entry exists
int[] array = new int[2];
array[0] = 10;
array[1] = 20;
assertEquals(new Integer(10), CollectionUtils.get(array,0));
assertEquals(new Integer(20), CollectionUtils.get(array,1));
// Object array, non-existent entry -- ArrayIndexOutOfBoundsException
try {
CollectionUtils.get(array,2);
fail("Expecting IndexOutOfBoundsException.");
} catch (IndexOutOfBoundsException ex) {
// expected
}
}
{
// Invalid object
Object obj = new Object();
try {
CollectionUtils.get(obj, 0);
fail("Expecting IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// expected
}
try {
CollectionUtils.get(null, 0);
fail("Expecting IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// expected
}
}
}
//-----------------------------------------------------------------------
public void testSize_List() {
List list = new ArrayList();
assertEquals(0, CollectionUtils.size(list));
list.add("a");
assertEquals(1, CollectionUtils.size(list));
list.add("b");
assertEquals(2, CollectionUtils.size(list));
}
public void testSize_Map() {
Map map = new HashMap();
assertEquals(0, CollectionUtils.size(map));
map.put("1", "a");
assertEquals(1, CollectionUtils.size(map));
map.put("2", "b");
assertEquals(2, CollectionUtils.size(map));
}
public void testSize_Array() {
Object[] objectArray = new Object[0];
assertEquals(0, CollectionUtils.size(objectArray));
String[] stringArray = new String[3];
assertEquals(3, CollectionUtils.size(stringArray));
stringArray[0] = "a";
stringArray[1] = "b";
stringArray[2] = "c";
assertEquals(3, CollectionUtils.size(stringArray));
}
public void testSize_PrimitiveArray() {
int[] intArray = new int[0];
assertEquals(0, CollectionUtils.size(intArray));
double[] doubleArray = new double[3];
assertEquals(3, CollectionUtils.size(doubleArray));
doubleArray[0] = 0.0d;
doubleArray[1] = 1.0d;
doubleArray[2] = 2.5d;
assertEquals(3, CollectionUtils.size(doubleArray));
}
public void testSize_Enumeration() {
Vector list = new Vector();
assertEquals(0, CollectionUtils.size(list.elements()));
list.add("a");
assertEquals(1, CollectionUtils.size(list.elements()));
list.add("b");
assertEquals(2, CollectionUtils.size(list.elements()));
}
public void testSize_Iterator() {
List list = new ArrayList();
assertEquals(0, CollectionUtils.size(list.iterator()));
list.add("a");
assertEquals(1, CollectionUtils.size(list.iterator()));
list.add("b");
assertEquals(2, CollectionUtils.size(list.iterator()));
}
public void testSize_Other() {
try {
CollectionUtils.size(null);
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException e) {}
try {
CollectionUtils.size("not a list");
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException e) {}
}
//-----------------------------------------------------------------------
public void testSizeIsEmpty_List() {
List list = new ArrayList();
assertEquals(true, CollectionUtils.sizeIsEmpty(list));
list.add("a");
assertEquals(false, CollectionUtils.sizeIsEmpty(list));
}
public void testSizeIsEmpty_Map() {
Map map = new HashMap();
assertEquals(true, CollectionUtils.sizeIsEmpty(map));
map.put("1", "a");
assertEquals(false, CollectionUtils.sizeIsEmpty(map));
}
public void testSizeIsEmpty_Array() {
Object[] objectArray = new Object[0];
assertEquals(true, CollectionUtils.sizeIsEmpty(objectArray));
String[] stringArray = new String[3];
assertEquals(false, CollectionUtils.sizeIsEmpty(stringArray));
stringArray[0] = "a";
stringArray[1] = "b";
stringArray[2] = "c";
assertEquals(false, CollectionUtils.sizeIsEmpty(stringArray));
}
public void testSizeIsEmpty_PrimitiveArray() {
int[] intArray = new int[0];
assertEquals(true, CollectionUtils.sizeIsEmpty(intArray));
double[] doubleArray = new double[3];
assertEquals(false, CollectionUtils.sizeIsEmpty(doubleArray));
doubleArray[0] = 0.0d;
doubleArray[1] = 1.0d;
doubleArray[2] = 2.5d;
assertEquals(false, CollectionUtils.sizeIsEmpty(doubleArray));
}
public void testSizeIsEmpty_Enumeration() {
Vector list = new Vector();
assertEquals(true, CollectionUtils.sizeIsEmpty(list.elements()));
list.add("a");
assertEquals(false, CollectionUtils.sizeIsEmpty(list.elements()));
Enumeration en = list.elements();
en.nextElement();
assertEquals(true, CollectionUtils.sizeIsEmpty(en));
}
public void testSizeIsEmpty_Iterator() {
List list = new ArrayList();
assertEquals(true, CollectionUtils.sizeIsEmpty(list.iterator()));
list.add("a");
assertEquals(false, CollectionUtils.sizeIsEmpty(list.iterator()));
Iterator it = list.iterator();
it.next();
assertEquals(true, CollectionUtils.sizeIsEmpty(it));
}
public void testSizeIsEmpty_Other() {
try {
CollectionUtils.sizeIsEmpty(null);
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException ex) {}
try {
CollectionUtils.sizeIsEmpty("not a list");
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException ex) {}
}
//-----------------------------------------------------------------------
public void testIsEmptyWithEmptyCollection() {
Collection coll = new ArrayList();
assertEquals(true, CollectionUtils.isEmpty(coll));
}
public void testIsEmptyWithNonEmptyCollection() {
Collection coll = new ArrayList();
coll.add("item");
assertEquals(false, CollectionUtils.isEmpty(coll));
}
public void testIsEmptyWithNull() {
Collection coll = null;
assertEquals(true, CollectionUtils.isEmpty(coll));
}
public void testIsNotEmptyWithEmptyCollection() {
Collection coll = new ArrayList();
assertEquals(false, CollectionUtils.isNotEmpty(coll));
}
public void testIsNotEmptyWithNonEmptyCollection() {
Collection coll = new ArrayList();
coll.add("item");
assertEquals(true, CollectionUtils.isNotEmpty(coll));
}
public void testIsNotEmptyWithNull() {
Collection coll = null;
assertEquals(false, CollectionUtils.isNotEmpty(coll));
}
//-----------------------------------------------------------------------
private static Predicate EQUALS_TWO = new Predicate() {
public boolean evaluate(Object input) {
return (input.equals("Two"));
}
};
public void testFilter() {
List list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
CollectionUtils.filter(list, EQUALS_TWO);
assertEquals(1, list.size());
assertEquals("Two", list.get(0));
list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
CollectionUtils.filter(list, null);
assertEquals(4, list.size());
CollectionUtils.filter(null, EQUALS_TWO);
assertEquals(4, list.size());
CollectionUtils.filter(null, null);
assertEquals(4, list.size());
}
public void testCountMatches() {
List list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
int count = CollectionUtils.countMatches(list, EQUALS_TWO);
assertEquals(4, list.size());
assertEquals(1, count);
assertEquals(0, CollectionUtils.countMatches(list, null));
assertEquals(0, CollectionUtils.countMatches(null, EQUALS_TWO));
assertEquals(0, CollectionUtils.countMatches(null, null));
}
public void testExists() {
List list = new ArrayList();
assertEquals(false, CollectionUtils.exists(null, null));
assertEquals(false, CollectionUtils.exists(list, null));
assertEquals(false, CollectionUtils.exists(null, EQUALS_TWO));
assertEquals(false, CollectionUtils.exists(list, EQUALS_TWO));
list.add("One");
list.add("Three");
list.add("Four");
assertEquals(false, CollectionUtils.exists(list, EQUALS_TWO));
list.add("Two");
assertEquals(true, CollectionUtils.exists(list, EQUALS_TWO));
}
public void testSelect() {
List list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
Collection output = CollectionUtils.select(list, EQUALS_TWO);
assertEquals(4, list.size());
assertEquals(1, output.size());
assertEquals("Two", output.iterator().next());
}
public void testSelectRejected() {
List list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
Collection output = CollectionUtils.selectRejected(list, EQUALS_TWO);
assertEquals(4, list.size());
assertEquals(3, output.size());
assertTrue(output.contains("One"));
assertTrue(output.contains("Three"));
assertTrue(output.contains("Four"));
}
public void testCollect() {
Transformer transformer = TransformerUtils.constantTransformer("z");
Collection collection = CollectionUtils.collect(collectionA, transformer);
assertTrue(collection.size() == collectionA.size());
assertTrue(collectionA.contains("a") && ! collectionA.contains("z"));
assertTrue(collection.contains("z") && !collection.contains("a"));
collection = new ArrayList();
CollectionUtils.collect(collectionA, transformer, collection);
assertTrue(collection.size() == collectionA.size());
assertTrue(collectionA.contains("a") && ! collectionA.contains("z"));
assertTrue(collection.contains("z") && !collection.contains("a"));
Iterator iterator = null;
collection = new ArrayList();
CollectionUtils.collect(iterator, transformer, collection);
iterator = collectionA.iterator();
CollectionUtils.collect(iterator, transformer, collection);
assertTrue(collection.size() == collectionA.size());
assertTrue(collectionA.contains("a") && ! collectionA.contains("z"));
assertTrue(collection.contains("z") && !collection.contains("a"));
iterator = collectionA.iterator();
collection = CollectionUtils.collect(iterator, transformer);
assertTrue(collection.size() == collectionA.size());
assertTrue(collection.contains("z") && !collection.contains("a"));
collection = CollectionUtils.collect((Iterator) null, (Transformer) null);
assertTrue(collection.size() == 0);
int size = collectionA.size();
CollectionUtils.collect((Collection) null, transformer, collectionA);
assertTrue(collectionA.size() == size && collectionA.contains("a"));
CollectionUtils.collect(collectionB, null, collectionA);
assertTrue(collectionA.size() == size && collectionA.contains("a"));
}
Transformer TRANSFORM_TO_INTEGER = new Transformer() {
public Object transform(Object input) {
return new Integer((String) input);
}
};
public void testTransform1() {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
CollectionUtils.transform(list, TRANSFORM_TO_INTEGER);
assertEquals(3, list.size());
assertEquals(new Integer(1), list.get(0));
assertEquals(new Integer(2), list.get(1));
assertEquals(new Integer(3), list.get(2));
list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
CollectionUtils.transform(null, TRANSFORM_TO_INTEGER);
assertEquals(3, list.size());
CollectionUtils.transform(list, null);
assertEquals(3, list.size());
CollectionUtils.transform(null, null);
assertEquals(3, list.size());
}
public void testTransform2() {
Set set = new HashSet();
set.add("1");
set.add("2");
set.add("3");
CollectionUtils.transform(set, new Transformer() {
public Object transform(Object input) {
return new Integer(4);
}
});
assertEquals(1, set.size());
assertEquals(new Integer(4), set.iterator().next());
}
//-----------------------------------------------------------------------
public void testAddIgnoreNull() {
Set set = new HashSet();
set.add("1");
set.add("2");
set.add("3");
assertEquals(false, CollectionUtils.addIgnoreNull(set, null));
assertEquals(3, set.size());
assertEquals(false, CollectionUtils.addIgnoreNull(set, "1"));
assertEquals(3, set.size());
assertEquals(true, CollectionUtils.addIgnoreNull(set, "4"));
assertEquals(4, set.size());
assertEquals(true, set.contains("4"));
}
//-----------------------------------------------------------------------
public void testPredicatedCollection() {
Predicate predicate = new Predicate() {
public boolean evaluate(Object o) {
return o instanceof String;
}
};
Collection collection =
CollectionUtils.predicatedCollection(new ArrayList(), predicate);
assertTrue("returned object should be a PredicatedCollection",
collection instanceof PredicatedCollection);
try {
collection =
CollectionUtils.predicatedCollection(new ArrayList(), null);
fail("Expecting IllegalArgumentException for null predicate.");
} catch (IllegalArgumentException ex) {
// expected
}
try {
collection =
CollectionUtils.predicatedCollection(null, predicate);
fail("Expecting IllegalArgumentException for null collection.");
} catch (IllegalArgumentException ex) {
// expected
}
}
public BulkTest bulkTestTypedCollection() {
return new TestTypedCollection("") {
public Collection typedCollection() {
return CollectionUtils.typedCollection(
new ArrayList(),
super.getType());
}
public BulkTest bulkTestAll() {
return new AbstractTestCollection("") {
public Collection makeCollection() {
return typedCollection();
}
public Collection makeConfirmedCollection() {
return new ArrayList();
}
public Collection makeConfirmedFullCollection() {
ArrayList list = new ArrayList();
list.addAll(java.util.Arrays.asList(getFullElements()));
return list;
}
public Object[] getFullElements() {
return getFullNonNullStringElements();
}
public Object[] getOtherElements() {
return getOtherNonNullStringElements();
}
};
}
};
}
public void testIsFull() {
Set set = new HashSet();
set.add("1");
set.add("2");
set.add("3");
try {
CollectionUtils.isFull(null);
fail();
} catch (NullPointerException ex) {}
assertEquals(false, CollectionUtils.isFull(set));
BoundedFifoBuffer buf = new BoundedFifoBuffer(set);
assertEquals(true, CollectionUtils.isFull(buf));
buf.remove("2");
assertEquals(false, CollectionUtils.isFull(buf));
buf.add("2");
assertEquals(true, CollectionUtils.isFull(buf));
Buffer buf2 = BufferUtils.synchronizedBuffer(buf);
assertEquals(true, CollectionUtils.isFull(buf2));
buf2.remove("2");
assertEquals(false, CollectionUtils.isFull(buf2));
buf2.add("2");
assertEquals(true, CollectionUtils.isFull(buf2));
}
public void testMaxSize() {
Set set = new HashSet();
set.add("1");
set.add("2");
set.add("3");
try {
CollectionUtils.maxSize(null);
fail();
} catch (NullPointerException ex) {}
assertEquals(-1, CollectionUtils.maxSize(set));
BoundedFifoBuffer buf = new BoundedFifoBuffer(set);
assertEquals(3, CollectionUtils.maxSize(buf));
buf.remove("2");
assertEquals(3, CollectionUtils.maxSize(buf));
buf.add("2");
assertEquals(3, CollectionUtils.maxSize(buf));
Buffer buf2 = BufferUtils.synchronizedBuffer(buf);
assertEquals(3, CollectionUtils.maxSize(buf2));
buf2.remove("2");
assertEquals(3, CollectionUtils.maxSize(buf2));
buf2.add("2");
assertEquals(3, CollectionUtils.maxSize(buf2));
}
public void testIntersectionUsesMethodEquals() {
// Let elta and eltb be objects...
Object elta = new Integer(17);
Object eltb = new Integer(17);
// ...which are equal...
assertEquals(elta,eltb);
assertEquals(eltb,elta);
// ...but not the same (==).
assertTrue(elta != eltb);
// Let cola and colb be collections...
Collection cola = new ArrayList();
Collection colb = new ArrayList();
// ...which contain elta and eltb,
// respectively.
cola.add(elta);
colb.add(eltb);
// Then the intersection of the two
// should contain one element.
Collection intersection = CollectionUtils.intersection(cola,colb);
assertEquals(1,intersection.size());
// In practice, this element will be the same (==) as elta
// or eltb, although this isn't strictly part of the
// contract.
Object eltc = intersection.iterator().next();
assertTrue((eltc == elta && eltc != eltb) || (eltc != elta && eltc == eltb));
// In any event, this element remains equal,
// to both elta and eltb.
assertEquals(elta,eltc);
assertEquals(eltc,elta);
assertEquals(eltb,eltc);
assertEquals(eltc,eltb);
}
// -----------------------------------------------------------------------
public void testRetainAll() {
final List base = new ArrayList();
base.add("A");
base.add("B");
base.add("C");
final List sub = new ArrayList();
sub.add("A");
sub.add("C");
sub.add("X");
final Collection result = CollectionUtils.retainAll(base, sub);
assertEquals(2, result.size());
assertEquals(true, result.contains("A"));
assertFalse(result.contains("B"));
assertEquals(true, result.contains("C"));
assertEquals(3, base.size());
assertEquals(true, base.contains("A"));
assertEquals(true, base.contains("B"));
assertEquals(true, base.contains("C"));
assertEquals(3, sub.size());
assertEquals(true, sub.contains("A"));
assertEquals(true, sub.contains("C"));
assertEquals(true, sub.contains("X"));
try {
CollectionUtils.retainAll(null, null);
fail("expecting NullPointerException");
} catch (final NullPointerException npe) {
} // this is what we want
}
public void testRemoveAll() {
final List base = new ArrayList();
base.add("A");
base.add("B");
base.add("C");
final List sub = new ArrayList();
sub.add("A");
sub.add("C");
sub.add("X");
final Collection result = CollectionUtils.removeAll(base, sub);
assertEquals(1, result.size());
assertFalse(result.contains("A"));
assertEquals(true, result.contains("B"));
assertFalse(result.contains("C"));
assertEquals(3, base.size());
assertEquals(true, base.contains("A"));
assertEquals(true, base.contains("B"));
assertEquals(true, base.contains("C"));
assertEquals(3, sub.size());
assertEquals(true, sub.contains("A"));
assertEquals(true, sub.contains("C"));
assertEquals(true, sub.contains("X"));
try {
CollectionUtils.removeAll(null, null);
fail("expecting NullPointerException");
} catch (final NullPointerException npe) {
} // this is what we want
}
// -----------------------------------------------------------------------
public void testTransformedCollection() {
Transformer transformer = TransformerUtils.nopTransformer();
Collection collection =
CollectionUtils.transformedCollection(new ArrayList(), transformer);
assertTrue("returned object should be a TransformedCollection",
collection instanceof TransformedCollection);
try {
collection =
CollectionUtils.transformedCollection(new ArrayList(), null);
fail("Expecting IllegalArgumentException for null transformer.");
} catch (IllegalArgumentException ex) {
// expected
}
try {
collection =
CollectionUtils.transformedCollection(null, transformer);
fail("Expecting IllegalArgumentException for null collection.");
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testTransformedCollection_2() {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
Collection result = CollectionUtils.transformedCollection(list, TRANSFORM_TO_INTEGER);
assertEquals(true, result.contains("1")); // untransformed
assertEquals(true, result.contains("2")); // untransformed
assertEquals(true, result.contains("3")); // untransformed
}
public void testSynchronizedCollection() {
Collection col = CollectionUtils.synchronizedCollection(new ArrayList());
assertTrue("Returned object should be a SynchronizedCollection.",
col instanceof SynchronizedCollection);
try {
col = CollectionUtils.synchronizedCollection(null);
fail("Expecting IllegalArgumentException for null collection.");
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testUnmodifiableCollection() {
Collection col = CollectionUtils.unmodifiableCollection(new ArrayList());
assertTrue("Returned object should be a UnmodifiableCollection.",
col instanceof UnmodifiableCollection);
try {
col = CollectionUtils.unmodifiableCollection(null);
fail("Expecting IllegalArgumentException for null collection.");
} catch (IllegalArgumentException ex) {
// expected
}
}
}