public void WriteObject_ThrowsArgumentNull_WriteContext()
        {
            ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(_serializerProvider);

            Assert.ThrowsArgumentNull(
                () => serializer.WriteObject(graph: null, type: null, messageWriter: ODataTestUtil.GetMockODataMessageWriter(), writeContext: null),
                "writeContext");
        }
        public void WriteObject_ThrowsArgumentNull_MessageWriter()
        {
            ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(_serializerProvider);

            Assert.ThrowsArgumentNull(
                () => serializer.WriteObject(graph: null, type: null, messageWriter: null, writeContext: new ODataSerializerContext()),
                "messageWriter");
        }
        public void WriteObject_CanWrite_TopLevelResourceSet_ContainsEmptyCollectionOfDynamicComplexElement()
        {
            // Arrange
            ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(_serializerProvider);
            MemoryStream          stream          = new MemoryStream();
            IODataResponseMessage message         = new ODataMessageWrapper(stream);

            ODataMessageWriterSettings settings = new ODataMessageWriterSettings
            {
                ODataUri = new ODataUri {
                    ServiceRoot = new Uri("http://any/"),
                }
            };

            settings.SetContentType(ODataFormat.Json);

            ODataMessageWriter        writer    = new ODataMessageWriter(message, settings);
            IList <SimpleOpenAddress> addresses = new[]
            {
                new SimpleOpenAddress
                {
                    City       = "Redmond",
                    Street     = "Microsoft Rd",
                    Properties = new Dictionary <string, object>
                    {
                        { "StringProp", "abc" },
                        { "Locations", new SimpleOpenAddress[] {} } // empty collection of complex
                    }
                }
            };

            var builder = new ODataConventionModelBuilder();

            builder.ComplexType <SimpleOpenAddress>();
            IEdmModel model = builder.GetEdmModel();
            ODataSerializerContext writeContext = new ODataSerializerContext {
                Model = model
            };

            // Act
            serializer.WriteObject(addresses, typeof(IList <SimpleOpenAddress>), writer, writeContext);
            stream.Seek(0, SeekOrigin.Begin);
            string result = JObject.Parse(new StreamReader(stream).ReadToEnd()).ToString();

            // Assert
            Assert.Equal(@"{
  ""@odata.context"": ""http://any/$metadata#Collection(System.Web.OData.SimpleOpenAddress)"",
  ""value"": [
    {
      ""Street"": ""Microsoft Rd"",
      ""City"": ""Redmond"",
      ""StringProp"": ""abc"",
      ""*****@*****.**"": ""#Collection(System.Web.OData.SimpleOpenAddress)"",
      ""Locations"": []
    }
  ]
}", result);
        }
        public void WriteObject_CanWriteTopLevelResourceSetContainsNullComplexElement()
        {
            // Arrange
            ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(_serializerProvider);
            MemoryStream          stream          = new MemoryStream();
            IODataResponseMessage message         = new ODataMessageWrapper(stream);

            ODataMessageWriterSettings settings = new ODataMessageWriterSettings
            {
                ODataUri = new ODataUri {
                    ServiceRoot = new Uri("http://any/"),
                }
            };

            settings.SetContentType(ODataFormat.Json);

            ODataMessageWriter writer    = new ODataMessageWriter(message, settings);
            IList <Address>    addresses = new[]
            {
                new Address {
                    City = "Redmond"
                },
                null,
                new Address {
                    City = "Shanghai"
                }
            };

            ODataSerializerContext writeContext = new ODataSerializerContext {
                Model = _model
            };

            // Act
            serializer.WriteObject(addresses, typeof(IList <Address>), writer, writeContext);
            stream.Seek(0, SeekOrigin.Begin);
            string result = new StreamReader(stream).ReadToEnd();

            // Assert
            Assert.Equal("{\"@odata.context\":\"http://any/$metadata#Collection(Default.Address)\"," +
                         "\"value\":[" +
                         "{\"Street\":null,\"City\":\"Redmond\",\"State\":null,\"CountryOrRegion\":null,\"ZipCode\":null}," +
                         "null," +
                         "{\"Street\":null,\"City\":\"Shanghai\",\"State\":null,\"CountryOrRegion\":null,\"ZipCode\":null}" +
                         "]}", result);
        }