diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml
index d549d5216..ff10a3814 100644
--- a/fluentinterface/pom.xml
+++ b/fluentinterface/pom.xml
@@ -16,5 +16,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
\ No newline at end of file
diff --git a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java
index 560b10189..44f095289 100644
--- a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java
+++ b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java
@@ -215,7 +215,7 @@ public class LazyFluentIterable implements FluentIterable {
return new DecoratingIterator(iterable.iterator()) {
@Override
public TYPE computeNext() {
- return fromIterator.next();
+ return fromIterator.hasNext() ? fromIterator.next() : null;
}
};
}
diff --git a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java
new file mode 100644
index 000000000..7d4cb0530
--- /dev/null
+++ b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java
@@ -0,0 +1,180 @@
+package com.iluwatar.fluentinterface.fluentiterable;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Spliterator;
+import java.util.function.Consumer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+/**
+ * Date: 12/12/15 - 7:00 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public abstract class FluentIterableTest {
+
+ /**
+ * Create a new {@link FluentIterable} from the given integers
+ *
+ * @param integers The integers
+ * @return The new iterable, use for testing
+ */
+ protected abstract FluentIterable createFluentIterable(final Iterable integers);
+
+ @Test
+ public void testFirst() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3, 10, 9, 8);
+ final Optional first = createFluentIterable(integers).first();
+ assertNotNull(first);
+ assertTrue(first.isPresent());
+ assertEquals(integers.get(0), first.get());
+ }
+
+ @Test
+ public void testFirstEmptyCollection() throws Exception {
+ final List integers = Collections.emptyList();
+ final Optional first = createFluentIterable(integers).first();
+ assertNotNull(first);
+ assertFalse(first.isPresent());
+ }
+
+ @Test
+ public void testFirstCount() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3, 10, 9, 8);
+ final List first4 = createFluentIterable(integers)
+ .first(4)
+ .asList();
+
+ assertNotNull(first4);
+ assertEquals(4, first4.size());
+
+ assertEquals(integers.get(0), first4.get(0));
+ assertEquals(integers.get(1), first4.get(1));
+ assertEquals(integers.get(2), first4.get(2));
+ assertEquals(integers.get(3), first4.get(3));
+ }
+
+ @Test
+ public void testFirstCountLessItems() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3);
+ final List first4 = createFluentIterable(integers)
+ .first(4)
+ .asList();
+
+ assertNotNull(first4);
+ assertEquals(3, first4.size());
+
+ assertEquals(integers.get(0), first4.get(0));
+ assertEquals(integers.get(1), first4.get(1));
+ assertEquals(integers.get(2), first4.get(2));
+ }
+
+ @Test
+ public void testLast() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3, 10, 9, 8);
+ final Optional last = createFluentIterable(integers).last();
+ assertNotNull(last);
+ assertTrue(last.isPresent());
+ assertEquals(integers.get(integers.size() - 1), last.get());
+ }
+
+ @Test
+ public void testLastEmptyCollection() throws Exception {
+ final List integers = Collections.emptyList();
+ final Optional last = createFluentIterable(integers).last();
+ assertNotNull(last);
+ assertFalse(last.isPresent());
+ }
+
+ @Test
+ public void testLastCount() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3, 10, 9, 8);
+ final List last4 = createFluentIterable(integers)
+ .last(4)
+ .asList();
+
+ assertNotNull(last4);
+ assertEquals(4, last4.size());
+ assertEquals(Integer.valueOf(3), last4.get(0));
+ assertEquals(Integer.valueOf(10), last4.get(1));
+ assertEquals(Integer.valueOf(9), last4.get(2));
+ assertEquals(Integer.valueOf(8), last4.get(3));
+ }
+
+ @Test
+ public void testLastCountLessItems() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3);
+ final List last4 = createFluentIterable(integers)
+ .last(4)
+ .asList();
+
+ assertNotNull(last4);
+ assertEquals(3, last4.size());
+
+ assertEquals(Integer.valueOf(1), last4.get(0));
+ assertEquals(Integer.valueOf(2), last4.get(1));
+ assertEquals(Integer.valueOf(3), last4.get(2));
+ }
+
+ @Test
+ public void testFilter() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3, 10, 9, 8);
+ final List evenItems = createFluentIterable(integers)
+ .filter(i -> i % 2 == 0)
+ .asList();
+
+ assertNotNull(evenItems);
+ assertEquals(3, evenItems.size());
+ assertEquals(Integer.valueOf(2), evenItems.get(0));
+ assertEquals(Integer.valueOf(10), evenItems.get(1));
+ assertEquals(Integer.valueOf(8), evenItems.get(2));
+ }
+
+ @Test
+ public void testMap() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3);
+ final List longs = createFluentIterable(integers)
+ .map(Integer::longValue)
+ .asList();
+
+ assertNotNull(longs);
+ assertEquals(integers.size(), longs.size());
+ assertEquals(Long.valueOf(1), longs.get(0));
+ assertEquals(Long.valueOf(2), longs.get(1));
+ assertEquals(Long.valueOf(3), longs.get(2));
+ }
+
+ @Test
+ public void testForEach() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3);
+
+ final Consumer consumer = mock(Consumer.class);
+ createFluentIterable(integers).forEach(consumer);
+
+ verify(consumer, times(1)).accept(Integer.valueOf(1));
+ verify(consumer, times(1)).accept(Integer.valueOf(2));
+ verify(consumer, times(1)).accept(Integer.valueOf(3));
+ verifyNoMoreInteractions(consumer);
+
+ }
+
+ @Test
+ public void testSpliterator() throws Exception {
+ final List integers = Arrays.asList(1, 2, 3);
+ final Spliterator split = createFluentIterable(integers).spliterator();
+ assertNotNull(split);
+ }
+
+}
\ No newline at end of file
diff --git a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterableTest.java b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterableTest.java
new file mode 100644
index 000000000..aa51327e3
--- /dev/null
+++ b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterableTest.java
@@ -0,0 +1,18 @@
+package com.iluwatar.fluentinterface.fluentiterable.lazy;
+
+import com.iluwatar.fluentinterface.fluentiterable.FluentIterable;
+import com.iluwatar.fluentinterface.fluentiterable.FluentIterableTest;
+
+/**
+ * Date: 12/12/15 - 7:56 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class LazyFluentIterableTest extends FluentIterableTest {
+
+ @Override
+ protected FluentIterable createFluentIterable(Iterable integers) {
+ return LazyFluentIterable.from(integers);
+ }
+
+}
diff --git a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterableTest.java b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterableTest.java
new file mode 100644
index 000000000..360d6e222
--- /dev/null
+++ b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterableTest.java
@@ -0,0 +1,18 @@
+package com.iluwatar.fluentinterface.fluentiterable.simple;
+
+import com.iluwatar.fluentinterface.fluentiterable.FluentIterable;
+import com.iluwatar.fluentinterface.fluentiterable.FluentIterableTest;
+
+/**
+ * Date: 12/12/15 - 7:56 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class SimpleFluentIterableTest extends FluentIterableTest {
+
+ @Override
+ protected FluentIterable createFluentIterable(Iterable integers) {
+ return SimpleFluentIterable.fromCopyOf(integers);
+ }
+
+}