diff --git a/pom.xml b/pom.xml index e9e560c..9289e02 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ me.bvn13.fsm fsm - 2.1.7 + 2.1.8 jar diff --git a/src/main/java/me/bvn13/fsm/Fsm.java b/src/main/java/me/bvn13/fsm/Fsm.java index 1253454..39b1a81 100644 --- a/src/main/java/me/bvn13/fsm/Fsm.java +++ b/src/main/java/me/bvn13/fsm/Fsm.java @@ -252,7 +252,6 @@ public class Fsm { throw new NotInitializedException(format("Unable to find state '%s'", name), e); } this.done = currentState.isFinish(); - this.currentState.beforeEvent(); } private void switchToNextState(E event) { diff --git a/src/test/java/me/bvn13/fsm/tests/FsmTest.java b/src/test/java/me/bvn13/fsm/tests/FsmTest.java index f79ff1e..a02e733 100644 --- a/src/test/java/me/bvn13/fsm/tests/FsmTest.java +++ b/src/test/java/me/bvn13/fsm/tests/FsmTest.java @@ -7,6 +7,7 @@ import org.junit.Assert; import org.junit.Test; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; /** * Created by bvn13 on 28.12.2017. @@ -179,7 +180,7 @@ public class FsmTest { Assert.assertFalse(initBefore.get()); Assert.assertFalse(initProcess.get()); Assert.assertFalse(initAfter.get()); - Assert.assertTrue(intermediateBefore.get()); + Assert.assertFalse(intermediateBefore.get()); Assert.assertTrue(intermediateAfter.get()); Assert.assertTrue(intermediateProcess.get()); Assert.assertTrue(finishBefore.get()); @@ -188,4 +189,83 @@ public class FsmTest { } + @Test + public void newSyntaxCountingEveryStep() { + + Counter initCounter = new Counter(); + Counter firstIntermediateCounter = new Counter(); + Counter secondIntermediateCounter = new Counter(); + Counter finishCounter = new Counter(); + + // @formatter:off + + SimpleFsm simpleFsm = Fsm + ., String>from(SimpleFsm::new) + .withStates() + .from("init") + .withBeforeHandler(fsm -> initCounter.before.incrementAndGet()) + .withAfterHandler(fsm -> initCounter.after.incrementAndGet()) + .withProcessor((fsm, event) -> initCounter.process.incrementAndGet()) + .end() + .state("intermediate-1") + .withBeforeHandler(fsm -> firstIntermediateCounter.before.incrementAndGet()) + .withAfterHandler(fsm -> firstIntermediateCounter.after.incrementAndGet()) + .withProcessor((fsm, event) -> firstIntermediateCounter.process.incrementAndGet()) + .end() + .state("intermediate-2") + .withBeforeHandler(fsm -> secondIntermediateCounter.before.incrementAndGet()) + .withAfterHandler(fsm -> secondIntermediateCounter.after.incrementAndGet()) + .withProcessor((fsm, event) -> secondIntermediateCounter.process.incrementAndGet()) + .end() + .finish("finish") + .withBeforeHandler(fsm -> finishCounter.before.incrementAndGet()) + .withAfterHandler(fsm -> finishCounter.after.incrementAndGet()) + .withProcessor((fsm, event) -> finishCounter.process.incrementAndGet()) + .end() + .withTransition() + .from("init") + .to("intermediate-1") + .checking((fsm, event) -> true) + .end() + .withTransition() + .from("intermediate-1") + .to("intermediate-2") + .checking((fsm, event) -> true) + .end() + .withTransition() + .from("intermediate-2") + .to("finish") + .checking((fsm, event) -> true) + .end() + .create() + ; + + // @formatter:on + + simpleFsm.process(""); + simpleFsm.process(""); + simpleFsm.process(""); + + Assert.assertEquals("finish", simpleFsm.getCurrentState().getName()); + Assert.assertEquals(1, initCounter.before.get()); + Assert.assertEquals(1, initCounter.after.get()); + Assert.assertEquals(1, initCounter.process.get()); + Assert.assertEquals(1, firstIntermediateCounter.before.get()); + Assert.assertEquals(1, firstIntermediateCounter.after.get()); + Assert.assertEquals(1, firstIntermediateCounter.process.get()); + Assert.assertEquals(1, secondIntermediateCounter.before.get()); + Assert.assertEquals(1, secondIntermediateCounter.after.get()); + Assert.assertEquals(1, secondIntermediateCounter.process.get()); + Assert.assertEquals(1, finishCounter.before.get()); + Assert.assertEquals(0, finishCounter.after.get()); + Assert.assertEquals(0, finishCounter.process.get()); + + } + + static class Counter { + final AtomicInteger before = new AtomicInteger(0); + final AtomicInteger after = new AtomicInteger(0); + final AtomicInteger process = new AtomicInteger(0); + } + }