blob: 6f4a5b1afd3b1bcdc4d73391a4e618a9f007fc17 [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.collections4;
import static org.apache.commons.collections4.functors.EqualPredicate.equalPredicate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.Vector;
import org.apache.commons.collections4.bag.HashBag;
import org.apache.commons.collections4.collection.PredicatedCollection;
import org.apache.commons.collections4.collection.SynchronizedCollection;
import org.apache.commons.collections4.collection.TransformedCollection;
import org.apache.commons.collections4.collection.UnmodifiableCollection;
import org.apache.commons.collections4.functors.DefaultEquator;
import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Tests for CollectionUtils.
*
*/
@SuppressWarnings("boxing")
public class CollectionUtilsTest extends MockTestCase {
/**
* Collection of {@link Integer}s
*/
private List<Integer> collectionA = null;
/**
* Collection of {@link Long}s
*/
private List<Long> collectionB = null;
/**
* Collection of {@link Integer}s that are equivalent to the Longs in
* collectionB.
*/
private Collection<Integer> collectionC = null;
/**
* Sorted Collection of {@link Integer}s
*/
private Collection<Integer> collectionD = null;
/**
* Sorted Collection of {@link Integer}s
*/
private Collection<Integer> collectionE = null;
/**
* Collection of {@link Integer}s, bound as {@link Number}s
*/
private Collection<Number> collectionA2 = null;
/**
* Collection of {@link Long}s, bound as {@link Number}s
*/
private Collection<Number> collectionB2 = null;
/**
* Collection of {@link Integer}s (cast as {@link Number}s) that are
* equivalent to the Longs in collectionB.
*/
private Collection<Number> collectionC2 = null;
private Iterable<Integer> iterableA = null;
private Iterable<Long> iterableB = null;
private Iterable<Integer> iterableC = null;
private Iterable<Number> iterableA2 = null;
private Iterable<Number> iterableB2 = null;
private final Collection<Integer> emptyCollection = new ArrayList<>(1);
@Before
public void setUp() {
collectionA = new ArrayList<>();
collectionA.add(1);
collectionA.add(2);
collectionA.add(2);
collectionA.add(3);
collectionA.add(3);
collectionA.add(3);
collectionA.add(4);
collectionA.add(4);
collectionA.add(4);
collectionA.add(4);
collectionB = new LinkedList<>();
collectionB.add(5L);
collectionB.add(4L);
collectionB.add(4L);
collectionB.add(3L);
collectionB.add(3L);
collectionB.add(3L);
collectionB.add(2L);
collectionB.add(2L);
collectionB.add(2L);
collectionB.add(2L);
collectionC = new ArrayList<>();
for (final Long l : collectionB) {
collectionC.add(l.intValue());
}
iterableA = collectionA;
iterableB = collectionB;
iterableC = collectionC;
collectionA2 = new ArrayList<>(collectionA);
collectionB2 = new LinkedList<>(collectionB);
collectionC2 = new LinkedList<>(collectionC);
iterableA2 = collectionA2;
iterableB2 = collectionB2;
collectionD = new ArrayList<>();
collectionD.add(1);
collectionD.add(3);
collectionD.add(3);
collectionD.add(3);
collectionD.add(5);
collectionD.add(7);
collectionD.add(7);
collectionD.add(10);
collectionE = new ArrayList<>();
collectionE.add(2);
collectionE.add(4);
collectionE.add(4);
collectionE.add(5);
collectionE.add(6);
collectionE.add(6);
collectionE.add(9);
}
@Test
public void getCardinalityMap() {
final Map<Number, Integer> freqA = CollectionUtils.<Number>getCardinalityMap(iterableA);
assertEquals(1, (int) freqA.get(1));
assertEquals(2, (int) freqA.get(2));
assertEquals(3, (int) freqA.get(3));
assertEquals(4, (int) freqA.get(4));
assertNull(freqA.get(5));
final Map<Long, Integer> freqB = CollectionUtils.getCardinalityMap(iterableB);
assertNull(freqB.get(1L));
assertEquals(4, (int) freqB.get(2L));
assertEquals(3, (int) freqB.get(3L));
assertEquals(2, (int) freqB.get(4L));
assertEquals(1, (int) freqB.get(5L));
}
@Test
@Deprecated
public void cardinality() {
assertEquals(1, CollectionUtils.cardinality(1, iterableA));
assertEquals(2, CollectionUtils.cardinality(2, iterableA));
assertEquals(3, CollectionUtils.cardinality(3, iterableA));
assertEquals(4, CollectionUtils.cardinality(4, iterableA));
assertEquals(0, CollectionUtils.cardinality(5, iterableA));
assertEquals(0, CollectionUtils.cardinality(1L, iterableB));
assertEquals(4, CollectionUtils.cardinality(2L, iterableB));
assertEquals(3, CollectionUtils.cardinality(3L, iterableB));
assertEquals(2, CollectionUtils.cardinality(4L, iterableB));
assertEquals(1, CollectionUtils.cardinality(5L, iterableB));
// Ensure that generic bounds accept valid parameters, but return
// expected results
// e.g. no longs in the "int" Iterable<Number>, and vice versa.
assertEquals(0, CollectionUtils.cardinality(2L, iterableA2));
assertEquals(0, CollectionUtils.cardinality(2, iterableB2));
final Set<String> 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));
final Bag<String> 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));
}
@Test
@Deprecated
public void cardinalityOfNull() {
final List<String> list = new ArrayList<>();
assertEquals(0, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertNull(freq.get(null));
}
list.add("A");
assertEquals(0, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertNull(freq.get(null));
}
list.add(null);
assertEquals(1, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertEquals(Integer.valueOf(1), freq.get(null));
}
list.add("B");
assertEquals(1, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertEquals(Integer.valueOf(1), freq.get(null));
}
list.add(null);
assertEquals(2, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertEquals(Integer.valueOf(2), freq.get(null));
}
list.add("B");
assertEquals(2, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertEquals(Integer.valueOf(2), freq.get(null));
}
list.add(null);
assertEquals(3, CollectionUtils.cardinality(null, list));
{
final Map<String, Integer> freq = CollectionUtils.getCardinalityMap(list);
assertEquals(Integer.valueOf(3), freq.get(null));
}
}
@Test
public void containsAll() {
final Collection<String> empty = new ArrayList<>(0);
final Collection<String> one = new ArrayList<>(1);
one.add("1");
final Collection<String> two = new ArrayList<>(1);
two.add("2");
final Collection<String> three = new ArrayList<>(1);
three.add("3");
final Collection<String> odds = new ArrayList<>(2);
odds.add("1");
odds.add("3");
final Collection<String> multiples = new ArrayList<>(3);
multiples.add("1");
multiples.add("3");
multiples.add("1");
assertTrue("containsAll({1},{1,3}) should return false.", !CollectionUtils.containsAll(one, odds));
assertTrue("containsAll({1,3},{1}) should return true.", CollectionUtils.containsAll(odds, one));
assertTrue("containsAll({3},{1,3}) should return false.", !CollectionUtils.containsAll(three, odds));
assertTrue("containsAll({1,3},{3}) should return true.", CollectionUtils.containsAll(odds, three));
assertTrue("containsAll({2},{2}) should return true.", CollectionUtils.containsAll(two, two));
assertTrue("containsAll({1,3},{1,3}) should return true.", CollectionUtils.containsAll(odds, odds));
assertTrue("containsAll({2},{1,3}) should return false.", !CollectionUtils.containsAll(two, odds));
assertTrue("containsAll({1,3},{2}) should return false.", !CollectionUtils.containsAll(odds, two));
assertTrue("containsAll({1},{3}) should return false.", !CollectionUtils.containsAll(one, three));
assertTrue("containsAll({3},{1}) should return false.", !CollectionUtils.containsAll(three, one));
assertTrue("containsAll({1,3},{}) should return true.", CollectionUtils.containsAll(odds, empty));
assertTrue("containsAll({},{1,3}) should return false.", !CollectionUtils.containsAll(empty, odds));
assertTrue("containsAll({},{}) should return true.", CollectionUtils.containsAll(empty, empty));
assertTrue("containsAll({1,3},{1,3,1}) should return true.", CollectionUtils.containsAll(odds, multiples));
assertTrue("containsAll({1,3,1},{1,3,1}) should return true.", CollectionUtils.containsAll(odds, odds));
}
@Test
public void containsAnyInCollection() {
final Collection<String> empty = new ArrayList<>(0);
final Collection<String> one = new ArrayList<>(1);
one.add("1");
final Collection<String> two = new ArrayList<>(1);
two.add("2");
final Collection<String> three = new ArrayList<>(1);
three.add("3");
final Collection<String> 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));
}
@Test
public void containsAnyInArray() {
final Collection<String> empty = new ArrayList<>(0);
final String[] emptyArr = {};
final Collection<String> one = new ArrayList<>(1);
one.add("1");
final String[] oneArr = {"1"};
final Collection<String> two = new ArrayList<>(1);
two.add("2");
final String[] twoArr = {"2"};
final Collection<String> three = new ArrayList<>(1);
three.add("3");
final String[] threeArr = {"3"};
final Collection<String> odds = new ArrayList<>(2);
odds.add("1");
odds.add("3");
final String[] oddsArr = {"1", "3"};
assertTrue("containsAny({1},{1,3}) should return true.", CollectionUtils.containsAny(one, oddsArr));
assertTrue("containsAny({1,3},{1}) should return true.", CollectionUtils.containsAny(odds, oneArr));
assertTrue("containsAny({3},{1,3}) should return true.", CollectionUtils.containsAny(three, oddsArr));
assertTrue("containsAny({1,3},{3}) should return true.", CollectionUtils.containsAny(odds, threeArr));
assertTrue("containsAny({2},{2}) should return true.", CollectionUtils.containsAny(two, twoArr));
assertTrue("containsAny({1,3},{1,3}) should return true.", CollectionUtils.containsAny(odds, oddsArr));
assertTrue("containsAny({2},{1,3}) should return false.", !CollectionUtils.containsAny(two, oddsArr));
assertTrue("containsAny({1,3},{2}) should return false.", !CollectionUtils.containsAny(odds, twoArr));
assertTrue("containsAny({1},{3}) should return false.", !CollectionUtils.containsAny(one, threeArr));
assertTrue("containsAny({3},{1}) should return false.", !CollectionUtils.containsAny(three, oneArr));
assertTrue("containsAny({1,3},{}) should return false.", !CollectionUtils.containsAny(odds, emptyArr));
assertTrue("containsAny({},{1,3}) should return false.", !CollectionUtils.containsAny(empty, oddsArr));
assertTrue("containsAny({},{}) should return false.", !CollectionUtils.containsAny(empty, emptyArr));
}
@Test
public void union() {
final Collection<Integer> col = CollectionUtils.union(iterableA, iterableC);
final Map<Integer, Integer> freq = CollectionUtils.getCardinalityMap(col);
assertEquals(Integer.valueOf(1), freq.get(1));
assertEquals(Integer.valueOf(4), freq.get(2));
assertEquals(Integer.valueOf(3), freq.get(3));
assertEquals(Integer.valueOf(4), freq.get(4));
assertEquals(Integer.valueOf(1), freq.get(5));
final Collection<Number> col2 = CollectionUtils.union(collectionC2, iterableA);
final Map<Number, Integer> freq2 = CollectionUtils.getCardinalityMap(col2);
assertEquals(Integer.valueOf(1), freq2.get(1));
assertEquals(Integer.valueOf(4), freq2.get(2));
assertEquals(Integer.valueOf(3), freq2.get(3));
assertEquals(Integer.valueOf(4), freq2.get(4));
assertEquals(Integer.valueOf(1), freq2.get(5));
}
@Test
public void intersection() {
final Collection<Integer> col = CollectionUtils.intersection(iterableA, iterableC);
final Map<Integer, Integer> freq = CollectionUtils.getCardinalityMap(col);
assertNull(freq.get(1));
assertEquals(Integer.valueOf(2), freq.get(2));
assertEquals(Integer.valueOf(3), freq.get(3));
assertEquals(Integer.valueOf(2), freq.get(4));
assertNull(freq.get(5));
final Collection<Number> col2 = CollectionUtils.intersection(collectionC2, collectionA);
final Map<Number, Integer> freq2 = CollectionUtils.getCardinalityMap(col2);
assertNull(freq2.get(1));
assertEquals(Integer.valueOf(2), freq2.get(2));
assertEquals(Integer.valueOf(3), freq2.get(3));
assertEquals(Integer.valueOf(2), freq2.get(4));
assertNull(freq2.get(5));
}
@Test
public void disjunction() {
final Collection<Integer> col = CollectionUtils.disjunction(iterableA, iterableC);
final Map<Integer, Integer> freq = CollectionUtils.getCardinalityMap(col);
assertEquals(Integer.valueOf(1), freq.get(1));
assertEquals(Integer.valueOf(2), freq.get(2));
assertNull(freq.get(3));
assertEquals(Integer.valueOf(2), freq.get(4));
assertEquals(Integer.valueOf(1), freq.get(5));
final Collection<Number> col2 = CollectionUtils.disjunction(collectionC2, collectionA);
final Map<Number, Integer> freq2 = CollectionUtils.getCardinalityMap(col2);
assertEquals(Integer.valueOf(1), freq2.get(1));
assertEquals(Integer.valueOf(2), freq2.get(2));
assertNull(freq2.get(3));
assertEquals(Integer.valueOf(2), freq2.get(4));
assertEquals(Integer.valueOf(1), freq2.get(5));
}
@Test
public void testDisjunctionAsUnionMinusIntersection() {
final Collection<Number> dis = CollectionUtils.<Number>disjunction(collectionA, collectionC);
final Collection<Number> un = CollectionUtils.<Number>union(collectionA, collectionC);
final Collection<Number> inter = CollectionUtils.<Number>intersection(collectionA, collectionC);
assertTrue(CollectionUtils.isEqualCollection(dis, CollectionUtils.subtract(un, inter)));
}
@Test
public void testDisjunctionAsSymmetricDifference() {
final Collection<Number> dis = CollectionUtils.<Number>disjunction(collectionA, collectionC);
final Collection<Number> amb = CollectionUtils.<Number>subtract(collectionA, collectionC);
final Collection<Number> bma = CollectionUtils.<Number>subtract(collectionC, collectionA);
assertTrue(CollectionUtils.isEqualCollection(dis, CollectionUtils.union(amb, bma)));
}
@Test
public void testSubtract() {
final Collection<Integer> col = CollectionUtils.subtract(iterableA, iterableC);
final Map<Integer, Integer> freq = CollectionUtils.getCardinalityMap(col);
assertEquals(Integer.valueOf(1), freq.get(1));
assertNull(freq.get(2));
assertNull(freq.get(3));
assertEquals(Integer.valueOf(2), freq.get(4));
assertNull(freq.get(5));
final Collection<Number> col2 = CollectionUtils.subtract(collectionC2, collectionA);
final Map<Number, Integer> freq2 = CollectionUtils.getCardinalityMap(col2);
assertEquals(Integer.valueOf(1), freq2.get(5));
assertNull(freq2.get(4));
assertNull(freq2.get(3));
assertEquals(Integer.valueOf(2), freq2.get(2));
assertNull(freq2.get(1));
}
@Test
public void testSubtractWithPredicate() {
// greater than 3
final Predicate<Number> predicate = n -> n.longValue() > 3L;
final Collection<Number> col = CollectionUtils.subtract(iterableA, collectionC, predicate);
final Map<Number, Integer> freq2 = CollectionUtils.getCardinalityMap(col);
assertEquals(Integer.valueOf(1), freq2.get(1));
assertEquals(Integer.valueOf(2), freq2.get(2));
assertEquals(Integer.valueOf(3), freq2.get(3));
assertEquals(Integer.valueOf(2), freq2.get(4));
assertNull(freq2.get(5));
}
@Test
public void testIsSubCollectionOfSelf() {
assertTrue(CollectionUtils.isSubCollection(collectionA, collectionA));
assertTrue(CollectionUtils.isSubCollection(collectionB, collectionB));
}
@Test
public void testIsSubCollection() {
assertTrue(!CollectionUtils.isSubCollection(collectionA, collectionC));
assertTrue(!CollectionUtils.isSubCollection(collectionC, collectionA));
}
@Test
public void testIsSubCollection2() {
final Collection<Integer> c = new ArrayList<>();
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(1);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(2);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(2);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(3);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(3);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(3);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(4);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(4);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(4);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(!CollectionUtils.isSubCollection(collectionA, c));
c.add(4);
assertTrue(CollectionUtils.isSubCollection(c, collectionA));
assertTrue(CollectionUtils.isSubCollection(collectionA, c));
c.add(5);
assertTrue(!CollectionUtils.isSubCollection(c, collectionA));
assertTrue(CollectionUtils.isSubCollection(collectionA, c));
}
@Test
public void testIsEqualCollectionToSelf() {
assertTrue(CollectionUtils.isEqualCollection(collectionA, collectionA));
assertTrue(CollectionUtils.isEqualCollection(collectionB, collectionB));
}
@Test
public void testIsEqualCollection() {
assertTrue(!CollectionUtils.isEqualCollection(collectionA, collectionC));
assertTrue(!CollectionUtils.isEqualCollection(collectionC, collectionA));
}
@Test
public void testIsEqualCollectionReturnsFalse() {
final List<Integer> b = new ArrayList<>(collectionA);
// remove an extra '2', and add a 5. This will increase the size of the cardinality
b.remove(1);
b.add(5);
assertFalse(CollectionUtils.isEqualCollection(collectionA, b));
assertFalse(CollectionUtils.isEqualCollection(b, collectionA));
}
@Test
public void testIsEqualCollection2() {
final Collection<String> a = new ArrayList<>();
final Collection<String> 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));
}
@Test
public void testIsEqualCollectionEquator() {
final Collection<Integer> collB = CollectionUtils.collect(collectionB, TRANSFORM_TO_INTEGER);
// odd / even equator
final Equator<Integer> e = new Equator<Integer>() {
@Override
public boolean equate(final Integer o1, final Integer o2) {
if (o1.intValue() % 2 == 0 ^ o2.intValue() % 2 == 0) {
return false;
}
return true;
}
@Override
public int hash(final Integer o) {
return o.intValue() % 2 == 0 ? Integer.valueOf(0).hashCode() : Integer.valueOf(1).hashCode();
}
};
assertTrue(CollectionUtils.isEqualCollection(collectionA, collectionA, e));
assertTrue(CollectionUtils.isEqualCollection(collectionA, collB, e));
assertTrue(CollectionUtils.isEqualCollection(collB, collectionA, e));
final Equator<Number> defaultEquator = DefaultEquator.defaultEquator();
assertFalse(CollectionUtils.isEqualCollection(collectionA, collectionB, defaultEquator));
assertFalse(CollectionUtils.isEqualCollection(collectionA, collB, defaultEquator));
}
@Test(expected=NullPointerException.class)
public void testIsEqualCollectionNullEquator() {
CollectionUtils.isEqualCollection(collectionA, collectionA, null);
}
@Test
public void testIsProperSubCollection() {
final Collection<String> a = new ArrayList<>();
final Collection<String> 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, collectionC), collectionA));
assertTrue(CollectionUtils.isProperSubCollection(CollectionUtils.subtract(a, b), a));
assertTrue(!CollectionUtils.isProperSubCollection(a, CollectionUtils.subtract(a, b)));
}
@Test
@Deprecated
public void find() {
Predicate<Number> testPredicate = equalPredicate((Number) 4);
Integer test = CollectionUtils.find(collectionA, testPredicate);
assertTrue(test.equals(4));
testPredicate = equalPredicate((Number) 45);
test = CollectionUtils.find(collectionA, testPredicate);
assertTrue(test == null);
assertNull(CollectionUtils.find(null,testPredicate));
assertNull(CollectionUtils.find(collectionA, null));
}
@Test
@Deprecated
public void forAllDoCollection() {
final Closure<Collection<Integer>> testClosure = ClosureUtils.invokerClosure("clear");
final Collection<Collection<Integer>> col = new ArrayList<>();
col.add(collectionA);
col.add(collectionC);
Closure<Collection<Integer>> resultClosure = CollectionUtils.forAllDo(col, testClosure);
assertSame(testClosure, resultClosure);
assertTrue(collectionA.isEmpty() && collectionC.isEmpty());
// fix for various java 1.6 versions: keep the cast
resultClosure = CollectionUtils.forAllDo(col, (Closure<Collection<Integer>>) null);
assertNull(resultClosure);
assertTrue(collectionA.isEmpty() && collectionC.isEmpty());
resultClosure = CollectionUtils.forAllDo((Collection<Collection<Integer>>) null, testClosure);
col.add(null);
// null should be OK
CollectionUtils.forAllDo(col, testClosure);
}
@Test
@Deprecated
public void forAllDoIterator() {
final Closure<Collection<Integer>> testClosure = ClosureUtils.invokerClosure("clear");
final Collection<Collection<Integer>> col = new ArrayList<>();
col.add(collectionA);
col.add(collectionC);
Closure<Collection<Integer>> resultClosure = CollectionUtils.forAllDo(col.iterator(), testClosure);
assertSame(testClosure, resultClosure);
assertTrue(collectionA.isEmpty() && collectionC.isEmpty());
// fix for various java 1.6 versions: keep the cast
resultClosure = CollectionUtils.forAllDo(col.iterator(), (Closure<Collection<Integer>>) null);
assertNull(resultClosure);
assertTrue(collectionA.isEmpty() && collectionC.isEmpty());
resultClosure = CollectionUtils.forAllDo((Iterator<Collection<Integer>>) null, testClosure);
col.add(null);
// null should be OK
CollectionUtils.forAllDo(col.iterator(), testClosure);
}
@Test(expected = FunctorException.class)
@Deprecated
public void forAllDoFailure() {
final Closure<String> testClosure = ClosureUtils.invokerClosure("clear");
final Collection<String> col = new ArrayList<>();
col.add("x");
CollectionUtils.forAllDo(col, testClosure);
}
@Test
@Deprecated
public void forAllButLastDoCollection() {
final Closure<List<? extends Number>> testClosure = ClosureUtils.invokerClosure("clear");
final Collection<List<? extends Number>> col = new ArrayList<>();
col.add(collectionA);
col.add(collectionB);
List<? extends Number> lastElement = CollectionUtils.forAllButLastDo(col, testClosure);
assertSame(lastElement, collectionB);
assertTrue(collectionA.isEmpty() && !collectionB.isEmpty());
col.clear();
col.add(collectionB);
lastElement = CollectionUtils.forAllButLastDo(col, testClosure);
assertSame(lastElement, collectionB);
assertTrue(!collectionB.isEmpty() );
col.clear();
lastElement = CollectionUtils.forAllButLastDo(col, testClosure);
assertNull(lastElement);
final Collection<String> strings = Arrays.asList("a", "b", "c");
final StringBuffer result = new StringBuffer();
result.append(CollectionUtils.forAllButLastDo(strings, (Closure<String>) input -> result.append(input+";")));
assertEquals("a;b;c", result.toString());
final Collection<String> oneString = Arrays.asList("a");
final StringBuffer resultOne = new StringBuffer();
resultOne.append(CollectionUtils.forAllButLastDo(oneString, (Closure<String>) input -> resultOne.append(input+";")));
assertEquals("a", resultOne.toString());
assertNull(CollectionUtils.forAllButLastDo(strings, (Closure<String>) null)); // do not remove cast
assertNull(CollectionUtils.forAllButLastDo((Collection<String>) null, (Closure<String>) null)); // do not remove cast
}
@Test
@Deprecated
public void forAllButLastDoIterator() {
final Closure<List<? extends Number>> testClosure = ClosureUtils.invokerClosure("clear");
final Collection<List<? extends Number>> col = new ArrayList<>();
col.add(collectionA);
col.add(collectionB);
final List<? extends Number> lastElement = CollectionUtils.forAllButLastDo(col.iterator(), testClosure);
assertSame(lastElement, collectionB);
assertTrue(collectionA.isEmpty() && !collectionB.isEmpty());
assertNull(CollectionUtils.forAllButLastDo(col.iterator(), (Closure<List<? extends Number>>) null));
assertNull(CollectionUtils.forAllButLastDo((Iterator<String>) null, (Closure<String>) null)); // do not remove cast
}
@Test
public void getFromMap() {
// Unordered map, entries exist
final Map<String, String> expected = new HashMap<>();
expected.put("zeroKey", "zero");
expected.put("oneKey", "one");
final Map<String, String> found = new HashMap<>();
Map.Entry<String, String> entry = CollectionUtils.get(expected, 0);
found.put(entry.getKey(), entry.getValue());
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 (final IndexOutOfBoundsException e) {
// expected
}
try {
CollectionUtils.get(expected, -2);
fail("Expecting IndexOutOfBoundsException.");
} catch (final IndexOutOfBoundsException e) {
// expected
}
// Sorted map, entries exist, should respect order
final SortedMap<String, String> map = new TreeMap<>();
map.put("zeroKey", "zero");
map.put("oneKey", "one");
Map.Entry<String, String> test = CollectionUtils.get(map, 1);
assertEquals("zeroKey", test.getKey());
assertEquals("zero", test.getValue());
test = CollectionUtils.get(map, 0);
assertEquals("oneKey", test.getKey());
assertEquals("one", test.getValue());
}
/**
* Tests that {@link List}s are handled correctly - e.g. using
* {@link List#get(int)}.
*/
@Test(expected=IndexOutOfBoundsException.class)
public void getFromList() throws Exception {
// List, entry exists
final List<String> list = createMock(List.class);
expect(list.get(0)).andReturn("zero");
expect(list.get(1)).andReturn("one");
replay();
final String string = CollectionUtils.get(list, 0);
assertEquals("zero", string);
assertEquals("one", CollectionUtils.get(list, 1));
// list, non-existent entry -- IndexOutOfBoundsException
CollectionUtils.get(new ArrayList<>(), 2);
}
@Test
@Deprecated
public void getFromIterator() throws Exception {
// Iterator, entry exists
Iterator<Integer> iterator = iterableA.iterator();
assertEquals(1, (int) CollectionUtils.get(iterator, 0));
iterator = iterableA.iterator();
assertEquals(2, (int) CollectionUtils.get(iterator, 1));
// Iterator, non-existent entry
try {
CollectionUtils.get(iterator, 10);
fail("Expecting IndexOutOfBoundsException.");
} catch (final IndexOutOfBoundsException e) {
// expected
}
assertTrue(!iterator.hasNext());
}
@Test
@Deprecated
public void getFromEnumeration() throws Exception {
// Enumeration, entry exists
final Vector<String> vector = new Vector<>();
vector.addElement("zero");
vector.addElement("one");
Enumeration<String> 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 (final IndexOutOfBoundsException e) {
// expected
}
assertTrue(!en.hasMoreElements());
}
@Test(expected = IndexOutOfBoundsException.class)
@Deprecated
public void getFromIterable() throws Exception {
// Collection, entry exists
final Bag<String> bag = new HashBag<>();
bag.add("element", 1);
assertEquals("element", CollectionUtils.get(bag, 0));
// Collection, non-existent entry
CollectionUtils.get(bag, 1);
}
@Test(expected = IndexOutOfBoundsException.class)
public void getFromObjectArray() throws Exception {
// Object array, entry exists
final 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
CollectionUtils.get(objArray, 2);
}
@Test(expected = IndexOutOfBoundsException.class)
public void getFromPrimitiveArray() throws Exception {
// Primitive array, entry exists
final int[] array = new int[2];
array[0] = 10;
array[1] = 20;
assertEquals(10, CollectionUtils.get(array, 0));
assertEquals(20, CollectionUtils.get(array, 1));
// Object array, non-existent entry --
// ArrayIndexOutOfBoundsException
CollectionUtils.get(array, 2);
}
@Test(expected=IllegalArgumentException.class)
public void getFromObject() throws Exception {
// Invalid object
final Object obj = new Object();
CollectionUtils.get(obj, 0);
}
// -----------------------------------------------------------------------
@Test
public void testSize_List() {
List<String> list = null;
assertEquals(0, CollectionUtils.size(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));
}
@Test
public void testSize_Map() {
final Map<String, String> 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));
}
@Test
public void testSize_Array() {
final Object[] objectArray = new Object[0];
assertEquals(0, CollectionUtils.size(objectArray));
final String[] stringArray = new String[3];
assertEquals(3, CollectionUtils.size(stringArray));
stringArray[0] = "a";
stringArray[1] = "b";
stringArray[2] = "c";
assertEquals(3, CollectionUtils.size(stringArray));
}
@Test
public void testSize_PrimitiveArray() {
final int[] intArray = new int[0];
assertEquals(0, CollectionUtils.size(intArray));
final 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));
}
@Test
public void testSize_Enumeration() {
final Vector<String> 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()));
}
@Test
public void testSize_Iterator() {
final List<String> 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()));
}
@Test(expected=IllegalArgumentException.class)
public void testSize_Other() {
CollectionUtils.size("not a list");
}
// -----------------------------------------------------------------------
@Test
public void testSizeIsEmpty_Null() {
assertEquals(true, CollectionUtils.sizeIsEmpty(null));
}
@Test
public void testSizeIsEmpty_List() {
final List<String> list = new ArrayList<>();
assertEquals(true, CollectionUtils.sizeIsEmpty(list));
list.add("a");
assertEquals(false, CollectionUtils.sizeIsEmpty(list));
}
@Test
public void testSizeIsEmpty_Map() {
final Map<String, String> map = new HashMap<>();
assertEquals(true, CollectionUtils.sizeIsEmpty(map));
map.put("1", "a");
assertEquals(false, CollectionUtils.sizeIsEmpty(map));
}
@Test
public void testSizeIsEmpty_Array() {
final Object[] objectArray = new Object[0];
assertEquals(true, CollectionUtils.sizeIsEmpty(objectArray));
final String[] stringArray = new String[3];
assertEquals(false, CollectionUtils.sizeIsEmpty(stringArray));
stringArray[0] = "a";
stringArray[1] = "b";
stringArray[2] = "c";
assertEquals(false, CollectionUtils.sizeIsEmpty(stringArray));
}
@Test
public void testSizeIsEmpty_PrimitiveArray() {
final int[] intArray = new int[0];
assertEquals(true, CollectionUtils.sizeIsEmpty(intArray));
final 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));
}
@Test
public void testSizeIsEmpty_Enumeration() {
final Vector<String> list = new Vector<>();
assertEquals(true, CollectionUtils.sizeIsEmpty(list.elements()));
list.add("a");
assertEquals(false, CollectionUtils.sizeIsEmpty(list.elements()));
final Enumeration<String> en = list.elements();
en.nextElement();
assertEquals(true, CollectionUtils.sizeIsEmpty(en));
}
@Test
public void testSizeIsEmpty_Iterator() {
final List<String> list = new ArrayList<>();
assertEquals(true, CollectionUtils.sizeIsEmpty(list.iterator()));
list.add("a");
assertEquals(false, CollectionUtils.sizeIsEmpty(list.iterator()));
final Iterator<String> it = list.iterator();
it.next();
assertEquals(true, CollectionUtils.sizeIsEmpty(it));
}
@Test
public void testSizeIsEmpty_Other() {
try {
CollectionUtils.sizeIsEmpty("not a list");
fail("Expecting IllegalArgumentException");
} catch (final IllegalArgumentException ex) {
}
}
// -----------------------------------------------------------------------
@Test
public void testIsEmptyWithEmptyCollection() {
final Collection<Object> coll = new ArrayList<>();
assertEquals(true, CollectionUtils.isEmpty(coll));
}
@Test
public void testIsEmptyWithNonEmptyCollection() {
final Collection<String> coll = new ArrayList<>();
coll.add("item");
assertEquals(false, CollectionUtils.isEmpty(coll));
}
@Test
public void testIsEmptyWithNull() {
final Collection<?> coll = null;
assertEquals(true, CollectionUtils.isEmpty(coll));
}
@Test
public void testIsNotEmptyWithEmptyCollection() {
final Collection<Object> coll = new ArrayList<>();
assertEquals(false, CollectionUtils.isNotEmpty(coll));
}
@Test
public void testIsNotEmptyWithNonEmptyCollection() {
final Collection<String> coll = new ArrayList<>();
coll.add("item");
assertEquals(true, CollectionUtils.isNotEmpty(coll));
}
@Test
public void testIsNotEmptyWithNull() {
final Collection<?> coll = null;
assertEquals(false, CollectionUtils.isNotEmpty(coll));
}
// -----------------------------------------------------------------------
private static Predicate<Number> EQUALS_TWO = input -> input.intValue() == 2;
//Up to here
@Test
public void filter() {
final List<Integer> ints = new ArrayList<>();
ints.add(1);
ints.add(2);
ints.add(3);
ints.add(3);
final Iterable<Integer> iterable = ints;
assertTrue(CollectionUtils.filter(iterable, EQUALS_TWO));
assertEquals(1, ints.size());
assertEquals(2, (int) ints.get(0));
}
@Test
public void filterNullParameters() throws Exception {
final List<Long> longs = Collections.nCopies(4, 10L);
assertFalse(CollectionUtils.filter(longs, null));
assertEquals(4, longs.size());
assertFalse(CollectionUtils.filter(null, EQUALS_TWO));
assertEquals(4, longs.size());
assertFalse(CollectionUtils.filter(null, null));
assertEquals(4, longs.size());
}
@Test
public void filterInverse() {
final List<Integer> ints = new ArrayList<>();
ints.add(1);
ints.add(2);
ints.add(3);
ints.add(3);
final Iterable<Integer> iterable = ints;
assertTrue(CollectionUtils.filterInverse(iterable, EQUALS_TWO));
assertEquals(3, ints.size());
assertEquals(1, (int) ints.get(0));
assertEquals(3, (int) ints.get(1));
assertEquals(3, (int) ints.get(2));
}
@Test
public void filterInverseNullParameters() throws Exception {
final List<Long> longs = Collections.nCopies(4, 10L);
assertFalse(CollectionUtils.filterInverse(longs, null));
assertEquals(4, longs.size());
assertFalse(CollectionUtils.filterInverse(null, EQUALS_TWO));
assertEquals(4, longs.size());
assertFalse(CollectionUtils.filterInverse(null, null));
assertEquals(4, longs.size());
}
@Test
@Deprecated
public void countMatches() {
assertEquals(4, CollectionUtils.countMatches(iterableB, EQUALS_TWO));
assertEquals(0, CollectionUtils.countMatches(iterableA, null));
assertEquals(0, CollectionUtils.countMatches(null, EQUALS_TWO));
assertEquals(0, CollectionUtils.countMatches(null, null));
}
@Test
@Deprecated
public void exists() {
final List<Integer> list = new ArrayList<>();
assertFalse(CollectionUtils.exists(null, null));
assertFalse(CollectionUtils.exists(list, null));
assertFalse(CollectionUtils.exists(null, EQUALS_TWO));
assertFalse(CollectionUtils.exists(list, EQUALS_TWO));
list.add(1);
list.add(3);
list.add(4);
assertFalse(CollectionUtils.exists(list, EQUALS_TWO));
list.add(2);
assertEquals(true, CollectionUtils.exists(list, EQUALS_TWO));
}
@Test
public void select() {
final List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
// Ensure that the collection is the input type or a super type
final Collection<Integer> output1 = CollectionUtils.select(list, EQUALS_TWO);
final Collection<Number> output2 = CollectionUtils.<Number>select(list, EQUALS_TWO);
final HashSet<Number> output3 = CollectionUtils.select(list, EQUALS_TWO, new HashSet<Number>());
assertTrue(CollectionUtils.isEqualCollection(output1, output3));
assertEquals(4, list.size());
assertEquals(1, output1.size());
assertEquals(2, output2.iterator().next());
}
@Test
public void selectWithOutputCollections() {
final List<Integer> input = new ArrayList<>();
input.add(1);
input.add(2);
input.add(3);
input.add(4);
final List<Integer> output = new ArrayList<>();
final List<Integer> rejected = new ArrayList<>();
CollectionUtils.select(input, EQUALS_TWO, output, rejected);
// output contains 2
assertEquals(1, output.size());
assertEquals(2, CollectionUtils.extractSingleton(output).intValue());
// rejected contains 1, 3, and 4
final Integer[] expected = {1, 3, 4};
Assert.assertArrayEquals(expected, rejected.toArray());
output.clear();
rejected.clear();
CollectionUtils.select((List<Integer>) null, EQUALS_TWO, output, rejected);
assertTrue(output.isEmpty());
assertTrue(rejected.isEmpty());
}
@Test
public void selectRejected() {
final List<Long> list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
list.add(4L);
final Collection<Long> output1 = CollectionUtils.selectRejected(list, EQUALS_TWO);
final Collection<? extends Number> output2 = CollectionUtils.selectRejected(list, EQUALS_TWO);
final HashSet<Number> output3 = CollectionUtils.selectRejected(list, EQUALS_TWO, new HashSet<Number>());
assertTrue(CollectionUtils.isEqualCollection(output1, output2));
assertTrue(CollectionUtils.isEqualCollection(output1, output3));
assertEquals(4, list.size());
assertEquals(3, output1.size());
assertTrue(output1.contains(1L));
assertTrue(output1.contains(3L));
assertTrue(output1.contains(4L));
}
@Test
public void collect() {
final Transformer<Number, Long> transformer = TransformerUtils.constantTransformer(2L);
Collection<Number> collection = CollectionUtils.<Integer, Number>collect(iterableA, transformer);
assertTrue(collection.size() == collectionA.size());
assertCollectResult(collection);
ArrayList<Number> list;
list = CollectionUtils.collect(collectionA, transformer, new ArrayList<Number>());
assertTrue(list.size() == collectionA.size());
assertCollectResult(list);
Iterator<Integer> iterator = null;
list = CollectionUtils.collect(iterator, transformer, new ArrayList<Number>());
iterator = iterableA.iterator();
list = CollectionUtils.collect(iterator, transformer, list);
assertTrue(collection.size() == collectionA.size());
assertCollectResult(collection);
iterator = collectionA.iterator();
collection = CollectionUtils.<Integer, Number>collect(iterator, transformer);
assertTrue(collection.size() == collectionA.size());
assertTrue(collection.contains(2L) && !collection.contains(1));
collection = CollectionUtils.collect((Iterator<Integer>) null, (Transformer<Integer, Number>) null);
assertTrue(collection.size() == 0);
final int size = collectionA.size();
collectionB = CollectionUtils.collect((Collection<Integer>) null, transformer, collectionB);
assertTrue(collectionA.size() == size && collectionA.contains(1));
CollectionUtils.collect(collectionB, null, collectionA);
assertTrue(collectionA.size() == size && collectionA.contains(1));
}
private void assertCollectResult(final Collection<Number> collection) {
assertTrue(collectionA.contains(1) && !collectionA.contains(2L));
assertTrue(collection.contains(2L) && !collection.contains(1));
}
Transformer<Object, Integer> TRANSFORM_TO_INTEGER = input -> Integer.valueOf(((Long)input).intValue());
@Test
public void transform1() {
List<Number> list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
CollectionUtils.transform(list, TRANSFORM_TO_INTEGER);
assertEquals(3, list.size());
assertEquals(1, list.get(0));
assertEquals(2, list.get(1));
assertEquals(3, list.get(2));
list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
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());
}
@Test
public void transform2() {
final Set<Number> set = new HashSet<>();
set.add(1L);
set.add(2L);
set.add(3L);
CollectionUtils.transform(set, input -> 4);
assertEquals(1, set.size());
assertEquals(4, set.iterator().next());
}
// -----------------------------------------------------------------------
@Test
public void addIgnoreNull() {
final Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
assertFalse(CollectionUtils.addIgnoreNull(set, null));
assertEquals(3, set.size());
assertFalse(CollectionUtils.addIgnoreNull(set, "1"));
assertEquals(3, set.size());
assertEquals(true, CollectionUtils.addIgnoreNull(set, "4"));
assertEquals(4, set.size());
assertEquals(true, set.contains("4"));
}
// -----------------------------------------------------------------------
@Test
public void predicatedCollection() {
final Predicate<Object> predicate = PredicateUtils.instanceofPredicate(Integer.class);
final Collection<Number> collection = CollectionUtils.predicatedCollection(new ArrayList<Number>(), predicate);
assertTrue("returned object should be a PredicatedCollection", collection instanceof PredicatedCollection);
try {
CollectionUtils.predicatedCollection(new ArrayList<Number>(), null);
fail("Expecting NullPointerException for null predicate.");
} catch (final NullPointerException ex) {
// expected
}
try {
CollectionUtils.predicatedCollection(null, predicate);
fail("Expecting NullPointerException for null collection.");
} catch (final NullPointerException ex) {
// expected
}
}
@Test
public void isFull() {
final Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
try {
CollectionUtils.isFull(null);
fail();
} catch (final NullPointerException ex) {
}
assertFalse(CollectionUtils.isFull(set));
final CircularFifoQueue<String> buf = new CircularFifoQueue<>(set);
assertEquals(false, CollectionUtils.isFull(buf));
buf.remove("2");
assertFalse(CollectionUtils.isFull(buf));
buf.add("2");
assertEquals(false, CollectionUtils.isFull(buf));
}
@Test
public void isEmpty() {
assertFalse(CollectionUtils.isNotEmpty(null));
assertTrue(CollectionUtils.isNotEmpty(collectionA));
}
@Test
public void maxSize() {
final Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
try {
CollectionUtils.maxSize(null);
fail();
} catch (final NullPointerException ex) {
}
assertEquals(-1, CollectionUtils.maxSize(set));
final Queue<String> buf = new CircularFifoQueue<>(set);
assertEquals(3, CollectionUtils.maxSize(buf));
buf.remove("2");
assertEquals(3, CollectionUtils.maxSize(buf));
buf.add("2");
assertEquals(3, CollectionUtils.maxSize(buf));
}
@Test
public void intersectionUsesMethodEquals() {
// Let elta and eltb be objects...
final Integer elta = new Integer(17); // Cannot use valueOf here
final Integer 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...
final Collection<Number> cola = new ArrayList<>();
final Collection<Integer> 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.
final Collection<Number> 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.
final 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);
}
// -----------------------------------------------------------------------
//Up to here
@Test
public void testRetainAll() {
final List<String> base = new ArrayList<>();
base.add("A");
base.add("B");
base.add("C");
final List<Object> sub = new ArrayList<>();
sub.add("A");
sub.add("C");
sub.add("X");
final Collection<String> 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
}
@Test
public void testRemoveRange() {
List<Integer> list = new ArrayList<>();
list.add(1);
Collection<Integer> result = CollectionUtils.removeRange(list, 0, 0);
assertEquals(1, list.size());
assertEquals(0, result.size());
list.add(2);
list.add(3);
result = CollectionUtils.removeRange(list, 1, 3);
assertEquals(1, list.size());
assertEquals(1, (int) list.get(0));
assertEquals(2, result.size());
assertTrue(result.contains(2));
assertTrue(result.contains(3));
}
@Test(expected=IllegalArgumentException.class)
public void testRemoveRangeNull() {
Collection<Integer> list = null;
Collection result = CollectionUtils.removeRange(list, 0, 0);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testRemoveRangeStartIndexNegative() {
Collection<Integer> list = new ArrayList<>();
list.add(1);
Collection result = CollectionUtils.removeRange(list, -1, 1);
}
@Test(expected=IllegalArgumentException.class)
public void testRemoveRangeEndIndexNegative() {
Collection<Integer> list = new ArrayList<>();
list.add(1);
Collection result = CollectionUtils.removeRange(list, 0, -1);
}
@Test(expected=IllegalArgumentException.class)
public void testRemoveRangeEndLowStart() {
Collection<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Collection result = CollectionUtils.removeRange(list, 1, 0);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testRemoveRangeWrongEndIndex() {
Collection<Integer> list = new ArrayList<>();
list.add(1);
Collection result = CollectionUtils.removeRange(list, 0, 2);
}
@Test
public void testRemoveCount() {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Collection<Integer> result = CollectionUtils.removeCount(list, 0, 0);
assertEquals(4, list.size());
assertEquals(0, result.size());
result = CollectionUtils.removeCount(list, 0, 1);
assertEquals(3, list.size());
assertEquals(2, (int) list.get(0));
assertEquals(1, result.size());
assertTrue(result.contains(1));
list.add(5);
list.add(6);
result = CollectionUtils.removeCount(list, 1, 3);
assertEquals(2, list.size());
assertEquals(2, (int) list.get(0));
assertEquals(6, (int) list.get(1));
assertEquals(3, result.size());
assertTrue(result.contains(3));
assertTrue(result.contains(4));
assertTrue(result.contains(5));
}
@Test(expected=IllegalArgumentException.class)
public void testRemoveCountWithNull() {
Collection<Integer> list = null;
Collection result = CollectionUtils.removeCount(list, 0, 1);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testRemoveCountStartNegative() {
Collection<Integer> list = new ArrayList<>();
Collection result = CollectionUtils.removeCount(list, -1, 1);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testRemoveCountNegative() {
Collection<Integer> list = new ArrayList<>();
Collection result = CollectionUtils.removeCount(list, 0, -1);
}
@Test(expected=IndexOutOfBoundsException.class)
public void testRemoveCountWrongCount() {
Collection<Integer> list = new ArrayList<>();
list.add(1);
Collection result = CollectionUtils.removeCount(list, 0, 2);
}
@Test
public void testRemoveAll() {
final List<String> base = new ArrayList<>();
base.add("A");
base.add("B");
base.add("C");
final List<String> sub = new ArrayList<>();
sub.add("A");
sub.add("C");
sub.add("X");
final Collection<String> 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
}
// -----------------------------------------------------------------------
@Test
public void testTransformedCollection() {
final Transformer<Object, Object> transformer = TransformerUtils.nopTransformer();
final Collection<Object> collection = CollectionUtils.transformingCollection(new ArrayList<>(), transformer);
assertTrue("returned object should be a TransformedCollection", collection instanceof TransformedCollection);
try {
CollectionUtils.transformingCollection(new ArrayList<>(), null);
fail("Expecting NullPointerException for null transformer.");
} catch (final NullPointerException ex) {
// expected
}
try {
CollectionUtils.transformingCollection(null, transformer);
fail("Expecting NullPointerException for null collection.");
} catch (final NullPointerException ex) {
// expected
}
}
@Test
public void testTransformedCollection_2() {
final List<Object> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
final Collection<Object> result = CollectionUtils.transformingCollection(list, TRANSFORM_TO_INTEGER);
assertEquals(true, result.contains("1")); // untransformed
assertEquals(true, result.contains("2")); // untransformed
assertEquals(true, result.contains("3")); // untransformed
}
@Test
@Deprecated
public void testSynchronizedCollection() {
final Collection<Object> col = CollectionUtils.synchronizedCollection(new ArrayList<>());
assertTrue("Returned object should be a SynchronizedCollection.", col instanceof SynchronizedCollection);
try {
CollectionUtils.synchronizedCollection(null);
fail("Expecting NullPointerException for null collection.");
} catch (final NullPointerException ex) {
// expected
}
}
@Test
@Deprecated
public void testUnmodifiableCollection() {
final Collection<Object> col = CollectionUtils.unmodifiableCollection(new ArrayList<>());
assertTrue("Returned object should be a UnmodifiableCollection.", col instanceof UnmodifiableCollection);
try {
CollectionUtils.unmodifiableCollection(null);
fail("Expecting NullPointerException for null collection.");
} catch (final NullPointerException ex) {
// expected
}
}
@Test
public void emptyCollection() throws Exception {
final Collection<Number> coll = CollectionUtils.emptyCollection();
assertEquals(CollectionUtils.EMPTY_COLLECTION, coll);
}
@Test
public void emptyIfNull() {
assertTrue(CollectionUtils.emptyIfNull(null).isEmpty());
final Collection<Object> collection = new ArrayList<>();
assertSame(collection, CollectionUtils.emptyIfNull(collection));
}
/**
* This test ensures that {@link Iterable}s are supported by {@link CollectionUtils}.
* Specifically, it uses mocks to ensure that if the passed in
* {@link Iterable} is a {@link Collection} then
* {@link Collection#addAll(Collection)} is called instead of iterating.
*/
@Test
public void addAllForIterable() {
final Collection<Integer> inputCollection = createMock(Collection.class);
final Iterable<Integer> inputIterable = inputCollection;
final Iterable<Long> iterable = createMock(Iterable.class);
final Iterator<Long> iterator = createMock(Iterator.class);
final Collection<Number> c = createMock(Collection.class);
expect(iterable.iterator()).andReturn(iterator);
next(iterator, 1L);
next(iterator, 2L);
next(iterator, 3L);
expect(iterator.hasNext()).andReturn(false);
expect(c.add(1L)).andReturn(true);
expect(c.add(2L)).andReturn(true);
expect(c.add(3L)).andReturn(true);
// Check that the collection is added using
// Collection.addAll(Collection)
expect(c.addAll(inputCollection)).andReturn(true);
// Ensure the method returns false if nothing is added
expect(iterable.iterator()).andReturn(iterator);
next(iterator, 1L);
expect(iterator.hasNext()).andReturn(false);
expect(c.add(1L)).andReturn(false);
expect(c.addAll(inputCollection)).andReturn(false);
replay();
assertTrue(CollectionUtils.addAll(c, iterable));
assertTrue(CollectionUtils.addAll(c, inputIterable));
assertFalse(CollectionUtils.addAll(c, iterable));
assertFalse(CollectionUtils.addAll(c, inputIterable));
verify();
}
@Test
public void addAllForEnumeration() {
final Hashtable<Integer, Integer> h = new Hashtable<>();
h.put(5, 5);
final Enumeration<? extends Integer> enumeration = h.keys();
CollectionUtils.addAll(collectionA, enumeration);
assertTrue(collectionA.contains(5));
}
@Test
public void addAllForElements() {
CollectionUtils.addAll(collectionA, new Integer[]{5});
assertTrue(collectionA.contains(5));
}
@Test(expected=IndexOutOfBoundsException.class)
public void getNegative() {
CollectionUtils.get((Object)collectionA, -3);
}
@Test(expected=IndexOutOfBoundsException.class)
public void getPositiveOutOfBounds() {
CollectionUtils.get((Object)collectionA.iterator(), 30);
}
@Test(expected=IllegalArgumentException.class)
public void get1() {
CollectionUtils.get((Object)null, 0);
}
@Test
public void get() {
assertEquals(2, CollectionUtils.get((Object)collectionA, 2));
assertEquals(2, CollectionUtils.get((Object)collectionA.iterator(), 2));
final Map<Integer, Integer> map = CollectionUtils.getCardinalityMap(collectionA);
assertEquals(map.entrySet().iterator().next(), CollectionUtils.get((Object)map, 0));
}
@Test
public void getIterator() {
final Iterator<Integer> it = collectionA.iterator();
assertEquals(Integer.valueOf(2), CollectionUtils.get((Object) it, 2));
assertTrue(it.hasNext());
assertEquals(Integer.valueOf(4), CollectionUtils.get((Object) it, 6));
assertFalse(it.hasNext());
}
@Test
public void getEnumeration() {
final Vector<Integer> vectorA = new Vector<>(collectionA);
final Enumeration<Integer> e = vectorA.elements();
assertEquals(Integer.valueOf(2), CollectionUtils.get(e, 2));
assertTrue(e.hasMoreElements());
assertEquals(Integer.valueOf(4), CollectionUtils.get(e, 6));
assertFalse(e.hasMoreElements());
}
@Test
public void reverse() {
CollectionUtils.reverseArray(new Object[] {});
final Integer[] a = collectionA.toArray(new Integer[collectionA.size()]);
CollectionUtils.reverseArray(a);
// assume our implementation is correct if it returns the same order as the Java function
Collections.reverse(collectionA);
assertEquals(collectionA, Arrays.asList(a));
}
@Test
public void extractSingleton() {
ArrayList<String> coll = null;
try {
CollectionUtils.extractSingleton(coll);
fail("expected NullPointerException from extractSingleton(null)");
} catch (final NullPointerException e) {
}
coll = new ArrayList<>();
try {
CollectionUtils.extractSingleton(coll);
fail("expected IllegalArgumentException from extractSingleton(empty)");
} catch (final IllegalArgumentException e) {
}
coll.add("foo");
assertEquals("foo", CollectionUtils.extractSingleton(coll));
coll.add("bar");
try {
CollectionUtils.extractSingleton(coll);
fail("expected IllegalArgumentException from extractSingleton(size == 2)");
} catch (final IllegalArgumentException e) {
}
}
/**
* Records the next object returned for a mock iterator
*/
private <T> void next(final Iterator<T> iterator, final T t) {
expect(iterator.hasNext()).andReturn(true);
expect(iterator.next()).andReturn(t);
}
@Test(expected=NullPointerException.class)
public void collateException1() {
CollectionUtils.collate(collectionA, null);
}
@Test(expected=NullPointerException.class)
public void collateException2() {
CollectionUtils.collate(collectionA, collectionC, null);
}
@Test
public void testCollate() {
List<Integer> result = CollectionUtils.collate(emptyCollection, emptyCollection);
assertEquals("Merge empty with empty", 0, result.size());
result = CollectionUtils.collate(collectionA, emptyCollection);
assertEquals("Merge empty with non-empty", collectionA, result);
List<Integer> result1 = CollectionUtils.collate(collectionD, collectionE);
List<Integer> result2 = CollectionUtils.collate(collectionE, collectionD);
assertEquals("Merge two lists 1", result1, result2);
final List<Integer> combinedList = new ArrayList<>();
combinedList.addAll(collectionD);
combinedList.addAll(collectionE);
Collections.sort(combinedList);
assertEquals("Merge two lists 2", combinedList, result2);
final Comparator<Integer> reverseComparator =
ComparatorUtils.reversedComparator(ComparatorUtils.<Integer>naturalComparator());
result = CollectionUtils.collate(emptyCollection, emptyCollection, reverseComparator);
assertEquals("Comparator Merge empty with empty", 0, result.size());
Collections.reverse((List<Integer>) collectionD);
Collections.reverse((List<Integer>) collectionE);
Collections.reverse(combinedList);
result1 = CollectionUtils.collate(collectionD, collectionE, reverseComparator);
result2 = CollectionUtils.collate(collectionE, collectionD, reverseComparator);
assertEquals("Comparator Merge two lists 1", result1, result2);
assertEquals("Comparator Merge two lists 2", combinedList, result2);
}
@Test
public void testCollateIgnoreDuplicates() {
final List<Integer> result1 = CollectionUtils.collate(collectionD, collectionE, false);
final List<Integer> result2 = CollectionUtils.collate(collectionE, collectionD, false);
assertEquals("Merge two lists 1 - ignore duplicates", result1, result2);
final Set<Integer> combinedSet = new HashSet<>();
combinedSet.addAll(collectionD);
combinedSet.addAll(collectionE);
final List<Integer> combinedList = new ArrayList<>(combinedSet);
Collections.sort(combinedList);
assertEquals("Merge two lists 2 - ignore duplicates", combinedList, result2);
}
@Test(expected=NullPointerException.class)
public void testPermutationsWithNullCollection() {
CollectionUtils.permutations(null);
}
@Test
public void testPermutations() {
final List<Integer> sample = collectionA.subList(0, 5);
final Collection<List<Integer>> permutations = CollectionUtils.permutations(sample);
// result size = n!
final int collSize = sample.size();
int factorial = 1;
for (int i = 1; i <= collSize; i++) {
factorial *= i;
}
assertEquals(factorial, permutations.size());
}
@Test
@Deprecated
public void testMatchesAll() {
assertFalse(CollectionUtils.matchesAll(null, null));
assertFalse(CollectionUtils.matchesAll(collectionA, null));
final Predicate<Integer> lessThanFive = object -> object < 5;
assertTrue(CollectionUtils.matchesAll(collectionA, lessThanFive));
final Predicate<Integer> lessThanFour = object -> object < 4;
assertFalse(CollectionUtils.matchesAll(collectionA, lessThanFour));
assertTrue(CollectionUtils.matchesAll(null, lessThanFour));
assertTrue(CollectionUtils.matchesAll(emptyCollection, lessThanFour));
}
@Test
public void testRemoveAllWithEquator() {
final List<String> base = new ArrayList<>();
base.add("AC");
base.add("BB");
base.add("CA");
final List<String> remove = new ArrayList<>();
remove.add("AA");
remove.add("CX");
remove.add("XZ");
// use an equator which compares the second letter only
final Collection<String> result = CollectionUtils.removeAll(base, remove, new Equator<String>() {
@Override
public boolean equate(final String o1, final String o2) {
return o1.charAt(1) == o2.charAt(1);
}
@Override
public int hash(final String o) {
return o.charAt(1);
}
});
assertEquals(2, result.size());
assertTrue(result.contains("AC"));
assertTrue(result.contains("BB"));
assertFalse(result.contains("CA"));
assertEquals(3, base.size());
assertEquals(true, base.contains("AC"));
assertEquals(true, base.contains("BB"));
assertEquals(true, base.contains("CA"));
assertEquals(3, remove.size());
assertEquals(true, remove.contains("AA"));
assertEquals(true, remove.contains("CX"));
assertEquals(true, remove.contains("XZ"));
try {
CollectionUtils.removeAll(null, null, DefaultEquator.defaultEquator());
fail("expecting NullPointerException");
} catch (final NullPointerException npe) {
} // this is what we want
try {
CollectionUtils.removeAll(base, remove, null);
fail("expecting NullPointerException");
} catch (final NullPointerException npe) {
} // this is what we want
}
@Test
public void testRetainAllWithEquator() {
final List<String> base = new ArrayList<>();
base.add("AC");
base.add("BB");
base.add("CA");
final List<String> retain = new ArrayList<>();
retain.add("AA");
retain.add("CX");
retain.add("XZ");
// use an equator which compares the second letter only
final Collection<String> result = CollectionUtils.retainAll(base, retain, new Equator<String>() {
@Override
public boolean equate(final String o1, final String o2) {
return o1.charAt(1) == o2.charAt(1);
}
@Override
public int hash(final String o) {
return o.charAt(1);
}
});
assertEquals(1, result.size());
assertTrue(result.contains("CA"));
assertFalse(result.contains("BB"));
assertFalse(result.contains("AC"));
assertEquals(3, base.size());
assertTrue(base.contains("AC"));
assertTrue(base.contains("BB"));
assertTrue(base.contains("CA"));
assertEquals(3, retain.size());
assertTrue(retain.contains("AA"));
assertTrue(retain.contains("CX"));
assertTrue(retain.contains("XZ"));
try {
CollectionUtils.retainAll(null, null, null);
fail("expecting NullPointerException");
} catch (final NullPointerException npe) {
} // this is what we want
try {
CollectionUtils.retainAll(base, retain, null);
fail("expecting NullPointerException");
} catch (final NullPointerException npe) {
} // this is what we want
}
}