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); }