/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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.elasticsearch.common.collect; import org.elasticsearch.test.ESTestCase; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; public class IteratorsTests extends ESTestCase { public void testConcatentation() { List<Integer> threeTwoOne = Arrays.asList(3, 2, 1); List<Integer> fourFiveSix = Arrays.asList(4, 5, 6); Iterator<Integer> concat = Iterators.concat(threeTwoOne.iterator(), fourFiveSix.iterator()); assertContainsInOrder(concat, 3, 2, 1, 4, 5, 6); } public void testNoConcatenation() { Iterator<Integer> iterator = Iterators.<Integer>concat(); assertEmptyIterator(iterator); } public void testEmptyConcatenation() { Iterator<Integer> iterator = Iterators.<Integer>concat(empty()); assertEmptyIterator(iterator); } public void testMultipleEmptyConcatenation() { Iterator<Integer> iterator = Iterators.concat(empty(), empty()); assertEmptyIterator(iterator); } public void testSingleton() { int value = randomInt(); assertSingleton(value, singletonIterator(value)); } public void testEmptyBeforeSingleton() { int value = randomInt(); assertSingleton(value, empty(), singletonIterator(value)); } public void testEmptyAfterSingleton() { int value = randomInt(); assertSingleton(value, singletonIterator(value), empty()); } public void testRandomSingleton() { int numberOfIterators = randomIntBetween(1, 1000); int singletonIndex = randomIntBetween(0, numberOfIterators - 1); int value = randomInt(); Iterator<Integer>[] iterators = new Iterator[numberOfIterators]; for (int i = 0; i < numberOfIterators; i++) { iterators[i] = i != singletonIndex ? empty() : singletonIterator(value); } assertSingleton(value, iterators); } public void testRandomIterators() { int numberOfIterators = randomIntBetween(1, 1000); Iterator<Integer>[] iterators = new Iterator[numberOfIterators]; List<Integer> values = new ArrayList<>(); for (int i = 0; i < numberOfIterators; i++) { int numberOfValues = randomIntBetween(0, 256); List<Integer> theseValues = new ArrayList<>(); for (int j = 0; j < numberOfValues; j++) { int value = randomInt(); values.add(value); theseValues.add(value); } iterators[i] = theseValues.iterator(); } assertContainsInOrder(Iterators.concat(iterators), values.toArray(new Integer[values.size()])); } public void testTwoEntries() { int first = randomInt(); int second = randomInt(); Iterator<Integer> concat = Iterators.concat(singletonIterator(first), empty(), empty(), singletonIterator(second)); assertContainsInOrder(concat, first, second); } public void testNull() { try { Iterators.concat((Iterator<?>)null); fail("expected " + NullPointerException.class.getSimpleName()); } catch (NullPointerException e) { } } public void testNullIterator() { try { Iterators.concat(singletonIterator(1), empty(), null, empty(), singletonIterator(2)); fail("expected " + NullPointerException.class.getSimpleName()); } catch (NullPointerException e) { } } private <T> Iterator<T> singletonIterator(T value) { return Collections.singleton(value).iterator(); } private <T> void assertSingleton(T value, Iterator<T>... iterators) { Iterator<T> concat = Iterators.concat(iterators); assertContainsInOrder(concat, value); } private <T> Iterator<T> empty() { return new Iterator<T>() { @Override public boolean hasNext() { return false; } @Override public T next() { throw new NoSuchElementException(); } }; } private <T> void assertContainsInOrder(Iterator<T> iterator, T... values) { for (T value : values) { assertTrue(iterator.hasNext()); assertEquals(value, iterator.next()); } assertNoSuchElementException(iterator); } private <T> void assertEmptyIterator(Iterator<T> iterator) { assertFalse(iterator.hasNext()); assertNoSuchElementException(iterator); } private <T> void assertNoSuchElementException(Iterator<T> iterator) { try { iterator.next(); fail("expected " + NoSuchElementException.class.getSimpleName()); } catch (NoSuchElementException e) { } } }