Skip to content

Added DataContract annotations to all Quantities {Value, Unit} #907

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from 3 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: 5 additions & 1 deletion CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public override string Generate()
using System;
using System.Globalization;
using System.Linq;
using System.Runtime.Serialization;
using JetBrains.Annotations;
using UnitsNet.InternalHelpers;
using UnitsNet.Units;
Expand All @@ -70,7 +71,8 @@ namespace UnitsNet
/// </remarks>");

Writer.W(@$"
public partial struct {_quantity.Name} : IQuantity<{_unitEnumName}>, ");
[DataContract]
public partial struct {_quantity.Name} : IQuantity<{_unitEnumName}>, ");
if (_quantity.BaseType == "decimal")
{
Writer.W("IDecimalQuantity, ");
Expand All @@ -82,11 +84,13 @@ public partial struct {_quantity.Name} : IQuantity<{_unitEnumName}>, ");
/// <summary>
/// The numeric value this quantity was constructed with.
/// </summary>
[DataMember(Name = ""Value"", Order = 1)]
private readonly {_quantity.BaseType} _value;

/// <summary>
/// The unit this quantity was constructed with.
/// </summary>
[DataMember(Name = ""Unit"", Order = 2)]
private readonly {_unitEnumName}? _unit;
");
GenerateStaticConstructor();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net48</TargetFramework>

<IsPackable>false</IsPackable>

<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
<DotNetCliToolReference Include="JetBrains.dotCover.CommandLineTools" Version="2019.1.3" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\UnitsNet.Serialization.DataContract.Tests\UnitsNet.Serialization.DataContract.Tests.csproj" />
<ProjectReference Include="..\UnitsNet.Serialization.JsonNet\UnitsNet.Serialization.JsonNet.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.

using System.IO;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using UnitsNet.Serialization.DataContract.Tests;
using UnitsNet.Serialization.Surrogates;
using Xunit;

namespace UnitsNet.Serialization.DataContract.Compatibility.JsonNetTests.UnitsNetIQuantityJsonConverter
{
public class DataContractToJsonNetSerializationTests : SerializationTestsBase<string>
{
private readonly DataContractJsonSerializerSettings _dataContractJsonSerializerSettings;

private readonly JsonSerializerSettings _jsonNetSerializerSettings;

public DataContractToJsonNetSerializationTests()
{
_jsonNetSerializerSettings = new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.None};
_jsonNetSerializerSettings.Converters.Add(new JsonNet.UnitsNetIQuantityJsonConverter());
_dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings {DataContractSurrogate = new ExtendedQuantityDataContractSurrogate()};
}

protected override string SerializeObject(object obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType(), _dataContractJsonSerializerSettings);
using var stream = new MemoryStream();
serializer.WriteObject(stream, obj);
stream.Position = 0;
using var streamReader = new StreamReader(stream);
return streamReader.ReadToEnd();
}

protected override T DeserializeObject<T>(string payload)
{
return JsonConvert.DeserializeObject<T>(payload, _jsonNetSerializerSettings);
}


[Fact(Skip = "Tuples are currently not supported by the UnitsNetIQuantityJsonConverter")]
public override void TupleOfMixedValueQuantities_SerializationRoundTrips()
{
base.TupleOfMixedValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetIQuantityJsonConverter")]
public override void TupleOfDoubleAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDoubleAndNullQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetIQuantityJsonConverter")]
public override void TupleOfDecimalAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDecimalAndNullQuantities_SerializationRoundTrips();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.

using System.IO;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using UnitsNet.Serialization.DataContract.Tests;
using UnitsNet.Serialization.Surrogates;
using Xunit;

namespace UnitsNet.Serialization.DataContract.Compatibility.JsonNetTests.UnitsNetIQuantityJsonConverter
{
public class JsonNetToDataContractSerializationTests : SerializationTestsBase<string>
{
private readonly DataContractJsonSerializerSettings _dataContractJsonSerializerSettings;

private readonly JsonSerializerSettings _jsonNetSerializerSettings;

public JsonNetToDataContractSerializationTests()
{
_jsonNetSerializerSettings = new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.None};
_jsonNetSerializerSettings.Converters.Add(new JsonNet.UnitsNetIQuantityJsonConverter());
_dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings {DataContractSurrogate = new ExtendedQuantityDataContractSurrogate()};
}

protected override string SerializeObject(object obj)
{
return JsonConvert.SerializeObject(obj, _jsonNetSerializerSettings);
}

protected override T DeserializeObject<T>(string payload)
{
var serializer = new DataContractJsonSerializer(typeof(T), _dataContractJsonSerializerSettings);
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream);
writer.Write(payload);
writer.Flush();
stream.Position = 0;
return (T) serializer.ReadObject(stream);
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetIQuantityJsonConverter")]
public override void TupleOfMixedValueQuantities_SerializationRoundTrips()
{
base.TupleOfMixedValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetIQuantityJsonConverter")]
public override void TupleOfDoubleAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDoubleAndNullQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetIQuantityJsonConverter")]
public override void TupleOfDecimalAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDecimalAndNullQuantities_SerializationRoundTrips();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.

using System.IO;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using UnitsNet.Serialization.DataContract.Tests;
using UnitsNet.Serialization.Surrogates;
using Xunit;

namespace UnitsNet.Serialization.DataContract.Compatibility.JsonNetTests.UnitsNetJsonConverter
{
public class DataContractToJsonNetSerializationTests : SerializationTestsBase<string>
{
private readonly DataContractJsonSerializerSettings _dataContractJsonSerializerSettings;

private readonly JsonSerializerSettings _jsonNetSerializerSettings;

public DataContractToJsonNetSerializationTests()
{
_jsonNetSerializerSettings = new JsonSerializerSettings();
_jsonNetSerializerSettings.Converters.Add(new JsonNet.UnitsNetJsonConverter());
_dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings {DataContractSurrogate = new BasicQuantityContractSurrogate()};
}

protected override string SerializeObject(object obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType(), _dataContractJsonSerializerSettings);
using var stream = new MemoryStream();
serializer.WriteObject(stream, obj);
stream.Position = 0;
using var streamReader = new StreamReader(stream);
return streamReader.ReadToEnd();
}

protected override T DeserializeObject<T>(string payload)
{
return JsonConvert.DeserializeObject<T>(payload, _jsonNetSerializerSettings);
}

[Fact(Skip = "Arrays are currently not supported by the UnitsNetJsonConverter")]
public override void ArrayOfDoubleValueQuantities_SerializationRoundTrips()
{
base.ArrayOfDoubleValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Arrays are currently not supported by the UnitsNetJsonConverter")]
public override void ArrayOfDecimalValueQuantities_SerializationRoundTrips()
{
base.ArrayOfDecimalValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Arrays are currently not supported by the UnitsNetJsonConverter")]
public override void EmptyArray_RoundTripsEmpty()
{
base.EmptyArray_RoundTripsEmpty();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetJsonConverter")]
public override void TupleOfMixedValueQuantities_SerializationRoundTrips()
{
base.TupleOfMixedValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetJsonConverter")]
public override void TupleOfDoubleAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDoubleAndNullQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetJsonConverter")]
public override void TupleOfDecimalAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDecimalAndNullQuantities_SerializationRoundTrips();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.

using System.IO;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using UnitsNet.Serialization.DataContract.Tests;
using UnitsNet.Serialization.Surrogates;
using Xunit;

namespace UnitsNet.Serialization.DataContract.Compatibility.JsonNetTests.UnitsNetJsonConverter
{
public class JsonNetToDataContractSerializationTests : SerializationTestsBase<string>
{
private readonly DataContractJsonSerializerSettings _dataContractJsonSerializerSettings;

private readonly JsonSerializerSettings _jsonNetSerializerSettings;

public JsonNetToDataContractSerializationTests()
{
_jsonNetSerializerSettings = new JsonSerializerSettings();
_jsonNetSerializerSettings.Converters.Add(new JsonNet.UnitsNetJsonConverter());
_dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings {DataContractSurrogate = new BasicQuantityContractSurrogate()};
}

protected override string SerializeObject(object obj)
{
return JsonConvert.SerializeObject(obj, _jsonNetSerializerSettings);
}

protected override T DeserializeObject<T>(string payload)
{
var serializer = new DataContractJsonSerializer(typeof(T), _dataContractJsonSerializerSettings);
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream);
writer.Write(payload);
writer.Flush();
stream.Position = 0;
return (T) serializer.ReadObject(stream);
}

[Fact(Skip = "Arrays are currently not supported by the UnitsNetJsonConverter")]
public override void ArrayOfDoubleValueQuantities_SerializationRoundTrips()
{
base.ArrayOfDoubleValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Arrays are currently not supported by the UnitsNetJsonConverter")]
public override void ArrayOfDecimalValueQuantities_SerializationRoundTrips()
{
base.ArrayOfDecimalValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Arrays are currently not supported by the UnitsNetJsonConverter")]
public override void EmptyArray_RoundTripsEmpty()
{
base.EmptyArray_RoundTripsEmpty();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetJsonConverter")]
public override void TupleOfMixedValueQuantities_SerializationRoundTrips()
{
base.TupleOfMixedValueQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetJsonConverter")]
public override void TupleOfDoubleAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDoubleAndNullQuantities_SerializationRoundTrips();
}

[Fact(Skip = "Tuples are currently not supported by the UnitsNetJsonConverter")]
public override void TupleOfDecimalAndNullQuantities_SerializationRoundTrips()
{
base.TupleOfDecimalAndNullQuantities_SerializationRoundTrips();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.

using System.IO;
using System.Runtime.Serialization.Json;

namespace UnitsNet.Serialization.DataContract.Tests.DataContractJsonSerializerTests
{
public abstract class DataContractJsonSerializerTestsBase : SerializationTestsBase<string>
{
private readonly DataContractJsonSerializerSettings _settings;

protected DataContractJsonSerializerTestsBase()
{
}

protected DataContractJsonSerializerTestsBase(DataContractJsonSerializerSettings settings)
{
_settings = settings;
}

protected override string SerializeObject(object obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType(), _settings);
using var stream = new MemoryStream();
serializer.WriteObject(stream, obj);
stream.Position = 0;
using var streamReader = new StreamReader(stream);
return streamReader.ReadToEnd();
}

protected override T DeserializeObject<T>(string xml)
{
var serializer = new DataContractJsonSerializer(typeof(T), _settings);
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream);
writer.Write(xml);
writer.Flush();
stream.Position = 0;
return (T) serializer.ReadObject(stream);
}
}
}
Loading