diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml
index 62c6adf14..94873472f 100644
--- a/event-aggregator/pom.xml
+++ b/event-aggregator/pom.xml
@@ -13,5 +13,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java
new file mode 100644
index 000000000..09acf7442
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java
@@ -0,0 +1,133 @@
+package com.iluwatar.event.aggregator;
+
+import org.junit.Test;
+
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/12/15 - 10:58 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public abstract class EventEmitterTest {
+
+ /**
+ * Factory used to create a new instance of the test object with a default observer
+ */
+ private final Function factoryWithDefaultObserver;
+
+ /**
+ * Factory used to create a new instance of the test object without passing a default observer
+ */
+ private final Supplier factoryWithoutDefaultObserver;
+
+ /**
+ * The day of the week an event is expected
+ */
+ private final Weekday specialDay;
+
+ /**
+ * The expected event, emitted on the special day
+ */
+ private final Event event;
+
+ /**
+ * Create a new event emitter test, using the given test object factories, special day and event
+ */
+ EventEmitterTest(final Weekday specialDay, final Event event,
+ final Function factoryWithDefaultObserver,
+ final Supplier factoryWithoutDefaultObserver) {
+
+ this.specialDay = specialDay;
+ this.event = event;
+ this.factoryWithDefaultObserver = Objects.requireNonNull(factoryWithDefaultObserver);
+ this.factoryWithoutDefaultObserver = Objects.requireNonNull(factoryWithoutDefaultObserver);
+ }
+
+ /**
+ * Go over every day of the month, and check if the event is emitted on the given day. This test
+ * is executed twice, once without a default emitter and once with
+ */
+ @Test
+ public void testAllDays() {
+ testAllDaysWithoutDefaultObserver(specialDay, event);
+ testAllDaysWithDefaultObserver(specialDay, event);
+ }
+
+ /**
+ * Go over every day of the month, and check if the event is emitted on the given day. Use an
+ * event emitter without a default observer
+ *
+ * @param specialDay The special day on which an event is emitted
+ * @param event The expected event emitted by the test object
+ */
+ private void testAllDaysWithoutDefaultObserver(final Weekday specialDay, final Event event) {
+ final EventObserver observer1 = mock(EventObserver.class);
+ final EventObserver observer2 = mock(EventObserver.class);
+
+ final E emitter = this.factoryWithoutDefaultObserver.get();
+ emitter.registerObserver(observer1);
+ emitter.registerObserver(observer2);
+
+ testAllDays(specialDay, event, emitter, observer1, observer2);
+ }
+
+ /**
+ * Go over every day of the month, and check if the event is emitted on the given day.
+ *
+ * @param specialDay The special day on which an event is emitted
+ * @param event The expected event emitted by the test object
+ */
+ private void testAllDaysWithDefaultObserver(final Weekday specialDay, final Event event) {
+ final EventObserver defaultObserver = mock(EventObserver.class);
+ final EventObserver observer1 = mock(EventObserver.class);
+ final EventObserver observer2 = mock(EventObserver.class);
+
+ final E emitter = this.factoryWithDefaultObserver.apply(defaultObserver);
+ emitter.registerObserver(observer1);
+ emitter.registerObserver(observer2);
+
+ testAllDays(specialDay, event, emitter, defaultObserver, observer1, observer2);
+ }
+
+ /**
+ * Pass each week of the day, day by day to the event emitter and verify of the given observers
+ * received the correct event on the special day.
+ *
+ * @param specialDay The special day on which an event is emitted
+ * @param event The expected event emitted by the test object
+ * @param emitter The event emitter
+ * @param observers The registered observer mocks
+ */
+ private void testAllDays(final Weekday specialDay, final Event event, final E emitter,
+ final EventObserver... observers) {
+
+ for (final Weekday weekday : Weekday.values()) {
+ // Pass each week of the day, day by day to the event emitter
+ emitter.timePasses(weekday);
+
+ if (weekday == specialDay) {
+ // On a special day, every observer should have received the event
+ for (final EventObserver observer : observers) {
+ verify(observer, times(1)).onEvent(eq(event));
+ }
+ } else {
+ // On any other normal day, the observers should have received nothing at all
+ verifyZeroInteractions(observers);
+ }
+ }
+
+ // The observers should not have received any additional events after the week
+ verifyNoMoreInteractions(observers);
+ }
+
+}
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java
new file mode 100644
index 000000000..3f2cdb0fe
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java
@@ -0,0 +1,27 @@
+package com.iluwatar.event.aggregator;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Date: 12/12/15 - 2:52 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class EventTest {
+
+ /**
+ * Verify if every event has a non-null, non-empty description
+ */
+ @Test
+ public void testToString() {
+ for (final Event event : Event.values()) {
+ final String toString = event.toString();
+ assertNotNull(toString);
+ assertFalse(toString.trim().isEmpty());
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java
new file mode 100644
index 000000000..1dd4e5c63
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java
@@ -0,0 +1,67 @@
+package com.iluwatar.event.aggregator;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.PrintStream;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/12/15 - 3:04 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class KingJoffreyTest {
+
+ /**
+ * The mocked standard out {@link PrintStream}, required since {@link KingJoffrey} does nothing
+ * except for writing to std-out using {@link System#out}
+ */
+ private final PrintStream stdOutMock = mock(PrintStream.class);
+
+ /**
+ * Keep the original std-out so it can be restored after the test
+ */
+ private final PrintStream stdOutOrig = System.out;
+
+ /**
+ * Inject the mocked std-out {@link PrintStream} into the {@link System} class before each test
+ */
+ @Before
+ public void setUp() {
+ System.setOut(this.stdOutMock);
+ }
+
+ /**
+ * Removed the mocked std-out {@link PrintStream} again from the {@link System} class
+ */
+ @After
+ public void tearDown() {
+ System.setOut(this.stdOutOrig);
+ }
+
+ /**
+ * Test if {@link KingJoffrey} tells us what event he received
+ */
+ @Test
+ public void testOnEvent() {
+ final KingJoffrey kingJoffrey = new KingJoffrey();
+
+ for (final Event event : Event.values()) {
+ verifyZeroInteractions(this.stdOutMock);
+ kingJoffrey.onEvent(event);
+
+ final String expectedMessage = "Received event from the King's Hand: " + event.toString();
+ verify(this.stdOutMock, times(1)).println(expectedMessage);
+ verifyNoMoreInteractions(this.stdOutMock);
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java
new file mode 100644
index 000000000..992ee4cf5
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java
@@ -0,0 +1,48 @@
+package com.iluwatar.event.aggregator;
+
+import org.junit.Test;
+
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/12/15 - 10:57 AM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class KingsHandTest extends EventEmitterTest {
+
+ /**
+ * Create a new test instance, using the correct object factory
+ */
+ public KingsHandTest() {
+ super(null, null, KingsHand::new, KingsHand::new);
+ }
+
+ /**
+ * The {@link KingsHand} is both an {@EventEmitter} as an {@link EventObserver} so verify if every
+ * event received is passed up to it's superior, in most cases {@link KingJoffrey} but now just a
+ * mocked observer.
+ */
+ @Test
+ public void testPassThrough() throws Exception {
+ final EventObserver observer = mock(EventObserver.class);
+ final KingsHand kingsHand = new KingsHand(observer);
+
+ // The kings hand should not pass any events before he received one
+ verifyZeroInteractions(observer);
+
+ // Verify if each event is passed on to the observer, nothing less, nothing more.
+ for (final Event event : Event.values()) {
+ kingsHand.onEvent(event);
+ verify(observer, times(1)).onEvent(eq(event));
+ verifyNoMoreInteractions(observer);
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/LordBaelishTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/LordBaelishTest.java
new file mode 100644
index 000000000..dbc867859
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/LordBaelishTest.java
@@ -0,0 +1,17 @@
+package com.iluwatar.event.aggregator;
+
+/**
+ * Date: 12/12/15 - 10:57 AM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class LordBaelishTest extends EventEmitterTest {
+
+ /**
+ * Create a new test instance, using the correct object factory
+ */
+ public LordBaelishTest() {
+ super(Weekday.FRIDAY, Event.STARK_SIGHTED, LordBaelish::new, LordBaelish::new);
+ }
+
+}
\ No newline at end of file
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/LordVarysTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/LordVarysTest.java
new file mode 100644
index 000000000..050af5576
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/LordVarysTest.java
@@ -0,0 +1,17 @@
+package com.iluwatar.event.aggregator;
+
+/**
+ * Date: 12/12/15 - 10:57 AM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class LordVarysTest extends EventEmitterTest {
+
+ /**
+ * Create a new test instance, using the correct object factory
+ */
+ public LordVarysTest() {
+ super(Weekday.SATURDAY, Event.TRAITOR_DETECTED, LordVarys::new, LordVarys::new);
+ }
+
+}
\ No newline at end of file
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/ScoutTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/ScoutTest.java
new file mode 100644
index 000000000..435e07821
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/ScoutTest.java
@@ -0,0 +1,17 @@
+package com.iluwatar.event.aggregator;
+
+/**
+ * Date: 12/12/15 - 10:57 AM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class ScoutTest extends EventEmitterTest {
+
+ /**
+ * Create a new test instance, using the correct object factory
+ */
+ public ScoutTest() {
+ super(Weekday.TUESDAY, Event.WARSHIPS_APPROACHING, Scout::new, Scout::new);
+ }
+
+}
\ No newline at end of file
diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java
new file mode 100644
index 000000000..37b300851
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java
@@ -0,0 +1,24 @@
+package com.iluwatar.event.aggregator;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Date: 12/12/15 - 2:12 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class WeekdayTest {
+
+ @Test
+ public void testToString() throws Exception {
+ for (final Weekday weekday : Weekday.values()) {
+ final String toString = weekday.toString();
+ assertNotNull(toString);
+ assertEquals(weekday.name(), toString.toUpperCase());
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java b/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java
new file mode 100644
index 000000000..168026b65
--- /dev/null
+++ b/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java
@@ -0,0 +1,75 @@
+package com.iluwatar.execute.around;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Date: 12/12/15 - 3:21 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class SimpleFileWriterTest {
+
+ /**
+ * Create a temporary folder, used to generate files in during this test
+ */
+ @Rule
+ public final TemporaryFolder testFolder = new TemporaryFolder();
+
+ /**
+ * Verify if the given writer is not 'null'
+ */
+ @Test
+ public void testWriterNotNull() throws Exception {
+ final File temporaryFile = this.testFolder.newFile();
+ new SimpleFileWriter(temporaryFile.getPath(), Assert::assertNotNull);
+ }
+
+ /**
+ * Test if the {@link SimpleFileWriter} creates a file if it doesn't exist
+ */
+ @Test
+ public void testNonExistentFile() throws Exception {
+ final File nonExistingFile = new File(this.testFolder.getRoot(), "non-existing-file");
+ assertFalse(nonExistingFile.exists());
+
+ new SimpleFileWriter(nonExistingFile.getPath(), Assert::assertNotNull);
+ assertTrue(nonExistingFile.exists());
+ }
+
+ /**
+ * Test if the data written to the file writer actually gets in the file
+ */
+ @Test
+ public void testActualWrite() throws Exception {
+ final String testMessage = "Test message";
+
+ final File temporaryFile = this.testFolder.newFile();
+ assertTrue(temporaryFile.exists());
+
+ new SimpleFileWriter(temporaryFile.getPath(), writer -> writer.write(testMessage));
+ assertTrue(Files.lines(temporaryFile.toPath()).allMatch(testMessage::equals));
+ }
+
+ /**
+ * Verify if an {@link IOException} during the write ripples through
+ */
+ @Test(expected = IOException.class)
+ public void testIOException() throws Exception {
+ final File temporaryFile = this.testFolder.newFile();
+ new SimpleFileWriter(temporaryFile.getPath(), writer -> {
+ throw new IOException("");
+ });
+ }
+
+}
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);
+ }
+
+}
diff --git a/flux/pom.xml b/flux/pom.xml
index 3b06d299c..7b0afd626 100644
--- a/flux/pom.xml
+++ b/flux/pom.xml
@@ -14,5 +14,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
diff --git a/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java b/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java
new file mode 100644
index 000000000..7781c1d90
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java
@@ -0,0 +1,24 @@
+package com.iluwatar.flux.action;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Date: 12/12/15 - 10:11 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class ContentTest {
+
+ @Test
+ public void testToString() throws Exception {
+ for (final Content content : Content.values()) {
+ final String toString = content.toString();
+ assertNotNull(toString);
+ assertFalse(toString.trim().isEmpty());
+ }
+ }
+
+}
diff --git a/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java b/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java
new file mode 100644
index 000000000..02fa781e6
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java
@@ -0,0 +1,24 @@
+package com.iluwatar.flux.action;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Date: 12/12/15 - 10:15 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class MenuItemTest {
+
+ @Test
+ public void testToString() throws Exception {
+ for (final MenuItem menuItem : MenuItem.values()) {
+ final String toString = menuItem.toString();
+ assertNotNull(toString);
+ assertFalse(toString.trim().isEmpty());
+ }
+ }
+
+}
diff --git a/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java b/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java
new file mode 100644
index 000000000..8e1977dd8
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java
@@ -0,0 +1,92 @@
+package com.iluwatar.flux.dispatcher;
+
+import com.iluwatar.flux.action.Action;
+import com.iluwatar.flux.action.ActionType;
+import com.iluwatar.flux.action.Content;
+import com.iluwatar.flux.action.ContentAction;
+import com.iluwatar.flux.action.MenuAction;
+import com.iluwatar.flux.action.MenuItem;
+import com.iluwatar.flux.store.Store;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+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 - 8:22 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class DispatcherTest {
+
+ /**
+ * Dispatcher is a singleton with no way to reset it's internal state back to the beginning.
+ * Replace the instance with a fresh one before each test to make sure test cases have no
+ * influence on each other.
+ */
+ @Before
+ public void setUp() throws Exception {
+ final Constructor constructor;
+ constructor = Dispatcher.class.getDeclaredConstructor();
+ constructor.setAccessible(true);
+
+ final Field field = Dispatcher.class.getDeclaredField("instance");
+ field.setAccessible(true);
+ field.set(Dispatcher.getInstance(), constructor.newInstance());
+ }
+
+ @Test
+ public void testGetInstance() throws Exception {
+ assertNotNull(Dispatcher.getInstance());
+ assertSame(Dispatcher.getInstance(), Dispatcher.getInstance());
+ }
+
+ @Test
+ public void testMenuItemSelected() throws Exception {
+ final Dispatcher dispatcher = Dispatcher.getInstance();
+
+ final Store store = mock(Store.class);
+ dispatcher.registerStore(store);
+ dispatcher.menuItemSelected(MenuItem.HOME);
+ dispatcher.menuItemSelected(MenuItem.COMPANY);
+
+ // We expect 4 events, 2 menu selections and 2 content change actions
+ final ArgumentCaptor actionCaptor = ArgumentCaptor.forClass(Action.class);
+ verify(store, times(4)).onAction(actionCaptor.capture());
+ verifyNoMoreInteractions(store);
+
+ final List actions = actionCaptor.getAllValues();
+ final List menuActions = actions.stream()
+ .filter(a -> a.getType().equals(ActionType.MENU_ITEM_SELECTED))
+ .map(a -> (MenuAction) a)
+ .collect(Collectors.toList());
+
+ final List contentActions = actions.stream()
+ .filter(a -> a.getType().equals(ActionType.CONTENT_CHANGED))
+ .map(a -> (ContentAction) a)
+ .collect(Collectors.toList());
+
+ assertEquals(2, menuActions.size());
+ assertEquals(1, menuActions.stream().map(MenuAction::getMenuItem).filter(MenuItem.HOME::equals).count());
+ assertEquals(1, menuActions.stream().map(MenuAction::getMenuItem).filter(MenuItem.COMPANY::equals).count());
+
+ assertEquals(2, contentActions.size());
+ assertEquals(1, contentActions.stream().map(ContentAction::getContent).filter(Content.PRODUCTS::equals).count());
+ assertEquals(1, contentActions.stream().map(ContentAction::getContent).filter(Content.COMPANY::equals).count());
+
+ }
+
+}
diff --git a/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java b/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java
new file mode 100644
index 000000000..7c9ce0a69
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java
@@ -0,0 +1,47 @@
+package com.iluwatar.flux.store;
+
+import com.iluwatar.flux.action.Content;
+import com.iluwatar.flux.action.ContentAction;
+import com.iluwatar.flux.action.MenuAction;
+import com.iluwatar.flux.action.MenuItem;
+import com.iluwatar.flux.view.View;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/12/15 - 10:18 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class ContentStoreTest {
+
+ @Test
+ public void testOnAction() throws Exception {
+ final ContentStore contentStore = new ContentStore();
+
+ final View view = mock(View.class);
+ contentStore.registerView(view);
+
+ verifyZeroInteractions(view);
+
+ // Content should not react on menu action ...
+ contentStore.onAction(new MenuAction(MenuItem.PRODUCTS));
+ verifyZeroInteractions(view);
+
+ // ... but it should react on a content action
+ contentStore.onAction(new ContentAction(Content.COMPANY));
+ verify(view, times(1)).storeChanged(eq(contentStore));
+ verifyNoMoreInteractions(view);
+ assertEquals(Content.COMPANY, contentStore.getContent());
+
+ }
+
+}
diff --git a/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java b/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java
new file mode 100644
index 000000000..2e7f80590
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java
@@ -0,0 +1,47 @@
+package com.iluwatar.flux.store;
+
+import com.iluwatar.flux.action.Content;
+import com.iluwatar.flux.action.ContentAction;
+import com.iluwatar.flux.action.MenuAction;
+import com.iluwatar.flux.action.MenuItem;
+import com.iluwatar.flux.view.View;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/12/15 - 10:18 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class MenuStoreTest {
+
+ @Test
+ public void testOnAction() throws Exception {
+ final MenuStore menuStore = new MenuStore();
+
+ final View view = mock(View.class);
+ menuStore.registerView(view);
+
+ verifyZeroInteractions(view);
+
+ // Menu should not react on content action ...
+ menuStore.onAction(new ContentAction(Content.COMPANY));
+ verifyZeroInteractions(view);
+
+ // ... but it should react on a menu action
+ menuStore.onAction(new MenuAction(MenuItem.PRODUCTS));
+ verify(view, times(1)).storeChanged(eq(menuStore));
+ verifyNoMoreInteractions(view);
+ assertEquals(MenuItem.PRODUCTS, menuStore.getSelected());
+
+ }
+
+}
diff --git a/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java b/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java
new file mode 100644
index 000000000..49cecd24a
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java
@@ -0,0 +1,33 @@
+package com.iluwatar.flux.view;
+
+import com.iluwatar.flux.action.Content;
+import com.iluwatar.flux.store.ContentStore;
+
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+/**
+ * Date: 12/12/15 - 10:31 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class ContentViewTest {
+
+ @Test
+ public void testStoreChanged() throws Exception {
+ final ContentStore store = mock(ContentStore.class);
+ when(store.getContent()).thenReturn(Content.PRODUCTS);
+
+ final ContentView view = new ContentView();
+ view.storeChanged(store);
+
+ verify(store, times(1)).getContent();
+ verifyNoMoreInteractions(store);
+ }
+
+}
diff --git a/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java b/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java
new file mode 100644
index 000000000..2534515b0
--- /dev/null
+++ b/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java
@@ -0,0 +1,50 @@
+package com.iluwatar.flux.view;
+
+import com.iluwatar.flux.action.Action;
+import com.iluwatar.flux.action.MenuItem;
+import com.iluwatar.flux.dispatcher.Dispatcher;
+import com.iluwatar.flux.store.MenuStore;
+import com.iluwatar.flux.store.Store;
+
+import org.junit.Test;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+/**
+ * Date: 12/12/15 - 10:31 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class MenuViewTest {
+
+ @Test
+ public void testStoreChanged() throws Exception {
+ final MenuStore store = mock(MenuStore.class);
+ when(store.getSelected()).thenReturn(MenuItem.HOME);
+
+ final MenuView view = new MenuView();
+ view.storeChanged(store);
+
+ verify(store, times(1)).getSelected();
+ verifyNoMoreInteractions(store);
+ }
+
+ @Test
+ public void testItemClicked() throws Exception {
+ final Store store = mock(Store.class);
+ Dispatcher.getInstance().registerStore(store);
+
+ final MenuView view = new MenuView();
+ view.itemClicked(MenuItem.PRODUCTS);
+
+ // We should receive a menu click action and a content changed action
+ verify(store, times(2)).onAction(any(Action.class));
+
+ }
+
+}
diff --git a/flyweight/src/main/java/com/iluwatar/flyweight/AlchemistShop.java b/flyweight/src/main/java/com/iluwatar/flyweight/AlchemistShop.java
index 15206a84a..a48abbcb0 100644
--- a/flyweight/src/main/java/com/iluwatar/flyweight/AlchemistShop.java
+++ b/flyweight/src/main/java/com/iluwatar/flyweight/AlchemistShop.java
@@ -1,6 +1,7 @@
package com.iluwatar.flyweight;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
/**
@@ -39,6 +40,24 @@ public class AlchemistShop {
bottomShelf.add(factory.createPotion(PotionType.HOLY_WATER));
}
+ /**
+ * Get a read-only list of all the items on the top shelf
+ *
+ * @return The top shelf potions
+ */
+ public final List getTopShelf() {
+ return Collections.unmodifiableList(this.topShelf);
+ }
+
+ /**
+ * Get a read-only list of all the items on the bottom shelf
+ *
+ * @return The bottom shelf potions
+ */
+ public final List getBottomShelf() {
+ return Collections.unmodifiableList(this.bottomShelf);
+ }
+
public void enumerate() {
System.out.println("Enumerating top shelf potions\n");
diff --git a/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java b/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java
new file mode 100644
index 000000000..d99a98cf9
--- /dev/null
+++ b/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java
@@ -0,0 +1,40 @@
+package com.iluwatar.flyweight;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Date: 12/12/15 - 10:54 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class AlchemistShopTest {
+
+ @Test
+ public void testShop() throws Exception {
+ final AlchemistShop shop = new AlchemistShop();
+
+ final List bottomShelf = shop.getBottomShelf();
+ assertNotNull(bottomShelf);
+ assertEquals(5, bottomShelf.size());
+
+ final List topShelf = shop.getTopShelf();
+ assertNotNull(topShelf);
+ assertEquals(8, topShelf.size());
+
+ final List allPotions = new ArrayList<>();
+ allPotions.addAll(topShelf);
+ allPotions.addAll(bottomShelf);
+
+ // There are 13 potion instances, but only 5 unique instance types
+ assertEquals(13, allPotions.size());
+ assertEquals(5, allPotions.stream().map(System::identityHashCode).distinct().count());
+
+ }
+
+}
diff --git a/front-controller/pom.xml b/front-controller/pom.xml
index 33a30c258..91ad6c1ab 100644
--- a/front-controller/pom.xml
+++ b/front-controller/pom.xml
@@ -15,5 +15,10 @@
junit
test
+
+ org.mockito
+ mockito-core
+ test
+
diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java
new file mode 100644
index 000000000..18bdf0d13
--- /dev/null
+++ b/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java
@@ -0,0 +1,20 @@
+package com.iluwatar.front.controller;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Date: 12/13/15 - 1:35 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+public class ApplicationExceptionTest {
+
+ @Test
+ public void testCause() throws Exception {
+ final Exception cause = new Exception();
+ assertSame(cause, new ApplicationException(cause).getCause());
+ }
+
+}
\ No newline at end of file
diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java
new file mode 100644
index 000000000..fa85caa39
--- /dev/null
+++ b/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java
@@ -0,0 +1,62 @@
+package com.iluwatar.front.controller;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+/**
+ * Date: 12/13/15 - 1:39 PM
+ *
+ * @author Jeroen Meulemeester
+ */
+@RunWith(Parameterized.class)
+public class CommandTest extends StdOutTest {
+
+ @Parameters
+ public static List