From 9b4252fc3709cb02776e5a0b71ed1c4f235c8f26 Mon Sep 17 00:00:00 2001 From: Wahid Bitar Date: Sun, 15 Aug 2021 19:29:39 +0300 Subject: [PATCH 1/2] There is no need to throw an exception when trying to get the Permitted Triggers. If it's not valid just don't return it. --- src/Stateless/StateRepresentation.cs | 19 +++++++--- test/Stateless.Tests/Trigger.cs | 11 ++++++ .../TriggerWithParametersFixture.cs | 35 +++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/Stateless/StateRepresentation.cs b/src/Stateless/StateRepresentation.cs index c08f797f..4751ccb2 100644 --- a/src/Stateless/StateRepresentation.cs +++ b/src/Stateless/StateRepresentation.cs @@ -318,12 +318,23 @@ public IEnumerable PermittedTriggers public IEnumerable GetPermittedTriggers(params object[] args) { - var result = TriggerBehaviours - .Where(t => t.Value.Any(a => !a.UnmetGuardConditions(args).Any())) - .Select(t => t.Key); + var result = new HashSet(); + foreach (var triggerBehaviour in TriggerBehaviours) + { + try + { + if (triggerBehaviour.Value.Any(a => !a.UnmetGuardConditions(args).Any())) + result.Add(triggerBehaviour.Key); + } + catch (Exception) + { + //Ignore + //There is no need to throw an exception when trying to get the Permitted Triggers. If it's not valid just don't return it. + } + } if (Superstate != null) - result = result.Union(Superstate.GetPermittedTriggers(args)); + result.UnionWith(Superstate.GetPermittedTriggers(args)); return result; } diff --git a/test/Stateless.Tests/Trigger.cs b/test/Stateless.Tests/Trigger.cs index 2fa9959b..11b663e3 100644 --- a/test/Stateless.Tests/Trigger.cs +++ b/test/Stateless.Tests/Trigger.cs @@ -4,4 +4,15 @@ enum Trigger { X, Y, Z } + class FirstFakeTrigger + { + public bool IsAllowed { get; set; } + } + + + + class SecondFakeTrigger + { + public bool IsOk { get; set; } + } } diff --git a/test/Stateless.Tests/TriggerWithParametersFixture.cs b/test/Stateless.Tests/TriggerWithParametersFixture.cs index 3c2890f2..89a9171f 100644 --- a/test/Stateless.Tests/TriggerWithParametersFixture.cs +++ b/test/Stateless.Tests/TriggerWithParametersFixture.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Xunit; namespace Stateless.Tests @@ -73,5 +74,39 @@ public void ParameterListOfCorrectTypeAreAccepted() var twp = new StateMachine.TriggerWithParameters(Trigger.X, new Type[] { typeof(int), typeof(string) }); twp.ValidateParameters(new object[] { 123, "arg" }); } + + [Fact] + public void GetPermittedTriggersShouldAcceptStronglyTypedTriggersWithConditionalGuardsConfigurations() + { + var stateMachine = new StateMachine(State.A); + var firstTrigger = new StateMachine.TriggerWithParameters(Trigger.X); + var secondTrigger = new StateMachine.TriggerWithParameters(Trigger.Y); + + stateMachine.Configure(State.A) + .PermitIf(firstTrigger, State.B, trigger => trigger.IsAllowed) + .PermitIf(secondTrigger, State.C, trigger => trigger.IsOk); + + var fakeTriggers = new List() + { + new FirstFakeTrigger + { + IsAllowed = true + }, + new SecondFakeTrigger + { + IsOk = false + }, + }; + + var availableTriggers = new List(); + foreach (var fakeTrigger in fakeTriggers) + { + var temp = stateMachine.GetPermittedTriggers(fakeTrigger); + availableTriggers.AddRange(temp); + } + + Assert.Contains(Trigger.X, availableTriggers); + Assert.DoesNotContain(Trigger.Y, availableTriggers); + } } } From e4e3c5b1dbc5e6be69acebb5ecea62c470cee641 Mon Sep 17 00:00:00 2001 From: Wahid Bitar Date: Wed, 12 Apr 2023 14:57:55 +0300 Subject: [PATCH 2/2] fix conflicts after update the origin package --- test/Stateless.Tests/TriggerWithParametersFixture.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Stateless.Tests/TriggerWithParametersFixture.cs b/test/Stateless.Tests/TriggerWithParametersFixture.cs index 4cf41d7b..66e75182 100644 --- a/test/Stateless.Tests/TriggerWithParametersFixture.cs +++ b/test/Stateless.Tests/TriggerWithParametersFixture.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using Xunit; namespace Stateless.Tests