Skip to content

Commit f9b291b

Browse files
author
Jay McGaffigan
committed
In the case of a superstate having a trigger that moves the state to a substate, if the machine is already in that substate then the entry action shouldn't trigger again
1 parent dc70a9d commit f9b291b

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/Stateless/StateMachine.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,10 @@ void InternalFireOne(TTrigger trigger, params object[] args)
423423
case DynamicTriggerBehaviour _ when result.Handler.ResultsInTransitionFrom(source, args, out var destination):
424424
case TransitioningTriggerBehaviour _ when result.Handler.ResultsInTransitionFrom(source, args, out destination):
425425
{
426+
//If a trigger was found on a superstate that would cause unintended reentry, don't trigger.
427+
if (source.Equals(destination))
428+
break;
429+
426430
// Handle transition, and set new state
427431
var transition = new Transition(source, destination, trigger, args);
428432
HandleTransitioningTrigger(args, representativeState, transition);

test/Stateless.Tests/StateMachineFixture.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,29 @@ public void WhenInSubstate_TriggerIgnoredInSuperstate_RemainsInSubstate()
108108
Assert.Equal(State.B, sm.State);
109109
}
110110

111+
[Fact]
112+
public void WhenInSubstate_TriggerSuperStateTwiceToSameSubstate_DoesNotReenterSubstate()
113+
{
114+
var sm = new StateMachine<State, Trigger>(State.A);
115+
var eCount = 0;
116+
117+
sm.Configure(State.B)
118+
.OnEntry(() => { eCount++;})
119+
.SubstateOf(State.C);
120+
121+
sm.Configure(State.A)
122+
.SubstateOf(State.C);
123+
124+
125+
sm.Configure(State.C)
126+
.Permit(Trigger.X, State.B);
127+
128+
sm.Fire(Trigger.X);
129+
sm.Fire(Trigger.X);
130+
131+
Assert.Equal(1, eCount);
132+
}
133+
111134
[Fact]
112135
public void PermittedTriggersIncludeSuperstatePermittedTriggers()
113136
{

0 commit comments

Comments
 (0)