blob: 8cc0b3a0ece4cf40c9843948ef200cdf4e59e5e0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.common.utility.tests.internal.iterator;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import java.util.TreeSet;
import junit.framework.TestCase;
import org.eclipse.jpt.common.utility.internal.ClassTools;
import org.eclipse.jpt.common.utility.internal.collection.HashBag;
import org.eclipse.jpt.common.utility.internal.comparator.ReverseComparator;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.common.utility.internal.iterator.EmptyIterator;
import org.eclipse.jpt.common.utility.internal.iterator.IteratorTools;
import org.eclipse.jpt.common.utility.tests.internal.ArrayToolsTests;
import org.eclipse.jpt.common.utility.tests.internal.collection.MapToolsTests;
@SuppressWarnings("nls")
public class IteratorToolsTests
extends TestCase
{
public IteratorToolsTests(String name) {
super(name);
}
// ********** contains **********
public void testContainsIteratorObject_Object() {
Collection<Object> c = new HashBag<Object>();
c.add("zero");
c.add("one");
c.add("two");
c.add("three");
String one = "one";
assertTrue(IteratorTools.contains(c.iterator(), one));
assertFalse(IteratorTools.contains(c.iterator(), null));
c.add(null);
assertTrue(IteratorTools.contains(c.iterator(), null));
}
public void testContainsIteratorObject_String() {
Collection<String> c = this.buildStringList1();
assertTrue(IteratorTools.contains(c.iterator(), "one"));
assertFalse(IteratorTools.contains(c.iterator(), null));
c.add(null);
assertTrue(IteratorTools.contains(c.iterator(), null));
}
// ********** count **********
public void testCountIteratorObject() {
Collection<Object> c = new HashBag<Object>();
c.add("zero");
c.add("one");
c.add("two");
c.add("three");
String one = "one";
assertEquals(1, IteratorTools.count(c.iterator(), one));
c.add("one");
assertEquals(2, IteratorTools.count(c.iterator(), one));
assertEquals(0, IteratorTools.count(c.iterator(), null));
c.add(null);
assertEquals(1, IteratorTools.count(c.iterator(), null));
c.add(null);
assertEquals(2, IteratorTools.count(c.iterator(), null));
}
public void testCountFalseIteratorPredicate() {
Collection<String> c = new HashBag<String>();
c.add("zero");
c.add("one");
c.add("two");
c.add("three");
assertEquals(4, IteratorTools.countFalse(c.iterator(), new MapToolsTests.StringLengthPredicate(0)));
assertEquals(2, IteratorTools.countFalse(c.iterator(), new MapToolsTests.StringLengthPredicate(3)));
c.add("foo");
assertEquals(2, IteratorTools.countFalse(c.iterator(), new MapToolsTests.StringLengthPredicate(3)));
}
public void testCountTrueIteratorPredicate() {
Collection<String> c = new HashBag<String>();
c.add("zero");
c.add("one");
c.add("two");
c.add("three");
assertEquals(0, IteratorTools.countTrue(c.iterator(), new MapToolsTests.StringLengthPredicate(0)));
assertEquals(2, IteratorTools.countTrue(c.iterator(), new MapToolsTests.StringLengthPredicate(3)));
c.add("foo");
assertEquals(3, IteratorTools.countTrue(c.iterator(), new MapToolsTests.StringLengthPredicate(3)));
}
// ********** contains all **********
public void testContainsAllIteratorCollection_StringString() {
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), this.buildStringList1()));
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), this.buildStringList2()));
}
public void testContainsAllIteratorIntCollection() {
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), 5, this.buildStringList1()));
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), 5, this.buildStringList2()));
}
public void testContainsAllIteratorIntIterable() {
Iterable<String> iterable = this.buildStringList1();
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), 3, iterable));
iterable = this.buildStringList2();
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), 3, iterable));
}
public void testContainsAllIteratorIntIterator() {
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), 3, this.buildStringList1().iterator()));
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), 3, this.buildStringList2().iterator()));
}
public void testContainsAllIteratorIntObjectArray() {
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), 3, this.buildObjectArray1()));
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), 3, this.buildObjectArray2()));
}
public void testContainsAllIteratorIterable() {
Iterable<String> iterable = this.buildStringList1();
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), iterable));
iterable = this.buildStringList2();
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), iterable));
}
public void testContainsAllIteratorIterator_ObjectString() {
Collection<Object> c1 = new ArrayList<Object>();
c1.add("zero");
c1.add("one");
c1.add("two");
Collection<String> c2 = new ArrayList<String>();
c2.add("zero");
c2.add("one");
c2.add("two");
assertTrue(IteratorTools.containsAll(c1.iterator(), c2.iterator()));
}
public void testContainsAllIteratorIterator_StringString() {
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), this.buildStringList1().iterator()));
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), this.buildStringList2().iterator()));
}
public void testContainsAllIteratorObjectArray() {
assertTrue(IteratorTools.containsAll(this.buildStringList1().iterator(), this.buildObjectArray1()));
assertFalse(IteratorTools.containsAll(this.buildStringList1().iterator(), this.buildObjectArray2()));
}
public void testContainsAllIteratorCollection_ObjectString() {
Collection<Object> c1 = new ArrayList<Object>();
c1.add("zero");
c1.add("one");
c1.add("two");
Collection<String> c2 = new ArrayList<String>();
c2.add("zero");
c2.add("one");
c2.add("two");
assertTrue(IteratorTools.containsAll(c1.iterator(), c2));
}
// ********** elements are equal **********
public void testElementsAreDifferentIteratorIterator() {
List<String> list1 = new ArrayList<String>();
list1.add("1000");
list1.add("2000");
list1.add("3000");
list1.add("4000");
List<String> list2 = new ArrayList<String>();
assertTrue(IteratorTools.elementsAreDifferent(list1.iterator(), list2.iterator()));
assertFalse(IterableTools.elementsAreEqual(list1, list2));
}
public void testElementsAreEqualIteratorIterator() {
List<String> list1 = new ArrayList<String>();
list1.add("1000");
list1.add("2000");
list1.add("3000");
list1.add("4000");
List<String> list2 = new ArrayList<String>();
for (int i = 0; i < list1.size(); i++) {
list2.add(String.valueOf((i + 1) * 1000));
}
assertFalse(IteratorTools.elementsAreIdentical(list1.iterator(), list2.iterator()));
assertFalse(IteratorTools.elementsAreDifferent(list1.iterator(), list2.iterator()));
assertTrue(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
// ********** elements are identical **********
public void testElementsAreIdenticalIteratorIterator() {
List<String> list1 = new ArrayList<String>();
list1.add("0");
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
for (String s : list1) {
list2.add(s);
}
assertTrue(IteratorTools.elementsAreIdentical(list1.iterator(), list2.iterator()));
assertTrue(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
public void testElementsAreIdenticalIteratorIterator_Not() {
List<String> list1 = new ArrayList<String>();
list1.add("0");
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
for (String s : list1) {
list2.add(s);
}
list2.remove(0);
assertFalse(IteratorTools.elementsAreIdentical(list1.iterator(), list2.iterator()));
assertFalse(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
public void testElementsAreIdenticalIteratorIterator_DifferentSizes() {
List<String> list1 = new ArrayList<String>();
list1.add("0");
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
for (String s : list1) {
list2.add(s);
}
list2.remove(3);
assertFalse(IteratorTools.elementsAreIdentical(list1.iterator(), list2.iterator()));
assertFalse(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
public void testElementsAreNotIdenticalIteratorIterator() {
List<String> list1 = new ArrayList<String>();
list1.add("0");
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
for (String s : list1) {
list2.add(s);
}
assertFalse(IteratorTools.elementsAreNotIdentical(list1.iterator(), list2.iterator()));
assertTrue(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
public void testElementsAreNotIdenticalIteratorIterator_Not() {
List<String> list1 = new ArrayList<String>();
list1.add("0");
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
for (String s : list1) {
list2.add(s);
}
list2.remove(0);
assertTrue(IteratorTools.elementsAreNotIdentical(list1.iterator(), list2.iterator()));
assertFalse(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
public void testElementsAreNotIdenticalIteratorIterator_DifferentSizes() {
List<String> list1 = new ArrayList<String>();
list1.add("0");
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
for (String s : list1) {
list2.add(s);
}
list2.remove(3);
assertTrue(IteratorTools.elementsAreNotIdentical(list1.iterator(), list2.iterator()));
assertFalse(IteratorTools.elementsAreEqual(list1.iterator(), list2.iterator()));
}
// ********** execute **********
public void testExecuteParmCommand() {
List<String> list = this.buildStringList1();
ArrayToolsTests.ConcatenateClosure closure = new ArrayToolsTests.ConcatenateClosure();
IteratorTools.execute(list.iterator(), closure);
assertEquals("zeroonetwo", closure.string);
}
public void testExecuteInterruptibleParmCommand() throws Exception {
List<String> list = this.buildStringList1();
ArrayToolsTests.InterruptibleConcatenateClosure closure = new ArrayToolsTests.InterruptibleConcatenateClosure();
IteratorTools.execute(list.iterator(), closure);
assertEquals("zeroonetwo", closure.string);
}
// ********** get **********
public void testGetIteratorInt1() {
List<String> list = this.buildStringList1();
String o = IteratorTools.get(list.iterator(), 1);
assertEquals("one", o);
list.add(null);
o = IteratorTools.get(list.iterator(), list.size() - 1);
assertNull(o);
}
public void testGetIteratorInt2() {
List<String> list = this.buildStringList1();
boolean exCaught = false;
try {
IteratorTools.get(list.iterator(), list.size());
fail();
} catch (IndexOutOfBoundsException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
// ********** index of **********
public void testIndexOfIteratorObject_String() {
List<String> list = this.buildStringList1();
assertEquals(1, IteratorTools.indexOf(list.iterator(), "one"));
}
public void testIndexOfIteratorObjectInt() {
List<String> list = this.buildStringList1();
assertEquals(1, IteratorTools.indexOf(list.iterator(), "one", -1));
assertEquals(1, IteratorTools.indexOf(list.iterator(), "one", 1));
assertEquals(2, IteratorTools.indexOf(list.iterator(), "two", 1));
assertEquals(-1, IteratorTools.indexOf(list.iterator(), "one", 2));
assertEquals(-1, IteratorTools.indexOf(list.iterator(), "one", 22));
}
public void testIndexOfIteratorObject_String_Not() {
List<String> list = this.buildStringList1();
assertEquals(-1, IteratorTools.indexOf(list.iterator(), null));
assertEquals(-1, IteratorTools.indexOf(list.iterator(), "shazam"));
}
public void testIndexOfIteratorObject_Null() {
List<String> list = this.buildStringList1();
list.add(null);
assertEquals(list.size() - 1, IteratorTools.indexOf(list.iterator(), null));
}
public void testIndexOfIteratorObjectInt_Null() {
List<String> list = this.buildStringList1();
list.add(null);
assertEquals(list.size() - 1, IteratorTools.indexOf(list.iterator(), null, -1));
assertEquals(list.size() - 1, IteratorTools.indexOf(list.iterator(), null, 2));
assertEquals(list.size() - 1, IteratorTools.indexOf(list.iterator(), null, list.size() - 1));
assertEquals(-1, IteratorTools.indexOf(list.iterator(), null, 22));
}
public void testIndexOfIteratorObject_Object() {
List<Object> list = new ArrayList<Object>();
list.add("0");
list.add("1");
list.add("2");
list.add("3");
String one = "1";
assertEquals(1, IteratorTools.indexOf(list.iterator(), one));
list.add(null);
assertEquals(list.size() - 1, IteratorTools.indexOf(list.iterator(), null));
}
// ********** is empty **********
public void testIsEmptyIterator() {
assertFalse(IteratorTools.isEmpty(buildObjectList1().iterator()));
assertTrue(IteratorTools.isEmpty(EmptyIterator.instance()));
}
// ********** iterable/iterator **********
public void testIteratorObjectArray() {
String[] a = this.buildStringArray1();
int i = 0;
for (Iterator<String> stream = IteratorTools.iterator(a); stream.hasNext(); i++) {
assertEquals(a[i], stream.next());
}
}
// ********** first **********
public void testFirstIterator1() {
List<String> list = this.buildStringList1();
assertEquals("zero", IteratorTools.first(list.iterator()));
list.add(0, null);
assertEquals(null, IteratorTools.first(list.iterator()));
}
public void testFirstIterator2() {
List<String> list = new ArrayList<String>();
boolean exCaught = false;
try {
IteratorTools.first(list.iterator());
fail();
} catch (NoSuchElementException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
// ********** last **********
public void testLastIterator1() {
List<String> list = this.buildStringList1();
assertEquals("two", IteratorTools.last(list.iterator()));
list.add(null);
assertEquals(null, IteratorTools.last(list.iterator()));
}
public void testLastIterator2() {
List<String> list = new ArrayList<String>();
boolean exCaught = false;
try {
IteratorTools.last(list.iterator());
fail();
} catch (NoSuchElementException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
// ********** last index of **********
public void testLastIndexOfIteratorObject() {
List<String> list = this.buildStringList1();
assertEquals(1, IteratorTools.lastIndexOf(list.iterator(), "one"));
list.add(null);
assertEquals(list.size() - 1, IteratorTools.lastIndexOf(list.iterator(), null));
}
public void testLastIndexOfIteratorObjectInt() {
List<String> list = this.buildStringList1();
assertEquals(-1, IteratorTools.lastIndexOf(list.iterator(), "one", -1));
assertEquals(1, IteratorTools.lastIndexOf(list.iterator(), "one", 1));
assertEquals(-1, IteratorTools.lastIndexOf(list.iterator(), "two", 1));
assertEquals(1, IteratorTools.lastIndexOf(list.iterator(), "one", 2));
assertEquals(1, IteratorTools.lastIndexOf(list.iterator(), "one", 22));
}
public void testLastIndexOfIteratorObject_Empty() {
assertEquals(-1, IteratorTools.lastIndexOf(EmptyIterator.instance(), "foo"));
}
public void testLastIndexOfIteratorObjectInt_Null() {
List<String> list = this.buildStringList1();
list.add(null);
assertEquals(-1, IteratorTools.lastIndexOf(list.iterator(), null, -1));
assertEquals(-1, IteratorTools.lastIndexOf(list.iterator(), null, 2));
assertEquals(list.size() - 1, IteratorTools.lastIndexOf(list.iterator(), null, list.size() - 1));
assertEquals(list.size() - 1, IteratorTools.lastIndexOf(list.iterator(), null, 22));
}
// ********** list iterator **********
public void testListIteratorObjectArray() {
String[] a = this.buildStringArray1();
int i = 0;
for (ListIterator<String> stream = IteratorTools.listIterator(a); stream.hasNext(); i++) {
assertEquals(a[i], stream.next());
}
}
public void testListIteratorObjectArrayInt() {
String[] a = this.buildStringArray1();
int i = 1;
for (ListIterator<String> stream = IteratorTools.listIterator(a, 1); stream.hasNext(); i++) {
assertEquals(a[i], stream.next());
}
}
// ********** singleton iterator **********
public void testSingletonIterator_String() {
Iterator<String> stream = IteratorTools.singletonIterator("foo");
assertTrue(stream.hasNext());
assertEquals("foo", stream.next());
}
public void testSingletonIterator_Object() {
Iterator<Object> stream = IteratorTools.<Object>singletonIterator("foo");
assertTrue(stream.hasNext());
assertEquals("foo", stream.next());
}
public void testSingletonIterator_Cast() {
Iterator<Object> stream = IteratorTools.singletonIterator((Object) "foo");
assertTrue(stream.hasNext());
assertEquals("foo", stream.next());
}
public void testSingletonListIterator_String() {
ListIterator<String> stream = IteratorTools.singletonListIterator("foo");
assertTrue(stream.hasNext());
assertEquals("foo", stream.next());
assertFalse(stream.hasNext());
assertTrue(stream.hasPrevious());
assertEquals("foo", stream.previous());
}
// ********** size **********
public void testSizeIterator() {
assertEquals(3, IteratorTools.size(this.buildObjectList1().iterator()));
}
// ********** sort **********
public void testSortIterator() {
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("2");
list.add("3");
list.add("1");
SortedSet<String> ss = new TreeSet<String>();
ss.addAll(list);
Iterator<String> iterator1 = list.iterator();
Iterator<String> iterator2 = IteratorTools.<String>sort(iterator1);
assertTrue(IteratorTools.elementsAreEqual(ss.iterator(), iterator2));
}
public void testSortIteratorInt() {
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("2");
list.add("3");
list.add("1");
SortedSet<String> ss = new TreeSet<String>();
ss.addAll(list);
Iterator<String> iterator1 = list.iterator();
Iterator<String> iterator2 = IteratorTools.<String>sort(iterator1, 77);
assertTrue(IteratorTools.elementsAreEqual(ss.iterator(), iterator2));
}
public void testSortIteratorComparator() {
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("2");
list.add("3");
list.add("1");
SortedSet<String> ss = new TreeSet<String>(new ReverseComparator<String>());
ss.addAll(list);
Iterator<String> iterator1 = list.iterator();
Iterator<String> iterator2 = IteratorTools.<String>sort(iterator1, new ReverseComparator<String>());
assertTrue(IteratorTools.elementsAreEqual(ss.iterator(), iterator2));
}
public void testSortIteratorComparatorInt() {
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("2");
list.add("3");
list.add("1");
SortedSet<String> ss = new TreeSet<String>(new ReverseComparator<String>());
ss.addAll(list);
Iterator<String> iterator1 = list.iterator();
Iterator<String> iterator2 = IteratorTools.<String>sort(iterator1, new ReverseComparator<String>(), 77);
assertTrue(IteratorTools.elementsAreEqual(ss.iterator(), iterator2));
}
// ********** constructor **********
public void testConstructor() {
boolean exCaught = false;
try {
Object at = ClassTools.newInstance(IteratorTools.class);
fail("bogus: " + at); //$NON-NLS-1$
} catch (RuntimeException ex) {
if (ex.getCause() instanceof InvocationTargetException) {
if (ex.getCause().getCause() instanceof UnsupportedOperationException) {
exCaught = true;
}
}
}
assertTrue(exCaught);
}
// ********** transform **********
public void testTransformIteratorTransformer() {
List<String> list = Arrays.asList(new String[] { "zero", "one", "two" });
Iterator<String> actual = IteratorTools.transform(list.iterator(), ArrayToolsTests.UPPER_CASE_TRANSFORMER);
Iterator<Object> expected = Arrays.asList(new Object[] { "ZERO", "ONE", "TWO" }).iterator();
assertTrue(IteratorTools.elementsAreEqual(expected, actual));
}
// ********** test harness **********
private Object[] buildObjectArray1() {
return new Object[] { "zero", "one", "two" };
}
private String[] buildStringArray1() {
return new String[] { "zero", "one", "two" };
}
private Object[] buildObjectArray2() {
return new Object[] { "three", "four", "five" };
}
private List<String> buildStringList1() {
List<String> l = new ArrayList<String>();
this.addToCollection1(l);
return l;
}
private List<Object> buildObjectList1() {
List<Object> l = new ArrayList<Object>();
this.addToCollection1(l);
return l;
}
private void addToCollection1(Collection<? super String> c) {
c.add("zero");
c.add("one");
c.add("two");
}
private List<String> buildStringList2() {
List<String> l = new ArrayList<String>();
this.addToCollection2(l);
return l;
}
private void addToCollection2(Collection<? super String> c) {
c.add("three");
c.add("four");
c.add("five");
}
}