|
| 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 partial class ReflectionBasedTests |
| 7 | +{ |
| 8 | + [Fact] |
| 9 | + public void ReflectionBased_WithoutResolver_WithFormatAttribute_DoesNotApplyFormat() |
| 10 | + { |
| 11 | + // Arrange |
| 12 | + var options = new JsonSerializerOptions |
| 13 | + { |
| 14 | + WriteIndented = true |
| 15 | + }; |
| 16 | + var originalModel = new SourceGeneratorModelWithAttribute |
| 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 | + DateOnlyProperty = new DateOnly(2023, 10, 1), |
| 23 | + NullableDateOnlyProperty = new DateOnly(2023, 10, 1), |
| 24 | + TimeOnlyProperty = new TimeOnly(14, 30, 45), |
| 25 | + NullableTimeOnlyProperty = new TimeOnly(14, 30, 45) |
| 26 | + }; |
| 27 | + // Expected JSON with DEFAULT formats (not the custom formats from JsonDateTimeFormat attribute) |
| 28 | + const string expectedJson = """ |
| 29 | + { |
| 30 | + "DateTimeProperty": "2023-10-01T12:00:00Z", |
| 31 | + "NullableDateTimeProperty": "2023-10-01T12:00:00Z", |
| 32 | + "DateTimeOffsetProperty": "2023-10-01T12:00:00+00:00", |
| 33 | + "NullableDateTimeOffsetProperty": "2023-10-01T12:00:00+00:00", |
| 34 | + "DateOnlyProperty": "2023-10-01", |
| 35 | + "NullableDateOnlyProperty": "2023-10-01", |
| 36 | + "TimeOnlyProperty": "14:30:45", |
| 37 | + "NullableTimeOnlyProperty": "14:30:45" |
| 38 | + } |
| 39 | + """; |
| 40 | + |
| 41 | + // Act |
| 42 | + var json = JsonSerializer.Serialize(originalModel, options); |
| 43 | + var deserializedModel = JsonSerializer.Deserialize<SourceGeneratorModelWithAttribute>(json, options); |
| 44 | + |
| 45 | + // Assert |
| 46 | + Assert.NotNull(deserializedModel); |
| 47 | + Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty); |
| 48 | + Assert.Equal(originalModel.NullableDateTimeProperty, deserializedModel.NullableDateTimeProperty); |
| 49 | + Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty); |
| 50 | + Assert.Equal(originalModel.NullableDateTimeOffsetProperty, deserializedModel.NullableDateTimeOffsetProperty); |
| 51 | + Assert.Equal(originalModel.DateOnlyProperty, deserializedModel.DateOnlyProperty); |
| 52 | + Assert.Equal(originalModel.NullableDateOnlyProperty, deserializedModel.NullableDateOnlyProperty); |
| 53 | + Assert.Equal(originalModel.TimeOnlyProperty, deserializedModel.TimeOnlyProperty); |
| 54 | + Assert.Equal(originalModel.NullableTimeOnlyProperty, deserializedModel.NullableTimeOnlyProperty); |
| 55 | + Assert.Equal(expectedJson, json); |
| 56 | + } |
| 57 | + |
| 58 | + [Fact] |
| 59 | + public void ReflectionBased_WithoutResolver_WithFormatAttribute_WithNullValues_DoesNotApplyFormat() |
| 60 | + { |
| 61 | + // Arrange |
| 62 | + var options = new JsonSerializerOptions |
| 63 | + { |
| 64 | + WriteIndented = true |
| 65 | + }; |
| 66 | + var originalModel = new SourceGeneratorModelWithAttribute |
| 67 | + { |
| 68 | + DateTimeProperty = new DateTime(2023, 10, 1, 12, 0, 0, DateTimeKind.Utc), |
| 69 | + NullableDateTimeProperty = null, |
| 70 | + DateTimeOffsetProperty = new DateTimeOffset(2023, 10, 1, 12, 0, 0, TimeSpan.Zero), |
| 71 | + NullableDateTimeOffsetProperty = null, |
| 72 | + DateOnlyProperty = new DateOnly(2023, 10, 1), |
| 73 | + NullableDateOnlyProperty = null, |
| 74 | + TimeOnlyProperty = new TimeOnly(14, 30, 45), |
| 75 | + NullableTimeOnlyProperty = null |
| 76 | + }; |
| 77 | + // Expected JSON with DEFAULT formats (not the custom formats from JsonDateTimeFormat attribute) |
| 78 | + const string expectedJson = """ |
| 79 | + { |
| 80 | + "DateTimeProperty": "2023-10-01T12:00:00Z", |
| 81 | + "NullableDateTimeProperty": null, |
| 82 | + "DateTimeOffsetProperty": "2023-10-01T12:00:00+00:00", |
| 83 | + "NullableDateTimeOffsetProperty": null, |
| 84 | + "DateOnlyProperty": "2023-10-01", |
| 85 | + "NullableDateOnlyProperty": null, |
| 86 | + "TimeOnlyProperty": "14:30:45", |
| 87 | + "NullableTimeOnlyProperty": null |
| 88 | + } |
| 89 | + """; |
| 90 | + |
| 91 | + // Act |
| 92 | + var json = JsonSerializer.Serialize(originalModel, options); |
| 93 | + var deserializedModel = JsonSerializer.Deserialize<SourceGeneratorModelWithAttribute>(json, options); |
| 94 | + |
| 95 | + // Assert |
| 96 | + Assert.NotNull(deserializedModel); |
| 97 | + Assert.Equal(originalModel.DateTimeProperty, deserializedModel.DateTimeProperty); |
| 98 | + Assert.Null(deserializedModel.NullableDateTimeProperty); |
| 99 | + Assert.Equal(originalModel.DateTimeOffsetProperty, deserializedModel.DateTimeOffsetProperty); |
| 100 | + Assert.Null(deserializedModel.NullableDateTimeOffsetProperty); |
| 101 | + Assert.Equal(originalModel.DateOnlyProperty, deserializedModel.DateOnlyProperty); |
| 102 | + Assert.Null(deserializedModel.NullableDateOnlyProperty); |
| 103 | + Assert.Equal(originalModel.TimeOnlyProperty, deserializedModel.TimeOnlyProperty); |
| 104 | + Assert.Null(deserializedModel.NullableTimeOnlyProperty); |
| 105 | + Assert.Equal(expectedJson, json); |
| 106 | + } |
| 107 | +} |
0 commit comments