Skip to content

Commit 8b782fa

Browse files
mariuszsgmessner
authored andcommitted
Spliterator improvments (#297)
* fix for NPE on empty source * add NPE when action is missing (required by contract) * declare characteristics
1 parent 0085d12 commit 8b782fa

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

src/main/java/org/gitlab4j/api/PagerSpliterator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.gitlab4j.api;
22

3+
import java.util.Collections;
34
import java.util.Iterator;
45
import java.util.Spliterator;
56
import java.util.function.Consumer;
@@ -14,11 +15,16 @@ class PagerSpliterator<T> implements Spliterator<T> {
1415
this.pager = pager;
1516
if (pager.hasNext()) {
1617
elements = this.pager.next().iterator();
18+
} else {
19+
elements = Collections.emptyIterator();
1720
}
1821
}
1922

2023
@Override
2124
public boolean tryAdvance(Consumer<? super T> action) {
25+
if (action == null) {
26+
throw new NullPointerException("Action is null");
27+
}
2228
if (elements.hasNext()) {
2329
action.accept(elements.next());
2430
return true;
@@ -42,6 +48,6 @@ public long estimateSize() {
4248

4349
@Override
4450
public int characteristics() {
45-
return 0;
51+
return SIZED | NONNULL;
4652
}
4753
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.gitlab4j.api;
2+
3+
import java.util.Collections;
4+
5+
import org.junit.Assert;
6+
import org.junit.Before;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.mockito.Mock;
10+
import org.mockito.junit.MockitoJUnitRunner;
11+
12+
import static org.junit.Assert.assertEquals;
13+
import static org.junit.Assert.assertFalse;
14+
import static org.junit.Assert.assertTrue;
15+
import static org.mockito.Mockito.when;
16+
17+
@RunWith(MockitoJUnitRunner.class)
18+
public class PagerSpliteratorTest {
19+
20+
PagerSpliterator<Integer> pagerSpliterator;
21+
22+
@Mock
23+
Pager pager;
24+
25+
@Before
26+
public void setUp() {
27+
pagerSpliterator = new PagerSpliterator<>(pager);
28+
}
29+
30+
@Test
31+
public void shouldAcceptElementFromSource() {
32+
when(pager.hasNext()).thenReturn(true);
33+
when(pager.next()).thenReturn(Collections.singletonList(1));
34+
35+
boolean success = pagerSpliterator.tryAdvance(System.out::println);
36+
37+
assertTrue(success);
38+
}
39+
40+
@Test
41+
public void shouldDoNotFailOnEmptySource() {
42+
boolean success = pagerSpliterator.tryAdvance(System.out::println);
43+
44+
assertFalse(success);
45+
}
46+
47+
@Test
48+
public void shouldThrowNullPointerExceptionWhenActionIsMissing() {
49+
try {
50+
pagerSpliterator.tryAdvance(null);
51+
Assert.fail("Missing NullPointerException");
52+
} catch (Throwable e) {
53+
assertEquals(NullPointerException.class, e.getClass());
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)