public void IsUnaryWithJsonCriteria()
        {
            var crit     = JsonConvert.DeserializeObject <IList>("[\"!\", []]");
            var compiler = new FilterExpressionCompiler <object>(false);

            Assert.True(compiler.IsUnary(crit));
        }
        public void Dynamic()
        {
            var compiler = new FilterExpressionCompiler <dynamic>(true, true);
            var expr     = compiler.Compile(new object[] {
                new[] { "this", "startswith", "1" },
                "or",
                new[] { "this", "B" },
                "or",
                new[] { "this", ">=", "C" }
            });

            var expectedExpr = "(((IIF((obj == null), null, obj.ToString().ToLower()) ?? '').StartsWith('1')"
                               + " OrElse (DynamicCompare(obj, 'b', True) == 0))"
                               + " OrElse (DynamicCompare(obj, 'c', True) >= 0))";

            Assert.Equal(
                expectedExpr.Replace("'", "\""),
                expr.Body.ToString()
                );

            var method = expr.Compile();

            Assert.True((bool)method.DynamicInvoke(1));
            Assert.True((bool)method.DynamicInvoke("B"));
            Assert.True((bool)method.DynamicInvoke('C'));
        }
        public void InvalidValueHandling()
        {
            var compiler = new FilterExpressionCompiler <Structs>(false);

            Assert.Equal("False", compiler.Compile(new[] { "byte", "-3" }).Body.ToString());
            Assert.Equal("False", compiler.Compile(new[] { "byte", "257" }).Body.ToString());
            Assert.Equal("False", compiler.Compile(new[] { "int", "not-int" }).Body.ToString());
        }
예제 #4
0
        /// <summary>
        /// Create a log event filter based on the provided expression.
        /// </summary>
        /// <param name="expression">A filter expression.</param>
        /// <param name="filter">A function that evaluates the expression in the context of the log event.</param>
        /// <param name="error">The reported error, if compilation was unsuccessful.</param>
        /// <returns>True if the filter could be created; otherwise, false.</returns>
        public static bool TryCreateFilter(string expression, out Func <LogEvent, object> filter, out string error)
        {
            if (!FilterExpressionParser.TryParse(expression, out var root, out error))
            {
                filter = null;
                return(false);
            }

            filter = FilterExpressionCompiler.CompileAndExpose(root);
            error  = null;
            return(true);
        }
        public void NoToStringForNumbers()
        {
            var compiler = new FilterExpressionCompiler(typeof(object), false);

            void Case(IList clientFilter, string expectedExpr, object trueTestValue)
            {
                var expr = compiler.Compile(clientFilter);

                Assert.Equal(expectedExpr, expr.Body.ToString());
                Assert.True((bool)expr.Compile().DynamicInvoke(trueTestValue));
            }

            Case(
                new object[] { "this", ">", new JValue(9) },
                "(DynamicCompare(obj, 9, False) > 0)",
                10
                );
        }
        void AssertEvaluation <T>(T dataItem, params object[] clientFilter)
        {
            var expr = new FilterExpressionCompiler <T>(false).Compile(clientFilter);

            Assert.True((bool)expr.Compile().DynamicInvoke(dataItem));
        }