Exemplo n.º 1
0
        public object Any(EvalExpression request)
        {
            if (string.IsNullOrWhiteSpace(request.Expression))
            {
                return(new EvalExpressionResponse());
            }

            var args = new Dictionary <string, object>();

            foreach (String name in Request.QueryString.AllKeys)
            {
                if (name.EqualsIgnoreCase("expression"))
                {
                    continue;
                }

                var argExpr  = Request.QueryString[name];
                var argValue = JS.eval(argExpr);
                args[name] = argValue;
            }

            var scope = JS.CreateScope(args: args);
            var expr  = JS.expression(request.Expression.Trim());

            var response = new EvalExpressionResponse {
                Result = ScriptLanguage.UnwrapValue(expr.Evaluate(scope)),
                Tree   = expr.ToJsAstString(),
            };

            return(response);
        }
        public void Can_Invoke_Arrow_Expressions()
        {
            var context = new TemplateContext().Init();

            var expr = JS.expression("pow(2,2) + pow(4,2)");

            Assert.That(expr.Evaluate(), Is.EqualTo(20));

            Assert.That(JS.eval("pow(2,2) + pow(4,2)"), Is.EqualTo(20));

            var scope = JS.CreateScope(args: new Dictionary <string, object> {
                ["a"] = 2,
                ["b"] = 4,
            });

            Assert.That(JS.eval("pow(a,2) + pow(b,2)", scope), Is.EqualTo(20));

            var customPow = JS.CreateScope(functions: new MyFilters());

            Assert.That(JS.eval("pow(2,2) + pow(4,2)", customPow), Is.EqualTo(3));

            var arrowExpr = (JsArrowFunctionExpression)JS.expression("(a,b) => pow(a,2) + pow(b,2)");

            Assert.That(arrowExpr.Invoke(2, 4), Is.EqualTo(20));

            Assert.That(arrowExpr.Invoke(customPow, 2, 4), Is.EqualTo(3));
        }
Exemplo n.º 3
0
        public void Can_eval_js()
        {
            var scope = JS.CreateScope(
                args: new Dictionary <string, object>
            {
                { "arg", "value" }
            },
                functions: new CustomFilter());

            Assert.That(JS.eval("arg", scope), Is.EqualTo("value"));

            Assert.That(JS.eval("reverse(arg)", scope), Is.EqualTo("eulav"));

            Assert.That(JS.eval("itemsOf(3, padRight(reverse(arg), 8, '_'))", scope), Is.EqualTo(new List <object> {
                "eulav___", "eulav___", "eulav___"
            }));

            Assert.That(JS.eval("{a: itemsOf(3, padRight(reverse(arg), 8, '_')) }", scope), Is.EqualTo(new Dictionary <string, object>
            {
                { "a", new List <object> {
                      "eulav___", "eulav___", "eulav___"
                  } }
            }));

            Assert.That(JS.eval("3.itemsOf(arg.reverse().padRight(8, '_'))", scope), Is.EqualTo(new List <object> {
                "eulav___", "eulav___", "eulav___"
            }));
        }
Exemplo n.º 4
0
        public void Can_customize_and_evaluate_custom_AST_expressions()
        {
            JsToken expr;

            var expected = new JsLogicalExpression(
                new JsBinaryExpression(new JsIdentifier("a"), JsGreaterThan.Operator, new JsLiteral(1)),
                JsAnd.Operator,
                new JsBinaryExpression(new JsIdentifier("b"), JsLessThan.Operator, new JsLiteral(2))
                );

            expr = JS.expression("a > 1 && b < 2");
            Assert.That(expr, Is.EqualTo(expected));
            Assert.That(expr.Equals(expected));

            Assert.That(new JsLogicalExpression(
                            JS.expression("a > 1"),
                            JsAnd.Operator,
                            JS.expression("b < 2")),
                        Is.EqualTo(expected));

            Assert.That((bool)expr.Evaluate(JS.CreateScope(args: new Dictionary <string, object> {
                ["a"] = 2,
                ["b"] = 1
            })));

            Assert.That((bool)expr.Evaluate(JS.CreateScope(args: new Dictionary <string, object> {
                ["a"] = 1,
                ["b"] = 2
            })), Is.False);
        }
        public void Can_Invoke_Arrow_Expressions()
        {
            var context = new TemplateContext().Init();

            "(a,b) => pow(a,2) + pow(b,2)".ParseJsExpression(out var token);
            var arrowExpr = (JsArrowFunctionExpression)token;

            Assert.That(arrowExpr.Invoke(2, 4), Is.EqualTo(20));

            Assert.That(arrowExpr.Invoke(JS.CreateScope(functions: new MyFilter()), 2, 4), Is.EqualTo(3));
        }
Exemplo n.º 6
0
 /// <summary>
 /// Invokes the specified parameters.
 /// </summary>
 /// <param name="params">The parameters.</param>
 /// <returns>System.Object.</returns>
 public object Invoke(params object[] @params) => Invoke(JS.CreateScope(), @params);
Exemplo n.º 7
0
 /// <summary>
 /// Parses the specified json.
 /// </summary>
 /// <param name="json">The json.</param>
 /// <returns>System.Object.</returns>
 public static object parse(string json)
 {
     json.AsSpan().ParseJsToken(out var token);
     return(token?.Evaluate(JS.CreateScope()));
 }