public void Read_Roundtrip_PrimitiveCollection() { // Arrange int[] numbers = Enumerable.Range(0, 100).ToArray(); ODataCollectionSerializer serializer = new ODataCollectionSerializer(SerializerProvider); ODataCollectionDeserializer deserializer = new ODataCollectionDeserializer(DeserializerProvider); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, settings, Model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), Model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = Model }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = Model }; // Act serializer.WriteObject(numbers, numbers.GetType(), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); IEnumerable readnumbers = deserializer.Read(messageReader, typeof(int[]), readContext) as IEnumerable; // Assert Assert.Equal(numbers, readnumbers.Cast <int>()); }
public void Read_Roundtrip_EnumCollection() { // Arrange Color[] colors = { Color.Blue, Color.Green }; ODataCollectionSerializer serializer = new ODataCollectionSerializer(SerializerProvider); ODataCollectionDeserializer deserializer = new ODataCollectionDeserializer(DeserializerProvider); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, settings, Model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), Model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = Model }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = Model }; // Act serializer.WriteObject(colors, colors.GetType(), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); IEnumerable readAddresses = deserializer.Read(messageReader, typeof(Color[]), readContext) as IEnumerable; // Assert Assert.Equal(colors, readAddresses.Cast <Color>()); }
/// <summary> /// Initializes a new instance of the <see cref="DefaultODataDeserializerProvider"/> class. /// </summary> public DefaultODataDeserializerProvider() { _actionPayloadDeserializer = new ODataActionPayloadDeserializer(this); _entityDeserializer = new ODataEntityDeserializer(this); _feedDeserializer = new ODataFeedDeserializer(this); _collectionDeserializer = new ODataCollectionDeserializer(this); _complexDeserializer = new ODataComplexTypeDeserializer(this); }
public void ReadInline_ThrowsArgumentNull_EdmType() { var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); Assert.ThrowsArgumentNull( () => deserializer.ReadInline(42, null, new ODataDeserializerContext()), "edmType"); }
public void ReadInline_ReturnsNull_IfItemIsNull() { // Arrange var deserializer = new ODataCollectionDeserializer(DeserializerProvider); // Act & Assert Assert.Null(deserializer.ReadInline(item: null, edmType: IntCollectionType, readContext: new ODataDeserializerContext())); }
public void ReadInline_ThrowsArgument_ArgumentMustBeOfType() { var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); Assert.Throws <ArgumentException>( () => deserializer.ReadInline(42, _intCollectionType, new ODataDeserializerContext()), "The argument must be of type 'ODataCollectionValue'.\r\nParameter name: item"); }
public void Read_ThrowsArgumentNull_MessageReader() { var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); Assert.ThrowsArgumentNull( () => deserializer.Read(messageReader: null, type: typeof(int[]), readContext: new ODataDeserializerContext()), "messageReader"); }
public void ReadCollectionValue_ThrowsArgumentNull_ElementType() { var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); Assert.ThrowsArgumentNull( () => deserializer.ReadCollectionValue(new ODataCollectionValue(), elementType: null, readContext: new ODataDeserializerContext()).GetEnumerator().MoveNext(), "elementType"); }
public void ReadInline_ThrowsArgumentNull_EdmType() { // Arrange var deserializer = new ODataCollectionDeserializer(DeserializerProvider); // Act & Assert Assert.ThrowsArgumentNull( () => deserializer.ReadInline(42, null, new ODataDeserializerContext()), "edmType"); }
public void Read_ThrowsArgumentNull_MessageReader() { // Arrange var deserializer = new ODataCollectionDeserializer(DeserializerProvider); // Act & Assert Assert.ThrowsArgumentNull( () => deserializer.Read(messageReader: null, type: typeof(int[]), readContext: new ODataDeserializerContext()), "messageReader"); }
public void ReadCollectionValue_ThrowsArgumentNull_CollectionValue() { // Arrange var deserializer = new ODataCollectionDeserializer(DeserializerProvider); // Act & Assert Assert.ThrowsArgumentNull(() => deserializer.ReadCollectionValue(collectionValue: null, elementType: IntCollectionType.ElementType(), readContext: new ODataDeserializerContext()).GetEnumerator().MoveNext(), "collectionValue"); }
public void Read_ThrowsArgumentMustBeOfType_Type() { var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); Assert.ThrowsArgument( () => deserializer.Read(messageReader: ODataTestUtil.GetMockODataMessageReader(), type: typeof(int), readContext: new ODataDeserializerContext { Model = _model }), "type", "The argument must be of type 'Collection'."); }
public void ReadCollectionValue_Throws_IfElementTypeCannotBeDeserialized() { Mock <ODataDeserializerProvider> deserializerProvider = new Mock <ODataDeserializerProvider>(); deserializerProvider.Setup(p => p.GetEdmTypeDeserializer(_addressType)).Returns <ODataEntityDeserializer>(null); var deserializer = new ODataCollectionDeserializer(deserializerProvider.Object); Assert.Throws <SerializationException>( () => deserializer.ReadCollectionValue(new ODataCollectionValue() { Items = new[] { 1, 2, 3 } }, _addressCollectionType.ElementType(), new ODataDeserializerContext()) .GetEnumerator() .MoveNext(), "'System.Web.OData.Formatter.Serialization.Models.Address' cannot be deserialized using the ODataMediaTypeFormatter."); }
public void ReadCollectionValue_Throws_IfElementTypeCannotBeDeserialized() { // Arrange Mock <ODataDeserializerProvider> deserializerProvider = new Mock <ODataDeserializerProvider>(); deserializerProvider.Setup(p => p.GetEdmTypeDeserializer(ColorType)).Returns <ODataResourceDeserializer>(null); var deserializer = new ODataCollectionDeserializer(deserializerProvider.Object); // Act & Assert Assert.Throws <SerializationException>( () => deserializer.ReadCollectionValue(new ODataCollectionValue() { Items = new[] { 1, 2, 3 }.Cast <object>() }, ColorCollectionType.ElementType(), new ODataDeserializerContext()) .GetEnumerator() .MoveNext(), "'NS.Color' cannot be deserialized using the ODataMediaTypeFormatter."); }
public void Read_Roundtrip_ComplexCollection() { Address[] addresses = new[] { new Address { City = "Redmond", ZipCode = "1", Street = "A", State = "123" }, new Address { City = "Seattle", ZipCode = "2", Street = "S", State = "321" } }; ODataCollectionSerializer serializer = new ODataCollectionSerializer(new DefaultODataSerializerProvider()); ODataCollectionDeserializer deserializer = new ODataCollectionDeserializer(_deserializerProvider); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, settings, _model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), _model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = _model }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = _model }; serializer.WriteObject(addresses, addresses.GetType(), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); IEnumerable readAddresses = deserializer.Read(messageReader, typeof(Address[]), readContext) as IEnumerable; Assert.Equal(addresses, readAddresses.Cast <Address>(), new AddressComparer()); }
public void Read_ReturnsEdmComplexObjectCollection_TypelessMode() { // Arrange HttpContent content = new StringContent("{ 'value': [ { 'City' : 'Redmond' } ] }"); content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); IODataRequestMessage request = new ODataMessageWrapper(content.ReadAsStreamAsync().Result, content.Headers); ODataMessageReader reader = new ODataMessageReader(request, new ODataMessageReaderSettings(), _model); var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); ODataDeserializerContext readContext = new ODataDeserializerContext { Model = _model, ResourceType = typeof(IEdmObject), ResourceEdmType = _addressCollectionType }; // Act var result = deserializer.Read(reader, typeof(IEdmObject), readContext); // Assert IEdmObject edmObject = Assert.IsType <EdmComplexObjectCollection>(result); Assert.Equal(_addressCollectionType, edmObject.GetEdmType()); }
public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } IEdmAction action = GetAction(readContext); Contract.Assert(action != null); // Create the correct resource type; Dictionary <string, object> payload; if (type == typeof(ODataActionParameters)) { payload = new ODataActionParameters(); } else { payload = new ODataUntypedActionParameters(action); } ODataParameterReader reader = messageReader.CreateODataParameterReader(action); while (reader.Read()) { string parameterName = null; IEdmOperationParameter parameter = null; switch (reader.State) { case ODataParameterReaderState.Value: parameterName = reader.Name; parameter = action.Parameters.SingleOrDefault(p => p.Name == parameterName); // ODataLib protects against this but asserting just in case. Contract.Assert(parameter != null, String.Format(CultureInfo.InvariantCulture, "Parameter '{0}' not found.", parameterName)); if (parameter.Type.IsPrimitive()) { payload[parameterName] = reader.Value; } else { ODataEdmTypeDeserializer deserializer = DeserializerProvider.GetEdmTypeDeserializer(parameter.Type); payload[parameterName] = deserializer.ReadInline(reader.Value, parameter.Type, readContext); } break; case ODataParameterReaderState.Collection: parameterName = reader.Name; parameter = action.Parameters.SingleOrDefault(p => p.Name == parameterName); // ODataLib protects against this but asserting just in case. Contract.Assert(parameter != null, String.Format(CultureInfo.InvariantCulture, "Parameter '{0}' not found.", parameterName)); IEdmCollectionTypeReference collectionType = parameter.Type as IEdmCollectionTypeReference; Contract.Assert(collectionType != null); ODataCollectionValue value = ODataCollectionDeserializer.ReadCollection(reader.CreateCollectionReader()); ODataCollectionDeserializer collectionDeserializer = (ODataCollectionDeserializer)DeserializerProvider.GetEdmTypeDeserializer(collectionType); payload[parameterName] = collectionDeserializer.ReadInline(value, collectionType, readContext); break; case ODataParameterReaderState.Resource: parameterName = reader.Name; parameter = action.Parameters.SingleOrDefault(p => p.Name == parameterName); Contract.Assert(parameter != null, String.Format(CultureInfo.InvariantCulture, "Parameter '{0}' not found.", parameterName)); Contract.Assert(parameter.Type.IsStructured()); ODataReader resourceReader = reader.CreateResourceReader(); object item = resourceReader.ReadResourceOrResourceSet(); ODataResourceDeserializer resourceDeserializer = (ODataResourceDeserializer)DeserializerProvider.GetEdmTypeDeserializer(parameter.Type); payload[parameterName] = resourceDeserializer.ReadInline(item, parameter.Type, readContext); break; case ODataParameterReaderState.ResourceSet: parameterName = reader.Name; parameter = action.Parameters.SingleOrDefault(p => p.Name == parameterName); Contract.Assert(parameter != null, String.Format(CultureInfo.InvariantCulture, "Parameter '{0}' not found.", parameterName)); IEdmCollectionTypeReference resourceSetType = parameter.Type as IEdmCollectionTypeReference; Contract.Assert(resourceSetType != null); ODataReader resourceSetReader = reader.CreateResourceSetReader(); object feed = resourceSetReader.ReadResourceOrResourceSet(); ODataResourceSetDeserializer resourceSetDeserializer = (ODataResourceSetDeserializer)DeserializerProvider.GetEdmTypeDeserializer(resourceSetType); object result = resourceSetDeserializer.ReadInline(feed, resourceSetType, readContext); IEdmTypeReference elementTypeReference = resourceSetType.ElementType(); Contract.Assert(elementTypeReference.IsStructured()); IEnumerable enumerable = result as IEnumerable; if (enumerable != null) { if (readContext.IsUntyped) { payload[parameterName] = enumerable.ConvertToEdmObject(resourceSetType); } else { Type elementClrType = EdmLibHelpers.GetClrType(elementTypeReference, readContext.Model); IEnumerable castedResult = _castMethodInfo.MakeGenericMethod(elementClrType) .Invoke(null, new[] { result }) as IEnumerable; payload[parameterName] = castedResult; } } break; } } return(payload); }
public void ReadInline_ReturnsNull_IfItemIsNull() { var deserializer = new ODataCollectionDeserializer(new DefaultODataDeserializerProvider()); Assert.Null(deserializer.ReadInline(item: null, edmType: _intCollectionType, readContext: new ODataDeserializerContext())); }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } IEdmAction action = GetAction(readContext); Contract.Assert(action != null); // Create the correct resource type; Dictionary <string, object> payload; if (type == typeof(ODataActionParameters)) { payload = new ODataActionParameters(); } else { payload = new ODataUntypedActionParameters(action); } ODataParameterReader reader = messageReader.CreateODataParameterReader(action); while (reader.Read()) { string parameterName = null; IEdmOperationParameter parameter = null; switch (reader.State) { case ODataParameterReaderState.Value: parameterName = reader.Name; parameter = action.Parameters.SingleOrDefault(p => p.Name == parameterName); // ODataLib protects against this but asserting just in case. Contract.Assert(parameter != null, String.Format(CultureInfo.InvariantCulture, "Parameter '{0}' not found.", parameterName)); if (parameter.Type.IsPrimitive()) { payload[parameterName] = reader.Value; } else { ODataEdmTypeDeserializer deserializer = DeserializerProvider.GetEdmTypeDeserializer(parameter.Type); payload[parameterName] = deserializer.ReadInline(reader.Value, parameter.Type, readContext); } break; case ODataParameterReaderState.Collection: parameterName = reader.Name; parameter = action.Parameters.SingleOrDefault(p => p.Name == parameterName); // ODataLib protects against this but asserting just in case. Contract.Assert(parameter != null, String.Format(CultureInfo.InvariantCulture, "Parameter '{0}' not found.", parameterName)); IEdmCollectionTypeReference collectionType = parameter.Type as IEdmCollectionTypeReference; Contract.Assert(collectionType != null); ODataCollectionValue value = ODataCollectionDeserializer.ReadCollection(reader.CreateCollectionReader()); ODataCollectionDeserializer collectionDeserializer = (ODataCollectionDeserializer)DeserializerProvider.GetEdmTypeDeserializer(collectionType); payload[parameterName] = collectionDeserializer.ReadInline(value, collectionType, readContext); break; default: break; } } return(payload); }