Exemple #1
0
        public void ParseInteger()
        {
            var parser = new Core.Parser();

            var constantExpression = parser.Parse("100") as ConstantExpression;

            Assert.NotNull(constantExpression);
            Assert.Equal("100", constantExpression.Raw);
            Assert.Equal(100, constantExpression.Value);

            constantExpression = parser.Parse("12312381") as ConstantExpression;
            Assert.NotNull(constantExpression);
            Assert.Equal("12312381", constantExpression.Raw);
            Assert.Equal(12312381, constantExpression.Value);

            constantExpression = parser.Parse("956869218") as ConstantExpression;
            Assert.NotNull(constantExpression);
            Assert.Equal("956869218", constantExpression.Raw);
            Assert.Equal(956869218, constantExpression.Value);

            var option = ParseOption.CreateOption()
                         .NotAllowedConvertUnsignedInteger()
                         .AsReadOnly();

            constantExpression = parser.Parse("956869218", option) as ConstantExpression;
            Assert.NotNull(constantExpression);
            Assert.Equal("956869218", constantExpression.Raw);
            Assert.NotEqual(956869218, constantExpression.Value);
            Assert.Equal(956869218UL, constantExpression.Value);
        }
Exemple #2
0
        public void TestCustomUnaryOperator()
        {
            var parser   = new Core.Parser();
            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AddUnaryOperator("@", s => s != null)
                           .AddUnaryOperator("not", s => s != null).AsReadOnly();

            foreach (var item in new[] { "1", "2.0", "true", "'aa'", "compiler" })
            {
                Assert.Equal(false, compiler.Compile($"!{item}".ToEvaluableExpression(option)).Evaluate(null));
            }
            foreach (var item in new[] { "0", "-2.0", "false", "''", "null" })
            {
                Assert.Equal(true, compiler.Compile($"!{item}".ToEvaluableExpression(option)).Evaluate(null));
            }
            var array = new object[] { 'a', (sbyte)1, (byte)2, (ushort)3, (short)5, 66, (uint)4, 88L, (ulong)222, 6.0f, 7.0222d, 8.7232718m };

            for (var i = 0; i < array.Length; i++)
            {
                var expr = $"!this[{i}]";
                Assert.Equal(false, compiler.Compile(expr.ToEvaluableExpression()).Evaluate(array));
                Assert.Equal(true, $"@this[{i}]".Compile(option).Evaluate(array));
                Assert.Equal(true, $"not(this[{i}])".Compile(option).Evaluate(array));
            }
            array = new object[] { char.MinValue, sbyte.MinValue, (byte)0, (ushort)0, (short)-5, -66, (uint)0, long.MinValue, (ulong)0, -6.0f, -7.0222d, -8.7232718m };
            for (var i = 0; i < array.Length; i++)
            {
                var expr = $"!this[{i}]";
                Assert.Equal(true, expr.Compile(parser, compiler).Evaluate(array));
            }
        }
Exemple #3
0
        public void ParseNakedFunction()
        {
            var option = ParseOption.CreateOption()
                         .AddNakedFunction("abc", args => "abc")
                         .AddNakedFunction("hash", args => args.GetHashCode())
                         .AsReadOnly();

            var parser = new Core.Parser();

            var callExpression = parser.Parse("abc(1)", option) as NakedFunctionCallExpression;

            Assert.NotNull(callExpression);
            Assert.Equal("abc", callExpression.NakedFunction.Name);

            callExpression = parser.Parse("max(1,2,3)", option) as NakedFunctionCallExpression;
            Assert.NotNull(callExpression);
            Assert.Equal("max", callExpression.NakedFunction.Name);

            callExpression = parser.Parse("abc(hash(1,2,3))", option) as NakedFunctionCallExpression;
            Assert.NotNull(callExpression);
            Assert.Equal("abc", callExpression.NakedFunction.Name);
            callExpression = callExpression.Arguments[0] as NakedFunctionCallExpression;
            Assert.NotNull(callExpression);
            Assert.Equal("hash", callExpression.NakedFunction.Name);
        }
