From 7beb36703e01dd53cd5b7d4a84ceb5f245b4adc2 Mon Sep 17 00:00:00 2001
From: Nelson Tavares de Sousa <ntd@informatik.uni-kiel.de>
Date: Fri, 27 Mar 2015 13:00:01 +0100
Subject: [PATCH] Merger only sends one signal, depending on its type (Starting
 on first; Terminating on last)

---
 .../teetime/stage/basic/merger/Merger.java    | 21 +++++---
 .../stage/basic/merger/MergerSignalTest.java  | 50 +++++++++++--------
 .../stage/basic/merger/MergerTestingPipe.java |  5 ++
 3 files changed, 50 insertions(+), 26 deletions(-)

diff --git a/src/main/java/teetime/stage/basic/merger/Merger.java b/src/main/java/teetime/stage/basic/merger/Merger.java
index adeb4abb..52ef50be 100644
--- a/src/main/java/teetime/stage/basic/merger/Merger.java
+++ b/src/main/java/teetime/stage/basic/merger/Merger.java
@@ -25,6 +25,7 @@ import teetime.framework.InputPort;
 import teetime.framework.OutputPort;
 import teetime.framework.signal.ISignal;
 import teetime.framework.signal.StartingSignal;
+import teetime.framework.signal.TerminatingSignal;
 
 /**
  *
@@ -88,19 +89,27 @@ public final class Merger<T> extends AbstractStage {
 			if (!set.add(inputPort)) {
 				this.logger.warn("Received more than one signal - " + signal + " - from input port: " + inputPort);
 			}
-
+			if (signalMap.get(signalClass).size() == this.getInputPorts().length && signalClass == TerminatingSignal.class) {
+				signal.trigger(this);
+				sendSignalToOutputPorts(signal);
+				signalMap.remove(signalClass);
+			}
 		} else {
 			Set<InputPort<?>> tempSet = new HashSet<InputPort<?>>();
 			tempSet.add(inputPort);
 			signalMap.put((Class<ISignal>) signalClass, tempSet);
+			if (signalClass == StartingSignal.class) {
+				signal.trigger(this);
+				sendSignalToOutputPorts(signal);
+			}
 		}
 
-		if (signalMap.get(signalClass).size() == this.getInputPorts().length || signalClass == StartingSignal.class) {
-			signal.trigger(this);
-			this.outputPort.sendSignal(signal);
-			signalMap.remove(signalClass);
-		}
+	}
 
+	private void sendSignalToOutputPorts(final ISignal signal) {
+		for (OutputPort<?> outputPort : getOutputPorts()) {
+			outputPort.sendSignal(signal);
+		}
 	}
 
 	public IMergerStrategy getMergerStrategy() {
diff --git a/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java b/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java
index 597cee06..f4deb2bc 100644
--- a/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java
+++ b/src/test/java/teetime/stage/basic/merger/MergerSignalTest.java
@@ -15,7 +15,9 @@
  */
 package teetime.stage.basic.merger;
 
-import org.junit.Assert;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import org.junit.Test;
 
 import teetime.framework.InputPort;
@@ -43,59 +45,67 @@ public class MergerSignalTest {
 	public void testSameSignal() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-
+		assertTrue(testPipe.startSent());
+		testPipe.reset();
 		merger.onSignal(new StartingSignal(), secondPort);
-		Assert.assertTrue(testPipe.startSent());
+		assertFalse(testPipe.startSent());
 	}
 
 	@Test
 	public void testDifferentSignals() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertTrue(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), secondPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertFalse(testPipe.startSent());
 	}
 
 	@Test
 	public void testInterleavedSignals() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertFalse(testPipe.terminateSent());
+		assertTrue(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), secondPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertFalse(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertTrue(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertTrue(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new TerminatingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
-		Assert.assertTrue(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), secondPort);
-		Assert.assertTrue(testPipe.startSent());
-		Assert.assertTrue(testPipe.terminateSent());
+		assertFalse(testPipe.startSent());
+		assertFalse(testPipe.terminateSent());
 	}
 
 	@Test
 	public void testMultipleSignals() {
 		this.beforeSignalTesting();
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertTrue(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertFalse(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), firstPort);
-		Assert.assertFalse(testPipe.startSent());
+		assertFalse(testPipe.startSent());
+		testPipe.reset();
 
 		merger.onSignal(new StartingSignal(), secondPort);
-		Assert.assertTrue(testPipe.startSent());
+		assertFalse(testPipe.startSent());
 	}
 }
diff --git a/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java b/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
index 9b0e3904..9defb451 100644
--- a/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
+++ b/src/test/java/teetime/stage/basic/merger/MergerTestingPipe.java
@@ -46,6 +46,11 @@ public class MergerTestingPipe implements IPipe {
 		return this.terminateSent;
 	}
 
+	public void reset() {
+		this.startSent = false;
+		this.terminateSent = false;
+	}
+
 	@Override
 	public boolean add(final Object element) {
 		return false;
-- 
GitLab