Skip to content

Commit 4ce247f

Browse files
committed
More tests
1 parent f88de90 commit 4ce247f

3 files changed

Lines changed: 160 additions & 76 deletions

File tree

README.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ Make sure you have the appropriate .NET target framework installed. This package
2323

2424
## Usage
2525

26-
Examples of how to serialize and deserialize models with custom date formats using `JsonDateTimeConverter` and `JsonDateTimeFormatConverter`. Note the differences when using source generators with `System.Text.Json`.
26+
Examples of how to serialize and deserialize models with custom date formats using `JsonDateTimeConverter` attribute and `JsonDateTimeFormatConverter` converter.
2727

28-
### Using reflection based with `JsonDateTimeConverter`
28+
**Note:** The `JsonDateTimeConverter` attribute does not support `System.Text.Json` source generators. Using this attribute with `JsonSerializerContext` results in **SYSLIB1223**: "Attributes deriving from `JsonConverterAttribute` are not supported by the source generator."
29+
30+
In such cases, use the `JsonDateTimeFormatConverter`, which also works with reflection-based serialization and deserialization. The `JsonDateTimeConverter` attribute is simply less verbose and more readable than the `JsonDateTimeFormatConverter`.
31+
32+
### Using reflection based only with `JsonDateTimeConverter`
33+
34+
This will work only with reflection-based serialization and deserialization.
2935

3036
```csharp
3137
public class MyModel
@@ -59,13 +65,10 @@ public class Program
5965
}
6066
```
6167

62-
**Note:** `JsonDateTimeConverter` does not support `System.Text.Json` source generators. Using this converter with `JsonSerializerContext` results in **SYSLIB1223**: "Attributes deriving from `JsonConverterAttribute` are not supported by the source generator." For such cases, use `JsonDateTimeFormatConverter`.
63-
6468
### Using Source Generators with `JsonDateTimeFormatConverter`
6569

66-
To work with `System.Text.Json` source generators, use `JsonDateTimeFormatConverter` instead of `JsonDateTimeConverterAttribute`.
70+
To work with `System.Text.Json` source generators, use `JsonDateTimeFormatConverter` instead of `JsonDateTimeConverterAttribute`. This can also work with reflection-based serialization and deserialization.
6771

68-
#### Example Model
6972

