/// <summary>
        /// Invert the all of the paths in an expandToken, such that they are now in the same order as they are present in the 
        /// base url
        /// </summary>
        /// <param name="treeToInvert">the tree to invert paths on</param>
        /// <returns>a new tree with all of its paths inverted</returns>
        public ExpandToken NormalizePaths(ExpandToken treeToInvert)
        {
            // iterate through each expand term token, and reverse the tree in its path property
            List<ExpandTermToken> updatedTerms = new List<ExpandTermToken>();
            foreach (ExpandTermToken term in treeToInvert.ExpandTerms)
            {
                PathReverser pathReverser = new PathReverser();
                PathSegmentToken reversedPath = term.PathToNavProp.Accept(pathReverser);

                // we also need to call the select token normalizer for this level to reverse the select paths
                SelectToken newSelectToken = term.SelectOption;
                if (term.SelectOption != null)
                {
                    SelectTreeNormalizer selectTreeNormalizer = new SelectTreeNormalizer();
                    newSelectToken = selectTreeNormalizer.NormalizeSelectTree(term.SelectOption);
                }

                ExpandToken subExpandTree;
                if (term.ExpandOption != null)
                {
                    subExpandTree = this.NormalizePaths(term.ExpandOption);
                }
                else
                {
                    subExpandTree = null;
                }

                ExpandTermToken newTerm = new ExpandTermToken(reversedPath, term.FilterOption, term.OrderByOptions, term.TopOption, term.SkipOption, term.CountQueryOption, term.LevelsOption, term.SearchOption, newSelectToken, subExpandTree);
                updatedTerms.Add(newTerm);
            }

            return new ExpandToken(updatedTerms);
        }
 public void SingleLevelExpandTermTokenWorks()
 {
     ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null));
     ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {expandTermToken});
     var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken));
     item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And.SelectAndExpand.AllSelected.Should().BeTrue();
 }
        public void PropertySetCorrectly()
        {
            ExpandTermToken expandTerm1 = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*selectOption*/,
                                                             null /*expandOption*/);
            expandTerm1.PathToNavProp.ShouldBeNonSystemToken("stuff");

            ExpandTermToken expandTerm2 = new ExpandTermToken(new NonSystemToken("stuff", null, null));
            expandTerm2.PathToNavProp.ShouldBeNonSystemToken("stuff");
        }
 public void BindingOnTreeWithWithMultipleNavPropPathsThrows()
 {
     NonSystemToken topLevelSegment = new NonSystemToken("MyDog", null, null);
     NonSystemToken navProp = new NonSystemToken("MyPeople", null, topLevelSegment);
     ExpandTermToken expandTerm = new ExpandTermToken(navProp);
     ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {expandTerm});
     Action bindTreeWithMultipleNavPropPaths = () => this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken));
     bindTreeWithMultipleNavPropPaths.ShouldThrow<ODataException>()
                         .WithMessage(ODataErrorStrings.ExpandItemBinder_TraversingMultipleNavPropsInTheSamePath);
 }
 public void FilterSetCorrectly()
 {
     QueryToken filter = new LiteralToken(1);
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      filter,
                                                      null /*orderByOption*/,
                                                      null /*topOption*/,
                                                      null /*skipOption*/,
                                                      null /*countQueryOption*/,
                                                      null /*levelsOption*/,
                                                      null /*searchOption*/,
                                                      null /*selectOption*/,
                                                      null /*expandOption*/);
     expandTerm.FilterOption.ShouldBeLiteralQueryToken(1);
 }
        public void FilterSetCorrectly()
        {
            QueryToken      filter     = new LiteralToken(1);
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             filter,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/);

            expandTerm.FilterOption.ShouldBeLiteralQueryToken(1);
        }
Beispiel #7
0
        public void EntitySetCorrectlyPopulatedAtEachLevel()
        {
            ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null));
            ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null),
                                                                  null,
                                                                  new ExpandToken(new ExpandTermToken[] { innerExpandTerm }));
            ExpandToken expandToken     = new ExpandToken(new ExpandTermToken[] { outerExpandTerm });
            var         item            = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken));
            var         myDogExpandItem = item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And;

            myDogExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetDogsSet());
            var myPeopleExpandItem = myDogExpandItem.SelectAndExpand.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()).And;

            myPeopleExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetPeopleSet());
            myPeopleExpandItem.SelectAndExpand.SelectedItems.Should().BeEmpty();
        }
Beispiel #8
0
        public void InnerExpandSetCorrectly()
        {
            // Arrange & Act
            ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("abc", null, null), null, null);

            ExpandToken expand = new ExpandToken(new[] { innerExpandTerm });

            SelectTermToken selectTerm = new SelectTermToken(new NonSystemToken("stuff", null, null), null, expand);

            // Assert
            Assert.NotNull(selectTerm.ExpandOption);
            ExpandTermToken token = Assert.Single(selectTerm.ExpandOption.ExpandTerms);

            ReferenceEquals(token.PathToNavigationProp, token.PathToProperty);
            Assert.Equal("abc", token.PathToProperty.Identifier);
        }
Beispiel #9
0
        public void SkipSetCorrectly()
        {
            long            skip       = 1;
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             skip,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/);

            expandTerm.SkipOption.Should().Be(1);
        }
