Skip to content

Commit a4ad7fb

Browse files
CopilotScarletKuro
andauthored
Test: Cover DateTimeConverterFactoryHelper and nullable converter WriteNullValue paths (#5)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: ScarletKuro <19953225+ScarletKuro@users.noreply.github.com>
1 parent 4ee291c commit a4ad7fb

4 files changed

Lines changed: 369 additions & 26 deletions

File tree

src/Scarlet.System.Text.Json.DateTimeConverter.Tests/ConverterTests.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ public void DateTimeConverter_Read_ValidFormat_Success()
3333
// Arrange
3434
var options = new JsonSerializerOptions
3535
{
36-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime)) }
36+
Converters = { new JsonDateTimeConverterAttribute("MM/dd/yyyy").CreateConverter(typeof(DateTime)) }
3737
};
38-
var json = "\"2023-10-15\"";
38+
var json = "\"10/15/2023\"";
3939

4040
// Act
4141
var result = JsonSerializer.Deserialize<DateTime>(json, options);
@@ -50,7 +50,7 @@ public void DateTimeConverter_Read_InvalidFormat_FallbackToGetDateTime()
5050
// Arrange
5151
var options = new JsonSerializerOptions
5252
{
53-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime)) }
53+
Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateTime)) }
5454
};
5555
// ISO 8601 format that doesn't match our custom format
5656
var json = "\"2023-10-15T14:30:45Z\"";
@@ -107,15 +107,15 @@ public void DateTimeNullableConverter_Write_ValidValue_Success()
107107
// Arrange
108108
var options = new JsonSerializerOptions
109109
{
110-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
110+
Converters = { new JsonDateTimeConverterAttribute("yyyy/MM/dd").CreateConverter(typeof(DateTime?)) }
111111
};
112112
DateTime? date = new DateTime(2023, 10, 15, 14, 30, 45, DateTimeKind.Utc);
113113

114114
// Act
115115
var json = JsonSerializer.Serialize(date, options);
116116

117117
// Assert
118-
Assert.Equal("\"2023-10-15\"", json);
118+
Assert.Equal("\"2023/10/15\"", json);
119119
}
120120

121121
[Fact]
@@ -124,7 +124,7 @@ public void DateTimeNullableConverter_Write_NullValue_Success()
124124
// Arrange
125125
var options = new JsonSerializerOptions
126126
{
127-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
127+
Converters = { new JsonDateTimeConverterAttribute("yyyyMMdd").CreateConverter(typeof(DateTime?)) }
128128
};
129129
DateTime? date = null;
130130

@@ -141,9 +141,9 @@ public void DateTimeNullableConverter_Read_ValidFormat_Success()
141141
// Arrange
142142
var options = new JsonSerializerOptions
143143
{
144-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
144+
Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateTime?)) }
145145
};
146-
var json = "\"2023-10-15\"";
146+
var json = "\"15.10.2023\"";
147147

148148
// Act
149149
var result = JsonSerializer.Deserialize<DateTime?>(json, options);
@@ -159,7 +159,7 @@ public void DateTimeNullableConverter_Read_NullToken_ReturnsNull()
159159
// Arrange
160160
var options = new JsonSerializerOptions
161161
{
162-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
162+
Converters = { new JsonDateTimeConverterAttribute("yyyy.MM.dd").CreateConverter(typeof(DateTime?)) }
163163
};
164164
var json = "null";
165165

@@ -176,7 +176,7 @@ public void DateTimeNullableConverter_Read_InvalidFormat_ReturnsNull()
176176
// Arrange
177177
var options = new JsonSerializerOptions
178178
{
179-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
179+
Converters = { new JsonDateTimeConverterAttribute("MM-dd-yyyy").CreateConverter(typeof(DateTime?)) }
180180
};
181181
var json = "\"invalid-date\"";
182182

@@ -211,7 +211,7 @@ public void DateTimeNullableConverter_RoundTrip_WithNull_Success()
211211
// Arrange
212212
var options = new JsonSerializerOptions
213213
{
214-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
214+
Converters = { new JsonDateTimeConverterAttribute("dd/MM/yyyy").CreateConverter(typeof(DateTime?)) }
215215
};
216216
DateTime? original = null;
217217

@@ -267,7 +267,7 @@ public void DateTimeOffsetConverter_Read_InvalidFormat_FallbackToGetDateTimeOffs
267267
// Arrange
268268
var options = new JsonSerializerOptions
269269
{
270-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset)) }
270+
Converters = { new JsonDateTimeConverterAttribute("yyyyMMdd").CreateConverter(typeof(DateTimeOffset)) }
271271
};
272272
// Standard ISO 8601 format
273273
var json = "\"2023-10-15T14:30:45+00:00\"";
@@ -324,7 +324,7 @@ public void DateTimeOffsetNullableConverter_Write_NullValue_Success()
324324
// Arrange
325325
var options = new JsonSerializerOptions
326326
{
327-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
327+
Converters = { new JsonDateTimeConverterAttribute("yyyy/MM/dd").CreateConverter(typeof(DateTimeOffset?)) }
328328
};
329329
DateTimeOffset? date = null;
330330

