diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java index a7adcecf..f593eb9b 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java @@ -34,6 +34,7 @@ import org.springframework.statemachine.ObjectStateMachine; import org.springframework.statemachine.StateMachineSystemConstants; import org.springframework.statemachine.config.EnableStateMachine; import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; +import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; @@ -120,6 +121,18 @@ public class EndStateTests extends AbstractStateMachineTests { assertThat(machine.getState().getIds(), contains(TestStates.S1, TestStates.SF)); } + @Test + public void testMultipleTransitionsToSameEndState() { + context.register(Config5.class); + context.refresh(); + } + + @Test + public void testMultipleTransitionsToSameEndStateFromChoices() { + context.register(Config6.class); + context.refresh(); + } + @Configuration @EnableStateMachine static class Config1 extends EnumStateMachineConfigurerAdapter { @@ -347,4 +360,80 @@ public class EndStateTests extends AbstractStateMachineTests { return new SyncTaskExecutor(); } } + + @Configuration + @EnableStateMachine + static class Config5 extends EnumStateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineStateConfigurer states) throws Exception { + states + .withStates() + .initial(TestStates.SI) + .state(TestStates.S1) + .state(TestStates.S2) + .end(TestStates.SF); + } + + @Override + public void configure(StateMachineTransitionConfigurer transitions) throws Exception { + transitions + .withExternal() + .source(TestStates.SI) + .target(TestStates.S1) + .event(TestEvents.E1) + .and() + .withExternal() + .source(TestStates.SI) + .target(TestStates.S2) + .event(TestEvents.E2) + .and() + .withExternal() + .source(TestStates.S1) + .target(TestStates.SF) + .event(TestEvents.E3) + .and() + .withExternal() + .source(TestStates.S2) + .target(TestStates.SF) + .event(TestEvents.E3); + } + } + + @Configuration + @EnableStateMachine + static class Config6 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineStateConfigurer states) throws Exception { + states + .withStates() + .initial("SI") + .choice("JOIN1") + .choice("JOIN2") + .end("SF"); + } + + @Override + public void configure(StateMachineTransitionConfigurer transitions) throws Exception { + transitions + .withExternal() + .source("SI") + .target("JOIN1") + .event("E1") + .and() + .withExternal() + .source("SI") + .target("JOIN2") + .event("E2") + .and() + .withChoice() + .source("JOIN1") + .last("SF") + .and() + .withChoice() + .source("JOIN2") + .last("SF"); + } + } } diff --git a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java index 499766ec..d7e3c397 100644 --- a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java +++ b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java @@ -566,6 +566,18 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S1")); } + @Test + public void testSimpleFlatMultipleToEnds() throws Exception { + context.register(Config17.class); + context.refresh(); + } + + @Test + public void testSimpleFlatMultipleToEndsViachoices() throws Exception { + context.register(Config18.class); + context.refresh(); + } + @Configuration @EnableStateMachine public static class Config2 extends StateMachineConfigurerAdapter { @@ -890,6 +902,40 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { } } + @Configuration + @EnableStateMachine + public static class Config17 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineModelConfigurer model) throws Exception { + model + .withModel() + .factory(modelFactory()); + } + + @Bean + public StateMachineModelFactory modelFactory() { + return new UmlStateMachineModelFactory("classpath:org/springframework/statemachine/uml/simple-flat-multiple-to-end.uml"); + } + } + + @Configuration + @EnableStateMachine + public static class Config18 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineModelConfigurer model) throws Exception { + model + .withModel() + .factory(modelFactory()); + } + + @Bean + public StateMachineModelFactory modelFactory() { + return new UmlStateMachineModelFactory("classpath:org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.uml"); + } + } + public static class LatchAction implements Action { CountDownLatch latch = new CountDownLatch(1); @Override diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.notation new file mode 100644 index 00000000..faae926e --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.notation @@ -0,0 +1,160 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.uml new file mode 100644 index 00000000..1357e56a --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end-viachoices.uml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.notation new file mode 100644 index 00000000..bfb1a911 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.notation @@ -0,0 +1,120 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.uml new file mode 100644 index 00000000..71446cc3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-flat-multiple-to-end.uml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + +