Example #1
0
        public void SelectProperties_OnSubPropertyWithTypeCastFromComplex_SelectsExpectedProperties()
        {
            // Arrange
            EdmComplexType subComplexType = new EdmComplexType("NS", "CnAddress", _model.Address);

            subComplexType.AddStructuralProperty("SubAddressProperty", EdmPrimitiveTypeKind.String);
            subComplexType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo
            {
                Name = "CnAddressOrderNav",
                TargetMultiplicity = EdmMultiplicity.One,
                Target             = _model.Order
            });
            _model.Model.AddElement(subComplexType);

            string select = "Address/NS.CnAddress/SubAddressProperty";
            string expand = "Address/NS.CnAddress/CnAddressOrderNav";

            SelectExpandClause selectExpandClause = ParseSelectExpand(select, expand);

            // Act
            SelectExpandNode selectExpandNode = new SelectExpandNode(selectExpandClause, _model.Customer, _model.Model);

            // Assert: Top Level
            Assert.Null(selectExpandNode.SelectedStructuralProperties);
            Assert.Null(selectExpandNode.SelectedNavigationProperties);
            Assert.Null(selectExpandNode.ExpandedProperties); // Not expanded at first level

            Assert.NotNull(selectExpandNode.SelectedComplexProperties);
            var firstLevelSelected = Assert.Single(selectExpandNode.SelectedComplexProperties);

            Assert.Equal("Address", firstLevelSelected.Key.Name);

            Assert.NotNull(firstLevelSelected.Value);
            Assert.NotNull(firstLevelSelected.Value.SelectAndExpand);

            // Assert: Second Level
            {
                // use the base type to test
                SelectExpandNode subSelectExpandNode = new SelectExpandNode(firstLevelSelected.Value.SelectAndExpand, _model.Address, _model.Model);
                Assert.Null(subSelectExpandNode.SelectedStructuralProperties);
                Assert.Null(subSelectExpandNode.SelectedComplexProperties);
                Assert.Null(subSelectExpandNode.ExpandedProperties);
                Assert.Null(subSelectExpandNode.SelectedNavigationProperties);
            }
            {
                // use the sub type to test
                SelectExpandNode subSelectExpandNode = new SelectExpandNode(firstLevelSelected.Value.SelectAndExpand, subComplexType, _model.Model);
                Assert.Null(subSelectExpandNode.SelectedComplexProperties);
                Assert.NotNull(subSelectExpandNode.SelectedStructuralProperties);
                Assert.Equal("SubAddressProperty", Assert.Single(subSelectExpandNode.SelectedStructuralProperties).Name);

                Assert.NotNull(subSelectExpandNode.ExpandedProperties);
                var expandedProperty = Assert.Single(subSelectExpandNode.ExpandedProperties);
                Assert.Equal("CnAddressOrderNav", expandedProperty.Key.Name);

                Assert.NotNull(expandedProperty.Value);
                Assert.NotNull(expandedProperty.Value.SelectAndExpand);
                Assert.True(expandedProperty.Value.SelectAndExpand.AllSelected);
                Assert.Empty(expandedProperty.Value.SelectAndExpand.SelectedItems);
            }
        }
        private static EdmModel GetModel()
        {
            var model = new EdmModel();

            var person   = new EdmEntityType("DefaultNs", "Person");
            var entityId = person.AddStructuralProperty("UserName", EdmCoreModel.Instance.GetString(false));

            person.AddKeys(entityId);

            var employee = new EdmEntityType("DefaultNs", "Employee", person);

            var city   = new EdmEntityType("DefaultNs", "City");
            var cityId = city.AddStructuralProperty("ZipCode", EdmCoreModel.Instance.GetInt32(false));

            city.AddKeys(cityId);

            var personCity   = new EdmEntityType("DefaultNs", "PersonCity");
            var personcityId = personCity.AddStructuralProperty("ZipCode", EdmCoreModel.Instance.GetInt32(false));

            personCity.AddKeys(personcityId);

            var city3   = new EdmEntityType("DefaultNs", "City3");
            var cityId3 = city.AddStructuralProperty("ZipCode3", EdmCoreModel.Instance.GetInt32(false));

            city.AddKeys(cityId3);

            var region   = new EdmEntityType("DefaultNs", "Region");
            var regionId = region.AddStructuralProperty("Name", EdmCoreModel.Instance.GetString(false));

            region.AddKeys(regionId);

            var cityRegion = city.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo()
            {
                Name               = "Region",
                Target             = region,
                TargetMultiplicity = EdmMultiplicity.One,
            });

            var complex = new EdmComplexType("DefaultNs", "Address");

            complex.AddStructuralProperty("Road", EdmCoreModel.Instance.GetString(false));

            var subcomplex = new EdmComplexType("DefaultNs", "SubAddress");

            subcomplex.AddStructuralProperty("SubRoad", EdmCoreModel.Instance.GetString(false));

            complex.AddStructuralProperty("SubAddress", new EdmComplexTypeReference(subcomplex, false));

            var navP = complex.AddUnidirectionalNavigation(
                new EdmNavigationPropertyInfo()
            {
                Name               = "City",
                Target             = city,
                TargetMultiplicity = EdmMultiplicity.One,
            });

            var navP3 = complex.AddUnidirectionalNavigation(
                new EdmNavigationPropertyInfo()
            {
                Name               = "City3",
                Target             = city3,
                TargetMultiplicity = EdmMultiplicity.One,
            });


            var derivedComplex = new EdmComplexType("DefaultNs", "WorkAddress", complex);
            var navP2          = derivedComplex.AddUnidirectionalNavigation(
                new EdmNavigationPropertyInfo()
            {
                Name               = "City2",
                Target             = city,
                TargetMultiplicity = EdmMultiplicity.One,
            });

            complex.AddStructuralProperty("WorkAddress", new EdmComplexTypeReference(complex, false));

            person.AddStructuralProperty("Address", new EdmComplexTypeReference(complex, false));
            person.AddStructuralProperty("Addresses", new EdmCollectionTypeReference(new EdmCollectionType(new EdmComplexTypeReference(complex, false))));
            var navP4 = person.AddUnidirectionalNavigation(
                new EdmNavigationPropertyInfo()
            {
                Name               = "PersonCity",
                Target             = personCity,
                TargetMultiplicity = EdmMultiplicity.One,
            });

            model.AddElement(person);
            model.AddElement(employee);
            model.AddElement(city);
            model.AddElement(personCity);
            model.AddElement(city3);
            model.AddElement(region);
            model.AddElement(complex);
            model.AddElement(derivedComplex);

            var entityContainer = new EdmEntityContainer("DefaultNs", "Container");

            model.AddElement(entityContainer);
            EdmEntitySet people  = new EdmEntitySet(entityContainer, "People", person);
            EdmEntitySet cities  = new EdmEntitySet(entityContainer, "City", city);
            EdmEntitySet pcities = new EdmEntitySet(entityContainer, "PersonCity", personCity);
            EdmEntitySet regions = new EdmEntitySet(entityContainer, "Regions", region);

            people.AddNavigationTarget(navP, cities, new EdmPathExpression("Address/City"));
            people.AddNavigationTarget(navP3, cities, new EdmPathExpression("Address/City3"));
            people.AddNavigationTarget(navP, cities, new EdmPathExpression("Addresses/City"));
            people.AddNavigationTarget(navP2, cities, new EdmPathExpression("Address/WorkAddress/DefaultNs.WorkAddress/City2"));
            people.AddNavigationTarget(navP4, pcities, new EdmPathExpression("PersonCity"));


            cities.AddNavigationTarget(cityRegion, regions);
            entityContainer.AddElement(people);
            entityContainer.AddElement(cities);
            entityContainer.AddElement(pcities);

            return(model);
        }