/*
* 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.util.iterable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import org.elasticsearch.test.ESTestCase;
import static org.hamcrest.object.HasToString.hasToString;
public class IterablesTests extends ESTestCase {
public void testGetOverList() {
test(Arrays.asList("a", "b", "c"));
}
public void testGetOverIterable() {
Iterable<String> iterable = () ->
new Iterator<String>() {
private int position = 0;
@Override
public boolean hasNext() {
return position < 3;
}
@Override
public String next() {
if (position < 3) {
String s = position == 0 ? "a" : position == 1 ? "b" : "c";
position++;
return s;
} else {
throw new NoSuchElementException();
}
}
};
test(iterable);
}
public void testFlatten() {
List<List<Integer>> list = new ArrayList<>();
list.add(new ArrayList<>());
Iterable<Integer> allInts = Iterables.flatten(list);
int count = 0;
for(int x : allInts) {
count++;
}
assertEquals(0, count);
list.add(new ArrayList<>());
list.get(1).add(0);
// changes to the outer list are not seen since flatten pre-caches outer list on init:
count = 0;
for(int x : allInts) {
count++;
}
assertEquals(0, count);
// but changes to the original inner lists are seen:
list.get(0).add(0);
for(int x : allInts) {
count++;
}
assertEquals(1, count);
}
private void test(Iterable<String> iterable) {
try {
Iterables.get(iterable, -1);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
assertThat(e, hasToString("java.lang.IllegalArgumentException: position >= 0"));
}
assertEquals("a", Iterables.get(iterable, 0));
assertEquals("b", Iterables.get(iterable, 1));
assertEquals("c", Iterables.get(iterable, 2));
try {
Iterables.get(iterable, 3);
fail("expected IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException e) {
assertThat(e, hasToString("java.lang.IndexOutOfBoundsException: 3"));
}
}
}