public void Property_Container_RoundTrips() { SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity>(); Assert.Reflection.Property( wrapper, w => w.Container, expectedDefaultValue: null, allowNull: true, roundTripTestValue: new MockPropertyContainer()); }
public void GetEdmType_Returns_TypeFromTypeNameIfNotNull() { SelectExpandWrapper<int> wrapper = new SelectExpandWrapper<int> { TypeName = _model.Customer.FullName(), ModelID = _modelID }; IEdmTypeReference result = wrapper.GetEdmType(); Assert.Same(_model.Customer, result.Definition); }
public void GetEdmType_ThrowsODataException_IfTypeFromTypeNameIsNotFoundInModel() { _modelID = ModelContainer.GetModelID(EdmCoreModel.Instance); SelectExpandWrapper<int> wrapper = new SelectExpandWrapper<int> { TypeName = _model.Customer.FullName(), ModelID = _modelID }; Assert.Throws<InvalidOperationException>( () => wrapper.GetEdmType(), "Cannot find the entity type 'NS.Customer' in the model."); }
public void GetEdmType_Returns_ElementTypeIfInstanceIsNull() { _model.Model.SetAnnotationValue(_model.Customer, new ClrTypeAnnotation(typeof(TestEntity))); _model.Model.SetAnnotationValue(_model.SpecialCustomer, new ClrTypeAnnotation(typeof(DerivedEntity))); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity> { ModelID = _modelID }; IEdmTypeReference edmType = wrapper.GetEdmType(); Assert.Same(_model.Customer, edmType.Definition); }
public void ToDictionary_ContainsAllProperties_FromContainer() { // Arrange EdmModel model = new EdmModel(); EdmEntityType entityType = new EdmEntityType("NS", "Name"); model.AddElement(entityType); model.SetAnnotationValue(entityType, new ClrTypeAnnotation(typeof(TestEntity))); entityType.AddStructuralProperty("SampleProperty", EdmPrimitiveTypeKind.Int32); MockPropertyContainer container = new MockPropertyContainer(); container.Properties.Add("Property", 42); SelectExpandWrapper <TestEntity> wrapper = new SelectExpandWrapper <TestEntity> { Container = container, Model = model }; // Act var result = wrapper.ToDictionary(); // Assert Assert.Equal(42, result["Property"]); }
public void ProjectAsWrapper_Element_ProjectedValueContainsInstance_IfSelectionIsAll(string select) { // Arrange Customer customer = new Customer(); ODataQueryOptionParser parser = new ODataQueryOptionParser( _model.Model, _model.Customer, _model.Customers, new Dictionary <string, string> { { "$select", select }, { "$expand", "Orders" } }); SelectExpandClause selectExpand = parser.ParseSelectAndExpand(); Expression source = Expression.Constant(customer); // Act Expression projection = _binder.ProjectAsWrapper(source, selectExpand, _model.Customer, _model.Customers); // Assert Assert.Equal(ExpressionType.MemberInit, projection.NodeType); Assert.NotEmpty((projection as MemberInitExpression).Bindings.Where(p => p.Member.Name == "Instance")); SelectExpandWrapper <Customer> customerWrapper = Expression.Lambda(projection).Compile().DynamicInvoke() as SelectExpandWrapper <Customer>; Assert.Same(customer, customerWrapper.Instance); }
public void ProjectAsWrapper_NullExpandedProperty_HasNullValueInProjectedWrapper() { // Arrange IPropertyMapper mapper = new IdentityPropertyMapper(); Order order = new Order(); ExpandedNavigationSelectItem expandItem = new ExpandedNavigationSelectItem( new ODataExpandPath(new NavigationPropertySegment(_model.Order.NavigationProperties().Single(), navigationSource: _model.Customers)), _model.Customers, selectExpandOption: null); SelectExpandClause selectExpand = new SelectExpandClause(new SelectItem[] { expandItem }, allSelected: true); Expression source = Expression.Constant(order); _model.Model.SetAnnotationValue(_model.Order, new DynamicPropertyDictionaryAnnotation(typeof(Order).GetProperty("OrderProperties"))); // Act Expression projection = _binder.ProjectAsWrapper(source, selectExpand, _model.Order, _model.Orders); // Assert SelectExpandWrapper <Order> projectedOrder = Expression.Lambda(projection).Compile().DynamicInvoke() as SelectExpandWrapper <Order>; Assert.NotNull(projectedOrder); Assert.Contains("Customer", projectedOrder.Container.ToDictionary(mapper).Keys); Assert.Null(projectedOrder.Container.ToDictionary(mapper)["Customer"]); }
public void TryGetValue_ReturnsValueFromInstance_IfNotPresentInContainer() { object expectedPropertyValue = new object(); MockPropertyContainer container = new MockPropertyContainer(); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity> { ModelID = _modelID, Container = container }; wrapper.Instance = new TestEntity { SampleProperty = expectedPropertyValue }; object value; bool result = wrapper.TryGetPropertyValue("SampleProperty", out value); Assert.True(result); Assert.Same(expectedPropertyValue, value); }
public void Property_Instance_RoundTrips() { SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity>(); Assert.Reflection.Property(wrapper, w => w.Instance, expectedDefaultValue: null, allowNull: true, roundTripTestValue: new TestEntity()); }
public void ToDictionary_ContainsAllProperties_FromContainer() { // Arrange MockPropertyContainer container = new MockPropertyContainer(); container.Properties.Add("Property", 42); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity> { Container = container }; // Act var result = wrapper.ToDictionary(); // Assert Assert.Equal(42, result["Property"]); }
public void ToDictionary_ContainsAllStructuralProperties_IfInstanceIsNotNull() { // Arrange EdmModel model = new EdmModel(); EdmEntityType entityType = new EdmEntityType("NS", "Name"); model.AddElement(entityType); model.SetAnnotationValue(entityType, new ClrTypeAnnotation(typeof(TestEntity))); entityType.AddStructuralProperty("SampleProperty", EdmPrimitiveTypeKind.Int32); IEdmTypeReference edmType = new EdmEntityTypeReference(entityType, isNullable: false); SelectExpandWrapper<TestEntity> testWrapper = new SelectExpandWrapper<TestEntity> { Instance = new TestEntity { SampleProperty = 42 }, ModelID = ModelContainer.GetModelID(model) }; // Act var result = testWrapper.ToDictionary(); // Assert Assert.Equal(42, result["SampleProperty"]); }
public void TryGetValue_ReturnsFalse_IfPropertyNotPresentInElement() { SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity>(); object value; bool result = wrapper.TryGetValue("SampleNotPresentProperty", out value); Assert.False(result); }
public void TryGetValue_ReturnsFalse_IfContainerAndInstanceAreNull() { SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity>(); object value; bool result = wrapper.TryGetValue("SampleProperty", out value); Assert.False(result); }
public void TryGetValue_ReturnsValueFromInstance_IfContainerIsNull() { object expectedPropertyValue = new object(); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity>(); wrapper.Instance = new TestEntity { SampleProperty = expectedPropertyValue }; object value; bool result = wrapper.TryGetValue("SampleProperty", out value); Assert.True(result); Assert.Same(expectedPropertyValue, value); }
public void ToDictionary_Throws_IfMapperProviderIsNull() { // Arrange SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity>(); // Act & Assert Assert.Throws<ArgumentNullException>(() => wrapper.ToDictionary(mapperProvider: null)); }
public void ToDictionary_Throws_IfMapperProvider_ReturnsNullPropertyMapper() { // Arrange EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddStructuralProperty("SampleProperty", EdmPrimitiveTypeKind.Int32); EdmModel model = new EdmModel(); model.AddElement(entityType); model.SetAnnotationValue(entityType, new ClrTypeAnnotation(typeof(TestEntity))); IEdmTypeReference edmType = new EdmEntityTypeReference(entityType, isNullable: false); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity> { Instance = new TestEntity { SampleProperty = 42 }, ModelID = ModelContainer.GetModelID(model) }; Func<IEdmModel, IEdmStructuredType, IPropertyMapper> mapperProvider = (IEdmModel m, IEdmStructuredType t) => null; // Act & Assert Assert.Throws<InvalidOperationException>(() => wrapper.ToDictionary(mapperProvider: mapperProvider), "The mapper provider must return a valid 'System.Web.Http.OData.Query.IPropertyMapper' instance for the given 'NS.Name' IEdmType."); }
public void SelectExpandBinder_BindsComputedPropertyInExpand_FromDollarCompute() { // Arrange QueryClause clause = CreateQueryClause("$expand=Orders($select=Title,Tax;$compute=Amount mul TaxRate as Tax)", _model, typeof(ComputeCustomer)); ODataQuerySettings querySettings = new ODataQuerySettings(); SelectExpandBinder binder = new SelectExpandBinder(); QueryBinderContext context = new QueryBinderContext(_model, querySettings, typeof(ComputeCustomer)); if (clause.Compute != null) { context.AddComputedProperties(clause.Compute.ComputedItems); } // Act Expression selectExp = binder.BindSelectExpand(clause.SelectExpand, context); // Assert Assert.NotNull(selectExp); string resultExpression = ExpressionStringBuilder.ToString(selectExp); Assert.Equal("$it => new SelectAllAndExpand`1() {Model = Microsoft.OData.Edm.EdmModel, " + "Instance = $it, UseInstanceForProperties = True, " + "Container = new NamedPropertyWithNext0`1() " + "{" + "Name = Orders, " + "Value = $it.Orders.Select($it => new SelectSome`1() " + "{" + "Model = Microsoft.OData.Edm.EdmModel, " + "Container = new NamedPropertyWithNext1`1() " + "{" + "Name = Title, " + "Value = $it.Title, " + "Next0 = new NamedProperty`1() {Name = Tax, Value = (Convert($it.Amount) * $it.TaxRate), }, " + "Next1 = new AutoSelectedNamedProperty`1() " + "{" + "Name = Id, Value = Convert($it.Id), " + "}, " + "}, " + "}), " + "Next0 = new NamedProperty`1() {Name = Dynamics, Value = $it.Dynamics, }, }, }", resultExpression); ComputeCustomer customer = new ComputeCustomer { Orders = new List <ComputeOrder> { new ComputeOrder { Title = "Kerry", Amount = 4, TaxRate = 0.35 }, new ComputeOrder { Title = "WU", Amount = 6, TaxRate = 0.5 }, new ComputeOrder { Title = "XU", Amount = 5, TaxRate = 0.12 }, } }; IDictionary <string, object> result = SelectExpandBinderTest.InvokeSelectExpand(customer, selectExp); Assert.Equal(8, result.Count); // Because it's select-all int idx = 0; var ordersValue = result["Orders"] as IEnumerable; foreach (var order in ordersValue) { SelectExpandWrapper itemWrapper = order as SelectExpandWrapper; var orderDic = itemWrapper.ToDictionary(); Assert.Equal(customer.Orders[idx].Title, orderDic["Title"]); Assert.Equal(customer.Orders[idx].Amount * customer.Orders[idx].TaxRate, orderDic["Tax"]); idx++; } }
public void ToDictionary_AppliesMappingToAllProperties_IfInstanceIsNotNull() { // Arrange EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddStructuralProperty("SampleProperty", EdmPrimitiveTypeKind.Int32); EdmModel model = new EdmModel(); model.AddElement(entityType); model.SetAnnotationValue(entityType, new ClrTypeAnnotation(typeof(TestEntity))); IEdmTypeReference edmType = new EdmEntityTypeReference(entityType, isNullable: false); SelectExpandWrapper<TestEntity> testWrapper = new SelectExpandWrapper<TestEntity> { Instance = new TestEntity { SampleProperty = 42 }, ModelID = ModelContainer.GetModelID(model) }; Mock<IPropertyMapper> mapperMock = new Mock<IPropertyMapper>(); mapperMock.Setup(m => m.MapProperty("SampleProperty")).Returns("Sample"); Func<IEdmModel, IEdmStructuredType, IPropertyMapper> mapperProvider = (IEdmModel m, IEdmStructuredType t) => mapperMock.Object; // Act var result = testWrapper.ToDictionary(mapperProvider); // Assert Assert.Equal(42, result["Sample"]); }
public void ToDictionary_Throws_IfMappingIsNullOrEmpty_ForAGivenProperty(string propertyMapping) { // Arrange EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddStructuralProperty("SampleProperty", EdmPrimitiveTypeKind.Int32); EdmModel model = new EdmModel(); model.AddElement(entityType); model.SetAnnotationValue(entityType, new ClrTypeAnnotation(typeof(TestEntity))); IEdmTypeReference edmType = new EdmEntityTypeReference(entityType, isNullable: false); SelectExpandWrapper<TestEntity> testWrapper = new SelectExpandWrapper<TestEntity> { Instance = new TestEntity { SampleProperty = 42 }, ModelID = ModelContainer.GetModelID(model) }; Mock<IPropertyMapper> mapperMock = new Mock<IPropertyMapper>(); mapperMock.Setup(m => m.MapProperty("SampleProperty")).Returns(propertyMapping); Func<IEdmModel, IEdmStructuredType, IPropertyMapper> mapperProvider = (IEdmModel m, IEdmStructuredType t) => mapperMock.Object; // Act & Assert Assert.Throws<InvalidOperationException>(() => testWrapper.ToDictionary(mapperProvider), "The key mapping for the property 'SampleProperty' can't be null or empty."); }
public void TryGetValue_PropertyAliased_IfAnnotationSet() { // Arrange _model.Model.SetAnnotationValue(_model.Customer, new ClrTypeAnnotation(typeof(TestEntityWithAlias))); _model.Model.SetAnnotationValue( _model.CustomerName, new ClrPropertyInfoAnnotation(typeof(TestEntityWithAlias).GetProperty("SampleProperty"))); object expectedPropertyValue = new object(); SelectExpandWrapper<TestEntityWithAlias> wrapper = new SelectExpandWrapper<TestEntityWithAlias> { ModelID = _modelID }; wrapper.Instance = new TestEntityWithAlias { SampleProperty = expectedPropertyValue }; // Act object value; bool result = wrapper.TryGetPropertyValue("Name", out value); // Assert Assert.True(result); Assert.Same(expectedPropertyValue, value); }
public void Property_Instance_RoundTrips() { SelectExpandWrapper <TestEntity> wrapper = new SelectExpandWrapper <TestEntity>(); ReflectionAssert.Property(wrapper, w => w.Instance, expectedDefaultValue: null, allowNull: true, roundTripTestValue: new TestEntity()); }
public void TryGetValue_ReturnsValueFromPropertyContainer_IfPresent() { object expectedPropertyValue = new object(); MockPropertyContainer container = new MockPropertyContainer(); container.Properties.Add("SampleProperty", expectedPropertyValue); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity> { Container = container }; wrapper.Instance = new TestEntity(); object value; bool result = wrapper.TryGetValue("SampleProperty", out value); Assert.True(result); Assert.Same(expectedPropertyValue, value); }
public void ToDictionary_ContainsAllProperties_FromContainer() { // Arrange EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddStructuralProperty("SampleProperty", EdmPrimitiveTypeKind.Int32); EdmModel model = new EdmModel(); model.AddElement(entityType); model.SetAnnotationValue(entityType, new ClrTypeAnnotation(typeof(TestEntity))); MockPropertyContainer container = new MockPropertyContainer(); container.Properties.Add("Property", 42); SelectExpandWrapper<TestEntity> wrapper = new SelectExpandWrapper<TestEntity> { Container = container, ModelID = ModelContainer.GetModelID(model) }; // Act var result = wrapper.ToDictionary(); // Assert Assert.Equal(42, result["Property"]); }