Exemple #4
0
        public void CompileLiteral()
        {
            var array  = new object[] { 'a', (sbyte)-1, (byte)2, (ushort)3, (short)-3, -4, (uint)4, -5L, (ulong)5, 6.0f, 7.0222d, 8.7232718m };
            var option = ParseOption.CreateOption()
                         .AddLiteralValue("array", array)
                         .AddLiteralValue("abc", -90.44m)
                         .AsReadOnly();

            Assert.Equal(array.Length, "len(array)".Compile(option).Evaluate(null));
            Assert.Equal(array.Length, "array.Length".Compile(option).Evaluate(null));
            Assert.Equal(97m, "max(array)".Compile(option).Evaluate(null));
            Assert.Equal(-5m, "min(array)".Compile(option).Evaluate(null));
            Assert.Equal(119.7454718m, "sum(array)".Compile(option).Evaluate(null));
            Assert.Equal(-90.44m, "abc".Compile(option).Evaluate(null));
            Assert.Null("null".Compile().Evaluate(null));
            Assert.Null("null".Compile().Evaluate(12));
            Assert.Null("null".Compile().EvaluateAs <object>());
            Assert.Null("null".Compile().EvaluateAsType(typeof(object)));
            Assert.True("true".Compile().EvaluateAs <bool>());
            Assert.False("false".Compile().EvaluateAs <bool>());


            option = ParseOption.CreateOption()
                     .AddLiteralValue("longValue1", 2147483649L)
                     .AddLiteralValue("longValue2", 2147483641L)
                     .AsReadOnly();
            Assert.Equal(2147483649L, "longValue1".Compile(option).EvaluateAs <long>());
            Assert.Equal(2147483641, "longValue2".Compile(option).EvaluateAs <int>());
            Assert.Equal(2147483647, "2147483647".Compile().EvaluateAs <int>());
            Assert.Equal(2147483646, "2147483646".Compile().EvaluateAs <int>());
            Assert.Equal(4294967295, "4294967295".Compile().EvaluateAs <uint>());
            Assert.Equal(4294967294, "4294967294".Compile().EvaluateAs <uint>());
        }
Exemple #5
0
        public void CompileInExpression()
        {
            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <ArgumentNullException>(() => compiler.Compile(null));

            var evaluator = "1 in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);

            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "2.0222 in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);
            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "true in (1, 2.0222 ,true, 'das', false, null, compiler)".Compile(option);
            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "'das' in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);
            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "false in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);
            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "null in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);
            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "compiler in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);
            Assert.Equal(true, evaluator.Evaluate(null));

            evaluator = "99 in (1, 2.0222 ,true,'das', false, null, compiler)".Compile(option);
            Assert.Equal(false, evaluator.Evaluate(null));
        }
Exemple #6
0
        public void CompileObjectMemberExpression()
        {
            var fixture = new Fixture()
            {
                x = 12,
                y = "aaa",
                a = "x",
                c = () => "string"
            };

            Assert.Equal(fixture.a, "this.a".Compile().EvaluateAs <string>(fixture));
            Assert.Equal(fixture.a, "this[thisIsA]".Compile(ParseOption.CreateOption()
                                                            .AddLiteralValue("thisIsA", "a")
                                                            .AsReadOnly()
                                                            ).EvaluateAs <string>(fixture));
            Assert.Equal("aa", "this.a()".Compile().EvaluateAs <string>(new Fixture {
                a = new Func <string>(() => "aa")
            }));
            Assert.Equal("aa", "this.D()".Compile().EvaluateAs <string>(new Fixture {
                D = new Func <string>(() => "aa")
            }));
            Assert.Equal("12122", "this.D".Compile().EvaluateAs <string>(new Fixture {
                D = "12122"
            }));
            Assert.Equal(fixture.ToString(), "this.ToString()".Compile().EvaluateAs <string>(fixture));
            Assert.Equal(fixture.c(), "this.c()".Compile().EvaluateAs <string>(fixture));
            Assert.Equal(fixture.ToString(), "this.ToString()".Compile().EvaluateAsType(fixture, typeof(string)));
            Assert.Throws <ParseException>(() => "ToString()".Compile().Evaluate(fixture));
            Assert.Equal(3, "this.lengthOf('abc')".Compile().Evaluate(new { lengthOf = new Func <string, int>(s => s.Length) }));
            Assert.Equal(fixture.GetString("abc"), "this.GetString('abc')".Compile().Evaluate(fixture));
            Assert.Equal(fixture.Add(12), "this.Add(12)".Compile().Evaluate(fixture));
            Assert.Equal(fixture.Add(12), "a.Add(12)".Compile().Evaluate(new { a = fixture }));
            Assert.Equal("1111", "this.f[0]()".Compile().Evaluate(new { f = new object[] { new Func <string>(() => "1111") } }));
            Assert.Equal(6, "('abc'+d).Length".Compile().Evaluate(new { d = "efg" }));
        }
