From 151ed0747218c97f69f97511f36c3c66f6e89099 Mon Sep 17 00:00:00 2001 From: Vyacheslav Boyko Date: Tue, 12 Jul 2022 23:27:46 +0300 Subject: [PATCH 1/4] Update for next development version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e9e560c..1d6f85f 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ me.bvn13.fsm fsm - 2.1.7 + 2.1.8-SNAPSHOT jar From 8ab3306142317d7bb8e1a7dcb7c902d7549cc78d Mon Sep 17 00:00:00 2001 From: Vyacheslav Boyko Date: Thu, 14 Jul 2022 13:55:19 +0300 Subject: [PATCH 2/4] test to ensure that all state handlers are called only once --- src/test/java/me/bvn13/fsm/tests/FsmTest.java | 86 ++++++++++++++++++- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/src/test/java/me/bvn13/fsm/tests/FsmTest.java b/src/test/java/me/bvn13/fsm/tests/FsmTest.java index f79ff1e..963e62a 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. @@ -148,7 +149,7 @@ public class FsmTest { .withAfterHandler(fsm -> initAfter.set(true)) .withProcessor((fsm, event) -> initProcess.set(true)) .end() - .state("intermediate") + .state("intermediate-1") .withBeforeHandler(fsm -> intermediateBefore.set(true)) .withAfterHandler(fsm -> intermediateAfter.set(true)) .withProcessor((fsm, event) -> intermediateProcess.set(true)) @@ -160,11 +161,11 @@ public class FsmTest { .end() .withTransition() .from("init") - .to("intermediate") + .to("intermediate-1") .checking((fsm, event) -> true) .end() .withTransition() - .from("intermediate") + .from("intermediate-1") .to("finish") .checking((fsm, event) -> true) .end() @@ -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); + } + } From 99babc5b5a31baf795a59ebfa4fd97237622dbf3 Mon Sep 17 00:00:00 2001 From: Vyacheslav Boyko Date: Thu, 14 Jul 2022 13:57:22 +0300 Subject: [PATCH 3/4] if startingAt beforeHandler must not be called --- src/main/java/me/bvn13/fsm/Fsm.java | 1 - src/test/java/me/bvn13/fsm/tests/FsmTest.java | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) 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 963e62a..a02e733 100644 --- a/src/test/java/me/bvn13/fsm/tests/FsmTest.java +++ b/src/test/java/me/bvn13/fsm/tests/FsmTest.java @@ -149,7 +149,7 @@ public class FsmTest { .withAfterHandler(fsm -> initAfter.set(true)) .withProcessor((fsm, event) -> initProcess.set(true)) .end() - .state("intermediate-1") + .state("intermediate") .withBeforeHandler(fsm -> intermediateBefore.set(true)) .withAfterHandler(fsm -> intermediateAfter.set(true)) .withProcessor((fsm, event) -> intermediateProcess.set(true)) @@ -161,11 +161,11 @@ public class FsmTest { .end() .withTransition() .from("init") - .to("intermediate-1") + .to("intermediate") .checking((fsm, event) -> true) .end() .withTransition() - .from("intermediate-1") + .from("intermediate") .to("finish") .checking((fsm, event) -> true) .end() @@ -180,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()); From dd88e919d16c854dff83482da65416a9df46e501 Mon Sep 17 00:00:00 2001 From: Vyacheslav Boyko Date: Thu, 14 Jul 2022 13:58:44 +0300 Subject: [PATCH 4/4] Update versions for release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d6f85f..9289e02 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ me.bvn13.fsm fsm - 2.1.8-SNAPSHOT + 2.1.8 jar