From 4f1d035689a9063d62f7ae48e2703d2ba909f911 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:05:44 +0000 Subject: [PATCH 1/3] Initial plan From 40fd1e4a7b905e990f0e1f38e7af59176404e199 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:12:34 +0000 Subject: [PATCH 2/3] Add comprehensive test coverage for DateTimeConverterFactoryHelper and nullable converters Co-authored-by: ScarletKuro <19953225+ScarletKuro@users.noreply.github.com> --- .../ConverterTests.cs | 52 ++--- .../DateTimeConverterFactoryHelperTests.cs | 128 +++++++++++ .../NullableConverterWriteTests.cs | 199 ++++++++++++++++++ ....System.Text.Json.DateTimeConverter.csproj | 4 + 4 files changed, 357 insertions(+), 26 deletions(-) create mode 100644 src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs create mode 100644 src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs diff --git a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/ConverterTests.cs b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/ConverterTests.cs index e0a2104..f686ae1 100644 --- a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/ConverterTests.cs +++ b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/ConverterTests.cs @@ -33,9 +33,9 @@ public void DateTimeConverter_Read_ValidFormat_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime)) } + Converters = { new JsonDateTimeConverterAttribute("MM/dd/yyyy").CreateConverter(typeof(DateTime)) } }; - var json = "\"2023-10-15\""; + var json = "\"10/15/2023\""; // Act var result = JsonSerializer.Deserialize(json, options); @@ -50,7 +50,7 @@ public void DateTimeConverter_Read_InvalidFormat_FallbackToGetDateTime() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime)) } + Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateTime)) } }; // ISO 8601 format that doesn't match our custom format var json = "\"2023-10-15T14:30:45Z\""; @@ -107,7 +107,7 @@ public void DateTimeNullableConverter_Write_ValidValue_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) } + Converters = { new JsonDateTimeConverterAttribute("yyyy/MM/dd").CreateConverter(typeof(DateTime?)) } }; DateTime? date = new DateTime(2023, 10, 15, 14, 30, 45, DateTimeKind.Utc); @@ -115,7 +115,7 @@ public void DateTimeNullableConverter_Write_ValidValue_Success() var json = JsonSerializer.Serialize(date, options); // Assert - Assert.Equal("\"2023-10-15\"", json); + Assert.Equal("\"2023/10/15\"", json); } [Fact] @@ -124,7 +124,7 @@ public void DateTimeNullableConverter_Write_NullValue_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) } + Converters = { new JsonDateTimeConverterAttribute("yyyyMMdd").CreateConverter(typeof(DateTime?)) } }; DateTime? date = null; @@ -141,9 +141,9 @@ public void DateTimeNullableConverter_Read_ValidFormat_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) } + Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateTime?)) } }; - var json = "\"2023-10-15\""; + var json = "\"15.10.2023\""; // Act var result = JsonSerializer.Deserialize(json, options); @@ -159,7 +159,7 @@ public void DateTimeNullableConverter_Read_NullToken_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) } + Converters = { new JsonDateTimeConverterAttribute("yyyy.MM.dd").CreateConverter(typeof(DateTime?)) } }; var json = "null"; @@ -176,7 +176,7 @@ public void DateTimeNullableConverter_Read_InvalidFormat_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) } + Converters = { new JsonDateTimeConverterAttribute("MM-dd-yyyy").CreateConverter(typeof(DateTime?)) } }; var json = "\"invalid-date\""; @@ -211,7 +211,7 @@ public void DateTimeNullableConverter_RoundTrip_WithNull_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) } + Converters = { new JsonDateTimeConverterAttribute("dd/MM/yyyy").CreateConverter(typeof(DateTime?)) } }; DateTime? original = null; @@ -267,7 +267,7 @@ public void DateTimeOffsetConverter_Read_InvalidFormat_FallbackToGetDateTimeOffs // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset)) } + Converters = { new JsonDateTimeConverterAttribute("yyyyMMdd").CreateConverter(typeof(DateTimeOffset)) } }; // Standard ISO 8601 format var json = "\"2023-10-15T14:30:45+00:00\""; @@ -324,7 +324,7 @@ public void DateTimeOffsetNullableConverter_Write_NullValue_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) } + Converters = { new JsonDateTimeConverterAttribute("yyyy/MM/dd").CreateConverter(typeof(DateTimeOffset?)) } }; DateTimeOffset? date = null; @@ -359,7 +359,7 @@ public void DateTimeOffsetNullableConverter_Read_NullToken_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) } + Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateTimeOffset?)) } }; var json = "null"; @@ -376,7 +376,7 @@ public void DateTimeOffsetNullableConverter_Read_InvalidFormat_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) } + Converters = { new JsonDateTimeConverterAttribute("MM/dd/yyyy").CreateConverter(typeof(DateTimeOffset?)) } }; var json = "\"invalid-date\""; @@ -411,7 +411,7 @@ public void DateTimeOffsetNullableConverter_RoundTrip_WithNull_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) } + Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateTimeOffset?)) } }; DateTimeOffset? original = null; @@ -485,7 +485,7 @@ public void DateOnlyConverter_Read_InvalidToken_ThrowsJsonException() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly)) } + Converters = { new JsonDateTimeConverterAttribute("dd/MM/yyyy").CreateConverter(typeof(DateOnly)) } }; var json = "\"invalid-date-format\""; @@ -538,7 +538,7 @@ public void DateOnlyNullableConverter_Write_NullValue_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateOnly?)) } }; DateOnly? date = null; @@ -573,7 +573,7 @@ public void DateOnlyNullableConverter_Read_NullToken_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateOnly?)) } }; var json = "null"; @@ -590,7 +590,7 @@ public void DateOnlyNullableConverter_Read_InvalidFormat_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("MM-dd-yyyy").CreateConverter(typeof(DateOnly?)) } }; var json = "\"invalid-date\""; @@ -625,7 +625,7 @@ public void DateOnlyNullableConverter_RoundTrip_WithNull_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("yyyy.MM.dd").CreateConverter(typeof(DateOnly?)) } }; DateOnly? original = null; @@ -681,7 +681,7 @@ public void TimeOnlyConverter_Read_InvalidFormat_FallbackToGetDateTime() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("HH:mm").CreateConverter(typeof(TimeOnly)) } + Converters = { new JsonDateTimeConverterAttribute("HH.mm").CreateConverter(typeof(TimeOnly)) } }; // Full datetime that doesn't match our format var json = "\"2023-10-15T14:30:45Z\""; @@ -752,7 +752,7 @@ public void TimeOnlyNullableConverter_Write_NullValue_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("HH-mm-ss").CreateConverter(typeof(TimeOnly?)) } }; TimeOnly? time = null; @@ -787,7 +787,7 @@ public void TimeOnlyNullableConverter_Read_NullToken_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("HH.mm.ss").CreateConverter(typeof(TimeOnly?)) } }; var json = "null"; @@ -804,7 +804,7 @@ public void TimeOnlyNullableConverter_Read_InvalidFormat_ReturnsNull() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("mm:ss:HH").CreateConverter(typeof(TimeOnly?)) } }; var json = "\"invalid-time\""; @@ -839,7 +839,7 @@ public void TimeOnlyNullableConverter_RoundTrip_WithNull_Success() // Arrange var options = new JsonSerializerOptions { - Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) } + Converters = { new JsonDateTimeConverterAttribute("HH:mm").CreateConverter(typeof(TimeOnly?)) } }; TimeOnly? original = null; diff --git a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs new file mode 100644 index 0000000..26be37f --- /dev/null +++ b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs @@ -0,0 +1,128 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Scarlet.System.Text.Json.DateTimeConverter.Tests; + +/// +/// Unit tests for DateTimeConverterFactoryHelper to ensure full code coverage. +/// +public class DateTimeConverterFactoryHelperTests +{ + [Fact] + public void CreateConverter_DateTime_ReturnsDateTimeConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime), "yyyy-MM-dd"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_NullableDateTime_ReturnsDateTimeNullableConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime?), "yyyy-MM-dd"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_DateTimeOffset_ReturnsDateTimeOffsetConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset), "yyyy-MM-dd"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_NullableDateTimeOffset_ReturnsDateTimeOffsetNullableConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset?), "yyyy-MM-dd"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_DateOnly_ReturnsDateOnlyConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly), "yyyy-MM-dd"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_NullableDateOnly_ReturnsDateOnlyNullableConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly?), "yyyy-MM-dd"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_TimeOnly_ReturnsTimeOnlyConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly), "HH:mm:ss"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_NullableTimeOnly_ReturnsTimeOnlyNullableConverter() + { + // Act + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly?), "HH:mm:ss"); + + // Assert + Assert.NotNull(converter); + Assert.IsType(converter); + } + + [Fact] + public void CreateConverter_UnsupportedType_ThrowsNotSupportedException() + { + // Act & Assert + var exception = Assert.Throws(() => + DateTimeConverterFactoryHelper.CreateConverter(typeof(string), "yyyy-MM-dd")); + + Assert.Contains("System.String", exception.Message); + Assert.Contains("DateTimeConverterFactoryHelper", exception.Message); + } + + [Fact] + public void CreateConverter_AnotherUnsupportedType_ThrowsNotSupportedException() + { + // Act & Assert + var exception = Assert.Throws(() => + DateTimeConverterFactoryHelper.CreateConverter(typeof(int), "yyyy-MM-dd")); + + Assert.Contains("System.Int32", exception.Message); + Assert.Contains("DateTimeConverterFactoryHelper", exception.Message); + } + + [Fact] + public void CreateConverter_NullType_ThrowsArgumentNullException() + { + // Act & Assert + Assert.Throws(() => + DateTimeConverterFactoryHelper.CreateConverter(null!, "yyyy-MM-dd")); + } +} diff --git a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs new file mode 100644 index 0000000..71cc642 --- /dev/null +++ b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs @@ -0,0 +1,199 @@ +using System.Text; +using System.Text.Json; + +namespace Scarlet.System.Text.Json.DateTimeConverter.Tests; + +/// +/// Direct unit tests for nullable converters' Write method to ensure WriteNullValue() path is covered. +/// These tests directly invoke the converter's Write method with null values. +/// +public class NullableConverterWriteTests +{ + [Fact] + public void DateTimeNullableConverter_Write_DirectCallWithNull_WritesNullValue() + { + // Arrange + var converter = Converters.DateTimeNullableConverter.FromFormat("yyyy-MM-dd"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + DateTime? value = null; + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("null", json); + } + + [Fact] + public void DateTimeNullableConverter_Write_DirectCallWithValue_WritesFormattedDate() + { + // Arrange + var converter = Converters.DateTimeNullableConverter.FromFormat("yyyy-MM-dd"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + DateTime? value = new DateTime(2023, 10, 15); + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("\"2023-10-15\"", json); + } + + [Fact] + public void DateTimeOffsetNullableConverter_Write_DirectCallWithNull_WritesNullValue() + { + // Arrange + var converter = Converters.DateTimeOffsetNullableConverter.FromFormat("yyyy-MM-dd"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + DateTimeOffset? value = null; + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("null", json); + } + + [Fact] + public void DateTimeOffsetNullableConverter_Write_DirectCallWithValue_WritesFormattedDate() + { + // Arrange + var converter = Converters.DateTimeOffsetNullableConverter.FromFormat("yyyy-MM-dd"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + DateTimeOffset? value = new DateTimeOffset(2023, 10, 15, 0, 0, 0, TimeSpan.Zero); + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("\"2023-10-15\"", json); + } + + [Fact] + public void DateOnlyNullableConverter_Write_DirectCallWithNull_WritesNullValue() + { + // Arrange + var converter = Converters.DateOnlyNullableConverter.FromFormat("yyyy-MM-dd"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + DateOnly? value = null; + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("null", json); + } + + [Fact] + public void DateOnlyNullableConverter_Write_DirectCallWithValue_WritesFormattedDate() + { + // Arrange + var converter = Converters.DateOnlyNullableConverter.FromFormat("yyyy-MM-dd"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + DateOnly? value = new DateOnly(2023, 10, 15); + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("\"2023-10-15\"", json); + } + + [Fact] + public void TimeOnlyNullableConverter_Write_DirectCallWithNull_WritesNullValue() + { + // Arrange + var converter = Converters.TimeOnlyNullableConverter.FromFormat("HH:mm:ss"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + TimeOnly? value = null; + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("null", json); + } + + [Fact] + public void TimeOnlyNullableConverter_Write_DirectCallWithValue_WritesFormattedTime() + { + // Arrange + var converter = Converters.TimeOnlyNullableConverter.FromFormat("HH:mm:ss"); + using var stream = new MemoryStream(); + using var writer = new Utf8JsonWriter(stream); + TimeOnly? value = new TimeOnly(14, 30, 45); + + // Act + converter.Write(writer, value, new JsonSerializerOptions()); + writer.Flush(); + + // Assert + var json = Encoding.UTF8.GetString(stream.ToArray()); + Assert.Equal("\"14:30:45\"", json); + } + + [Fact] + public void DateTimeNullableConverter_Write_NullWriter_ThrowsArgumentNullException() + { + // Arrange + var converter = Converters.DateTimeNullableConverter.FromFormat("yyyy-MM-dd"); + DateTime? value = new DateTime(2023, 10, 15); + + // Act & Assert + Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); + } + + [Fact] + public void DateTimeOffsetNullableConverter_Write_NullWriter_ThrowsArgumentNullException() + { + // Arrange + var converter = Converters.DateTimeOffsetNullableConverter.FromFormat("yyyy-MM-dd"); + DateTimeOffset? value = new DateTimeOffset(2023, 10, 15, 0, 0, 0, TimeSpan.Zero); + + // Act & Assert + Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); + } + + [Fact] + public void DateOnlyNullableConverter_Write_NullWriter_ThrowsArgumentNullException() + { + // Arrange + var converter = Converters.DateOnlyNullableConverter.FromFormat("yyyy-MM-dd"); + DateOnly? value = new DateOnly(2023, 10, 15); + + // Act & Assert + Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); + } + + [Fact] + public void TimeOnlyNullableConverter_Write_NullWriter_ThrowsArgumentNullException() + { + // Arrange + var converter = Converters.TimeOnlyNullableConverter.FromFormat("HH:mm:ss"); + TimeOnly? value = new TimeOnly(14, 30, 45); + + // Act & Assert + Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); + } +} diff --git a/src/Scarlet.System.Text.Json.DateTimeConverter/Scarlet.System.Text.Json.DateTimeConverter.csproj b/src/Scarlet.System.Text.Json.DateTimeConverter/Scarlet.System.Text.Json.DateTimeConverter.csproj index e2446e4..5f7d9e7 100644 --- a/src/Scarlet.System.Text.Json.DateTimeConverter/Scarlet.System.Text.Json.DateTimeConverter.csproj +++ b/src/Scarlet.System.Text.Json.DateTimeConverter/Scarlet.System.Text.Json.DateTimeConverter.csproj @@ -56,4 +56,8 @@ + + + + From 0269fdb584568efd0c7ed418dcefb1b87b1fcf3d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:14:31 +0000 Subject: [PATCH 3/3] Refactor tests to use constants for maintainability Co-authored-by: ScarletKuro <19953225+ScarletKuro@users.noreply.github.com> --- .../DateTimeConverterFactoryHelperTests.cs | 25 +++++----- .../NullableConverterWriteTests.cs | 49 +++++++++++-------- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs index 26be37f..e1db479 100644 --- a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs +++ b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/DateTimeConverterFactoryHelperTests.cs @@ -8,11 +8,14 @@ namespace Scarlet.System.Text.Json.DateTimeConverter.Tests; /// public class DateTimeConverterFactoryHelperTests { + private const string TestDateFormat = "yyyy-MM-dd"; + private const string TestTimeFormat = "HH:mm:ss"; + [Fact] public void CreateConverter_DateTime_ReturnsDateTimeConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime), "yyyy-MM-dd"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime), TestDateFormat); // Assert Assert.NotNull(converter); @@ -23,7 +26,7 @@ public void CreateConverter_DateTime_ReturnsDateTimeConverter() public void CreateConverter_NullableDateTime_ReturnsDateTimeNullableConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime?), "yyyy-MM-dd"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime?), TestDateFormat); // Assert Assert.NotNull(converter); @@ -34,7 +37,7 @@ public void CreateConverter_NullableDateTime_ReturnsDateTimeNullableConverter() public void CreateConverter_DateTimeOffset_ReturnsDateTimeOffsetConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset), "yyyy-MM-dd"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset), TestDateFormat); // Assert Assert.NotNull(converter); @@ -45,7 +48,7 @@ public void CreateConverter_DateTimeOffset_ReturnsDateTimeOffsetConverter() public void CreateConverter_NullableDateTimeOffset_ReturnsDateTimeOffsetNullableConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset?), "yyyy-MM-dd"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset?), TestDateFormat); // Assert Assert.NotNull(converter); @@ -56,7 +59,7 @@ public void CreateConverter_NullableDateTimeOffset_ReturnsDateTimeOffsetNullable public void CreateConverter_DateOnly_ReturnsDateOnlyConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly), "yyyy-MM-dd"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly), TestDateFormat); // Assert Assert.NotNull(converter); @@ -67,7 +70,7 @@ public void CreateConverter_DateOnly_ReturnsDateOnlyConverter() public void CreateConverter_NullableDateOnly_ReturnsDateOnlyNullableConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly?), "yyyy-MM-dd"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly?), TestDateFormat); // Assert Assert.NotNull(converter); @@ -78,7 +81,7 @@ public void CreateConverter_NullableDateOnly_ReturnsDateOnlyNullableConverter() public void CreateConverter_TimeOnly_ReturnsTimeOnlyConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly), "HH:mm:ss"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly), TestTimeFormat); // Assert Assert.NotNull(converter); @@ -89,7 +92,7 @@ public void CreateConverter_TimeOnly_ReturnsTimeOnlyConverter() public void CreateConverter_NullableTimeOnly_ReturnsTimeOnlyNullableConverter() { // Act - var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly?), "HH:mm:ss"); + var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly?), TestTimeFormat); // Assert Assert.NotNull(converter); @@ -101,7 +104,7 @@ public void CreateConverter_UnsupportedType_ThrowsNotSupportedException() { // Act & Assert var exception = Assert.Throws(() => - DateTimeConverterFactoryHelper.CreateConverter(typeof(string), "yyyy-MM-dd")); + DateTimeConverterFactoryHelper.CreateConverter(typeof(string), TestDateFormat)); Assert.Contains("System.String", exception.Message); Assert.Contains("DateTimeConverterFactoryHelper", exception.Message); @@ -112,7 +115,7 @@ public void CreateConverter_AnotherUnsupportedType_ThrowsNotSupportedException() { // Act & Assert var exception = Assert.Throws(() => - DateTimeConverterFactoryHelper.CreateConverter(typeof(int), "yyyy-MM-dd")); + DateTimeConverterFactoryHelper.CreateConverter(typeof(int), TestDateFormat)); Assert.Contains("System.Int32", exception.Message); Assert.Contains("DateTimeConverterFactoryHelper", exception.Message); @@ -123,6 +126,6 @@ public void CreateConverter_NullType_ThrowsArgumentNullException() { // Act & Assert Assert.Throws(() => - DateTimeConverterFactoryHelper.CreateConverter(null!, "yyyy-MM-dd")); + DateTimeConverterFactoryHelper.CreateConverter(null!, TestDateFormat)); } } diff --git a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs index 71cc642..143dd2c 100644 --- a/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs +++ b/src/Scarlet.System.Text.Json.DateTimeConverter.Tests/NullableConverterWriteTests.cs @@ -9,11 +9,20 @@ namespace Scarlet.System.Text.Json.DateTimeConverter.Tests; /// public class NullableConverterWriteTests { + private const string TestDateFormat = "yyyy-MM-dd"; + private const string TestTimeFormat = "HH:mm:ss"; + private const int TestYear = 2023; + private const int TestMonth = 10; + private const int TestDay = 15; + private const int TestHour = 14; + private const int TestMinute = 30; + private const int TestSecond = 45; + [Fact] public void DateTimeNullableConverter_Write_DirectCallWithNull_WritesNullValue() { // Arrange - var converter = Converters.DateTimeNullableConverter.FromFormat("yyyy-MM-dd"); + var converter = Converters.DateTimeNullableConverter.FromFormat(TestDateFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); DateTime? value = null; @@ -31,10 +40,10 @@ public void DateTimeNullableConverter_Write_DirectCallWithNull_WritesNullValue() public void DateTimeNullableConverter_Write_DirectCallWithValue_WritesFormattedDate() { // Arrange - var converter = Converters.DateTimeNullableConverter.FromFormat("yyyy-MM-dd"); + var converter = Converters.DateTimeNullableConverter.FromFormat(TestDateFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); - DateTime? value = new DateTime(2023, 10, 15); + DateTime? value = new DateTime(TestYear, TestMonth, TestDay); // Act converter.Write(writer, value, new JsonSerializerOptions()); @@ -49,7 +58,7 @@ public void DateTimeNullableConverter_Write_DirectCallWithValue_WritesFormattedD public void DateTimeOffsetNullableConverter_Write_DirectCallWithNull_WritesNullValue() { // Arrange - var converter = Converters.DateTimeOffsetNullableConverter.FromFormat("yyyy-MM-dd"); + var converter = Converters.DateTimeOffsetNullableConverter.FromFormat(TestDateFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); DateTimeOffset? value = null; @@ -67,10 +76,10 @@ public void DateTimeOffsetNullableConverter_Write_DirectCallWithNull_WritesNullV public void DateTimeOffsetNullableConverter_Write_DirectCallWithValue_WritesFormattedDate() { // Arrange - var converter = Converters.DateTimeOffsetNullableConverter.FromFormat("yyyy-MM-dd"); + var converter = Converters.DateTimeOffsetNullableConverter.FromFormat(TestDateFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); - DateTimeOffset? value = new DateTimeOffset(2023, 10, 15, 0, 0, 0, TimeSpan.Zero); + DateTimeOffset? value = new DateTimeOffset(TestYear, TestMonth, TestDay, 0, 0, 0, TimeSpan.Zero); // Act converter.Write(writer, value, new JsonSerializerOptions()); @@ -85,7 +94,7 @@ public void DateTimeOffsetNullableConverter_Write_DirectCallWithValue_WritesForm public void DateOnlyNullableConverter_Write_DirectCallWithNull_WritesNullValue() { // Arrange - var converter = Converters.DateOnlyNullableConverter.FromFormat("yyyy-MM-dd"); + var converter = Converters.DateOnlyNullableConverter.FromFormat(TestDateFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); DateOnly? value = null; @@ -103,10 +112,10 @@ public void DateOnlyNullableConverter_Write_DirectCallWithNull_WritesNullValue() public void DateOnlyNullableConverter_Write_DirectCallWithValue_WritesFormattedDate() { // Arrange - var converter = Converters.DateOnlyNullableConverter.FromFormat("yyyy-MM-dd"); + var converter = Converters.DateOnlyNullableConverter.FromFormat(TestDateFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); - DateOnly? value = new DateOnly(2023, 10, 15); + DateOnly? value = new DateOnly(TestYear, TestMonth, TestDay); // Act converter.Write(writer, value, new JsonSerializerOptions()); @@ -121,7 +130,7 @@ public void DateOnlyNullableConverter_Write_DirectCallWithValue_WritesFormattedD public void TimeOnlyNullableConverter_Write_DirectCallWithNull_WritesNullValue() { // Arrange - var converter = Converters.TimeOnlyNullableConverter.FromFormat("HH:mm:ss"); + var converter = Converters.TimeOnlyNullableConverter.FromFormat(TestTimeFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); TimeOnly? value = null; @@ -139,10 +148,10 @@ public void TimeOnlyNullableConverter_Write_DirectCallWithNull_WritesNullValue() public void TimeOnlyNullableConverter_Write_DirectCallWithValue_WritesFormattedTime() { // Arrange - var converter = Converters.TimeOnlyNullableConverter.FromFormat("HH:mm:ss"); + var converter = Converters.TimeOnlyNullableConverter.FromFormat(TestTimeFormat); using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); - TimeOnly? value = new TimeOnly(14, 30, 45); + TimeOnly? value = new TimeOnly(TestHour, TestMinute, TestSecond); // Act converter.Write(writer, value, new JsonSerializerOptions()); @@ -157,8 +166,8 @@ public void TimeOnlyNullableConverter_Write_DirectCallWithValue_WritesFormattedT public void DateTimeNullableConverter_Write_NullWriter_ThrowsArgumentNullException() { // Arrange - var converter = Converters.DateTimeNullableConverter.FromFormat("yyyy-MM-dd"); - DateTime? value = new DateTime(2023, 10, 15); + var converter = Converters.DateTimeNullableConverter.FromFormat(TestDateFormat); + DateTime? value = new DateTime(TestYear, TestMonth, TestDay); // Act & Assert Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); @@ -168,8 +177,8 @@ public void DateTimeNullableConverter_Write_NullWriter_ThrowsArgumentNullExcepti public void DateTimeOffsetNullableConverter_Write_NullWriter_ThrowsArgumentNullException() { // Arrange - var converter = Converters.DateTimeOffsetNullableConverter.FromFormat("yyyy-MM-dd"); - DateTimeOffset? value = new DateTimeOffset(2023, 10, 15, 0, 0, 0, TimeSpan.Zero); + var converter = Converters.DateTimeOffsetNullableConverter.FromFormat(TestDateFormat); + DateTimeOffset? value = new DateTimeOffset(TestYear, TestMonth, TestDay, 0, 0, 0, TimeSpan.Zero); // Act & Assert Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); @@ -179,8 +188,8 @@ public void DateTimeOffsetNullableConverter_Write_NullWriter_ThrowsArgumentNullE public void DateOnlyNullableConverter_Write_NullWriter_ThrowsArgumentNullException() { // Arrange - var converter = Converters.DateOnlyNullableConverter.FromFormat("yyyy-MM-dd"); - DateOnly? value = new DateOnly(2023, 10, 15); + var converter = Converters.DateOnlyNullableConverter.FromFormat(TestDateFormat); + DateOnly? value = new DateOnly(TestYear, TestMonth, TestDay); // Act & Assert Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions())); @@ -190,8 +199,8 @@ public void DateOnlyNullableConverter_Write_NullWriter_ThrowsArgumentNullExcepti public void TimeOnlyNullableConverter_Write_NullWriter_ThrowsArgumentNullException() { // Arrange - var converter = Converters.TimeOnlyNullableConverter.FromFormat("HH:mm:ss"); - TimeOnly? value = new TimeOnly(14, 30, 45); + var converter = Converters.TimeOnlyNullableConverter.FromFormat(TestTimeFormat); + TimeOnly? value = new TimeOnly(TestHour, TestMinute, TestSecond); // Act & Assert Assert.Throws(() => converter.Write(null!, value, new JsonSerializerOptions()));