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