7073
```csharp
7174
public class MyModelSourceGenerator

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

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -154,74 +154,4 @@ public void SerializeAndDeserialize_TestModel_WithNullValues_ShouldMatchOriginal
154154
Assert.Null(deserializedModel.NullableDateTimeOffsetProperty);
155155
Assert.Equal(expectedJson, json);
156156
}
157-
158-
[Fact]
159-
public void SerializeAndDeserialize_SourceGenerator_TestModel_ShouldMatchOriginal()
160-
{
161-
// Arrange
162-
var testModelType = typeof(TestModelSourceGenerator);
163-
var context = TestModelSourceGeneratorJsonSerializerContext.Default;
164-
var originalModel = new TestModelSourceGenerator
165-
{
166-
DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
167-
NullableDateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
168-
DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero),
169-
NullableDateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero)
170-
};
171-
const string expectedJson = """
172-
{
173-
"DateTimeProperty": "2023-10-01T12:00:00",
174-
"NullableDateTimeProperty": "2023-10-01T12:00:00",
175-
"DateTimeOffsetProperty": "2023-10-01T12:00:00.000Z",
176-
"NullableDateTimeOffsetProperty": "2023-10-01T12:00:00.000Z"
177-
}
178-
""";
179-
180-
// Act
181-
var json = JsonSerializer.Serialize(originalModel, testModelType, context);
182-
var deserializedModel = (TestModelSourceGenerator?)JsonSerializer.Deserialize(json, testModelType, context);
183-
184-
// Assert
185-
Assert.NotNull(deserializedModel);
186-
Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty);
187-
Assert.Equal(originalModel.NullableDateTimeProperty, deserializedModel.NullableDateTimeProperty);
188-
Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty);
189-
Assert.Equal(originalModel.NullableDateTimeOffsetProperty, deserializedModel.NullableDateTimeOffsetProperty);
190-
Assert.Equal(expectedJson, json);
191-
}
192-
193-
[Fact]
194-
public void SerializeAndDeserialize_SourceGenerator_TestModel_WithNullValues_ShouldMatchOriginal()
195-
{
196-
// Arrange
197-
var testModelType = typeof(TestModelSourceGenerator);
198-
var context = TestModelSourceGeneratorJsonSerializerContext.Default;
199-
var originalModel = new TestModelSourceGenerator
200-
{
201-
DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
202-
NullableDateTimeProperty = null,
203-
DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero),
204-
NullableDateTimeOffsetProperty = null
205-
};
206-
const string expectedJson = """
207-
{
208-
"DateTimeProperty": "2023-10-01T12:00:00",
209-
"NullableDateTimeProperty": null,
210-
"DateTimeOffsetProperty": "2023-10-01T12:00:00.000Z",
211-
"NullableDateTimeOffsetProperty": null
212-
}
213-
""";
214-
215-
// Act
216-
var json = JsonSerializer.Serialize(originalModel, testModelType, context);
217-
var deserializedModel = (TestModelSourceGenerator?)JsonSerializer.Deserialize(json, testModelType, context);
218-
219-
// Assert
220-
Assert.NotNull(deserializedModel);
221-
Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty);
222-
Assert.Null(deserializedModel.NullableDateTimeProperty);
223-
Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty);
224-
Assert.Null(deserializedModel.NullableDateTimeOffsetProperty);
225-
Assert.Equal(expectedJson, json);
226-
}
227157
}
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
using System.Text.Json;
2+
using Scarlet.System.Text.Json.DateTimeConverter.Tests.Model;
3+
4+
namespace Scarlet.System.Text.Json.DateTimeConverter.Tests;
5+
6+
public class JsonDateTimeFormatConverterTests
7+
{
8+
[Fact]
9+
public void SerializeAndDeserialize_Reflection_TestModel_ShouldMatchOriginal()
10+
{
11+
// Arrange
12+
var options = new JsonSerializerOptions
13+
{
14+
WriteIndented = true
15+
};
16+
var originalModel = new TestModelSourceGenerator
17+
{
18+
DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
19+
NullableDateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
20+
DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero),
21+
NullableDateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero)
22+
};
23+
const string expectedJson = """
24+
{
25+
"DateTimeProperty": "2023-10-01T12:00:00",
26+
"NullableDateTimeProperty": "2023-10-01T12:00:00",
27+
"DateTimeOffsetProperty": "2023-10-01T12:00:00.000Z",
28+
"NullableDateTimeOffsetProperty": "2023-10-01T12:00:00.000Z"
29+
}
30+
""";
31+
32+
// Act
33+
var json = JsonSerializer.Serialize(originalModel, options);
34+
var deserializedModel = JsonSerializer.Deserialize<TestModelSourceGenerator>(json, options);
35+
36+
// Assert
37+
Assert.NotNull(deserializedModel);
38+
Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty);
39+
Assert.Equal(originalModel.NullableDateTimeProperty, deserializedModel.NullableDateTimeProperty);
40+
Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty);
41+
Assert.Equal(originalModel.NullableDateTimeOffsetProperty, deserializedModel.NullableDateTimeOffsetProperty);
42+
Assert.Equal(expectedJson, json);
43+
}
44+
45+
[Fact]
46+
public void SerializeAndDeserialize_Reflection_TestModel_WithNullValues_ShouldMatchOriginal()
47+
{
48+
// Arrange
49+
var options = new JsonSerializerOptions
50+
{
51+
WriteIndented = true
52+
};
53+
var originalModel = new TestModelSourceGenerator
54+
{
55+
DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
56+
NullableDateTimeProperty = null,
57+
DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero),
58+
NullableDateTimeOffsetProperty = null
59+
};
60+
const string expectedJson = """
61+
{
62+
"DateTimeProperty": "2023-10-01T12:00:00",
63+
"NullableDateTimeProperty": null,
64+
"DateTimeOffsetProperty": "2023-10-01T12:00:00.000Z",
65+
"NullableDateTimeOffsetProperty": null
66+
}
67+
""";
68+
69+
// Act
70+
var json = JsonSerializer.Serialize(originalModel, options);
71+
var deserializedModel = JsonSerializer.Deserialize<TestModelSourceGenerator>(json, options);
72+
73+
// Assert
74+
Assert.NotNull(deserializedModel);
75+
Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty);
76+
Assert.Null(deserializedModel.NullableDateTimeProperty);
77+
Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty);
78+
Assert.Null(deserializedModel.NullableDateTimeOffsetProperty);
79+
Assert.Equal(expectedJson, json);
80+
}
81+
82+
[Fact]
83+
public void SerializeAndDeserialize_SourceGenerator_TestModel_ShouldMatchOriginal()
84+
{
85+
// Arrange
86+
var testModelType = typeof(TestModelSourceGenerator);
87+
var context = TestModelSourceGeneratorJsonSerializerContext.Default;
88+
var originalModel = new TestModelSourceGenerator
89+
{
90+
DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
91+
NullableDateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
92+
DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero),
93+
NullableDateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero)
94+
};
95+
const string expectedJson = """
96+
{
97+
"DateTimeProperty": "2023-10-01T12:00:00",
98+
"NullableDateTimeProperty": "2023-10-01T12:00:00",
99+
"DateTimeOffsetProperty": "2023-10-01T12:00:00.000Z",
100+
"NullableDateTimeOffsetProperty": "2023-10-01T12:00:00.000Z"
101+
}
102+
""";
103+
104+
// Act
105+
var json = JsonSerializer.Serialize(originalModel, testModelType, context);
106+
var deserializedModel = (TestModelSourceGenerator?)JsonSerializer.Deserialize(json, testModelType, context);
107+
108+
// Assert
109+
Assert.NotNull(deserializedModel);
110+
Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty);
111+
Assert.Equal(originalModel.NullableDateTimeProperty, deserializedModel.NullableDateTimeProperty);
112+
Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty);
113+
Assert.Equal(originalModel.NullableDateTimeOffsetProperty, deserializedModel.NullableDateTimeOffsetProperty);
114+
Assert.Equal(expectedJson, json);
115+
}
116+
117+
[Fact]
118+
public void SerializeAndDeserialize_SourceGenerator_TestModel_WithNullValues_ShouldMatchOriginal()
119+
{
120+
// Arrange
121+
var testModelType = typeof(TestModelSourceGenerator);
122+
var context = TestModelSourceGeneratorJsonSerializerContext.Default;
123+
var originalModel = new TestModelSourceGenerator
124+
{
125+
DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc),
126+
NullableDateTimeProperty = null,
127+
DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero),
128+
NullableDateTimeOffsetProperty = null
129+
};
130+
const string expectedJson = """
131+
{
132+
"DateTimeProperty": "2023-10-01T12:00:00",
133+
"NullableDateTimeProperty": null,
134+
"DateTimeOffsetProperty": "2023-10-01T12:00:00.000Z",
135+
"NullableDateTimeOffsetProperty": null
136+
}
137+
""";
138+
139+
// Act
140+
var json = JsonSerializer.Serialize(originalModel, testModelType, context);
141+
var deserializedModel = (TestModelSourceGenerator?)JsonSerializer.Deserialize(json, testModelType, context);
142+
143+
// Assert
144+
Assert.NotNull(deserializedModel);
145+
Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty);
146+
Assert.Null(deserializedModel.NullableDateTimeProperty);
147+
Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty);
148+
Assert.Null(deserializedModel.NullableDateTimeOffsetProperty);
149+
Assert.Equal(expectedJson, json);
150+
}
151+
}

0 commit comments

Comments
 (0)