public async Task WriteObjectInlineAsync_Can_WriteCollectionOfIEdmChangedObjects()
        {
            // Arrange
            IEdmTypeReference           edmType   = new EdmEntityTypeReference(new EdmEntityType("NS", "Name"), isNullable: false);
            IEdmCollectionTypeReference feedType  = new EdmCollectionTypeReference(new EdmCollectionType(edmType));
            Mock <IEdmChangedObject>    edmObject = new Mock <IEdmChangedObject>();

            edmObject.Setup(e => e.GetEdmType()).Returns(edmType);

            var mockWriter = new Mock <ODataWriter>();

            Mock <ODataSerializerProvider> provider           = new Mock <ODataSerializerProvider>();
            Mock <ODataResourceSerializer> customerSerializer = new Mock <ODataResourceSerializer>(provider.Object);

            customerSerializer.Setup(s => s.WriteDeltaObjectInlineAsync(edmObject.Object, edmType, mockWriter.Object, _writeContext)).Verifiable();

            Mock <ODataSerializerProvider> serializerProvider = new Mock <ODataSerializerProvider>();

            serializerProvider.Setup(s => s.GetEdmTypeSerializer(edmType)).Returns(customerSerializer.Object);

            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(serializerProvider.Object);

            // Act
            await serializer.WriteObjectInlineAsync(new[] { edmObject.Object }, feedType, mockWriter.Object, _writeContext);

            // Assert
            customerSerializer.Verify();
        }
        public async Task WriteObjectAsync_ThrowsArgumentNull_MessageWriter()
        {
            // Arrange
            Mock <ODataSerializerProvider>  provider   = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(provider.Object);

            // Act & Assert
            await ExceptionAssert.ThrowsArgumentNullAsync(
                () => serializer.WriteObjectAsync(graph: null, type: null, messageWriter: null, writeContext: new ODataSerializerContext()),
                "messageWriter");
        }
        public async Task WriteObjectInlineAsync_ThrowsArgumentNull_WriteContext()
        {
            // Arrange
            Mock <ODataSerializerProvider>  provider   = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(provider.Object);

            // Act & Assert
            await ExceptionAssert.ThrowsArgumentNullAsync(
                () => serializer.WriteObjectInlineAsync(graph: null, expectedType: null, writer: new Mock <ODataWriter>().Object, writeContext: null),
                "writeContext");
        }
        public async Task WriteObjectInlineAsync_Throws_NullElementInCollection_IfFeedContainsNullElement()
        {
            // Arrange
            IEnumerable instance = new object[] { null };
            Mock <ODataSerializerProvider>  provider   = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(provider.Object);

            // Act
            await ExceptionAssert.ThrowsAsync <SerializationException>(
                () => serializer.WriteObjectInlineAsync(instance, _customersType, new Mock <ODataWriter>().Object, _writeContext),
                "Collections cannot contain null elements.");
        }
        public async Task WriteObjectInlineAsync_ThrowsSerializationException_IfGraphIsNotEnumerable()
        {
            // Arrange
            Mock <ODataSerializerProvider>  provider   = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(provider.Object);

            // Act & Assert
            await ExceptionAssert.ThrowsAsync <SerializationException>(
                () => serializer.WriteObjectInlineAsync(graph: 42, expectedType: _customersType,
                                                        writer: new Mock <ODataWriter>().Object, writeContext: _writeContext),
                "ODataDeltaResourceSetSerializer cannot write an object of type 'System.Int32'.");
        }
        public async Task WriteObjectInlineAsync_ThrowsSerializationException_CannotSerializerNull()
        {
            // Arrange
            Mock <ODataSerializerProvider>  provider   = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(provider.Object);

            // Act & Assert
            await ExceptionAssert.ThrowsAsync <SerializationException>(
                () => serializer.WriteObjectInlineAsync(graph: null, expectedType: _customersType,
                                                        writer: new Mock <ODataWriter>().Object, writeContext: _writeContext),
                "Cannot serialize a null 'DeltaResourceSet'.");
        }
        public async Task WriteObjectAsync_Throws_EntitySetMissingDuringSerialization()
        {
            // Arrange
            object graph = new object();
            Mock <ODataSerializerProvider>  provider   = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(provider.Object);

            // Act & Assert
            await ExceptionAssert.ThrowsAsync <SerializationException>(
                () => serializer.WriteObjectAsync(graph: graph, type: null, messageWriter: ODataTestUtil.GetMockODataMessageWriter(), writeContext: new ODataSerializerContext()),
                "The related entity set could not be found from the OData path. The related entity set is required to serialize the payload.");
        }
        public async Task WriteObjectInlineAsync_Throws_TypeCannotBeSerialized_IfFeedContainsEntityThatCannotBeSerialized()
        {
            // Arrange
            Mock <ODataSerializerProvider> serializerProvider = new Mock <ODataSerializerProvider>();
            var request = RequestFactory.Create();

            serializerProvider.Setup(s => s.GetODataPayloadSerializer(typeof(int), request)).Returns <ODataSerializer>(null);
            IEnumerable instance = new object[] { 42 };
            ODataDeltaResourceSetSerializer serializer = new ODataDeltaResourceSetSerializer(serializerProvider.Object);

            // Act
            await ExceptionAssert.ThrowsAsync <SerializationException>(
                () => serializer.WriteObjectInlineAsync(instance, _customersType, new Mock <ODataWriter>().Object, _writeContext),
                "ODataDeltaResourceSetSerializer cannot write an object of type 'System.Int32'.");
        }
        public void CreateODataDeltaResourceSet_Sets_NextPageLinkForPageResult()
        {
            // Arrange
            Mock <ODataSerializerProvider>  serializeProvider = new Mock <ODataSerializerProvider>();
            ODataDeltaResourceSetSerializer serializer        = new ODataDeltaResourceSetSerializer(serializeProvider.Object);
            Uri        expectedNextLink   = new Uri("http://nextlink.com");
            const long ExpectedCountValue = 1000;

            var result = new PageResult <Customer>(_customers, expectedNextLink, ExpectedCountValue);

            // Act
            ODataDeltaResourceSet feed = serializer.CreateODataDeltaResourceSet(result, _customersType, new ODataSerializerContext());

            // Assert
            Assert.Equal(expectedNextLink, feed.NextPageLink);
        }
        public async Task WriteObjectInlineAsync_WritesEachEntityInstance()
        {
            // Arrange
            Mock <ODataSerializerProvider> serializeProvider  = new Mock <ODataSerializerProvider>();
            Mock <ODataResourceSerializer> customerSerializer = new Mock <ODataResourceSerializer>(serializeProvider.Object);
            ODataSerializerProvider        provider           = ODataTestUtil.GetMockODataSerializerProvider(customerSerializer.Object);
            var mockWriter = new Mock <ODataWriter>();

            customerSerializer.Setup(s => s.WriteDeltaObjectInlineAsync(_deltaResourceSetCustomers[0], _customersType.ElementType(), mockWriter.Object, _writeContext)).Verifiable();
            _serializer = new ODataDeltaResourceSetSerializer(provider);

            // Act
            await _serializer.WriteObjectInlineAsync(_deltaResourceSetCustomers, _customersType, mockWriter.Object, _writeContext);

            // Assert
            customerSerializer.Verify();
        }