Beispiel #10
0
        public void NestedAggregateTransformationInExpandIsAllowed()
        {
            // Arrange & Act
            ExpandTermToken expandTerm = this.ParseExpandOptions("($apply=aggregate(Amount with sum as Total))");

            // Assert
            Assert.NotNull(expandTerm);
            Assert.NotNull(expandTerm.ApplyOptions);

            QueryToken               token     = Assert.Single(expandTerm.ApplyOptions);
            AggregateToken           aggregate = Assert.IsType <AggregateToken>(token);
            AggregateExpressionToken aggregateExpressionToken = Assert.Single(aggregate.Expressions);

            Assert.Equal("Total", aggregateExpressionToken.Alias);
            Assert.Equal(AggregationMethod.Sum, aggregateExpressionToken.Method);
            aggregateExpressionToken.Expression.ShouldBeEndPathToken("Amount");
        }
        public void ComputeSetCorrectly()
        {
            ComputeToken    compute    = new ComputeToken(new ComputeExpressionToken[] { });
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/,
                                                             compute);

            expandTerm.ComputeOption.Should().BeSameAs(compute);
        }
Beispiel #12
0
        public void DeepNestedExpandsAreAllowed(string optionText)
        {
            // Arrange & Act
            ExpandTermToken expandTerm = this.ParseExpandOptions(optionText);

            // Assert
            Assert.NotNull(expandTerm);
            Assert.NotNull(expandTerm.ExpandOption);

            ExpandTermToken two = Assert.Single(expandTerm.ExpandOption.ExpandTerms);

            two.PathToNavigationProp.ShouldBeNonSystemToken("two");

            ExpandTermToken three = Assert.Single(two.ExpandOption.ExpandTerms);

            three.PathToNavigationProp.ShouldBeNonSystemToken("three");
        }
        /// <summary>
        /// Combine together the select clauses of two ExpandTermTokens
        /// </summary>
        /// <param name="existingToken">the already existing expand term token</param>
        /// <param name="newToken">the new expand term token to be added</param>
        /// <returns>A new select term containing each of the selected entries.</returns>
        private SelectToken CombineSelects(ExpandTermToken existingToken, ExpandTermToken newToken)
        {
            if (existingToken.SelectOption == null)
            {
                return(newToken.SelectOption);
            }

            if (newToken.SelectOption == null)
            {
                return(existingToken.SelectOption);
            }

            List <PathSegmentToken> newSelects = existingToken.SelectOption.Properties.ToList();

            newSelects.AddRange(newToken.SelectOption.Properties);
            return(new SelectToken(newSelects.Distinct(new PathSegmentTokenEqualityComparer())));
        }
        public void SelectSetCorrectly()
        {
            SelectToken     select     = new SelectToken(new PathSegmentToken[] { new NonSystemToken("1", null, null) });
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             select,
                                                             null /*expandOption*/);

            expandTerm.SelectOption.Properties.Count().Should().Be(1);
            expandTerm.SelectOption.Properties.ElementAt(0).ShouldBeNonSystemToken("1");
        }
        public void OrderBySetCorrectly()
        {
            OrderByToken    orderBy    = new OrderByToken(new LiteralToken(1), OrderByDirection.Descending);
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             new OrderByToken[] { orderBy },
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/);

            expandTerm.OrderByOptions.Single().Kind.Should().Be(QueryTokenKind.OrderBy);
            expandTerm.OrderByOptions.Single().Expression.ShouldBeLiteralQueryToken(1);
        }
Beispiel #16
0
        public void LowerLevelEmptySelectedItemsListDoesNotThrow()
        {
            // Arrange
            ExpandToken     lowerLevelExpand        = new ExpandToken(new List <ExpandTermToken>());
            ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", /*namedValues*/ null, /*nextToken*/ null), null, lowerLevelExpand);
            ExpandToken     topLevelExpand          = new ExpandToken(new List <ExpandTermToken>()
            {
                topLevelExpandTermToken
            });

            // Act
            Action bindWithEmptySelectedItemsList = () => BinderForPerson.Bind(topLevelExpand, null);

            // Assert
            var ex = Record.Exception(bindWithEmptySelectedItemsList);

            Assert.Null(ex);
        }
Beispiel #17
0
        public void ParseApplyWithFilteredExpandShouldParseSuccessfully()
        {
            string apply = "expand(Sales, filter(Amount gt 3))";
            IEnumerable <QueryToken> actual = this.testSubject.ParseApply(apply);

            Assert.NotNull(actual);
            Assert.Single(actual);

            ExpandToken expand = (ExpandToken)actual.First();

            Assert.Single(expand.ExpandTerms);

            ExpandTermToken expandTerm = expand.ExpandTerms.First();

            Assert.Equal(QueryTokenKind.ExpandTerm, expandTerm.Kind);
            Assert.Equal("Sales", expandTerm.PathToNavigationProp.Identifier);
            Assert.NotNull(expandTerm.FilterOption);
        }
        public void ApplySetCorrectly()
        {
            IEnumerable <QueryToken> applyOptions = new QueryToken[] { };
            ExpandTermToken          expandTerm   = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                                        null /*filterOption*/,
                                                                        null /*orderByOption*/,
                                                                        null /*topOption*/,
                                                                        null /*skipOption*/,
                                                                        null /*countQueryOption*/,
                                                                        null /*levelsOption*/,
                                                                        null /*searchOption*/,
                                                                        null /*selectOption*/,
                                                                        null /*expandOption*/,
                                                                        null /*computeOption*/,
                                                                        applyOptions /*applyOptions*/);

            Assert.Same(expandTerm.ApplyOptions, applyOptions);
        }
