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