@@ -359,7 +359,7 @@ public void DateTimeOffsetNullableConverter_Read_NullToken_ReturnsNull()
359359
// Arrange
360360
var options = new JsonSerializerOptions
361361
{
362-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
362+
Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateTimeOffset?)) }
363363
};
364364
var json = "null";
365365

@@ -376,7 +376,7 @@ public void DateTimeOffsetNullableConverter_Read_InvalidFormat_ReturnsNull()
376376
// Arrange
377377
var options = new JsonSerializerOptions
378378
{
379-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
379+
Converters = { new JsonDateTimeConverterAttribute("MM/dd/yyyy").CreateConverter(typeof(DateTimeOffset?)) }
380380
};
381381
var json = "\"invalid-date\"";
382382

@@ -411,7 +411,7 @@ public void DateTimeOffsetNullableConverter_RoundTrip_WithNull_Success()
411411
// Arrange
412412
var options = new JsonSerializerOptions
413413
{
414-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
414+
Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateTimeOffset?)) }
415415
};
416416
DateTimeOffset? original = null;
417417

@@ -485,7 +485,7 @@ public void DateOnlyConverter_Read_InvalidToken_ThrowsJsonException()
485485
// Arrange
486486
var options = new JsonSerializerOptions
487487
{
488-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly)) }
488+
Converters = { new JsonDateTimeConverterAttribute("dd/MM/yyyy").CreateConverter(typeof(DateOnly)) }
489489
};
490490
var json = "\"invalid-date-format\"";
491491

@@ -538,7 +538,7 @@ public void DateOnlyNullableConverter_Write_NullValue_Success()
538538
// Arrange
539539
var options = new JsonSerializerOptions
540540
{
541-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
541+
Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateOnly?)) }
542542
};
543543
DateOnly? date = null;
544544

@@ -573,7 +573,7 @@ public void DateOnlyNullableConverter_Read_NullToken_ReturnsNull()
573573
// Arrange
574574
var options = new JsonSerializerOptions
575575
{
576-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
576+
Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateOnly?)) }
577577
};
578578
var json = "null";
579579

@@ -590,7 +590,7 @@ public void DateOnlyNullableConverter_Read_InvalidFormat_ReturnsNull()
590590
// Arrange
591591
var options = new JsonSerializerOptions
592592
{
593-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
593+
Converters = { new JsonDateTimeConverterAttribute("MM-dd-yyyy").CreateConverter(typeof(DateOnly?)) }
594594
};
595595
var json = "\"invalid-date\"";
596596

@@ -625,7 +625,7 @@ public void DateOnlyNullableConverter_RoundTrip_WithNull_Success()
625625
// Arrange
626626
var options = new JsonSerializerOptions
627627
{
628-
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
628+
Converters = { new JsonDateTimeConverterAttribute("yyyy.MM.dd").CreateConverter(typeof(DateOnly?)) }
629629
};
630630
DateOnly? original = null;
631631

@@ -681,7 +681,7 @@ public void TimeOnlyConverter_Read_InvalidFormat_FallbackToGetDateTime()
681681
// Arrange
682682
var options = new JsonSerializerOptions
683683
{
684-
Converters = { new JsonDateTimeConverterAttribute("HH:mm").CreateConverter(typeof(TimeOnly)) }
684+
Converters = { new JsonDateTimeConverterAttribute("HH.mm").CreateConverter(typeof(TimeOnly)) }
685685
};
686686
// Full datetime that doesn't match our format
687687
var json = "\"2023-10-15T14:30:45Z\"";
@@ -752,7 +752,7 @@ public void TimeOnlyNullableConverter_Write_NullValue_Success()
752752
// Arrange
753753
var options = new JsonSerializerOptions
754754
{
755-
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
755+
Converters = { new JsonDateTimeConverterAttribute("HH-mm-ss").CreateConverter(typeof(TimeOnly?)) }
756756
};
757757
TimeOnly? time = null;
758758

@@ -787,7 +787,7 @@ public void TimeOnlyNullableConverter_Read_NullToken_ReturnsNull()
787787
// Arrange
788788
var options = new JsonSerializerOptions
789789
{
790-
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
790+
Converters = { new JsonDateTimeConverterAttribute("HH.mm.ss").CreateConverter(typeof(TimeOnly?)) }
791791
};
792792
var json = "null";
793793

@@ -804,7 +804,7 @@ public void TimeOnlyNullableConverter_Read_InvalidFormat_ReturnsNull()
804804
// Arrange
805805
var options = new JsonSerializerOptions
806806
{
807-
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
807+
Converters = { new JsonDateTimeConverterAttribute("mm:ss:HH").CreateConverter(typeof(TimeOnly?)) }
808808
};
809809
var json = "\"invalid-time\"";
810810