Beispiel #19
0
        public void AllNestedOptionsAreNullIfNotPresentInExpand()
        {
            // Arrange & Act
            ExpandTermToken expandTerm = this.ParseExpandOptions("");

            // Assert
            Assert.NotNull(expandTerm);
            Assert.Null(expandTerm.FilterOption);
            Assert.Null(expandTerm.TopOption);
            Assert.Null(expandTerm.SkipOption);
            Assert.Null(expandTerm.OrderByOptions);
            Assert.Null(expandTerm.SelectOption);
            Assert.Null(expandTerm.ExpandOption);
            Assert.Null(expandTerm.LevelsOption);
            Assert.Null(expandTerm.SearchOption);
            Assert.Null(expandTerm.ComputeOption);
            Assert.Null(expandTerm.ApplyOptions);
        }
Beispiel #20
0
        public void NestedComputeInExpandIsAllowed(string optionsText)
        {
            // Arrange & Act
            ExpandTermToken expandTerm = this.ParseExpandOptions(optionsText);

            // Assert
            Assert.NotNull(expandTerm);
            Assert.NotNull(expandTerm.ComputeOption);
            Assert.NotNull(expandTerm.ComputeOption.Expressions);
            ComputeExpressionToken computeExpressionToken = Assert.Single(expandTerm.ComputeOption.Expressions);

            Assert.Equal("TotalPrice", computeExpressionToken.Alias);

            BinaryOperatorToken binaryOperatorToken = computeExpressionToken.Expression.ShouldBeBinaryOperatorQueryToken(BinaryOperatorKind.Multiply);

            binaryOperatorToken.Left.ShouldBeEndPathToken("Price");
            binaryOperatorToken.Right.ShouldBeEndPathToken("Qty");
        }
Beispiel #21
0
        public void SingleLevelExpandTermTokenWorks()
        {
            // Arrange
            ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null));
            ExpandToken     expandToken     = new ExpandToken(new ExpandTermToken[] { expandTermToken });

            // Act
            SelectExpandClause clause = BinderForPerson.Bind(expandToken, null);

            // Arrange
            Assert.NotNull(clause);
            SelectItem selectItem = Assert.Single(clause.SelectedItems);

            ExpandedNavigationSelectItem expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp());

            Assert.NotNull(expandedItem);
            Assert.NotNull(expandedItem.SelectAndExpand);
        }
        public void ParseApplyWithFilteredExpandShouldParseSuccessfully()
        {
            string apply = "expand(Sales, filter(Amount gt 3))";
            IEnumerable <QueryToken> actual = this.testSubject.ParseApply(apply);

            actual.Should().NotBeNull();
            actual.Should().HaveCount(1);

            ExpandToken expand = (ExpandToken)actual.First();

            expand.ExpandTerms.Should().HaveCount(1);

            ExpandTermToken expandTerm = expand.ExpandTerms.First();

            expandTerm.Kind.ShouldBeEquivalentTo(QueryTokenKind.ExpandTerm);
            expandTerm.PathToNavigationProp.Identifier.ShouldBeEquivalentTo("Sales");
            expandTerm.FilterOption.Should().NotBeNull();
        }
Beispiel #23
0
        public void SearchSetCorrectly()
        {
            // Arrange & Act
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             new StringLiteralToken("searchMe") /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/);

            // Assert
            Assert.NotNull(expandTerm.SearchOption);
            expandTerm.SearchOption.ShouldBeStringLiteralToken("searchMe");
        }
Beispiel #24
0
        public void InvertPathsActuallyInvertsPaths()
        {
            // Arrange: $expand=1/2
            ExpandToken expand = new ExpandToken(new ExpandTermToken[]
            {
                new ExpandTermToken(new NonSystemToken("2", null, new NonSystemToken("1", null, null)))
            });

            // Act
            ExpandToken invertedPaths = ExpandTreeNormalizer.NormalizePaths(expand);

            // Assert
            Assert.NotNull(invertedPaths);
            ExpandTermToken term = Assert.Single(invertedPaths.ExpandTerms).ShouldBeExpandTermToken("1", false);

            Assert.NotNull(term.PathToNavigationProp.NextToken);
            term.PathToNavigationProp.NextToken.ShouldBeNonSystemToken("2");
        }
Beispiel #25
0
        public void CombineChildNodesWorksForTwoPopulatedNodes()
        {
            // $expand=1($expand=2), 1($expand=3)
            ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null));
            ExpandToken     innerExpand1     = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 });
            ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   innerExpand1);
            ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null));
            ExpandToken     innerExpand2     = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 });
            ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   innerExpand2);
            ExpandTreeNormalizer          expandTreeNormalizer = new ExpandTreeNormalizer();
            IEnumerable <ExpandTermToken> combinedChildren     = expandTreeNormalizer.CombineChildNodes(outerExpandTerm1, outerExpandTerm2);

            combinedChildren.Should().Contain(innerExpandTerm1).And.Contain(innerExpandTerm2);
        }
