Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions sdk/core/Azure.Core/tests/ModelSerializationTests/Animal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,28 @@ 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);
writer.WritePropertyName("isHungry"u8);
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)
Expand Down Expand Up @@ -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()));
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,34 +21,34 @@ 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\",");
}
expectedSerialized.Append("\"name\":\"Doggo\",");
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"));
}
Expand All @@ -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<string> { "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<string, BinaryData>;
Assert.AreEqual(1, additionalProperties.Count);
Expand All @@ -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<string, BinaryData>;
var additionalProperties2 = typeof(DogListProperty).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model2) as Dictionary<string, BinaryData>;

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]
Expand All @@ -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();

Expand All @@ -117,7 +99,7 @@ public void PrettyPrint()
}
""";

Assert.AreEqual(expectedJson, actualJson);
Assert.AreEqual(VerifyModels.NormalizeNewLines(expectedJson), VerifyModels.NormalizeNewLines(actualJson));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,40 +21,40 @@ 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"));
}
Assert.That(model.Name, Is.EqualTo("Doggo"));
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<string, BinaryData>;
Assert.AreEqual(1, additionalProperties.Count);
Expand All @@ -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<string, BinaryData>;
var additionalProperties2 = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model2) as Dictionary<string, BinaryData>;

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]
Expand All @@ -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));
}
}
}
63 changes: 63 additions & 0 deletions sdk/core/Azure.Core/tests/ModelSerializationTests/VerifyModels.cs
Original file line number Diff line number Diff line change
@@ -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<string, BinaryData>;
var additionalPropertiesY = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(y) as Dictionary<string, BinaryData>;

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);
}
}
}