@@ -839,7 +839,7 @@ public void TimeOnlyNullableConverter_RoundTrip_WithNull_Success()
839839
// Arrange
840840
var options = new JsonSerializerOptions
841841
{
842-
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
842+
Converters = { new JsonDateTimeConverterAttribute("HH:mm").CreateConverter(typeof(TimeOnly?)) }
843843
};
844844
TimeOnly? original = null;
845845

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace Scarlet.System.Text.Json.DateTimeConverter.Tests;
5+
6+
/// <summary>
7+
/// Unit tests for DateTimeConverterFactoryHelper to ensure full code coverage.
8+
/// </summary>
9+
public class DateTimeConverterFactoryHelperTests
10+
{
11+
private const string TestDateFormat = "yyyy-MM-dd";
12+
private const string TestTimeFormat = "HH:mm:ss";
13+
14+
[Fact]
15+
public void CreateConverter_DateTime_ReturnsDateTimeConverter()
16+
{
17+
// Act
18+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime), TestDateFormat);
19+
20+
// Assert
21+
Assert.NotNull(converter);
22+
Assert.IsType<Converters.DateTimeConverter>(converter);
23+
}
24+
25+
[Fact]
26+
public void CreateConverter_NullableDateTime_ReturnsDateTimeNullableConverter()
27+
{
28+
// Act
29+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime?), TestDateFormat);
30+
31+
// Assert
32+
Assert.NotNull(converter);
33+
Assert.IsType<Converters.DateTimeNullableConverter>(converter);
34+
}
35+
36+
[Fact]
37+
public void CreateConverter_DateTimeOffset_ReturnsDateTimeOffsetConverter()
38+
{
39+
// Act
40+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset), TestDateFormat);
41+
42+
// Assert
43+
Assert.NotNull(converter);
44+
Assert.IsType<Converters.DateTimeOffsetConverter>(converter);
45+
}
46+
47+
[Fact]
48+
public void CreateConverter_NullableDateTimeOffset_ReturnsDateTimeOffsetNullableConverter()
49+
{
50+
// Act
51+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset?), TestDateFormat);
52+
53+
// Assert
54+
Assert.NotNull(converter);
55+
Assert.IsType<Converters.DateTimeOffsetNullableConverter>(converter);
56+
}
57+
58+
[Fact]
59+
public void CreateConverter_DateOnly_ReturnsDateOnlyConverter()
60+
{
61+
// Act
62+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly), TestDateFormat);
63+
64+
// Assert
65+
Assert.NotNull(converter);
66+
Assert.IsType<Converters.DateOnlyConverter>(converter);
67+
}
68+
69+
[Fact]
70+
public void CreateConverter_NullableDateOnly_ReturnsDateOnlyNullableConverter()
71+
{
72+
// Act
73+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly?), TestDateFormat);
74+
75+
// Assert
76+
Assert.NotNull(converter);
77+
Assert.IsType<Converters.DateOnlyNullableConverter>(converter);
78+
}
79+
80+
[Fact]
81+
public void CreateConverter_TimeOnly_ReturnsTimeOnlyConverter()
82+
{
83+
// Act
84+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly), TestTimeFormat);
85+
86+
// Assert
87+
Assert.NotNull(converter);
88+
Assert.IsType<Converters.TimeOnlyConverter>(converter);
89+
}
90+
91+
[Fact]
92+
public void CreateConverter_NullableTimeOnly_ReturnsTimeOnlyNullableConverter()
93+
{
94+
// Act
95+
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly?), TestTimeFormat);
96+
97+
// Assert
98+
Assert.NotNull(converter);
99+
Assert.IsType<Converters.TimeOnlyNullableConverter>(converter);
100+
}
101+
102+
[Fact]
103+
public void CreateConverter_UnsupportedType_ThrowsNotSupportedException()
104+
{
105+
// Act & Assert
106+
var exception = Assert.Throws<NotSupportedException>(() =>
107+
DateTimeConverterFactoryHelper.CreateConverter(typeof(string), TestDateFormat));
108+
109+
Assert.Contains("System.String", exception.Message);
110+
Assert.Contains("DateTimeConverterFactoryHelper", exception.Message);
111+
}
112+
113+
[Fact]
114+
public void CreateConverter_AnotherUnsupportedType_ThrowsNotSupportedException()
115+
{
116+
// Act & Assert
117+
var exception = Assert.Throws<NotSupportedException>(() =>
118+
DateTimeConverterFactoryHelper.CreateConverter(typeof(int), TestDateFormat));
119+
120+
Assert.Contains("System.Int32", exception.Message);
121+
Assert.Contains("DateTimeConverterFactoryHelper", exception.Message);
122+
}
123+
124+
[Fact]
125+
public void CreateConverter_NullType_ThrowsArgumentNullException()
126+
{
127+
// Act & Assert
128+
Assert.Throws<ArgumentNullException>(() =>
129+
DateTimeConverterFactoryHelper.CreateConverter(null!, TestDateFormat));
130+
}
131+
}

0 commit comments

Comments
 (0)