From 9823c352cd2dcf0b51d7bf90fa1d47a44db4c331 Mon Sep 17 00:00:00 2001 From: Mariusz Smykula Date: Sun, 10 Feb 2019 13:20:55 +0100 Subject: [PATCH] Spliterator improvments * fix for NPE on empty source * add NPE when action is missing (required by contract) * declare characteristics --- .../org/gitlab4j/api/PagerSpliterator.java | 8 ++- .../gitlab4j/api/PagerSpliteratorTest.java | 56 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/gitlab4j/api/PagerSpliteratorTest.java diff --git a/src/main/java/org/gitlab4j/api/PagerSpliterator.java b/src/main/java/org/gitlab4j/api/PagerSpliterator.java index 943373126..bf1ccf54a 100644 --- a/src/main/java/org/gitlab4j/api/PagerSpliterator.java +++ b/src/main/java/org/gitlab4j/api/PagerSpliterator.java @@ -1,5 +1,6 @@ package org.gitlab4j.api; +import java.util.Collections; import java.util.Iterator; import java.util.Spliterator; import java.util.function.Consumer; @@ -14,11 +15,16 @@ class PagerSpliterator implements Spliterator { this.pager = pager; if (pager.hasNext()) { elements = this.pager.next().iterator(); + } else { + elements = Collections.emptyIterator(); } } @Override public boolean tryAdvance(Consumer action) { + if (action == null) { + throw new NullPointerException("Action is null"); + } if (elements.hasNext()) { action.accept(elements.next()); return true; @@ -42,6 +48,6 @@ public long estimateSize() { @Override public int characteristics() { - return 0; + return SIZED | NONNULL; } } diff --git a/src/test/java/org/gitlab4j/api/PagerSpliteratorTest.java b/src/test/java/org/gitlab4j/api/PagerSpliteratorTest.java new file mode 100644 index 000000000..c727b4e2d --- /dev/null +++ b/src/test/java/org/gitlab4j/api/PagerSpliteratorTest.java @@ -0,0 +1,56 @@ +package org.gitlab4j.api; + +import java.util.Collections; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class PagerSpliteratorTest { + + PagerSpliterator pagerSpliterator; + + @Mock + Pager pager; + + @Before + public void setUp() { + pagerSpliterator = new PagerSpliterator<>(pager); + } + + @Test + public void shouldAcceptElementFromSource() { + when(pager.hasNext()).thenReturn(true); + when(pager.next()).thenReturn(Collections.singletonList(1)); + + boolean success = pagerSpliterator.tryAdvance(System.out::println); + + assertTrue(success); + } + + @Test + public void shouldDoNotFailOnEmptySource() { + boolean success = pagerSpliterator.tryAdvance(System.out::println); + + assertFalse(success); + } + + @Test + public void shouldThrowNullPointerExceptionWhenActionIsMissing() { + try { + pagerSpliterator.tryAdvance(null); + Assert.fail("Missing NullPointerException"); + } catch (Throwable e) { + assertEquals(NullPointerException.class, e.getClass()); + } + } +} \ No newline at end of file