Exemple #7
0
        public void TestPositive()
        {
            var compiler = Core.Compiler.Default;

            Assert.Equal(12, compiler.Compile("+12".ToEvaluableExpression()).Evaluate(null));
            Assert.Equal(12.8m, compiler.Compile("+12.8".ToEvaluableExpression()).Evaluate(null));

            var option = ParseOption.CreateOption()
                         .AddLiteralValue("compiler", compiler)
                         .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => compiler.Compile("+compiler".ToEvaluableExpression(option)).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => compiler.Compile("+'aa'".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => compiler.Compile("+true".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => compiler.Compile("+null".ToEvaluableExpression()).Evaluate(null));

            var array = new object[] { 'a', (sbyte)-1, (byte)2, (ushort)3, (short)-3, -4, (uint)4, -5L, (ulong)222, 6.0f, 7.0222d, 8.7232718m };

            for (var i = 0; i < array.Length; i++)
            {
                var value = array[i];
                var expr  = $"+this[{i}]";
                Assert.Equal(value, compiler.Compile(expr.ToEvaluableExpression()).Evaluate(array));
            }
        }
Exemple #8
0
        public void TestNegative()
        {
            Assert.Equal(-12, "-12".Compile().Evaluate(null));
            Assert.Equal(-12.8m, "-12.8".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "-compiler".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "-'aa'".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "-true".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "-null".Compile().Evaluate(null));

            var array = new object[] { 'a', (sbyte)-1, (byte)2, (ushort)3, (short)-3, -4, (uint)4, -5L, 6.0f, 7.0222d, 8.7232718m };

            Assert.Equal(-97, compiler.Compile("-this[0]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(1, compiler.Compile("-this[1]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(-2, compiler.Compile("-this[2]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(-3, compiler.Compile("-this[3]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(3, compiler.Compile("-this[4]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(4, compiler.Compile("-this[5]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(-4L, compiler.Compile("-this[6]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(5L, compiler.Compile("-this[7]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(-6.0f, compiler.Compile("-this[8]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(-7.0222d, compiler.Compile("-this[9]".ToEvaluableExpression()).Evaluate(array));
            Assert.Equal(-8.7232718m, compiler.Compile("-this[10]".ToEvaluableExpression()).Evaluate(array));
            Assert.Throws <UnsupportedOperationException>(() => compiler.Compile("-a".ToEvaluableExpression()).Evaluate(new { a = (ulong)222 }));
        }
Exemple #9
0
        public void CompileCustomFunction()
        {
            var option = ParseOption.CreateOption()
                         .AddNakedFunction("tell_me_the_cat_name", s => "tom", true)
                         .AddNakedFunction("tell_me_the_mouse_name", s => "jerry", true)
                         .AddBinaryOperator("and", (a, b) => $"{a} and {b}", 10)
                         .AddNakedFunction("answer_for_question", s => (s[0] as string).Replace("吗", "").Replace("?", "!"))
                         .AddBinaryOperator("is", (a, b) => string.Equals(a as string, b as string), 10)
                         .AddLiteralValue("cat", "cat")
                         .AddLiteralValue("mouse", "mouse")
                         .AddNakedFunction("tell_me_the_name_of", s =>
            {
                switch (s[0])
                {
                case "cat":
                    return("tom");

                case "mouse":
                    return("jerry");

                default:
                    return("i don't know");
                }
            }, true)
                         .AsReadOnly();

            Assert.Equal("tom and jerry", "tell_me_the_cat_name() and tell_me_the_mouse_name()".Compile(option).EvaluateAs <string>());
            Assert.Equal("tom and jerry", "tell_me_the_name_of(cat) and tell_me_the_name_of(mouse)".Compile(option).EvaluateAs <string>());
            Assert.True("answer_for_question('在吗?') is '在!'".Compile(option).EvaluateAs <bool>());
            Assert.True("answer_for_question('你好') is '你好'".Compile(option).EvaluateAs <bool>());
            Assert.True("answer_for_question('能听懂汉语吗?') is '能听懂汉语!'".Compile(option).EvaluateAs <bool>());
            Assert.True("answer_for_question('真的吗?') is '真的!'".Compile(option).EvaluateAs <bool>());
        }
Exemple #10
0
        public void TestLess()
        {
            Assert.Equal(true, "11<12".Compile().Evaluate(null));
            Assert.Equal(true, "11.7<12".Compile().Evaluate(null));
            Assert.Equal(true, "12.7<13".Compile().Evaluate(null));
            Assert.Equal(true, "12.7<13.1".Compile().Evaluate(null));

            Assert.Equal(false, "12<12".Compile().Evaluate(null));
            Assert.Equal(false, "12<12.0".Compile().Evaluate(null));
            Assert.Equal(false, "12.0<12".Compile().Evaluate(null));
            Assert.Equal(false, "12.7<12.7".Compile().Evaluate(null));

            Assert.Equal(false, "12<11".Compile().Evaluate(null));
            Assert.Equal(false, "12<11.0".Compile().Evaluate(null));
            Assert.Equal(false, "12.7<11".Compile().Evaluate(null));
            Assert.Equal(false, "12.7<11.7".Compile().Evaluate(null));


            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler<134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'aa'<34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "true<34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null<34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34<null".Compile().Evaluate(null));
        }
Exemple #11
0
        public void TestGreaterEqual()
        {
            Assert.Equal(true, "12>=11".Compile().Evaluate(null));
            Assert.Equal(true, "12>=11.7".Compile().Evaluate(null));
            Assert.Equal(true, "12.7>=11".Compile().Evaluate(null));
            Assert.Equal(true, "12.7>=11.1".Compile().Evaluate(null));


            Assert.Equal(true, "12>=12".Compile().Evaluate(null));
            Assert.Equal(true, "12>=12.0".Compile().Evaluate(null));
            Assert.Equal(true, "12.0>=12".Compile().Evaluate(null));
            Assert.Equal(true, "12.7>=12.7".Compile().Evaluate(null));

            Assert.Equal(false, "11>=12".Compile().Evaluate(null));
            Assert.Equal(false, "11.7>=12".Compile().Evaluate(null));
            Assert.Equal(false, "12.7>=13".Compile().Evaluate(null));
            Assert.Equal(false, "12.7>=13.1".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler>=134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'aa'>=34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "true>=34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null>=34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34>=null".Compile().Evaluate(null));
        }
Exemple #12
0
        public void CompileArray()
        {
            var compiler = Core.Compiler.Default;

            Assert.Throws <ArgumentNullException>(() => compiler.Compile(null));

            var option = ParseOption.CreateOption()
                         .AddLiteralValue("compiler", compiler)
                         .AsReadOnly();

            var evaluator = "[1, 2.0222, -9.7777, true,'das', false, null, compiler]".Compile(option);
            var array     = (object[])evaluator.Evaluate(null);

            Assert.Equal(8, array.Length);
            Assert.Equal(1, array[0]);
            Assert.Equal(2.0222m, array[1]);
            Assert.Equal(-9.7777m, array[2]);
            Assert.Equal(true, array[3]);
            Assert.Equal("das", array[4]);
            Assert.Equal(false, array[5]);
            Assert.Null(array[6]);
            Assert.Equal(compiler, array[7]);

            Assert.Equal(2, "this[1]".Compile().EvaluateAs <int>(new object[] { 1, 2, 3 }));
        }
Exemple #13
0
        public void TestNotEqual()
        {
            Assert.Equal(true, "11!=12".Compile().Evaluate(null));
            Assert.Equal(true, "11.7!=12".Compile().Evaluate(null));
            Assert.Equal(true, "12.7!=113".Compile().Evaluate(null));
            Assert.Equal(true, "12.7!=13.1".Compile().Evaluate(null));
            Assert.Equal(true, "true!=false".Compile().Evaluate(null));
            Assert.Equal(true, "'aa'!='ab'".Compile().Evaluate(null));
            Assert.Equal(true, "'aa'!='Ab'".Compile().Evaluate(null));

            Assert.Equal(false, "null!=null".Compile().Evaluate(null));
            Assert.Equal(false, "12!=12".Compile().Evaluate(null));
            Assert.Equal(false, "12!=12.0".Compile().Evaluate(null));
            Assert.Equal(false, "12.0!=12".Compile().Evaluate(null));
            Assert.Equal(false, "12.7!=12.7".Compile().Evaluate(null));
            Assert.Equal(false, "true!=true".Compile().Evaluate(null));
            Assert.Equal(false, "'aa'!='aa'".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler!=134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'aa'!=134".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "true!=134".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null!=134".Compile().Evaluate(null));
        }
Exemple #14
0
        public void ParseLiterals()
        {
            var parser = new Core.Parser();

            var literalExpression = parser.Parse("true") as LiteralExpression;

            Assert.NotNull(literalExpression);
            Assert.True((bool)literalExpression.LiteralValue.Value);

            literalExpression = parser.Parse("false") as LiteralExpression;
            Assert.NotNull(literalExpression);
            Assert.False((bool)literalExpression.LiteralValue.Value);

            literalExpression = parser.Parse("null") as LiteralExpression;
            Assert.NotNull(literalExpression);
            Assert.Null(literalExpression.LiteralValue.Value);

            var option = ParseOption.CreateOption()
                         .AddLiteralValue("longValue1", 2147483649L)
                         .AddLiteralValue("longValue2", 2147483641L)
                         .AsReadOnly();

            literalExpression = parser.Parse("longValue1", option) as LiteralExpression;
            Assert.NotNull(literalExpression);
            Assert.Equal(2147483649L, literalExpression.LiteralValue.Value);

            literalExpression = parser.Parse("longValue2", option) as LiteralExpression;
            Assert.NotNull(literalExpression);
            Assert.Equal(2147483641L, literalExpression.LiteralValue.Value);
        }
Exemple #15
0
        public void CompileTrick()
        {
            var compiler = Core.Compiler.Default;

            Assert.Equal(4, "('ab'+'cd').Length".ToEvaluableExpression().Compile().Evaluate(null));
            Assert.Equal(4, "('ab'+'cd').Length".ToEvaluableExpression().Compile(compiler).Evaluate(null));

            Assert.Equal(4, "this[v]['Length']".Compile(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", "y")
                             .AsReadOnly()
                             ).Evaluate(new Fixture {
                y = "abcd"
            }));
            Assert.Equal(4, "this[v]['Len'+'gth']".Compile(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", "y")
                             .AsReadOnly()
                             ).Evaluate(new Fixture {
                y = "abcd"
            }));
            Assert.Equal(4, "('ab'+'cd').Length".Compile().Evaluate(null));
            Assert.Throws <UnsupportedObjectIndexerException>(() => "this[v]".Compile(
                                                                  ParseOption.CreateOption()
                                                                  .AddLiteralValue("v", compiler)
                                                                  .AsReadOnly()
                                                                  ).Evaluate(new Fixture()));
        }
Exemple #16
0
        public void CompileMultiLevelObjectMemberExpression()
        {
            var a = new A
            {
                b = new A.B
                {
                    c = new A.B.C
                    {
                        d = new A.B.C.D
                        {
                            e = "this is e"
                        }
                    }
                }
            };

            Assert.Equal("this is e", "b['c']['d']['e']".Compile <A>().Evaluate(a));
            Assert.Equal("this is e", "b['c'][thisIsD]['e']".Compile <A>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("thisIsD", "d")
                             .AsReadOnly()
                             ).Evaluate(a));
            Assert.Equal("this is e", "b.c.d.e".Compile <A>().Evaluate(a));
            Assert.Equal("this is e", "this.b.c.d.e".Compile <A>().Evaluate(a));
            Assert.Equal(a.b, "b".Compile <A>().Evaluate(a));
        }
Exemple #17
0
        public void TestOr()
        {
            var compiler = Core.Compiler.Default;

            var option = ParseOption.CreateOption()
                         .AddLiteralValue("compiler", compiler)
                         .AsReadOnly();

            var trueValues  = new[] { "1", "2.0", "true", "'aa'", "compiler" };
            var falseValues = new[] { "0", "-2.0", "false", "''", "null" };

            foreach (var item in trueValues)
            {
                foreach (var trueValue in trueValues)
                {
                    Assert.Equal(true, $"{item}||{trueValue}".Compile(option).Evaluate(null));
                }
                foreach (var falseValue in falseValues)
                {
                    Assert.Equal(true, $"{item}||{falseValue}".Compile(option).Evaluate(null));
                }
            }
            foreach (var item in falseValues)
            {
                foreach (var trueValue in trueValues)
                {
                    Assert.Equal(true, $"{item}||{trueValue}".Compile(option).Evaluate(null));
                }
                foreach (var falseValue in falseValues)
                {
                    Assert.Equal(false, $"{item}||{falseValue}".Compile(option).Evaluate(null));
                }
            }
        }
Exemple #18
0
        public void CompileTrick()
        {
            var compiler = Core.Compiler.Default;

            Assert.Equal(4, "('ab'+'cd').Length".ToEvaluableExpression().Compile <Fixture>().Evaluate(null));
            Assert.Equal(4, "('ab'+'cd').Length".ToEvaluableExpression().Compile <Fixture>(compiler).Evaluate(null));

            Assert.Equal(4, "this[v?'y':'x'][len]".Compile <Fixture>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", true)
                             .AddLiteralValue("len", "Length")
                             .AsReadOnly()
                             ).Evaluate(new Fixture {
                y = "abcd"
            }));

            Assert.Equal(4, "this[v]['Len'+'gth']".Compile <Fixture>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", "y")
                             .AsReadOnly()
                             ).Evaluate(new Fixture {
                y = "abcd"
            }));

            Assert.Equal(4, "this['y'][v]".Compile <Fixture>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", "Length")
                             .AsReadOnly()
                             ).Evaluate(new Fixture {
                y = "abcd"
            }));

            Assert.Equal(4, "this[v]['Length']".Compile <Fixture>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", "y")
                             .AsReadOnly()
                             ).Evaluate(new Fixture {
                y = "abcd"
            }));

            Assert.Equal(4, "('ab'+'cd').Length".Compile <Fixture>().Evaluate(null));

            Assert.Equal("aa", "this[v?'D':'D']()".Compile <Fixture>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("v", true)
                             .AsReadOnly()
                             ).EvaluateAs <Fixture, string>(new Fixture {
                D = new Func <string>(() => "aa")
            }));

            Assert.Throws <UnsupportedObjectIndexerException>(() => "this[v]".Compile <Fixture>(
                                                                  ParseOption.CreateOption()
                                                                  .AddLiteralValue("v", compiler)
                                                                  .AsReadOnly()
                                                                  ).Evaluate(new Fixture()));
        }
Exemple #19
0
        public void CompileObjectMemberExpression()
        {
            Assert.Throws <ArgumentNullException>(() => Core.Compiler.Default.Compile <Fixture>(null));
            var cachedEvaluator = "3*'abc'".Compile <Fixture>();

            Assert.Equal("abcabcabc", cachedEvaluator.EvaluateAs <Fixture, string>(null));
            Assert.Equal("abcabcabc", cachedEvaluator.EvaluateAs <Fixture, string>(null));
            var fixture = new Fixture()
            {
                x = 12,
                y = "aaa",
                a = "x",
                c = () => "string"
            };

            Assert.Equal(3, "abc".Compile <IndexerObject>().EvaluateAs <IndexerObject, int>(new IndexerObject()));
            Assert.Equal(fixture.a, "this.a".Compile <Fixture>().EvaluateAs <Fixture, string>(fixture));
            Assert.Equal(fixture.a, "this[thisIsA]".Compile <Fixture>(
                             ParseOption.CreateOption()
                             .AddLiteralValue("thisIsA", "a")
                             .AsReadOnly()
                             ).EvaluateAs <Fixture, string>(fixture));
            Assert.Equal("aa", "this.a()".Compile <Fixture>().EvaluateAs <Fixture, string>(new Fixture {
                a = new Func <string>(() => "aa")
            }));
            Assert.Equal("aa", "this.D()".Compile <Fixture>().EvaluateAs <Fixture, string>(new Fixture {
                D = new Func <string>(() => "aa")
            }));
            Assert.Equal("12122", "this.D".Compile <Fixture>().EvaluateAs <Fixture, string>(new Fixture {
                D = "12122"
            }));
            Assert.Equal("12122", "D".Compile <Fixture>().EvaluateAs <Fixture, string>(new Fixture {
                D = "12122"
            }));
            Assert.Equal(12122, "E".Compile <Fixture>().EvaluateAs <Fixture, int>(new Fixture {
                E = 12122
            }));
            Assert.Equal("this is a value", "a".Compile <Fixture>().EvaluateAs <Fixture, string>(new Fixture {
                a = "this is a value"
            }));
            Assert.Equal(123456, "x".Compile <Fixture>().EvaluateAs <Fixture, int>(new Fixture {
                x = 123456
            }));
            Assert.Equal(fixture.ToString(), "this.ToString()".Compile <Fixture>().EvaluateAs <Fixture, string>(fixture));
            Assert.Equal(fixture.c(), "this.c()".Compile <Fixture>().EvaluateAs <Fixture, string>(fixture));
            Assert.Equal(fixture.c(), "this.c()".Compile <Fixture>(Core.Parser.Default).EvaluateAs <Fixture, string>(fixture));
            Assert.Equal(fixture.ToString(), "this.ToString()".Compile <Fixture>().EvaluateAsType(fixture, typeof(string)));
            Assert.Equal(fixture.GetString("abc"), "this.GetString('abc')".Compile <Fixture>().Evaluate(fixture));
            Assert.Equal(fixture.Add(12), "this.Add(12)".Compile <Fixture>().Evaluate(fixture));
            Assert.Equal(fixture.Add(12).ToString(), "this.Add(12)".Compile <Fixture>().EvaluateAs <Fixture, string>(fixture));
            Assert.Null("this.DoSomething()".Compile <Fixture>().Evaluate(fixture));
            Assert.Throws <MemberNotFoundException>(() => "Y".Compile <Fixture>().Evaluate(fixture));
            Assert.Throws <MemberNotFoundException>(() => "this.Y".Compile <Fixture>().Evaluate(fixture));
        }
Exemple #20
0
        public void CompileNakeStatisticsFunctions()
        {
            var compiler = new Core.Compiler();

            Assert.Throws <ArgumentNullException>(() => compiler.Compile(null));
            var option = ParseOption.CreateOption();

            option.LiteralValues.Add(new LiteralValue("compiler", compiler));

            Assert.Equal(4, compiler.Compile("len([1, 2.0222, true, 'das'])".ToEvaluableExpression()).Evaluate(null));
            Assert.Equal(0, compiler.Compile("len([])".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("len()".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("len(1,8)".ToEvaluableExpression()).Evaluate(null));

            Assert.Equal(11.5m, compiler.Compile("max([1, -2.0222, -89, 11.5])".ToEvaluableExpression()).Evaluate(null));
            Assert.Equal(110m, compiler.Compile("max([1, 110, -89, 100])".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("max()".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("max(1,8)".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("max([1, 2.0222 ,true,'das', false, null, compiler])".ToEvaluableExpression(option.AsReadOnly())).Evaluate(null));

            Assert.Equal(-89m, compiler.Compile("min([1, -2.0222, -89, 11.5])".ToEvaluableExpression()).Evaluate(null));
            Assert.Equal(-90.1m, compiler.Compile("min([1, 110, -90.1, 100])".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("min()".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("min(1,8)".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("min([1, 2.0222 ,true,'das', false, null, compiler])".ToEvaluableExpression(option.AsReadOnly())).Evaluate(null));

            var watch     = Stopwatch.StartNew();
            var evaluator = compiler.Compile($"sum([{string.Join(",", Enumerable.Range(1, 1000))}])".ToEvaluableExpression());

            Assert.Equal((decimal)Enumerable.Range(1, 1000).Sum(), evaluator.Evaluate(null));
            watch.Stop();
            var elapsedTicks = watch.ElapsedTicks;

            watch.Restart();
            Assert.Equal((decimal)Enumerable.Range(1, 1000).Sum(), evaluator.Evaluate(null));
            watch.Stop();
            Assert.True(watch.ElapsedTicks < elapsedTicks);
            Assert.Equal(5050m, compiler.Compile($"sum([{string.Join(",", Enumerable.Range(0, 101))}])".ToEvaluableExpression()).Evaluate(null));
            Assert.Equal((decimal)Enumerable.Range(1, 1000).Sum(), compiler.Compile($"sum([{string.Join(",", Enumerable.Range(1, 1000))}])".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("sum()".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("sum(1,8)".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("sum([1, 2.0222 ,true,'das', false, null, compiler])".ToEvaluableExpression(option.AsReadOnly())).Evaluate(null));

            Assert.Equal(50m, compiler.Compile($"avg([{string.Join(",", Enumerable.Range(0, 101))}])".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("avg()".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("avg(1,8)".ToEvaluableExpression()).Evaluate(null));
            Assert.Throws <UnsupportedFunctionCallException>(() => compiler.Compile("avg([1, 2.0222 ,true,'das', false, null, compiler])".ToEvaluableExpression(option.AsReadOnly())).Evaluate(null));
        }
Exemple #21
0
        public void TestModulo()
        {
            Assert.Equal(0, "22%2".Compile().Evaluate(null));
            Assert.Equal(1m, "25%2.0".Compile().Evaluate(null));
            Assert.Equal(0.222m, "28.222%2".Compile().Evaluate(null));
            Assert.Equal(0.21m, "36.21%3.0".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler%134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'aa'%34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "false%34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34%null".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null%34".Compile().Evaluate(null));
        }
Exemple #22
0
        public void TestMinus()
        {
            Assert.Equal(1, "12-11".Compile().Evaluate(null));
            Assert.Equal(.9m, "12-11.1".Compile().Evaluate(null));
            Assert.Equal(1.8009m, "12.8009-11".Compile().Evaluate(null));
            Assert.Equal(1.0009m, "12.8009-11.8".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler-134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "false-34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'a'-34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34-null".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null-34".Compile().Evaluate(null));
        }
Exemple #23
0
        public void Setup()
        {
            var option = ParseOption.CreateOption();
            var expr   = "0";

            for (var i = 0; i < FunctionCount; i++)
            {
                var name  = $"f{i}";
                var value = i;
                option.AddNakedFunction(name, s => value, Cacheable);
                total += value;
                expr   = $"{expr}+{name}()";
            }
            evaluator = expr.Compile(option.AsReadOnly());
            if (WarmUp)
            {
                evaluator.EvaluateAs <decimal>();
            }
        }
Exemple #24
0
        public void Setup()
        {
            var option = ParseOption.CreateOption();
            var expr   = "0";

            for (var i = 0; i < LiteralCount; i++)
            {
                var name  = $"v{i}";
                var value = i;
                total += value;
                expr   = $"{expr}+{name}";
                option.AddLiteralValue(name, value);
            }
            evaluator = expr.Compile(option.AsReadOnly());
            if (WarmUp)
            {
                evaluator.EvaluateAs <decimal>();
            }
        }
Exemple #25
0
        public void TestDivide()
        {
            Assert.Equal(2, "22/11".Compile().Evaluate(null));
            Assert.Equal(12.5m, "25/2.0".Compile().Evaluate(null));
            Assert.Equal(14.111m, "28.222/2".Compile().Evaluate(null));
            Assert.Equal(12.07m, "36.21/3.0".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler/134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'aa'/34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null/34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "false/34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34/null".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null/34".Compile().Evaluate(null));
        }
Exemple #26
0
        public void TestMultiply()
        {
            Assert.Equal(12 * 11, "12*11".Compile().Evaluate(null));
            Assert.Equal(133.2m, "12*11.1".Compile().Evaluate(null));
            Assert.Equal(140.8099m, "12.8009*11".Compile().Evaluate(null));
            Assert.Equal(151.05062m, "12.8009*11.8".Compile().Evaluate(null));
            Assert.Equal("ababab", "3*'ab'".Compile().Evaluate(null));
            Assert.Equal("ababab", "'ab'*3".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler*134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null*34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "false*34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34*null".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null*34".Compile().Evaluate(null));
        }
Exemple #27
0
        public void NotAllowedInExpression()
        {
            var option = ParseOption.CreateOption()
                         .NotAllowedInExpression()
                         .AsReadOnly();
            var parser = new Core.Parser();

            Assert.Equal("In expression is not allowed at character 5", Assert.Throws <ParseException>(() => parser.Parse("1 in (1,2,3)", option)).Message);
            Assert.Equal("In expression is not allowed at character 6", Assert.Throws <ParseException>(() => parser.Parse("xy in (m['u'],n,y)", option)).Message);

            Assert.NotNull(parser.Parse("[1,2,3]", option) as ArrayExpression);
            Assert.NotNull(parser.Parse("true?1:2", option) as ConditionalExpression);
            Assert.NotNull(parser.Parse("x.f", option) as ObjectMemberExpression);
            Assert.NotNull(parser.Parse("x['f']", option) as ObjectMemberExpression);
            var add = parser.Parse("add", option) as IdentifierExpression;

            Assert.NotNull(add);
            Assert.Equal("add", add.Name);
            Assert.NotNull(parser.Parse("12", option) as ConstantExpression);
        }
Exemple #28
0
        public void TestAdd()
        {
            Assert.Equal(46, "12+34".Compile().Evaluate(null));
            Assert.Equal(888888888 + 12, "12+888888888".Compile().Evaluate(null));
            Assert.Equal(8888888888 + 12UL, "12+8888888888".Compile().Evaluate(null));
            Assert.Equal(24.7m, "12+12.7".Compile().Evaluate(null));
            Assert.Equal(46.7m, "12.7+34".Compile().Evaluate(null));
            Assert.Equal(25.1m, "12.4+12.7".Compile().Evaluate(null));
            Assert.Equal("abc", "'a'+'bc'".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler+134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "true+34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'a'+34".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "34+null".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null+34".Compile().Evaluate(null));
        }
Exemple #29
0
        public void CompileConditionalExpression()
        {
            var parser   = new Core.Parser();
            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            var trueValues  = new[] { "1", "2.0", "true", "'aa'", "compiler" };
            var falseValues = new[] { "0", "-2.0", "false", "''", "null" };

            foreach (var item in trueValues)
            {
                var expr = $"{item}?true:false";
                Assert.Equal(true, expr.Compile(parser, option).Evaluate(null));
            }
            foreach (var item in falseValues)
            {
                var expr = $"{item}?true:false";
                Assert.Equal(false, expr.Compile(parser, option, compiler).Evaluate(null));
            }
        }
Exemple #30
0
        public void TestEqual()
        {
            Assert.Equal(false, "11==12".Compile().Evaluate(null));
            Assert.Equal(false, "11.7==12".Compile().Evaluate(null));
            Assert.Equal(false, "12.7==113".Compile().Evaluate(null));
            Assert.Equal(false, "12.7==13.1".Compile().Evaluate(null));
            Assert.Equal(false, "true==false".Compile().Evaluate(null));
            Assert.Equal(false, "'aa'=='ab'".Compile().Evaluate(null));
            Assert.Equal(false, "'aa'=='Ab'".Compile().Evaluate(null));

            Assert.Equal(true, "null==null".Compile().Evaluate(null));
            Assert.Equal(true, "12==12".Compile().Evaluate(null));
            Assert.Equal(true, "12==12.0".Compile().Evaluate(null));
            Assert.Equal(true, "12.0==12".Compile().Evaluate(null));
            Assert.Equal(true, "12.7==12.7".Compile().Evaluate(null));
            Assert.Equal(true, "true==true".Compile().Evaluate(null));
            Assert.Equal(true, "'aa'=='aa'".Compile().Evaluate(null));

            var compiler = Core.Compiler.Default;
            var option   = ParseOption.CreateOption()
                           .AddLiteralValue("compiler", compiler)
                           .AsReadOnly();

            Assert.Throws <UnsupportedOperationException>(() => "compiler==134".Compile(option).Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "'aa'==134".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "true==134".Compile().Evaluate(null));
            Assert.Throws <UnsupportedOperationException>(() => "null==134".Compile().Evaluate(null));

            var array = new object[] { 'a', (sbyte)97, (byte)97, (ushort)97, (short)97, 97, (uint)97, 97L, (ulong)97, 97f, 97d, 97m };

            for (var i = 0; i < array.Length; i++)
            {
                for (var j = 0; j < array.Length; j++)
                {
                    var expr = $"this[{i}]==this[{j}]";
                    Assert.Equal(true, expr.Compile().Evaluate(array));
                }
            }
        }