package edu.stanford.nlp.util; import junit.framework.TestCase; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.Spliterator; import java.util.stream.Stream; import java.util.stream.StreamSupport; /** * A test for the {@link edu.stanford.nlp.util.IterableIterator}. * Notably, I don't entirely trust myself to implement the {@link Iterable#spliterator()}} function * properly. * * @author Gabor Angeli */ public class IterableIteratorTest extends TestCase { public void testBasic() { String[] strings = new String[] { "do", "re", "mi", "fa", "so", "la", "ti", "do", }; Iterator<String> it = Arrays.asList(strings).iterator(); IterableIterator<String> iterit = new IterableIterator<>(it); assertEquals("do", iterit.next()); assertEquals("re", iterit.next()); assertEquals("mi", iterit.next()); assertEquals("fa", iterit.next()); assertEquals("so", iterit.next()); assertEquals("la", iterit.next()); assertEquals("ti", iterit.next()); assertEquals("do", iterit.next()); assertFalse(iterit.hasNext()); } public void testSpliteratorInSequence() { ArrayList<Integer> x = new ArrayList<>(); for (int i = 0; i < 1000; ++i) { x.add(i); } IterableIterator<Integer> iter = new IterableIterator<>(x.iterator()); Spliterator<Integer> spliterator = iter.spliterator(); Stream<Integer> stream = StreamSupport.stream(spliterator, false); final Integer[] next = new Integer[]{0}; stream.forEach(elem -> { assertEquals(next[0], elem); next[0] += 1; }); } public void testSpliteratorInParallel() { ArrayList<Integer> x = new ArrayList<>(); for (int i = 0; i < 1000; ++i) { x.add(i); } IterableIterator<Integer> iter = new IterableIterator<>(x.iterator()); Spliterator<Integer> spliterator = iter.spliterator(); Stream<Integer> stream = StreamSupport.stream(spliterator, true); final boolean[] seen = new boolean[1000]; stream.forEach(elem -> { assertFalse(seen[elem]); seen[elem] = true; }); for (int i = 0; i < 1000; ++i) { assertTrue(seen[i]); } } }