Skip to content

Commit 99e49a8

Browse files
authored
Merge pull request #544 from hooligan495/bugfix/543_prevent_reentry
In the case of a superstate having a trigger that moves the state to …
2 parents e88e6eb + f9b291b commit 99e49a8

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)