blob: a2f2fce87140fc45a4af366c6e76d5c75599af2c [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed 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 com.intellij.util.containers;
import com.intellij.util.Assertion;
import junit.framework.Assert;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class SequenceIteratorTest extends TestCase {
private final Assertion CHECK = new Assertion();
public void testOneIterator() {
Iterator<Object> iterator = iterate("1", "2");
Iterator<Object> seq = ContainerUtil.concatIterators(iterator);
CHECK.compareAll(new Object[]{"1", "2"}, ContainerUtil.collect(seq));
}
public void testTwoNotEmpties() {
Iterator<Object> seq = ContainerUtil.concatIterators(iterate("1", "2"), iterate("3", "4"));
CHECK.compareAll(new Object[]{"1", "2", "3", "4"}, ContainerUtil.collect(seq));
}
public void testAllEmpty() {
Assert.assertFalse(ContainerUtil.concatIterators(empty()).hasNext());
Assert.assertFalse(ContainerUtil.concatIterators(empty(), empty()).hasNext());
}
public void testIntermediateEmpty() {
Iterator<Object> seq = ContainerUtil.concatIterators(iterate("1", "2"), empty(), iterate("3", "4"));
CHECK.compareAll(new Object[]{"1", "2", "3", "4"}, ContainerUtil.collect(seq));
}
public void testFirstEmpty() {
Iterator<Object> seq = ContainerUtil.concatIterators(empty(), iterate("1", "2"));
CHECK.compareAll(new Object[]{"1", "2"}, ContainerUtil.collect(seq));
}
private static Iterator<Object> iterate(String first, String second) {
return Arrays.asList(new Object[]{first, second}).iterator();
}
private static Iterator empty() {
return new ArrayList().iterator();
}
public void testSimple() throws Exception {
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(iter(arr1), iter(arr2), iter(arr3)));
int cnt = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
++ cnt;
}
Assert.assertEquals(arr1.length + arr2.length + arr3.length, cnt);
}
private static Iterator<Integer> compose(List<Iterator<Integer>> iterators) {
return ContainerUtil.concatIterators(iterators);
}
public void testOne() throws Exception {
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(iter(arr1)));
int cnt = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
++ cnt;
}
Assert.assertEquals(arr1.length, cnt);
}
public void testOneOne() throws Exception {
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(iter(new Integer[]{1})));
int cnt = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
++ cnt;
}
Assert.assertEquals(1, cnt);
}
public void testEmpty() throws Exception {
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(iter(new Integer[]{})));
int cnt = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
++ cnt;
}
Assert.assertEquals(0, cnt);
}
public void testManyEmpty() throws Exception {
final Iterator<Integer> iterator =
compose(Arrays.<Iterator<Integer>>asList(iter(new Integer[]{}), iter(new Integer[]{}), iter(new Integer[]{})));
int cnt = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
++ cnt;
}
Assert.assertEquals(0, cnt);
}
public void testRemoveSimple() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(arr1));
final ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(arr2));
final ArrayList<Integer> list3 = new ArrayList<Integer>(Arrays.asList(arr3));
final Iterator<Integer> iterator =
compose(Arrays.<Iterator<Integer>>asList(list1.iterator(), list2.iterator(), list3.iterator()));
int cnt = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
if ((cnt - 2) % 5 == 0) {
iterator.remove();
}
++ cnt;
}
Assert.assertTrue(! list1.contains(3));
Assert.assertTrue(! list2.contains(13));
Assert.assertTrue(! list3.contains(103));
}
public void testRemoveAfterLast() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(arr1));
final Iterator<Integer> it1 = list1.iterator();
while (it1.hasNext()) {
Integer next = it1.next();
}
it1.remove(); // ok, removes last
Assert.assertTrue(! list1.contains(5));
list1.add(5);
final ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(arr2));
final ArrayList<Integer> list3 = new ArrayList<Integer>(Arrays.asList(arr3));
final Iterator<Integer> iterator =
compose(Arrays.<Iterator<Integer>>asList(list1.iterator(), list2.iterator(), list3.iterator()));
while (iterator.hasNext()) {
Integer next = iterator.next();
}
iterator.remove();
Assert.assertTrue(! list3.contains(105));
}
public void testRemoveOnlyOne() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(new Integer[]{1}));
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(list1.iterator()));
iterator.next();
iterator.remove();
Assert.assertTrue(list1.isEmpty());
}
public void testIterateWithEmptyInside() throws Exception {
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(iter(arr1), iter(new Integer[]{}), iter(arr3)));
int cnt = 0;
int sum = 0;
while (iterator.hasNext()) {
Integer next = iterator.next();
++ cnt;
sum += next;
}
Assert.assertEquals(arr1.length + arr3.length, cnt);
Assert.assertEquals(530, sum);
}
public void testRemoveIfNextNotCalled() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(new Integer[]{1}));
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(list1.iterator()));
try {
iterator.remove();
Assert.assertTrue(false);
} catch (IllegalStateException e) {
// ok
}
}
public void testRemoveTwice() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5}));
final Iterator<Integer> iterator = compose(Arrays.<Iterator<Integer>>asList(list1.iterator()));
try {
iterator.next();
iterator.remove();
iterator.remove(); // wrong, next() should be called inside
Assert.assertTrue(false);
} catch (IllegalStateException e) {
// ok
}
}
public void testRemoveAll() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2));
final ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(3,4));
final ArrayList<Integer> list3 = new ArrayList<Integer>(Arrays.asList(5,6));
final Iterator<Integer> iterator =
compose(Arrays.<Iterator<Integer>>asList(list1.iterator(), list2.iterator(), list3.iterator()));
while (iterator.hasNext()) {
Integer next = iterator.next();
iterator.remove();
}
Assert.assertTrue(list1.isEmpty());
Assert.assertTrue(list2.isEmpty());
Assert.assertTrue(list3.isEmpty());
}
public void testRemoveAllWithEmptyInside() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2));
final ArrayList<Integer> list2 = new ArrayList<Integer>();
final ArrayList<Integer> list3 = new ArrayList<Integer>(Arrays.asList(5,6));
final Iterator<Integer> iterator =
compose(Arrays.<Iterator<Integer>>asList(list1.iterator(), list2.iterator(), list3.iterator()));
while (iterator.hasNext()) {
Integer next = iterator.next();
iterator.remove();
}
Assert.assertTrue(list1.isEmpty());
Assert.assertTrue(list2.isEmpty());
Assert.assertTrue(list3.isEmpty());
}
public void testRemoveLastAndFirstINNext() throws Exception {
final ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2));
final ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(3,4));
final ArrayList<Integer> list3 = new ArrayList<Integer>(Arrays.asList(5,6));
final Iterator<Integer> iterator =
compose(Arrays.<Iterator<Integer>>asList(list1.iterator(), list2.iterator(), list3.iterator()));
iterator.next();
iterator.next();
iterator.remove();
iterator.next();
iterator.remove();
Assert.assertTrue(list1.size() == 1 && ! list1.contains(2));
Assert.assertTrue(list2.size() == 1 && ! list1.contains(3));
Assert.assertTrue(list3.size() == 2);
}
private static final Integer[] arr1 = {1,2,3,4,5};
private static final Integer[] arr2 = {11,12,13,14,15};
private static final Integer[] arr3= {101,102,103,104,105};
private Iterator<Integer> iter(final Integer[] arr) {
return Arrays.asList(arr).iterator();
}
}