From f8e4cd1e6cfc1010686b5b8fe2eec8f9b491c57d Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 23 Oct 2020 13:20:22 +0200 Subject: [PATCH] Add IfElse extensions + tests --- .../Activities/ControlFlow/IfElse/IfElse.cs | 17 ++++------ .../IfElse/IfElseBuilderExtensions.cs | 15 +++++++++ .../ControlFlow/IfElse/IfElseExtensions.cs | 14 ++++++++ .../IfElseWorkflowTests.cs | 25 ++++++++++++++ .../Workflows/IfElseWorkflow.cs | 33 +++++++++++++++++++ 5 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseBuilderExtensions.cs create mode 100644 src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseExtensions.cs create mode 100644 test/integration/Elsa.Core.IntegrationTests/IfElseWorkflowTests.cs create mode 100644 test/integration/Elsa.Core.IntegrationTests/Workflows/IfElseWorkflow.cs diff --git a/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElse.cs b/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElse.cs index 4f9c148b9..da31ee18c 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElse.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElse.cs @@ -11,25 +11,20 @@ namespace Elsa.Activities.ControlFlow DisplayName = "If/Else", Category = "Control Flow", Description = "Evaluate a Boolean expression and continue execution depending on the result.", - RuntimeDescription = - "x => !!x.state.expression ? `Evaluate ${ x.state.expression.expression } and continue execution depending on the result.` : x.definition.description", - Outcomes = new[] { OutcomeNames.True, OutcomeNames.False, OutcomeNames.Done } + RuntimeDescription = "x => !!x.state.expression ? `Evaluate ${ x.state.expression.expression } and continue execution depending on the result.` : x.definition.description", + Outcomes = new[] { True, False, OutcomeNames.Done } )] public class IfElse : Activity { - private readonly IExpressionEvaluator _expressionEvaluator; - - public IfElse(IExpressionEvaluator expressionEvaluator) - { - _expressionEvaluator = expressionEvaluator; - } - + public const string True = "True"; + public const string False = "False"; + [ActivityProperty(Hint = "The condition to evaluate.")] public bool Condition { get; set; } protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) { - var outcome = Condition ? OutcomeNames.True : OutcomeNames.False; + var outcome = Condition ? True : False; return Outcomes(OutcomeNames.Done, outcome); } } diff --git a/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseBuilderExtensions.cs b/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseBuilderExtensions.cs new file mode 100644 index 000000000..229bfbb7b --- /dev/null +++ b/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseBuilderExtensions.cs @@ -0,0 +1,15 @@ +using System; +using Elsa.Builders; +using Elsa.Services.Models; + +// ReSharper disable once CheckNamespace +namespace Elsa.Activities.ControlFlow +{ + public static class IfElseBuilderExtensions + { + public static IActivityBuilder IfElse(this IBuilder builder, Action>? setup = default, string? name = default) => builder.Then(setup).WithName(name); + public static IActivityBuilder IfElse(this IBuilder builder, Func condition, string? name = default) => builder.IfElse(activity => activity.Set(x => x.Condition, condition), name); + public static IActivityBuilder IfElse(this IBuilder builder, Func condition, string? name = default) => builder.IfElse(activity => activity.Set(x => x.Condition, condition), name); + public static IActivityBuilder IfElse(this IBuilder builder, bool condition, string? name = default) => builder.IfElse(activity => activity.Set(x => x.Condition, condition), name); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseExtensions.cs b/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseExtensions.cs new file mode 100644 index 000000000..3b801d82d --- /dev/null +++ b/src/core/Elsa.Core/Activities/ControlFlow/IfElse/IfElseExtensions.cs @@ -0,0 +1,14 @@ +using System; +using Elsa.Builders; +using Elsa.Services.Models; + +// ReSharper disable once CheckNamespace +namespace Elsa.Activities.ControlFlow +{ + public static class IfElseExtensions + { + public static ISetupActivity WithCondition(this ISetupActivity activity, Func value) => activity.Set(x => x.Condition, value); + public static ISetupActivity WithCondition(this ISetupActivity activity, Func value) => activity.Set(x => x.Condition, value); + public static ISetupActivity WithCondition(this ISetupActivity activity, bool value) => activity.Set(x => x.Condition, value); + } +} \ No newline at end of file diff --git a/test/integration/Elsa.Core.IntegrationTests/IfElseWorkflowTests.cs b/test/integration/Elsa.Core.IntegrationTests/IfElseWorkflowTests.cs new file mode 100644 index 000000000..e93e2a34e --- /dev/null +++ b/test/integration/Elsa.Core.IntegrationTests/IfElseWorkflowTests.cs @@ -0,0 +1,25 @@ +using System.Linq; +using System.Threading.Tasks; +using Elsa.Core.IntegrationTests.Workflows; +using Elsa.Testing.Shared.Helpers; +using Xunit; +using Xunit.Abstractions; + +namespace Elsa.Core.IntegrationTests +{ + public class IfElseWorkflowTests : WorkflowsUnitTestBase + { + public IfElseWorkflowTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + } + + [Fact(DisplayName = "Runs IfElse twice")] + public async Task Test01() + { + var workflowInstance = await WorkflowRunner.RunWorkflowAsync(); + var iterationLogs = workflowInstance.ExecutionLog.Where(x => x.ActivityId == "IfElse").ToList(); + + Assert.Equal(2, iterationLogs.Count); + } + } +} \ No newline at end of file diff --git a/test/integration/Elsa.Core.IntegrationTests/Workflows/IfElseWorkflow.cs b/test/integration/Elsa.Core.IntegrationTests/Workflows/IfElseWorkflow.cs new file mode 100644 index 000000000..8f1136d24 --- /dev/null +++ b/test/integration/Elsa.Core.IntegrationTests/Workflows/IfElseWorkflow.cs @@ -0,0 +1,33 @@ +using Elsa.Activities.Console; +using Elsa.Activities.ControlFlow; +using Elsa.Builders; + +namespace Elsa.Core.IntegrationTests.Workflows +{ + public class IfElseWorkflow : IWorkflow + { + public void Build(IWorkflowBuilder workflow) + { + workflow + .WriteLine("Start") + .Then( + ifElse => ifElse.WithCondition(context => context.GetVariable("Flag")), + ifElse => + { + ifElse + .When(IfElse.False) + .WriteLine("Flag is false. Setting it to true.") + .SetVariable("Flag", true) + .Then("IfElse"); + + ifElse + .When(IfElse.True) + .WriteLine("Flag is set to true.") + .Then("Done"); + }) + .WithId("IfElse") + .WithName("IfElse") + .Add(writeLine => writeLine.WithText("Done")).WithName("Done"); + } + } +} \ No newline at end of file