blob: b00fcff9589ee85c613bf324485d3c8e9ca727b7 [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.jena.atlas.iterator;
import static org.junit.Assert.assertEquals ;
import static org.junit.Assert.assertFalse ;
import static org.junit.Assert.assertTrue ;
import java.util.* ;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.junit.Test ;
public class TestIter
{
private List<String> data0 = new ArrayList<>() ;
private List<String> data1 = Arrays.asList("a") ;
private List<String> data2 = Arrays.asList("x","y","z") ;
private List<String> data3 = Arrays.asList(null, "x", null, null, null, "y", "z", null);
@Test
public void append_1() {
Iterator<String> iter = Iter.append(data1.iterator(), data0.iterator());
test(iter, "a");
}
@Test
public void append_2() {
Iterator<String> iter = Iter.append(data0.iterator(), data1.iterator());
test(iter, "a");
}
@Test
public void append_3() {
Iterator<String> iter = Iter.append(data1.iterator(), data2.iterator());
test(iter, "a", "x", "y", "z");
}
private static List<String> mutableList(String...strings) {
List<String> list = new ArrayList<>();
for ( String s : strings )
list.add(s);
return list;
}
@Test
public void append_4() {
List<String> L = mutableList("a", "b", "c");
List<String> R = mutableList("d", "e", "f");
Iterator<String> LR = Iter.append(L.iterator(), R.iterator());
while (LR.hasNext()) {
String s = LR.next();
if ( "c".equals(s) ) {
LR.hasNext(); // test for JENA-60
LR.remove();
}
}
assertEquals(2, L.size());
assertEquals(Arrays.asList("a", "b"), L);
assertEquals(Arrays.asList("d", "e", "f"), R);
}
@Test
public void append_5() {
List<String> L = mutableList("a", "b", "c");
List<String> R = mutableList("d", "e", "f");
Iterator<String> LR = Iter.append(L.iterator(), R.iterator());
while (LR.hasNext()) {
String s = LR.next();
if ( "d".equals(s) ) {
LR.hasNext(); // test for JENA-60
LR.remove();
}
}
assertEquals(3, L.size());
assertEquals(Arrays.asList("e", "f"), R);
}
@Test
public void append_6() {
List<String> L = mutableList("a", "b", "c");
List<String> R = mutableList("d", "e", "f");
Iterator<String> LR = Iter.append(L.iterator(), R.iterator());
while (LR.hasNext()) {
LR.next();
}
LR.remove();
assertEquals(3, L.size());
assertEquals(Arrays.asList("a", "b", "c"), L);
assertEquals(Arrays.asList("d", "e"), R);
}
private static void test(Iterator<? > iter, Object...items) {
for ( Object x : items ) {
assertTrue(iter.hasNext());
assertEquals(x, iter.next());
}
assertFalse(iter.hasNext());
}
static Iter.Folder<String, String> f1 = (acc, arg)->acc + arg ;
@Test
public void fold_01() {
String[] x = {"a", "b", "c"};
String z = Iter.foldLeft(Arrays.asList(x).iterator(), "X", f1);
assertEquals("Xabc", z);
}
@Test
public void fold_02() {
String[] x = {"a", "b", "c"};
String z = Iter.foldRight(Arrays.asList(x).iterator(), "X", f1);
assertEquals("Xcba", z);
}
@Test
public void fold_03() {
String[] x = {};
String z = Iter.foldLeft(Arrays.asList(x).iterator(), "X", f1);
assertEquals("X", z);
}
@Test
public void fold_04() {
String[] x = {};
String z = Iter.foldRight(Arrays.asList(x).iterator(), "X", f1);
assertEquals("X", z);
}
@Test
public void map_01() {
Iterator<String> it = Iter.map(data2.iterator(), item -> item + item);
test(it, "xx", "yy", "zz");
}
@Test
public void flatmap_01() {
Iterator<String> it = Iter.flatMap(data2.iterator(), item -> Arrays.asList(item+item, item).iterator());
test(it, "xx", "x", "yy", "y", "zz", "z");
}
@Test
public void flatmap_02() {
List<Integer> data = Arrays.asList(1,2,3);
Iterator<Integer> it = Iter.flatMap(data.iterator(), x -> {
if ( x == 2 ) return Iter.nullIterator();
return Arrays.asList(x*x).iterator();
});
test(it, 1, 9);
}
@Test
public void flatmap_03() {
List<Integer> data = Arrays.asList(1,2,3);
Function<Integer, Iterator<String>> mapper = x -> {
switch(x) {
case 1: return Iter.nullIterator();
case 2: return Arrays.asList("two").iterator();
case 3: return Iter.nullIterator();
default: throw new IllegalArgumentException();
}
};
Iter<String> it = Iter.iter(data.iterator()).flatMap(mapper);
test(it, "two");
}
private Predicate<String> filter = item -> item.length() == 1;
@Test
public void first_01() {
Iter<String> iter = Iter.nullIter();
assertEquals(null, Iter.first(iter, filter));
}
@SuppressWarnings("deprecation")
@Test
public void first_02() {
List<String> data = Arrays.asList("11", "A", "B", "C");
assertEquals("A", Iter.first(data, filter));
}
@SuppressWarnings("deprecation")
@Test
public void first_03() {
List<String> data = Arrays.asList("11", "AA", "BB", "CC");
assertEquals(null, Iter.first(data, filter));
}
@Test
public void first_04() {
Iter<String> iter = Iter.nullIter();
assertEquals(-1, Iter.firstIndex(iter, filter));
}
@SuppressWarnings("deprecation")
@Test
public void first_05() {
List<String> data = Arrays.asList("11", "A", "B", "C");
assertEquals(1, Iter.firstIndex(data, filter));
}
@SuppressWarnings("deprecation")
@Test
public void first_06() {
List<String> data = Arrays.asList("11", "AA", "BB", "CC");
assertEquals(-1, Iter.firstIndex(data, filter));
}
@Test
public void last_01() {
Iter<String> iter = Iter.nullIter();
assertEquals(null, Iter.last(iter, filter));
}
@SuppressWarnings("deprecation")
@Test
public void last_02() {
List<String> data = Arrays.asList("11", "A", "B", "C");
assertEquals("C", Iter.last(data, filter));
}
@SuppressWarnings("deprecation")
@Test
public void last_03() {
List<String> data = Arrays.asList("11", "AA", "BB", "CC");
assertEquals(null, Iter.last(data, filter));
}
@Test
public void last_04() {
Iter<String> iter = Iter.nullIter();
assertEquals(-1, Iter.lastIndex(iter, filter));
}
@SuppressWarnings("deprecation")
@Test
public void last_05() {
List<String> data = Arrays.asList("11", "A", "B", "C");
assertEquals(3, Iter.lastIndex(data, filter));
}
@SuppressWarnings("deprecation")
@Test
public void last_06() {
List<String> data = Arrays.asList("11", "AA", "BB", "CC");
assertEquals(-1, Iter.lastIndex(data, filter));
}
private static Iterator<? > iterator(int n) {
return IntStream.range(1, n + 1).iterator();
}
@Test
public void iteratorStep_1() {
Iterator<? > iter = iterator(0);
int x = Iter.step(iter, 0);
assertEquals(0, x);
}
@Test
public void iteratorStep_2() {
Iterator<? > iter = iterator(0);
int x = Iter.step(iter, 1);
assertEquals(0, x);
}
@Test
public void iteratorStep_3() {
Iterator<? > iter = iterator(5);
int x = Iter.step(iter, 1);
assertEquals(1, x);
}
@Test
public void iteratorStep_4() {
Iterator<? > iter = iterator(5);
int x = Iter.step(iter, 4);
assertEquals(4, x);
}
@Test
public void iteratorStep_5() {
Iterator<? > iter = iterator(5);
int x = Iter.step(iter, 5);
assertEquals(5, x);
}
@Test
public void iteratorStep_6() {
Iterator<? > iter = iterator(5);
int x = Iter.step(iter, 6);
assertEquals(5, x);
}
@SafeVarargs
private static <X> Iterator<X> data(X ... items) {
List<X> a = new ArrayList<>(items.length);
for (X x : items )
a.add(x);
return a.iterator();
}
@Test public void anyMatch1() {
boolean b = Iter.anyMatch(data("2"), x->x.equals("2"));
assertTrue(b);
}
@Test public void anyMatch2() {
boolean b = Iter.anyMatch(data("2","3"), x->x.equals("2"));
assertTrue(b);
}
@Test public void anyMatch3() {
boolean b = Iter.anyMatch(data("2","3"), x->x.equals("1"));
assertFalse(b);
}
@Test public void allMatch1() {
boolean b = Iter.allMatch(data("2", "2"), x->x.equals("2"));
assertTrue(b);
}
@Test public void allMatch2() {
boolean b = Iter.allMatch(data("1", "2"), x->x.equals("2"));
assertFalse(b);
}
@Test public void noneMatch1() {
boolean b = Iter.noneMatch(data("1", "2", "3"), x->x.equals("A"));
assertTrue(b);
}
@Test public void noneMatch2() {
boolean b = Iter.noneMatch(data("A", "2", "3"), x->x.equals("A"));
assertFalse(b);
}
@Test public void findFirst1() {
Optional<String> r = Iter.findFirst(data("A", "2", "3"), x->x.equals("A"));
assertTrue(r.isPresent());
assertEquals("A", r.get());
}
@Test public void findFirst2() {
Optional<String> r = Iter.findFirst(data("A", "2", "3"), x->x.equals("Z"));
assertFalse(r.isPresent());
}
@Test public void findAny1() {
Optional<String> r = Iter.findAny(data("A", "2", "3"), x->x.equals("A"));
assertTrue(r.isPresent());
assertEquals("A", r.get());
}
@Test public void reduce1() {
Optional<String> r = Iter.reduce(data("A", "2", "3"), String::concat);
assertEquals(Optional.of("A23"), r);
}
@Test public void reduce2() {
Optional<String> r = Iter.reduce(data("A"), String::concat);
assertEquals(Optional.of("A"), r);
}
@Test public void reduce3() {
Optional<String> r = Iter.reduce(data(), String::concat);
assertFalse(r.isPresent());
}
@Test public void min1() {
Optional<String> x = Iter.min(data(), String::compareTo);
assertFalse(x.isPresent());
}
@Test public void min2() {
Optional<String> x = Iter.min(data("2"), String::compareTo);
assertTrue(x.isPresent());
assertEquals("2", x.get());
}
@Test public void min3() {
Optional<String> x = Iter.min(data("1", "2", "3"), String::compareTo);
assertTrue(x.isPresent());
assertEquals("1", x.get());
}
@Test public void min4() {
Optional<String> x = Iter.min(data("3", "1", "2"), String::compareTo);
assertTrue(x.isPresent());
assertEquals("1", x.get());
}
@Test public void max1() {
Optional<String> x = Iter.max(data(), String::compareTo);
assertFalse(x.isPresent());
}
@Test public void max2() {
Optional<String> x = Iter.max(data("2"), String::compareTo);
assertTrue(x.isPresent());
assertEquals("2", x.get());
}
@Test public void max3() {
Optional<String> x = Iter.max(data("1", "2", "3"), String::compareTo);
assertTrue(x.isPresent());
assertEquals("3", x.get());
}
@Test public void max4() {
Optional<String> x = Iter.max(data("3", "1", "2"), String::compareTo);
assertTrue(x.isPresent());
assertEquals("3", x.get());
}
@Test public void collect3() {
List<String> x = Iter.collect(data("A", "B", "C"), Collectors.toList());
assertEquals(3, x.size());
assertEquals(Arrays.asList("A", "B", "C"), x);
}
@Test public void collect1() {
List<String> x = Iter.collect(data("A", "B", "C"), ArrayList::new, ArrayList::add);
assertEquals(Arrays.asList("A", "B", "C"), x);
}
@Test
public void take_01() {
List<String> data = Arrays.asList("1", "A", "B", "CC");
List<String> data2 = Iter.take(data.iterator(), 2);
assertEquals(2, data2.size());
assertEquals("1", data2.get(0));
assertEquals("A", data2.get(1));
}
@Test
public void forEach_1() {
List<String> data = Arrays.asList("1", "A", "B", "CC");
AtomicInteger counter = new AtomicInteger(0);
Iter.forEach(data.iterator(), x->counter.incrementAndGet());
assertEquals(4, counter.get());
}
@Test
public void forEach_2() {
List<String> data = Collections.emptyList();
AtomicInteger counter = new AtomicInteger(0);
Iter.forEach(data.iterator(), x->counter.incrementAndGet());
assertEquals(0, counter.get());
}
@Test
public void take_02() {
List<String> data = Arrays.asList("1", "A", "B", "CC");
List<String> data2 = Iter.take(data.iterator(), 0);
assertEquals(0, data2.size());
}
@Test
public void take_03() {
List<String> data = Arrays.asList("1", "A", "B", "CC");
List<String> data2 = Iter.take(data.iterator(), 10);
assertEquals(4, data2.size());
assertEquals("1", data2.get(0));
assertEquals("A", data2.get(1));
assertEquals("B", data2.get(2));
assertEquals("CC", data2.get(3));
}
@Test
public void take_04() {
List<String> data = Arrays.asList("a", "b", "b", "c", "c", "d");
Iterator<String> iter = Iter.takeWhile(data.iterator(), item -> !item.equals("c"));
List<String> x = Iter.toList(iter);
List<String> expected = Arrays.asList("a", "b", "b");
assertEquals(expected, x);
}
@Test
public void take_05() {
List<String> data = Arrays.asList("a", "b", "b", "c", "c", "d");
Iterator<String> iter = Iter.takeUntil(data.iterator(), item -> item.equals("c"));
List<String> x = Iter.toList(iter);
List<String> expected = Arrays.asList("a", "b", "b");
assertEquals(expected, x);
}
@Test
public void take_06() {
List<String> data = Arrays.asList("a", "b", "b", "c", "c", "d");
Iterator<String> iter = Iter.takeWhile(data.iterator(), item -> true);
List<String> x = Iter.toList(iter);
assertEquals(data, x);
}
@Test
public void take_07() {
List<String> data = Arrays.asList("a", "b", "b", "c", "c", "d");
Iterator<String> iter = Iter.takeWhile(data.iterator(), item -> false);
assertFalse(iter.hasNext());
}
@Test
public void take_08() {
List<String> data = Collections.emptyList();
Iterator<String> iter = Iter.takeWhile(data.iterator(), item -> false);
assertFalse(iter.hasNext());
}
@Test
public void take_09() {
List<String> data = Collections.emptyList();
Iterator<String> iter = Iter.takeWhile(data.iterator(), item -> true);
assertFalse(iter.hasNext());
}
@Test
public void filter_01() {
test(Iter.removeNulls(data3.iterator()), "x", "y", "z");
}
@Test
public void filter_02() {
Iterator<String> it = Iter.filter(data3.iterator(), item -> "x".equals(item) || "z".equals(item));
test(it, "x", "z");
}
@Test
public void filter_03() {
Iterator<String> it = Iter.filter(data3.iterator(), item -> null == item || "x".equals(item));
test(it, null, "x", null, null, null, null);
}
@Test
public void distinct_01() {
List<String> x = Arrays.asList("a", "b", "a");
Iterator<String> iter = Iter.distinct(x.iterator());
test(iter, "a", "b");
}
@Test
public void distinct_02() {
List<String> x = Arrays.asList("a", "b", "a");
Iterator<String> iter = Iter.distinctAdjacent(x.iterator());
test(iter, "a", "b", "a");
}
@Test
public void distinct_03() {
List<String> x = Arrays.asList("a", "a", "b", "b", "b", "a", "a");
Iterator<String> iter = Iter.distinct(x.iterator());
test(iter, "a", "b");
}
@Test
public void distinct_04() {
List<String> x = Arrays.asList("a", "a", "b", "b", "b", "a", "a");
Iterator<String> iter = Iter.distinctAdjacent(x.iterator());
test(iter, "a", "b", "a");
}
private static class AlwaysAcceptFilterStack extends FilterStack<Object> {
public AlwaysAcceptFilterStack(Predicate<Object> f) {
super(f);
}
@Override
public boolean acceptAdditional(Object o) {
return true;
}
}
@Test
public void testFilterStack_01() {
Predicate<Object> filter = x -> true;
FilterStack<Object> filterStack = new AlwaysAcceptFilterStack(filter);
assertTrue(filterStack.test(new Object()));
}
@Test
public void testFilterStack_02() {
Predicate<Object> filter = x -> false;
FilterStack<Object> filterStack = new AlwaysAcceptFilterStack(filter);
assertFalse(filterStack.test(new Object()));
}
}