diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListAndArray/Tests.cs b/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListAndArray/Tests.cs deleted file mode 100644 index d1ef1c657..000000000 --- a/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListAndArray/Tests.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Collections.Generic; -using System.Dynamic; -using Elsa.JavaScript.Helpers; -using Jint; -using Jint.Runtime.Interop; -using Xunit; - -namespace Elsa.IntegrationTests.Scenarios.JavaScriptListAndArray; - -/// -/// Contains test cases for the functionality of the Engine class to enable list and array-like objects to be used in JavaScript as arrays. -/// -public class Tests -{ - private readonly Engine _engine; - - public Tests() - { - _engine = new Engine(cfg => cfg - .SetWrapObjectHandler((engine, target, type) => - { - var instance = new ObjectWrapper(engine, target); - - if (ObjectArrayHelper.DetermineIfObjectIsArrayLikeClrCollection(target.GetType())) - instance.Prototype = engine.Intrinsics.Array.PrototypeObject; - - return instance; - }) - ); - } - - [Fact(DisplayName = "Can access list properties as arrays")] - public void Test1() - { - var person = new ExpandoObject(); - - person.TryAdd("name", "John"); - person.TryAdd("age", 12); - - var languages = new List - { - "English", - "French" - }; - - person.TryAdd("languages", languages); - - var obj = new ExpandoObject(); - obj.TryAdd("persons", new List { person }); - _engine.SetValue("o", obj); - - var name = _engine.Evaluate("o.persons.filter(x => x.age == 12)[0].name").ToString(); - var language = _engine.Evaluate("o.persons[0].languages.filter(x => x == 'English')[0]").ToString(); - Assert.Equal("John", name); - Assert.Equal("English", language); - } -} \ No newline at end of file diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs b/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs index 66b705160..0b02ed905 100644 --- a/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs +++ b/test/integration/Elsa.IntegrationTests/Scenarios/JavaScriptListsAndArrays/Tests.cs @@ -6,6 +6,7 @@ using Elsa.Expressions.Models; using Elsa.Extensions; using Elsa.JavaScript.Contracts; using Elsa.Testing.Shared; +using Jint; using Microsoft.Extensions.DependencyInjection; using Xunit; using Xunit.Abstractions; @@ -16,12 +17,14 @@ public class Tests { private readonly IServiceProvider _services; private readonly IJavaScriptEvaluator _evaluator; + private readonly ExpressionExecutionContext _expressionContext; public Tests(ITestOutputHelper testOutputHelper) { var testOutputHelper1 = testOutputHelper ?? throw new ArgumentNullException(nameof(testOutputHelper)); _services = new TestApplicationBuilder(testOutputHelper1).Build(); _evaluator = _services.GetRequiredService(); + _expressionContext = new ExpressionExecutionContext(_services, new MemoryRegister()); } [Fact(DisplayName = "Workflow inputs containing .NET lists on dynamic objects are converted to arrays for use in JavaScript.")] @@ -31,10 +34,40 @@ public class Tests dynamicObject.List = new List { "a", "b", "c" }; var script = "getObj().List.filter(x => x === 'b').length === 1"; - var context = new ExpressionExecutionContext(_services, new MemoryRegister()); - context.SetVariable("obj", (object)dynamicObject); - var result = await _evaluator.EvaluateAsync(script, typeof(bool), context); + _expressionContext.SetVariable("obj", (object)dynamicObject); + var result = await _evaluator.EvaluateAsync(script, typeof(bool), _expressionContext); Assert.True((bool)result!); } + + [Fact(DisplayName = "Can access list properties as arrays")] + public async Task Test2() + { + var person = new ExpandoObject(); + var magicNumbers = new[]{42, 43, 44}; + var order1 = new ExpandoObject(); + + order1.TryAdd("magicNumbers", magicNumbers); + person.TryAdd("orders", new []{ order1 }); + person.TryAdd("name", "John"); + person.TryAdd("age", 12); + + var languages = new List + { + "English", + "French" + }; + + person.TryAdd("languages", languages); + + var obj = new ExpandoObject(); + obj.TryAdd("persons", new List { person }); + + var name = await _evaluator.EvaluateAsync("o.persons.filter(x => x.age == 12)[0].name", typeof(string), _expressionContext, configureEngine: engine => engine.SetValue("o", obj)); + var language = await _evaluator.EvaluateAsync("o.persons[0].languages.filter(x => x == 'English')[0]", typeof(string), _expressionContext, configureEngine: engine => engine.SetValue("o", obj)); + var magicNumber = await _evaluator.EvaluateAsync("o.persons[0].orders[0].magicNumbers[1]", typeof(int), _expressionContext, configureEngine: engine => engine.SetValue("o", obj)); + Assert.Equal("John", name); + Assert.Equal("English", language); + Assert.Equal(43, magicNumber); + } } \ No newline at end of file