Beispiel #26
0
        public void AddTermsWorksForOneLevelBelow()
        {
            // $expand=1($expand=2;), 1($expand=3;)
            ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null));
            ExpandToken     innerExpand1     = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 });
            ExpandTermToken outerToken1      = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   innerExpand1);
            ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null));
            ExpandToken     innerExpand2     = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 });
            ExpandTermToken outerToken2      = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   innerExpand2);
            ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
            var addedToken = expandTreeNormalizer.CombineTerms(outerToken1, outerToken2);

            addedToken.ShouldBeExpandTermToken("1", true).ExpandOption.ExpandTerms.Should().Contain(innerExpandTerm2).And.Contain(innerExpandTerm1);
        }
Beispiel #27
0
        public void LevelsSetCorrectly()
        {
            // Arrange & Act
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             3 /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/);

            // Assert
            Assert.NotNull(expandTerm.LevelsOption);
            Assert.Equal(3, expandTerm.LevelsOption);
        }
Beispiel #28
0
        public void AllNestedQueryOptionsInSelectAreAllowed()
        {
            // Arrange & Act
            SelectTermToken selectTerm = this.ParseSelectOptions("($select=one($select=subone);$filter=true;$count=true;$top=1;$skip=2;$expand=two($expand=three))");

            // Assert
            Assert.NotNull(selectTerm);

            // $select
            Assert.NotNull(selectTerm.SelectOption);
            SelectTermToken innerSelectTerms = Assert.Single(selectTerm.SelectOption.SelectTerms);

            innerSelectTerms.PathToProperty.ShouldBeNonSystemToken("one");

            SelectTermToken innerInnerSelectTerms = Assert.Single(innerSelectTerms.SelectOption.SelectTerms);

            innerInnerSelectTerms.PathToProperty.ShouldBeNonSystemToken("subone");

            // $filter
            Assert.NotNull(selectTerm.FilterOption);
            selectTerm.FilterOption.ShouldBeLiteralQueryToken(true);

            // $count
            Assert.NotNull(selectTerm.CountQueryOption);
            Assert.True(selectTerm.CountQueryOption);

            // $top
            Assert.NotNull(selectTerm.TopOption);
            Assert.Equal(1, selectTerm.TopOption);

            // $skip
            Assert.NotNull(selectTerm.SkipOption);
            Assert.Equal(2, selectTerm.SkipOption);

            // $expand
            Assert.NotNull(selectTerm.ExpandOption);
            ExpandTermToken two = Assert.Single(selectTerm.ExpandOption.ExpandTerms);

            two.PathToNavigationProp.ShouldBeNonSystemToken("two");

            ExpandTermToken three = Assert.Single(two.ExpandOption.ExpandTerms);

            three.PathToNavigationProp.ShouldBeNonSystemToken("three");
        }
Beispiel #29
0
        public void ComputeSetCorrectly()
        {
            // Arrange & Act
            ComputeToken    compute    = new ComputeToken(new ComputeExpressionToken[] { });
            ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                             null /*filterOption*/,
                                                             null /*orderByOption*/,
                                                             null /*topOption*/,
                                                             null /*skipOption*/,
                                                             null /*countQueryOption*/,
                                                             null /*levelsOption*/,
                                                             null /*searchOption*/,
                                                             null /*selectOption*/,
                                                             null /*expandOption*/,
                                                             compute);

            // Assert
            Assert.Same(expandTerm.ComputeOption, compute);
        }
        /// <summary>
        /// add a new expandTermToken into an exisiting token, adding any additional levels and trees along the way.
        /// </summary>
        /// <param name="existingToken">the exisiting (already expanded) token</param>
        /// <param name="newToken">the new (already expanded) token</param>
        /// <returns>the combined token, or, if the two are mutually exclusive, the same tokens</returns>
        public ExpandTermToken CombineTerms(ExpandTermToken existingToken, ExpandTermToken newToken)
        {
            Debug.Assert(new PathSegmentTokenEqualityComparer().Equals(existingToken.PathToNavProp, newToken.PathToNavProp), "Paths should be equal.");

            List <ExpandTermToken> childNodes      = CombineChildNodes(existingToken, newToken).ToList();
            SelectToken            combinedSelects = this.CombineSelects(existingToken, newToken);

            return(new ExpandTermToken(
                       existingToken.PathToNavProp,
                       existingToken.FilterOption,
                       existingToken.OrderByOptions,
                       existingToken.TopOption,
                       existingToken.SkipOption,
                       existingToken.CountQueryOption,
                       existingToken.LevelsOption,
                       existingToken.SearchOption,
                       combinedSelects,
                       new ExpandToken(childNodes)));
        }
