1 package io.atlassian.fugue;
2
3 import org.junit.Test;
4
5 import java.util.ArrayList;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.NoSuchElementException;
9
10 import static io.atlassian.fugue.Iterators.emptyIterator;
11 import static io.atlassian.fugue.Iterators.peekingIterator;
12 import static io.atlassian.fugue.Iterators.singletonIterator;
13 import static java.util.Arrays.asList;
14 import static java.util.Collections.singletonList;
15 import static org.hamcrest.MatcherAssert.assertThat;
16 import static org.hamcrest.Matchers.is;
17
18 public class IteratorsTest {
19
20 @Test(expected = IllegalStateException.class) public void removeAfterPeeking() throws Exception {
21 final Iterators.Peeking<Integer> integerPeekingIterator = peekingIterator(asList(1, 2).iterator());
22 assertThat(integerPeekingIterator.peek(), is(1));
23 integerPeekingIterator.remove();
24 }
25
26 @Test public void peekAfterRemoving() throws Exception {
27 final List<Integer> testList = new ArrayList<>();
28 testList.add(1);
29 testList.add(2);
30 final Iterators.Peeking<Integer> integerPeekingIterator = peekingIterator(testList.listIterator());
31 integerPeekingIterator.next();
32 integerPeekingIterator.remove();
33 assertThat(integerPeekingIterator.peek(), is(2));
34 }
35
36 @Test public void testSingletonIterator() throws Exception {
37 final Iterator<Integer> integerIterator = singletonIterator(1);
38 assertThat(integerIterator.hasNext(), is(true));
39 assertThat(integerIterator.next(), is(1));
40 assertThat(integerIterator.hasNext(), is(false));
41 }
42
43 @Test(expected = UnsupportedOperationException.class) public void iteratingTwiceFails() throws Exception {
44 final Iterator<Integer> integerIterator = singletonIterator(1);
45 assertThat(integerIterator.next(), is(1));
46 assertThat(integerIterator.hasNext(), is(false));
47 integerIterator.next();
48 }
49
50 @Test public void testEmptyIterator() throws Exception {
51 final Iterator<Integer> intIter = emptyIterator();
52 assertThat(intIter.hasNext(), is(false));
53 }
54
55 @Test(expected = NoSuchElementException.class) public void unsafeReferenceReuseExternalElementConsumption() {
56 final Iterator<Integer> i = asList(1, 2).iterator();
57 final Iterators.Peeking<Integer> peeking = peekingIterator(i);
58 assertThat(peeking.peek(), is(1));
59 assertThat(peeking.next(), is(1));
60 assertThat(peeking.hasNext(), is(true));
61 assertThat(i.hasNext(), is(true));
62 assertThat(i.next(), is(2));
63 peeking.next();
64 }
65
66 @Test(expected = NoSuchElementException.class) public void unsafeReferenceReusePeekConsumesElement() {
67 final Iterator<Integer> i = singletonList(1).iterator();
68 final Iterators.Peeking<Integer> peeking = peekingIterator(i);
69 assertThat(peeking.peek(), is(1));
70 i.next();
71 }
72 }