From 1919144dc5037aa4b4313c690ee9064b2b06d9b2 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 15 Apr 2021 18:44:34 -0400 Subject: [PATCH 1/3] Fixed a bug where nullable enum like classes could not be deserialized correctly --- .../Converters/EnumLikeStringConverter.cs | 7 +++-- test/Dap.Tests/EnumLikeConverterTests.cs | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 test/Dap.Tests/EnumLikeConverterTests.cs diff --git a/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs b/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs index 54908ccff..1a372f87d 100644 --- a/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs +++ b/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs @@ -13,9 +13,10 @@ public override IEnumLikeString ReadJson( bool hasExistingValue, JsonSerializer serializer ) => - reader.TokenType switch { - JsonToken.String => (IEnumLikeString) Activator.CreateInstance(objectType, (string) reader.Value), - _ => (IEnumLikeString) Activator.CreateInstance(objectType, null) + ( reader.TokenType, Nullable.GetUnderlyingType(objectType) ) switch { + (JsonToken.String, null) => (IEnumLikeString) Activator.CreateInstance(objectType, (string) reader.Value), + (JsonToken.String, { } realType) => (IEnumLikeString) Activator.CreateInstance(realType, (string) reader.Value), + _ => (IEnumLikeString) Activator.CreateInstance(objectType, null) }; public override bool CanRead => true; diff --git a/test/Dap.Tests/EnumLikeConverterTests.cs b/test/Dap.Tests/EnumLikeConverterTests.cs new file mode 100644 index 000000000..2c09da408 --- /dev/null +++ b/test/Dap.Tests/EnumLikeConverterTests.cs @@ -0,0 +1,30 @@ +using System; +using FluentAssertions; +using OmniSharp.Extensions.DebugAdapter.Client; +using OmniSharp.Extensions.DebugAdapter.Protocol; +using OmniSharp.Extensions.DebugAdapter.Protocol.Models; +using OmniSharp.Extensions.DebugAdapter.Protocol.Requests; +using Xunit; + +namespace Dap.Tests +{ + public class EnumLikeConverterTests + { + [Fact] + public void PathFormat_Should_Be_Serializable() + { + var options = new InitializeRequestArguments() { + PathFormat = PathFormat.Uri + }; + + Action a = () => new DapSerializer().SerializeObject(options); + a.Should().NotThrow(); + } + [Fact] + public void PathFormat_Should_Be_Deserializable() + { + Action a = () => new DapSerializer().DeserializeObject("{\"pathformat\": \"Uri\"}"); + a.Should().NotThrow(); + } + } +} From 67b82bde88b49370b18338bdc64146fbd3a11ec7 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 15 Apr 2021 18:54:04 -0400 Subject: [PATCH 2/3] Updated sample project version --- sample/SampleServer/SampleServer.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample/SampleServer/SampleServer.csproj b/sample/SampleServer/SampleServer.csproj index 2c1484e22..cc0db4f2c 100644 --- a/sample/SampleServer/SampleServer.csproj +++ b/sample/SampleServer/SampleServer.csproj @@ -1,11 +1,11 @@ - +la Exe false netcoreapp3.1 win7-x64 - 8.0 + latest From 4abdcc1250f84cf3162a310f19255b51bddc675e Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Thu, 15 Apr 2021 21:51:54 -0400 Subject: [PATCH 3/3] Added test for null cases as well --- sample/SampleServer/SampleServer.csproj | 2 +- .../Converters/EnumLikeStringConverter.cs | 3 ++- test/Dap.Tests/EnumLikeConverterTests.cs | 10 ++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sample/SampleServer/SampleServer.csproj b/sample/SampleServer/SampleServer.csproj index cc0db4f2c..ce86be19e 100644 --- a/sample/SampleServer/SampleServer.csproj +++ b/sample/SampleServer/SampleServer.csproj @@ -1,4 +1,4 @@ -la + Exe diff --git a/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs b/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs index 1a372f87d..6ff70ff86 100644 --- a/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs +++ b/src/JsonRpc/Serialization/Converters/EnumLikeStringConverter.cs @@ -16,7 +16,8 @@ JsonSerializer serializer ( reader.TokenType, Nullable.GetUnderlyingType(objectType) ) switch { (JsonToken.String, null) => (IEnumLikeString) Activator.CreateInstance(objectType, (string) reader.Value), (JsonToken.String, { } realType) => (IEnumLikeString) Activator.CreateInstance(realType, (string) reader.Value), - _ => (IEnumLikeString) Activator.CreateInstance(objectType, null) + (_, { }) => (IEnumLikeString) Activator.CreateInstance(objectType, null), + _ => null }; public override bool CanRead => true; diff --git a/test/Dap.Tests/EnumLikeConverterTests.cs b/test/Dap.Tests/EnumLikeConverterTests.cs index 2c09da408..00e7b5465 100644 --- a/test/Dap.Tests/EnumLikeConverterTests.cs +++ b/test/Dap.Tests/EnumLikeConverterTests.cs @@ -23,8 +23,14 @@ public void PathFormat_Should_Be_Serializable() [Fact] public void PathFormat_Should_Be_Deserializable() { - Action a = () => new DapSerializer().DeserializeObject("{\"pathformat\": \"Uri\"}"); - a.Should().NotThrow(); + Func a = () => new DapSerializer().DeserializeObject("{\"pathformat\": \"Uri\"}"); + a.Should().NotThrow().Subject.PathFormat.Should().NotBeNull(); + } + [Fact] + public void PathFormat_Should_Be_Deserializable_When_Null() + { + var a = new DapSerializer().DeserializeObject("{\"pathformat\":null}"); + a.PathFormat.Should().BeNull(); } } }