Beispiel #31
0
        public void AddTermsDoesNothingForIdenticalTrees()
        {
            // Arrange: $expand=1($expand=2;)
            ExpandToken innerExpand = new ExpandToken(new ExpandTermToken[]
            {
                new ExpandTermToken(new NonSystemToken("2", null, null))
            });
            ExpandTermToken outerExpandToken = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   innerExpand);

            // Act
            ExpandTermToken addedToken = ExpandTreeNormalizer.CombineTerms(outerExpandToken, outerExpandToken);

            // Assert
            Assert.NotNull(addedToken);
            addedToken.ShouldBeExpandTermToken("1", true);
            Assert.Single(addedToken.ExpandOption.ExpandTerms).ShouldBeExpandTermToken("2", true);
        }
        public void SelectedAndExpandedNavPropProduceExpandedNavPropSelectionItemAndPathSelectionItem()
        {
            // Arrange: $select=MyDog&$expand=MyDog
            ExpandTermToken innerExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null));
            ExpandToken     expandToken          = new ExpandToken(new ExpandTermToken[] { innerExpandTermToken });

            SelectTermToken innerSelectTermToken = new SelectTermToken(new NonSystemToken("MyDog", null, null));
            SelectToken     selectToken          = new SelectToken(new SelectTermToken[] { innerSelectTermToken });

            // Act
            SelectExpandClause clause = BinderForPerson.Bind(expandToken, selectToken);

            // Assert
            Assert.NotNull(clause);
            Assert.False(clause.AllSelected);
            Assert.Equal(2, clause.SelectedItems.Count());

            clause.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp());
            clause.SelectedItems.Last().ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetPeopleSet())));
        }
Beispiel #33
0
        public void NestedStarExpand()
        {
            // Arrange & Act
            ExpandToken expandToken = this.StarExpandTesting("Friend($expand=*)", "Persons");

            // Assert
            Assert.NotNull(expandToken);
            ExpandTermToken expandTermToken = Assert.Single(expandToken.ExpandTerms);

            // Depth 0
            expandTermToken.PathToNavigationProp.ShouldBeNonSystemToken("Friend");
            Assert.Null(expandTermToken.PathToNavigationProp.NextToken);

            // Depth 1
            Assert.NotNull(expandTermToken.ExpandOption);
            ExpandTermToken nestedExpandTermToken = Assert.Single(expandTermToken.ExpandOption.ExpandTerms);

            nestedExpandTermToken.PathToNavigationProp.ShouldBeNonSystemToken("Friend");
            Assert.Null(nestedExpandTermToken.PathToNavigationProp.NextToken);
        }
