Skip to content

Commit

Permalink
make DiscriminatedUnionConverter optional (#152)
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonCropp authored Jan 18, 2023
1 parent f564d3f commit a79a435
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 22 deletions.
1 change: 0 additions & 1 deletion src/Argon/Serialization/DefaultContractResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ public class DefaultContractResolver : IContractResolver
static readonly JsonConverter[] builtInConverters =
{
new ExpandoObjectConverter(),
new DiscriminatedUnionConverter(),
new KeyValuePairConverter(),
new DriveInfoConverter(),
new PathInfoConverter(),
Expand Down
46 changes: 25 additions & 21 deletions src/Tests/Converters/DiscriminatedUnionConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

public class DiscriminatedUnionConverterTests : TestFixtureBase
{
static DiscriminatedUnionConverter unionConverter = new();

public class DoubleDoubleConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Expand All @@ -30,11 +32,11 @@ public override bool CanConvert(Type type) =>
[Fact]
public void SerializeUnionWithConverter()
{
var json = JsonConvert.SerializeObject(Shape.NewRectangle(10.0, 5.0), new DoubleDoubleConverter());
var json = JsonConvert.SerializeObject(Shape.NewRectangle(10.0, 5.0), new DoubleDoubleConverter(), unionConverter);

Assert.Equal(@"{""Case"":""Rectangle"",""Fields"":[20.0,10.0]}", json);

var c = JsonConvert.DeserializeObject<Shape>(json, new DoubleDoubleConverter());
var c = JsonConvert.DeserializeObject<Shape>(json, new DoubleDoubleConverter(), unionConverter);
XUnitAssert.True(c.IsRectangle);

var r = (Shape.Rectangle) c;
Expand All @@ -46,7 +48,7 @@ public void SerializeUnionWithConverter()
[Fact]
public void SerializeBasicUnion()
{
var json = JsonConvert.SerializeObject(Currency.AUD);
var json = JsonConvert.SerializeObject(Currency.AUD, unionConverter);

Assert.Equal(@"{""Case"":""AUD""}", json);
}
Expand All @@ -60,14 +62,14 @@ public void SerializePerformance()
Shape.NewCircle(7.5)
};

var json = JsonConvert.SerializeObject(values, Formatting.Indented);
var json = JsonConvert.SerializeObject(values, Formatting.Indented, unionConverter);

var ts = new Stopwatch();
ts.Start();

for (var i = 0; i < 100; i++)
{
JsonConvert.SerializeObject(values);
JsonConvert.SerializeObject(values, unionConverter);
}

ts.Stop();
Expand All @@ -86,14 +88,14 @@ public void DeserializePerformance()
{""Case"":""Rectangle"",""Fields"":[10.0,5.0]}
]";

JsonConvert.DeserializeObject<List<Shape>>(json);
JsonConvert.DeserializeObject<List<Shape>>(json, unionConverter);

var ts = new Stopwatch();
ts.Start();

for (var i = 0; i < 100; i++)
{
JsonConvert.DeserializeObject<List<Shape>>(json);
JsonConvert.DeserializeObject<List<Shape>>(json, unionConverter);
}

ts.Stop();
Expand All @@ -104,28 +106,28 @@ public void DeserializePerformance()
[Fact]
public void SerializeUnionWithFields()
{
var json = JsonConvert.SerializeObject(Shape.NewRectangle(10.0, 5.0));
var json = JsonConvert.SerializeObject(Shape.NewRectangle(10.0, 5.0), unionConverter);

Assert.Equal(@"{""Case"":""Rectangle"",""Fields"":[10.0,5.0]}", json);
}

[Fact]
public void DeserializeBasicUnion()
{
var c = JsonConvert.DeserializeObject<Currency>(@"{""Case"":""AUD""}");
var c = JsonConvert.DeserializeObject<Currency>(@"{""Case"":""AUD""}", unionConverter);
Assert.Equal(Currency.AUD, c);

c = JsonConvert.DeserializeObject<Currency>(@"{""Case"":""EUR""}");
c = JsonConvert.DeserializeObject<Currency>(@"{""Case"":""EUR""}", unionConverter);
Assert.Equal(Currency.EUR, c);

c = JsonConvert.TryDeserializeObject<Currency>(@"null");
c = JsonConvert.TryDeserializeObject<Currency>(@"null", unionConverter);
Assert.Equal(null, c);
}

[Fact]
public void DeserializeUnionWithFields()
{
var c = JsonConvert.DeserializeObject<Shape>(@"{""Case"":""Rectangle"",""Fields"":[10.0,5.0]}");
var c = JsonConvert.DeserializeObject<Shape>(@"{""Case"":""Rectangle"",""Fields"":[10.0,5.0]}", unionConverter);
XUnitAssert.True(c.IsRectangle);

var r = (Shape.Rectangle) c;
Expand Down Expand Up @@ -213,51 +215,53 @@ public void Deserialize()
[Fact]
public void DeserializeBasicUnion_NoMatch() =>
XUnitAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":""abcdefg"",""Fields"":[]}"),
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":""abcdefg"",""Fields"":[]}", unionConverter),
"No union type found with the name 'abcdefg'. Path 'Case', line 1, position 17.");

[Fact]
public void DeserializeBasicUnion_MismatchedFieldCount() =>
XUnitAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":""AUD"",""Fields"":[1]}"),
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":""AUD"",""Fields"":[1]}", unionConverter),
"The number of field values does not match the number of properties defined by union 'AUD'. Path '', line 1, position 27.");

[Fact]
public void DeserializeBasicUnion_NoCaseName() =>
XUnitAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeObject<Currency>(@"{""Fields"":[1]}"),
() => JsonConvert.DeserializeObject<Currency>(@"{""Fields"":[1]}", unionConverter),
"No 'Case' property with union name found. Path '', line 1, position 14.");

[Fact]
public void DeserializeBasicUnion_UnexpectedEnd() =>
XUnitAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":"),
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":", unionConverter),
"Unexpected end when reading JSON. Path 'Case', line 1, position 8.");

[Fact]
public void DeserializeBasicUnion_FieldsObject() =>
XUnitAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":""AUD"",""Fields"":{}}"),
() => JsonConvert.DeserializeObject<Currency>(@"{""Case"":""AUD"",""Fields"":{}}", unionConverter),
"Union fields must been an array. Path 'Fields', line 1, position 24.");

[Fact]
public void DeserializeBasicUnion_UnexpectedProperty() =>
XUnitAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeObject<Currency>(@"{""Case123"":""AUD""}"),
() => JsonConvert.DeserializeObject<Currency>(@"{""Case123"":""AUD""}", unionConverter),
"Unexpected property 'Case123' found when reading union. Path 'Case123', line 1, position 11.");

[Fact]
public void SerializeUnionWithTypeNameHandlingAndReferenceTracking()
{
var json = JsonConvert.SerializeObject(Shape.NewRectangle(10.0, 5.0), new JsonSerializerSettings
var settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.All,
TypeNameHandling = TypeNameHandling.All
});
};
settings.Converters.Add(unionConverter);
var json = JsonConvert.SerializeObject(Shape.NewRectangle(10.0, 5.0), settings);

Assert.Equal(@"{""Case"":""Rectangle"",""Fields"":[10.0,5.0]}", json);

var c = JsonConvert.DeserializeObject<Shape>(json);
var c = JsonConvert.DeserializeObject<Shape>(json, unionConverter);
XUnitAssert.True(c.IsRectangle);

var r = (Shape.Rectangle) c;
Expand Down

0 comments on commit a79a435

Please sign in to comment.