Skip to content

Commit 40fd1e4

Browse files
CopilotScarletKuro
andcommitted
Add comprehensive test coverage for DateTimeConverterFactoryHelper and nullable converters
Co-authored-by: ScarletKuro <19953225+ScarletKuro@users.noreply.github.com>
1 parent 4f1d035 commit 40fd1e4

4 files changed

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

0 commit comments

Comments
 (0)