Пример #1
0
        public void TokensWithTruthyElementAccess_Parse_ReturnsCorrectExpression()
        {
            string input = "@.items >= 3 || @.b[123]";
            IReadOnlyList <FilterExpressionToken> tokens = FilterExpressionTokenizer.Tokenize(input);
            FilterSubExpression expr = FilterParser.Parse(tokens);

            Assert.IsType <LogicalFilterSubExpression>(expr);
            LogicalFilterSubExpression logical = expr as LogicalFilterSubExpression;

            // @.items > 3
            Assert.IsType <ComparisonFilterSubExpression>(logical.LeftSide);
            ComparisonFilterSubExpression left = logical.LeftSide as ComparisonFilterSubExpression;

            Assert.True(left.IsGreaterOrEqual);
            Assert.True(left.LeftSide is PropertyFilterSubExpression p1 && p1.PropertyChain.Length == 1 && p1.PropertyChain[0] == "items");
            Assert.True(left.RightSide is NumberConstantFilterSubExpression n1 && n1.Value == 3.0);

            // @.b[0]
            Assert.IsType <TruthyFilterSubExpression>(logical.RightSide);
            TruthyFilterSubExpression tr = logical.RightSide as TruthyFilterSubExpression;

            Assert.IsType <ArrayAccessFilterSubExpression>(tr.Expression);
            ArrayAccessFilterSubExpression ar = tr.Expression as ArrayAccessFilterSubExpression;

            Assert.True(ar.ExactElementsAccess != null && ar.ExactElementsAccess.Length == 1 && ar.ExactElementsAccess[0] == 123);
        }
Пример #2
0
        public void TokensWithArray_Parse_ReturnsCorrectExpression()
        {
            string input = "@.items[2] > 3";
            IReadOnlyList <FilterExpressionToken> tokens = FilterExpressionTokenizer.Tokenize(input);
            FilterSubExpression expr = FilterParser.Parse(tokens);

            Assert.IsType <ComparisonFilterSubExpression>(expr);
            ComparisonFilterSubExpression comp = expr as ComparisonFilterSubExpression;

            Assert.IsType <ArrayAccessFilterSubExpression>(comp.LeftSide);
            Assert.True((comp.RightSide as NumberConstantFilterSubExpression)?.Value == 3.0);

            ArrayAccessFilterSubExpression aa = comp.LeftSide as ArrayAccessFilterSubExpression;

            Assert.True(aa.ExactElementsAccess?.Length == 1 && aa.ExactElementsAccess[0] == 2);
            Assert.True(aa.ExecutedOn is PropertyFilterSubExpression p && p.PropertyChain.Length == 1 && p.PropertyChain[0] == "items");
        }
Пример #3
0
        public void TokensWithEscapedPropAccess_Parse_ReturnsCorrectExpression()
        {
            string input = "@.items['2'] > 3";
            IReadOnlyList <FilterExpressionToken> tokens = FilterExpressionTokenizer.Tokenize(input);
            FilterSubExpression expr = FilterParser.Parse(tokens);

            Assert.IsType <ComparisonFilterSubExpression>(expr);
            ComparisonFilterSubExpression comp = expr as ComparisonFilterSubExpression;

            Assert.IsType <PropertyFilterSubExpression>(comp.LeftSide);
            Assert.True((comp.RightSide as NumberConstantFilterSubExpression)?.Value == 3.0);

            PropertyFilterSubExpression aa = comp.LeftSide as PropertyFilterSubExpression;

            Assert.Equal(2, aa.PropertyChain.Length);
            Assert.Equal("items", aa.PropertyChain[0]);
            Assert.Equal("2", aa.PropertyChain[1]);
        }
Пример #4
0
        public void TokensWithMethodsComparisonLogicOperatorsAndTruthy_Parse_ReturnsValidExpression()
        {
            string input = "@.price.count >= 0 && (@.name.first.contains('a') || @['name'].contains(5) || @.f)";
            IReadOnlyList <FilterExpressionToken> tokens = FilterExpressionTokenizer.Tokenize(input);
            FilterSubExpression expr = FilterParser.Parse(tokens);

            Assert.IsType <LogicalFilterSubExpression>(expr);
            LogicalFilterSubExpression e1 = expr as LogicalFilterSubExpression;

            Assert.True(e1.IsAnd);
            Assert.IsType <ComparisonFilterSubExpression>(e1.LeftSide);

            // @.price.count >= 0
            ComparisonFilterSubExpression comp1 = e1.LeftSide as ComparisonFilterSubExpression;

            Assert.True(comp1.IsGreaterOrEqual);
            Assert.IsType <PropertyFilterSubExpression>(comp1.LeftSide);
            Assert.True(comp1.LeftSide is PropertyFilterSubExpression p1 &&
                        p1.PropertyChain.Length == 2 &&
                        p1.PropertyChain.First() == "price" &&
                        p1.PropertyChain.Last() == "count"
                        );
            Assert.True(comp1.RightSide is NumberConstantFilterSubExpression c1 &&
                        c1.Value == 0.0
                        );

            // @.name.first.contains('a') || @['name'].contains(5) || @.f
            LogicalFilterSubExpression comp2 = (e1.RightSide as GroupFilterSubExpression).Expression as LogicalFilterSubExpression;

            Assert.NotNull(comp2);

            // @.name.first.contains('a')
            Assert.IsType <MethodCallFilterSubExpression>(comp2.LeftSide);
            MethodCallFilterSubExpression mc1 = comp2.LeftSide as MethodCallFilterSubExpression;

            Assert.Equal("contains", mc1.MethodName);
            Assert.True(mc1.Arguments.Count == 1 && (mc1.Arguments.Single() as StringConstantFilterSubExpression).Value == "a");
            PropertyFilterSubExpression calledOn1 = mc1.CalledOnExpression as PropertyFilterSubExpression;

            Assert.True(calledOn1.PropertyChain.Length == 2 && calledOn1.PropertyChain.First() == "name" && calledOn1.PropertyChain.Last() == "first");

            // @['name'].contains(5) || @.f
            Assert.IsType <LogicalFilterSubExpression>(comp2.RightSide);
            LogicalFilterSubExpression logical3 = comp2.RightSide as LogicalFilterSubExpression;

            Assert.True(logical3.IsOr);

            // @['name'].contains(5)
            Assert.IsType <MethodCallFilterSubExpression>(logical3.LeftSide);
            MethodCallFilterSubExpression mc2 = logical3.LeftSide as MethodCallFilterSubExpression;

            Assert.Equal("contains", mc2.MethodName);
            Assert.Equal(5.0, (mc2.Arguments.Single() as NumberConstantFilterSubExpression).Value);
            Assert.Equal("name", (mc2.CalledOnExpression as PropertyFilterSubExpression).PropertyChain.Single());

            // || @.f
            Assert.IsType <TruthyFilterSubExpression>(logical3.RightSide);
            TruthyFilterSubExpression truthy = logical3.RightSide as TruthyFilterSubExpression;

            Assert.IsType <PropertyFilterSubExpression>(truthy.Expression);
            PropertyFilterSubExpression truthyProp = truthy.Expression as PropertyFilterSubExpression;

            Assert.Equal("f", truthyProp.PropertyChain.Single());
        }