diff --git a/sdk/core/Azure.Core/tests/ModelSerializationTests/Animal.cs b/sdk/core/Azure.Core/tests/ModelSerializationTests/Animal.cs index 187d3073a486..b4fee792207f 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializationTests/Animal.cs +++ b/sdk/core/Azure.Core/tests/ModelSerializationTests/Animal.cs @@ -47,7 +47,7 @@ internal Animal(string name) void IUtf8JsonSerializable.Write(Utf8JsonWriter writer, SerializableOptions options) { writer.WriteStartObject(); - if (options.IgnoreReadOnlyProperties) + if (!options.IgnoreReadOnlyProperties) { writer.WritePropertyName("latinName"u8); writer.WriteStringValue(LatinName); @@ -59,7 +59,7 @@ void IUtf8JsonSerializable.Write(Utf8JsonWriter writer, SerializableOptions opti writer.WritePropertyName("weight"u8); writer.WriteNumberValue(Weight); - if (options.IgnoreAdditionalProperties) + if (!options.IgnoreAdditionalProperties) { //write out the raw data foreach (var property in RawData) @@ -106,7 +106,7 @@ internal static Animal DeserializeAnimal(JsonElement element, SerializableOption continue; } - if (options.IgnoreAdditionalProperties) + if (!options.IgnoreAdditionalProperties) { //this means it's an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/ModelSerializationTests/CatReadOnlyProperty.cs b/sdk/core/Azure.Core/tests/ModelSerializationTests/CatReadOnlyProperty.cs index c8431b5b56ea..33b092543b58 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializationTests/CatReadOnlyProperty.cs +++ b/sdk/core/Azure.Core/tests/ModelSerializationTests/CatReadOnlyProperty.cs @@ -22,16 +22,19 @@ internal CatReadOnlyProperty(double weight, string latinName, string name, bool RawData = rawData; } - public bool HasWhiskers { get; set; } = true; + public bool HasWhiskers { get; private set; } = true; #region Serialization void IUtf8JsonSerializable.Write(Utf8JsonWriter writer, SerializableOptions options) { writer.WriteStartObject(); - if (options.IgnoreReadOnlyProperties) + if (!options.IgnoreReadOnlyProperties) { writer.WritePropertyName("latinName"u8); writer.WriteStringValue(LatinName); + + writer.WritePropertyName("hasWhiskers"u8); + writer.WriteBooleanValue(HasWhiskers); } writer.WritePropertyName("name"u8); writer.WriteStringValue(Name); @@ -39,10 +42,8 @@ void IUtf8JsonSerializable.Write(Utf8JsonWriter writer, SerializableOptions opti writer.WriteBooleanValue(IsHungry); writer.WritePropertyName("weight"u8); writer.WriteNumberValue(Weight); - writer.WritePropertyName("hasWhiskers"u8); - writer.WriteBooleanValue(HasWhiskers); - if (options.IgnoreAdditionalProperties) + if (!options.IgnoreAdditionalProperties) { //write out the raw data foreach (var property in RawData) @@ -84,18 +85,18 @@ internal static CatReadOnlyProperty DeserializeCatReadOnlyProperty(JsonElement e latinName = property.Value.GetString(); continue; } - if (property.NameEquals("hasWhiskers"u8)) + + if (property.NameEquals("isHungry"u8)) { - hasWhiskers = property.Value.GetBoolean(); + isHungry = property.Value.GetBoolean(); continue; } - if (property.NameEquals("isHungry"u8)) + if (property.NameEquals("hasWhiskers"u8)) { - isHungry = property.Value.GetBoolean(); + hasWhiskers = property.Value.GetBoolean(); continue; } - - if (options.IgnoreAdditionalProperties) + if (!options.IgnoreAdditionalProperties) { //this means its an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); @@ -117,6 +118,7 @@ internal static CatReadOnlyProperty DeserializeCatReadOnlyProperty(JsonElement e this.IsHungry = model.IsHungry; this.HasWhiskers = model.HasWhiskers; this.IsHungry = model.IsHungry; + this.RawData = model.RawData; bytesConsumed = stream.Length; return true; } diff --git a/sdk/core/Azure.Core/tests/ModelSerializationTests/DogListProperty.cs b/sdk/core/Azure.Core/tests/ModelSerializationTests/DogListProperty.cs index bd5bed7f0ba4..849b9d407600 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializationTests/DogListProperty.cs +++ b/sdk/core/Azure.Core/tests/ModelSerializationTests/DogListProperty.cs @@ -32,7 +32,7 @@ public DogListProperty() void IUtf8JsonSerializable.Write(Utf8JsonWriter writer, SerializableOptions options) { writer.WriteStartObject(); - if (options.IgnoreReadOnlyProperties) + if (!options.IgnoreReadOnlyProperties) { writer.WritePropertyName("latinName"u8); writer.WriteStringValue(LatinName); @@ -52,7 +52,7 @@ void IUtf8JsonSerializable.Write(Utf8JsonWriter writer, SerializableOptions opti } writer.WriteEndArray(); - if (options.IgnoreAdditionalProperties) + if (!options.IgnoreAdditionalProperties) { //write out the raw data foreach (var property in RawData) @@ -107,7 +107,7 @@ internal static DogListProperty DeserializeDogListProperty(JsonElement element, } continue; } - if (options.IgnoreAdditionalProperties) + if (!options.IgnoreAdditionalProperties) { //this means its an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/ModelSerializationTests/ListPropertyTests.cs b/sdk/core/Azure.Core/tests/ModelSerializationTests/ListPropertyTests.cs index 864dc0e8f38a..ca5a73fed21d 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializationTests/ListPropertyTests.cs +++ b/sdk/core/Azure.Core/tests/ModelSerializationTests/ListPropertyTests.cs @@ -21,14 +21,14 @@ public class ListPropertyTests [TestCase(true, false)] [TestCase(false, true)] [TestCase(false, false)] - public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool handleUnknown) + public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly, bool ignoreUnknown) { Stream stream = new MemoryStream(); string serviceResponse = "{\"latinName\":\"Animalia\",\"weight\":1.1,\"name\":\"Doggo\",\"isHungry\":false,\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"], \"numberOfLegs\":4}"; StringBuilder expectedSerialized = new StringBuilder("{"); - if (includeReadonly) + if (!ignoreReadOnly) { expectedSerialized.Append("\"latinName\":\"Animalia\","); } @@ -36,19 +36,19 @@ public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool hand expectedSerialized.Append("\"isHungry\":false,"); expectedSerialized.Append("\"weight\":1.1,"); expectedSerialized.Append("\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"]"); - if (handleUnknown) + if (!ignoreUnknown) { expectedSerialized.Append(",\"numberOfLegs\":4"); } expectedSerialized.Append("}"); var expectedSerializedString = expectedSerialized.ToString(); - SerializableOptions options = new SerializableOptions() { IgnoreReadOnlyProperties = includeReadonly, IgnoreAdditionalProperties = handleUnknown }; + SerializableOptions options = new SerializableOptions() { IgnoreReadOnlyProperties = ignoreReadOnly, IgnoreAdditionalProperties = ignoreUnknown }; var model = new DogListProperty(); model.TryDeserialize(new MemoryStream(Encoding.UTF8.GetBytes(serviceResponse)), out long bytesConsumed, options: options); - if (includeReadonly) + if (!ignoreReadOnly) { Assert.That(model.LatinName, Is.EqualTo("Animalia")); } @@ -57,7 +57,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool hand Assert.That(model.Weight, Is.EqualTo(1.1)); Assert.That(model.FoodConsumed, Is.EqualTo(new List { "kibble", "egg", "peanut butter" })); - if (handleUnknown) + if (!ignoreUnknown) { var additionalProperties = typeof(DogListProperty).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model) as Dictionary; Assert.AreEqual(1, additionalProperties.Count); @@ -73,25 +73,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool hand var model2 = new DogListProperty(); model2.TryDeserialize(new MemoryStream(Encoding.UTF8.GetBytes(roundTrip)), out bytesConsumed, options: options); - - if (includeReadonly) - Assert.That(model.LatinName, Is.EqualTo(model2.LatinName)); - Assert.That(model.Name, Is.EqualTo(model2.Name)); - Assert.That(model.Weight, Is.EqualTo(model2.Weight)); - Assert.That(roundTrip.Length, Is.EqualTo(bytesConsumed)); - Assert.That(model.FoodConsumed, Is.EqualTo(model2.FoodConsumed)); - if (handleUnknown) - { - var additionalProperties1 = typeof(DogListProperty).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model) as Dictionary; - var additionalProperties2 = typeof(DogListProperty).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model2) as Dictionary; - - Assert.AreEqual(1, additionalProperties1.Count); - Assert.IsTrue(additionalProperties1.ContainsKey("numberOfLegs")); - Assert.IsTrue(additionalProperties1["numberOfLegs"].ToString() == "4"); - Assert.AreEqual(1, additionalProperties2.Count); - Assert.IsTrue(additionalProperties2.ContainsKey("numberOfLegs")); - Assert.IsTrue(additionalProperties2["numberOfLegs"].ToString() == "4"); - } + VerifyModels.CheckDogs(model, model2, options); } [Test] @@ -100,7 +82,7 @@ public void PrettyPrint() DogListProperty model = new DogListProperty("Doggo"); Stream stream = new MemoryStream(); - model.TrySerialize(stream, out long bytesWritten, options: new SerializableOptions() { PrettyPrint = true }); + model.TrySerialize(stream, out long bytesWritten, options: new SerializableOptions() { IgnoreReadOnlyProperties = true, PrettyPrint = true }); stream.Position = 0; var actualJson = new StreamReader(stream).ReadToEnd(); @@ -117,7 +99,7 @@ public void PrettyPrint() } """; - Assert.AreEqual(expectedJson, actualJson); + Assert.AreEqual(VerifyModels.NormalizeNewLines(expectedJson), VerifyModels.NormalizeNewLines(actualJson)); } } } diff --git a/sdk/core/Azure.Core/tests/ModelSerializationTests/ReadOnlyPropertyTests.cs b/sdk/core/Azure.Core/tests/ModelSerializationTests/ReadOnlyPropertyTests.cs index 16e297226161..37a386fd7252 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializationTests/ReadOnlyPropertyTests.cs +++ b/sdk/core/Azure.Core/tests/ModelSerializationTests/ReadOnlyPropertyTests.cs @@ -21,32 +21,32 @@ public class ReadOnlyPropertyTests [TestCase(true, false)] [TestCase(false, true)] [TestCase(false, false)] - public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool handleUnknown) + public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly, bool ignoreUnknown) { Stream stream = new MemoryStream(); string serviceResponse = "{\"latinName\":\"Canis lupus familiaris\",\"weight\":5.5,\"name\":\"Doggo\",\"numberOfLegs\":4}"; StringBuilder expectedSerialized = new StringBuilder("{"); - if (includeReadonly) + if (!ignoreReadOnly) { expectedSerialized.Append("\"latinName\":\"Canis lupus familiaris\","); } expectedSerialized.Append("\"name\":\"Doggo\","); expectedSerialized.Append("\"isHungry\":false,"); expectedSerialized.Append("\"weight\":5.5"); - if (handleUnknown) + if (!ignoreUnknown) { expectedSerialized.Append(",\"numberOfLegs\":4"); } expectedSerialized.Append("}"); var expectedSerializedString = expectedSerialized.ToString(); - SerializableOptions options = new SerializableOptions() { IgnoreReadOnlyProperties = includeReadonly, IgnoreAdditionalProperties = handleUnknown }; + SerializableOptions options = new SerializableOptions() { IgnoreReadOnlyProperties = ignoreReadOnly, IgnoreAdditionalProperties = ignoreUnknown }; var model = new Animal(); model.TryDeserialize(new MemoryStream(Encoding.UTF8.GetBytes(serviceResponse)), out long bytesConsumed, options: options); - if (includeReadonly) + if (!ignoreReadOnly) { Assert.That(model.LatinName, Is.EqualTo("Canis lupus familiaris")); } @@ -54,7 +54,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool hand Assert.IsFalse(model.IsHungry); Assert.That(model.Weight, Is.EqualTo(5.5)); - if (handleUnknown) + if (!ignoreUnknown) { var additionalProperties = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model) as Dictionary; Assert.AreEqual(1, additionalProperties.Count); @@ -71,23 +71,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool includeReadonly, bool hand var model2 = new Animal(); model2.TryDeserialize(new MemoryStream(Encoding.UTF8.GetBytes(roundTrip)), out bytesConsumed, options: options); - if (includeReadonly) - Assert.That(model.LatinName, Is.EqualTo(model2.LatinName)); - Assert.That(model.Name, Is.EqualTo(model2.Name)); - Assert.That(model.Weight, Is.EqualTo(model2.Weight)); - Assert.That(roundTrip.Length, Is.EqualTo(bytesConsumed)); - if (handleUnknown) - { - var additionalProperties1 = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model) as Dictionary; - var additionalProperties2 = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model2) as Dictionary; - - Assert.AreEqual(1, additionalProperties1.Count); - Assert.IsTrue(additionalProperties1.ContainsKey("numberOfLegs")); - Assert.IsTrue(additionalProperties1["numberOfLegs"].ToString() == "4"); - Assert.AreEqual(1, additionalProperties2.Count); - Assert.IsTrue(additionalProperties2.ContainsKey("numberOfLegs")); - Assert.IsTrue(additionalProperties2["numberOfLegs"].ToString() == "4"); - } + VerifyModels.CheckAnimals(model, model2, options); } [Test] @@ -96,20 +80,21 @@ public void PrettyPrint() CatReadOnlyProperty model = new CatReadOnlyProperty(3.2, "Felis catus", "Catto", true, false); Stream stream = new MemoryStream(); - model.TrySerialize(stream, out long bytesWritten, options: new SerializableOptions() { PrettyPrint = true }); + model.TrySerialize(stream, out long bytesWritten, options: new SerializableOptions() { PrettyPrint = true });; stream.Position = 0; var actualJson = new StreamReader(stream).ReadToEnd(); var expectedJson = """ { + "latinName": "Felis catus", + "hasWhiskers": false, "name": "Catto", "isHungry": true, - "weight": 3.2, - "hasWhiskers": false + "weight": 3.2 } """; - Assert.AreEqual(expectedJson, actualJson); + Assert.AreEqual(VerifyModels.NormalizeNewLines(expectedJson), VerifyModels.NormalizeNewLines(actualJson)); } } } diff --git a/sdk/core/Azure.Core/tests/ModelSerializationTests/VerifyModels.cs b/sdk/core/Azure.Core/tests/ModelSerializationTests/VerifyModels.cs new file mode 100644 index 000000000000..adf79d0c733c --- /dev/null +++ b/sdk/core/Azure.Core/tests/ModelSerializationTests/VerifyModels.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using NUnit.Framework; + +namespace Azure.Core.Tests.ModelSerializationTests +{ + internal class VerifyModels + { + public static void CheckAnimals(Animal x, Animal y, SerializableOptions options) + { + VerifyProperties(x, y, options); + } + + private static void VerifyProperties(Animal x, Animal y, SerializableOptions options) + { + if (!options.IgnoreReadOnlyProperties) + Assert.That(x.LatinName, Is.EqualTo(y.LatinName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.Weight, Is.EqualTo(y.Weight)); + + if (!options.IgnoreReadOnlyProperties) + { + var additionalPropertiesX = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(x) as Dictionary; + var additionalPropertiesY = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(y) as Dictionary; + + Assert.AreEqual(additionalPropertiesX.Count, additionalPropertiesY.Count); + + foreach (var additionalProperty in additionalPropertiesX) + { + Assert.IsTrue(additionalPropertiesY.ContainsKey(additionalProperty.Key)); + Assert.AreEqual(additionalProperty.Value.ToString(), additionalPropertiesY[additionalProperty.Key].ToString()); + } + foreach (var additionalProperty in additionalPropertiesY) + { + Assert.IsTrue(additionalPropertiesX.ContainsKey(additionalProperty.Key)); + Assert.AreEqual(additionalProperty.Value.ToString(), additionalPropertiesX[additionalProperty.Key].ToString()); + } + } + } + + public static void CheckCats(CatReadOnlyProperty x, CatReadOnlyProperty y, SerializableOptions options) + { + VerifyProperties(x, y, options); + Assert.That(x.HasWhiskers, Is.EqualTo(y.HasWhiskers)); + } + + public static void CheckDogs(DogListProperty x, DogListProperty y, SerializableOptions options) + { + VerifyProperties(x, y, options); + Assert.That(x.FoodConsumed, Is.EqualTo(y.FoodConsumed)); + } + + public static string NormalizeNewLines(string value) + { + return value + .Replace("\r\n", "\n") + .Replace("\n", Environment.NewLine); + } + } +}