Beispiel #34
0
        public void NormalizeTreeWorksWhenPathsHaveArguments()
        {
            // Arrange: $expand=1(name=value)
            ExpandToken expand = new ExpandToken(new ExpandTermToken[]
            {
                new ExpandTermToken(new NonSystemToken("1", new NamedValue[] { new NamedValue("name", new LiteralToken("value")) }, null))
            });

            // Act
            ExpandToken normalizedExpand = ExpandTreeNormalizer.NormalizeExpandTree(expand);

            // Assert
            Assert.NotNull(normalizedExpand);
            ExpandTermToken term  = Assert.Single(normalizedExpand.ExpandTerms).ShouldBeExpandTermToken("1", true);
            NonSystemToken  token = Assert.IsType <NonSystemToken>(term.PathToNavigationProp);

            Assert.Single(token.NamedValues).ShouldBeNamedValue("name", "value");

            Assert.Null(term.ExpandOption);
        }
        /// <summary>
        /// Combine the child nodes of twoExpandTermTokens into one list of tokens
        /// </summary>
        /// <param name="existingToken">the existing token to to</param>
        /// <param name="newToken">the new token containing terms to add</param>
        /// <returns>a combined list of the all child nodes of the two tokens.</returns>
        public IEnumerable <ExpandTermToken> CombineChildNodes(ExpandTermToken existingToken, ExpandTermToken newToken)
        {
            if (existingToken.ExpandOption == null && newToken.ExpandOption == null)
            {
                return(new List <ExpandTermToken>());
            }

            var childNodes = new Dictionary <PathSegmentToken, ExpandTermToken>(new PathSegmentTokenEqualityComparer());

            if (existingToken.ExpandOption != null)
            {
                AddChildOptionsToDictionary(existingToken, childNodes);
            }

            if (newToken.ExpandOption != null)
            {
                AddChildOptionsToDictionary(newToken, childNodes);
            }

            return(childNodes.Values);
        }
 public void ExpansionsCanBeNull()
 {
     ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                           null /*filterOption*/,
                                                           null /*orderByOption*/,
                                                           null /*topOption*/,
                                                           null /*skipOption*/,
                                                           null /*countQueryOption*/,
                                                           null /*levelsOption*/,
                                                           null /*searchOption*/,
                                                           null /*selectOption*/,
                                                           null /*expandOption*/);
     expandTermToken.FilterOption.Should().BeNull();
     expandTermToken.OrderByOptions.Should().BeNull();
     expandTermToken.TopOption.Should().Be(null);
     expandTermToken.SkipOption.Should().Be(null);
     expandTermToken.CountQueryOption.Should().Be(null);
     expandTermToken.LevelsOption.Should().Be(null);
     expandTermToken.SearchOption.Should().Be(null);
     expandTermToken.SelectOption.Should().BeNull();
     expandTermToken.ExpandOption.Should().BeNull();
 }
 public void SearchSetCorrectly()
 {
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      null /*filterOption*/,
                                                      null /*orderByOption*/,
                                                      null /*topOption*/,
                                                      null /*skipOption*/,
                                                      null /*countQueryOption*/,
                                                      null /*levelsOption*/,
                                                      new StringLiteralToken("searchMe") /*searchOption*/,
                                                      null /*selectOption*/,
                                                      null /*expandOption*/);
     expandTerm.SearchOption.ShouldBeStringLiteralToken("searchMe");
 }
 public void MultiLevelExpandTermTokenWorks()
 {
     ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null));
     ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), null,
                                                           new ExpandToken(new ExpandTermToken[]
                                                               {innerExpandTerm}));
     ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {outerExpandTerm});
     var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken));
     var subSelectExpand = item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And.SelectAndExpand;
     subSelectExpand.AllSelected.Should().BeTrue();
     subSelectExpand.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp())
         .And.SelectAndExpand.AllSelected.Should().BeTrue();
 }
 public void CombineChildNodesWorksForTwoPopulatedNodes()
 {
     // $expand=1($expand=2), 1($expand=3)
     ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null));
     ExpandToken innerExpand1 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 });
     ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                            null /*selectOption*/,
                                                            innerExpand1);
     ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null));
     ExpandToken innerExpand2 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 });
     ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                            null /*selectOption*/,
                                                            innerExpand2);
     ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
     IEnumerable<ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(outerExpandTerm1, outerExpandTerm2);
     combinedChildren.Should().Contain(innerExpandTerm1).And.Contain(innerExpandTerm2);
 }
 public void CombineChildNodesWorksForTwoEmptyNodes()
 {
     // $expand=1
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("1", null, null));
     ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
     IEnumerable<ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(expandTerm, expandTerm);
     combinedChildren.Count().Should().Be(0);
 }
        public void AddTermsWorksAtDeepLevel()
        {
            // $expand=1($expand=2($expand=3;);), 1($expand=2($expand=0;);)

            ExpandTermToken innerInnerExpandTerm1 = new ExpandTermToken(new NonSystemToken("3", null, null));
            ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null),
                                                                   null /*selectOption*/,
                                                                   new ExpandToken(new ExpandTermToken[] { innerInnerExpandTerm1 }));
            ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 }));

            ExpandTermToken innerInnerExpandTerm2 = new ExpandTermToken(new NonSystemToken("0", null, null));
            ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("2", null, null),
                                                                   null /*selectOption*/,
                                                                   new ExpandToken(new ExpandTermToken[] { innerInnerExpandTerm2 }));
            ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                    new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 }));
            ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
            var addedToken = expandTreeNormalizer.CombineTerms(outerExpandTerm1, outerExpandTerm2);
            addedToken.ShouldBeExpandTermToken("1", true)
                .And.ExpandOption.ExpandTerms.Single().ShouldBeExpandTermToken("2", true)
                .And.ExpandOption.ExpandTerms.Should().Contain(innerInnerExpandTerm1)
                .And.Contain(innerInnerExpandTerm2);
        }
 public void AddTermsDoesNothingForIdenticalTrees()
 {
     // $expand=1($expand=2;)
     ExpandToken innerExpand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("2", null, null)) });
     ExpandTermToken outerExpandToken = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                            null /*selectOption*/,
                                                            innerExpand);
     ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
     var addedToken = expandTreeNormalizer.CombineTerms(outerExpandToken, outerExpandToken);
     addedToken.ShouldBeExpandTermToken("1", true).And.ExpandOption.ExpandTerms.Single().ShouldBeExpandTermToken("2", true);
 }
 public void SelectSetCorrectly()
 {
     SelectToken select = new SelectToken(new PathSegmentToken[] { new NonSystemToken("1", null, null) });
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      null /*filterOption*/,
                                                      null /*orderByOption*/,
                                                      null /*topOption*/,
                                                      null /*skipOption*/,
                                                      null /*countQueryOption*/,
                                                      null /*levelsOption*/,
                                                      null /*searchOption*/,
                                                      select,
                                                      null /*expandOption*/);
     expandTerm.SelectOption.Properties.Count().Should().Be(1);
     expandTerm.SelectOption.Properties.ElementAt(0).ShouldBeNonSystemToken("1");
 }
 public void CanSelectPropertyOnNonEntityType()
 {
     ExpandTermToken expandTermToken = new ExpandTermToken(new SystemToken(ExpressionConstants.It, null), new SelectToken(new List<PathSegmentToken>(){new NonSystemToken("City", null, null)}), null );
     ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { expandTermToken });
     var item = this.binderForAddress.Bind(expandToken);
     item.SelectedItems.Single().ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetAddressCityProperty())));
 }
 public void LowerLevelEmptySelectedItemsListDoesNotThrow()
 {
     ExpandToken lowerLevelExpand = new ExpandToken(new List<ExpandTermToken>());
     ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", /*namedValues*/null, /*nextToken*/null), null, lowerLevelExpand);
     ExpandToken topLevelExpand = new ExpandToken(new List<ExpandTermToken>(){topLevelExpandTermToken});
     Action bindWithEmptySelectedItemsList = () => this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(topLevelExpand));
     bindWithEmptySelectedItemsList.ShouldNotThrow();
 }
        /// <summary>
        /// Collapse all redundant terms in an expand tree
        /// </summary>
        /// <param name="treeToCollapse">the tree to collapse</param>
        /// <returns>A new tree with all redundant terms collapsed.</returns>
        public ExpandToken CombineTerms(ExpandToken treeToCollapse)
        {
            var combinedTerms = new Dictionary<PathSegmentToken, ExpandTermToken>(new PathSegmentTokenEqualityComparer());
            foreach (ExpandTermToken termToken in treeToCollapse.ExpandTerms)
            {
                ExpandTermToken finalTermToken = termToken;
                if (termToken.ExpandOption != null)
                {
                    ExpandToken newSubExpand = CombineTerms(termToken.ExpandOption);
                    finalTermToken = new ExpandTermToken(
                                                              termToken.PathToNavProp,
                                                              termToken.FilterOption,
                                                              termToken.OrderByOptions,
                                                              termToken.TopOption,
                                                              termToken.SkipOption,
                                                              termToken.CountQueryOption,
                                                              termToken.LevelsOption,
                                                              termToken.SearchOption,
                                                              RemoveDuplicateSelect(termToken.SelectOption),
                                                              newSubExpand);
                }

                AddOrCombine(combinedTerms, finalTermToken);
            }

            return new ExpandToken(combinedTerms.Values);
        }
 public void ExpandSetCorrectly()
 {
     ExpandToken expand = new ExpandToken(new ExpandTermToken[]{new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                                                    null /*selectOption*/,
                                                                                    null /*expandOption*/ )});
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      null /*selectOption*/,
                                                      expand);
     expandTerm.ExpandOption.Should().NotBeNull();
 }
        /// <summary>
        /// Combine together the select clauses of two ExpandTermTokens
        /// </summary>
        /// <param name="existingToken">the already existing expand term token</param>
        /// <param name="newToken">the new expand term token to be added</param>
        /// <returns>A new select term containing each of the selected entries.</returns>
        private static SelectToken CombineSelects(ExpandTermToken existingToken, ExpandTermToken newToken)
        {
            if (existingToken.SelectOption == null)
            {
                return newToken.SelectOption;
            }

            if (newToken.SelectOption == null)
            {
                return existingToken.SelectOption;
            }

            List<PathSegmentToken> newSelects = existingToken.SelectOption.Properties.ToList();
            newSelects.AddRange(newToken.SelectOption.Properties);
            return new SelectToken(newSelects.Distinct(new PathSegmentTokenEqualityComparer()));
        }
 /// <summary>
 /// Add child options to a new dictionary
 /// </summary>
 /// <param name="newToken">the token with child nodes to add to the dictionary</param>
 /// <param name="combinedTerms">dictionary to add child nodes to</param>
 private void AddChildOptionsToDictionary(ExpandTermToken newToken, Dictionary<PathSegmentToken, ExpandTermToken> combinedTerms)
 {
     foreach (ExpandTermToken expandedTerm in newToken.ExpandOption.ExpandTerms)
     {
         AddOrCombine(combinedTerms, expandedTerm);
     }
 }
 /// <summary>
 /// Adds the expand token to the dictionary or combines it with an existing  or combines it with another existing token with an equivalent path.
 /// </summary>
 /// <param name="combinedTerms">The combined terms dictionary.</param>
 /// <param name="expandedTerm">The expanded term to add or combine.</param>
 private void AddOrCombine(IDictionary<PathSegmentToken, ExpandTermToken> combinedTerms, ExpandTermToken expandedTerm)
 {
     ExpandTermToken existingTerm;
     if (combinedTerms.TryGetValue(expandedTerm.PathToNavProp, out existingTerm))
     {
         combinedTerms[expandedTerm.PathToNavProp] = CombineTerms(expandedTerm, existingTerm);
     }
     else
     {
         combinedTerms.Add(expandedTerm.PathToNavProp, expandedTerm);
     }
 }
 public void OrderBySetCorrectly()
 {
     OrderByToken orderBy = new OrderByToken(new LiteralToken(1), OrderByDirection.Descending);
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      null /*filterOption*/,
                                                      new OrderByToken[] { orderBy },
                                                      null /*topOption*/,
                                                      null /*skipOption*/,
                                                      null /*countQueryOption*/,
                                                      null /*levelsOption*/,
                                                      null /*searchOption*/,
                                                      null /*selectOption*/,
                                                      null /*expandOption*/);
     expandTerm.OrderByOptions.Single().Kind.Should().Be(QueryTokenKind.OrderBy);
     expandTerm.OrderByOptions.Single().Expression.ShouldBeLiteralQueryToken(1);
 }
 public void SelectedAndExpandedNavPropProduceExpandedNavPropSelectionItemAndPathSelectionItem()
 {
     ExpandTermToken innerExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null));
     ExpandToken innerExpandToken = new ExpandToken(new ExpandTermToken[] { innerExpandTermToken });
     ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new SystemToken(ExpressionConstants.It, /*nextToken*/null), new SelectToken(new List<PathSegmentToken>(){new NonSystemToken("MyDog", /*namedValues*/null, /*nextToken*/null)}), innerExpandToken);
     ExpandToken topLevelExpandToken = new ExpandToken(new ExpandTermToken[]{topLevelExpandTermToken});
     var item = this.binderForPerson.Bind(topLevelExpandToken);
     item.SelectedItems.Should().HaveCount(2);
     item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp());
     item.SelectedItems.Last().ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetPeopleSet())));
 }
 public void AddTermsWorksForOneLevelBelow()
 {
     // $expand=1($expand=2;), 1($expand=3;)
     ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null));
     ExpandToken innerExpand1 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 });
     ExpandTermToken outerToken1 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                       null /*selectOption*/,
                                                       innerExpand1);
     ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null));
     ExpandToken innerExpand2 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 });
     ExpandTermToken outerToken2 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                       null /*selectOption*/,
                                                       innerExpand2);
     ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
     var addedToken = expandTreeNormalizer.CombineTerms(outerToken1, outerToken2);
     addedToken.ShouldBeExpandTermToken("1", true).And.ExpandOption.ExpandTerms.Should().Contain(innerExpandTerm2).And.Contain(innerExpandTerm1);
 }
 public void EntitySetCorrectlyPopulatedAtEachLevel()
 {
     ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null));
     ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null),
                                                           null,
                                                           new ExpandToken(new ExpandTermToken[] { innerExpandTerm }));
     ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { outerExpandTerm });
     var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken));
     var myDogExpandItem = item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And;
     myDogExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetDogsSet());
     var myPeopleExpandItem = myDogExpandItem.SelectAndExpand.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()).And;
     myPeopleExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetPeopleSet());
     myPeopleExpandItem.SelectAndExpand.SelectedItems.Should().BeEmpty();
 }
        public void AddTermsWorksForNestedMultipleTerms()
        {
            // $expand=1($expand=2($expand=5;),4;), 1($expand=2($expand=0;);)
            ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null),
                                                       null /*selectOption*/,
                                                       new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("5", null, null)) }));
            ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("4", null, null));
            ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   new ExpandToken(new ExpandTermToken[] { innerExpandTerm1, innerExpandTerm2 }));

            ExpandTermToken innerExpandTerm3 = new ExpandTermToken(new NonSystemToken("2", null, null),
                                                                   null /*selectOption*/,
                                                                   new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("0", null, null)) }));
            ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                                   null /*selectOption*/,
                                                                   new ExpandToken(new ExpandTermToken[] { innerExpandTerm3 }));
            ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
            var addedToken = expandTreeNormalizer.CombineTerms(outerExpandTerm1, outerExpandTerm2);
            addedToken.ShouldBeExpandTermToken("1", true).And.ExpandOption.ExpandTerms.Should().Contain(innerExpandTerm2);
            ExpandTermToken twoToken = addedToken.ExpandOption.ExpandTerms.FirstOrDefault(x => x.PathToNavProp.Identifier == "2");
            twoToken.ShouldBeExpandTermToken("2", true);
            ExpandTermToken fiveToken = twoToken.ExpandOption.ExpandTerms.FirstOrDefault(x => x.PathToNavProp.Identifier == "5");
            ExpandTermToken zeroToken = twoToken.ExpandOption.ExpandTerms.FirstOrDefault(x => x.PathToNavProp.Identifier == "0");
            fiveToken.ShouldBeExpandTermToken("5", true);
            zeroToken.ShouldBeExpandTermToken("0", true);
        }
 public void SkipSetCorrectly()
 {
     long skip = 1;
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      null /*filterOption*/,
                                                      null /*orderByOption*/,
                                                      null /*topOption*/,
                                                      skip,
                                                      null /*countQueryOption*/,
                                                      null /*levelsOption*/,
                                                      null /*searchOption*/,
                                                      null /*selectOption*/,
                                                      null /*expandOption*/);
     expandTerm.SkipOption.Should().Be(1);
 }
 public void CombineChildNodesWorksForSingleEmptyNode()
 {
     // $expand=1($expand=2;), 1
     ExpandToken innerExpand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("2", null, null)) });
     ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null),
                                                            null /*selectOption*/,
                                                            innerExpand);
     ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null));
     ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer();
     IEnumerable<ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(outerExpandTerm1, outerExpandTerm2);
     combinedChildren.Single().ShouldBeExpandTermToken("2", false);
 }
 public void LevelsSetCorrectly()
 {
     ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null),
                                                      null /*filterOption*/,
                                                      null /*orderByOption*/,
                                                      null /*topOption*/,
                                                      null /*skipOption*/,
                                                      null /*countQueryOption*/,
                                                      3 /*levelsOption*/,
                                                      null /*searchOption*/,
                                                      null /*selectOption*/,
                                                      null /*expandOption*/);
     expandTerm.LevelsOption.Should().Be(3);
 }
 public void SelectIsBasedOnTheCurrentLevel()
 {
     ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null));
     ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null),
                                                           new SelectToken(new List<PathSegmentToken>()
                                                               {
                                                                   new NonSystemToken("Color", null, null)
                                                               }),
                                                           new ExpandToken(new ExpandTermToken[]
                                                               {innerExpandTerm}));
     ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {outerExpandTerm});
     var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken));
     var subExpand =
         item.SelectedItems.First()
             .ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp())
             .And.SelectAndExpand;
     subExpand.AllSelected.Should().BeFalse();
     subExpand.SelectedItems.Single(x => x is ExpandedNavigationSelectItem).ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp())
         .And.SelectAndExpand.AllSelected.Should().BeTrue();
     subExpand.SelectedItems.Last(x => x is PathSelectItem).ShouldBePathSelectionItem(new ODataPath( new PropertySegment(HardCodedTestModel.GetDogColorProp())));
 }
 /// <summary>
 /// Combine a top level select and expand token
 /// </summary>
 /// <param name="expand">the original expand token</param>
 /// <param name="select">the original select token</param>
 /// <returns>A new ExpandToken with the original select token embedded within a new top level expand token.</returns>
 public static ExpandToken Combine(ExpandToken expand, SelectToken select)
 {
     // build a new top level expand token embedding the top level select token.
     ExpandTermToken newTopLevelExpandTerm = new ExpandTermToken(new SystemToken(ExpressionConstants.It, null), select, expand);
     return new ExpandToken(new List<ExpandTermToken>() { newTopLevelExpandTerm });
 }