-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Additional tests for System.Text.Json #32705
Changes from all commits
4b5f5c2
a4c5847
a8374d9
8090c69
1e8e33c
7a6e0cb
823f147
256de92
02ab96b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,6 +21,9 @@ public static partial class JsonSerializer | |
/// <param name="cancellationToken">The <see cref="System.Threading.CancellationToken"/> which may be used to cancel the write operation.</param> | ||
public static Task SerializeAsync<TValue>(Stream utf8Json, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default) | ||
{ | ||
if (utf8Json == null) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice catch. We should update the docs with the new exceptions: If you get the chance, please add the exceptions this (and other SerializeAsync overloads) throw, here (if you are up for it, this would need a PR in the docs repo): See other overloads that have exception docs as an example: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will do, thanks for the pointers to the docs code and example. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Created issue dotnet/dotnet-api-docs#3961 |
||
throw new ArgumentNullException(nameof(utf8Json)); | ||
|
||
return WriteAsyncCore(utf8Json, value, typeof(TValue), options, cancellationToken); | ||
} | ||
|
||
|
@@ -65,11 +68,6 @@ private static async Task WriteAsyncCore(Stream utf8Json, object? value, Type in | |
return; | ||
} | ||
|
||
if (inputType == null) | ||
{ | ||
inputType = value.GetType(); | ||
} | ||
|
||
WriteStack state = default; | ||
state.InitializeRoot(inputType, options, supportContinuation: true); | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,9 +12,11 @@ namespace System.Text.Json.Serialization.Tests | |
public static partial class StreamTests | ||
{ | ||
[Fact] | ||
public static async Task NullArgumentFail() | ||
public static async Task ReadNullArgumentFail() | ||
{ | ||
await Assert.ThrowsAsync<ArgumentNullException>(async () => await JsonSerializer.DeserializeAsync<string>((Stream)null)); | ||
await Assert.ThrowsAsync<ArgumentNullException>(async () => await JsonSerializer.DeserializeAsync((Stream)null, (Type)null)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. While we are doing this, let's add all permutations. For example: have the stream parameter be null, but the type parameter be non-null. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed in 7a6e0cb |
||
await Assert.ThrowsAsync<ArgumentNullException>(async () => await JsonSerializer.DeserializeAsync((Stream)null, typeof(string))); | ||
await Assert.ThrowsAsync<ArgumentNullException>(async () => await JsonSerializer.DeserializeAsync(new MemoryStream(), (Type)null)); | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -899,6 +899,82 @@ public static void TestSingleStringsMultiSegment() | |
} | ||
} | ||
|
||
[Fact] | ||
public static void TestMultiSegmentStringConversionToDateTime() | ||
{ | ||
string jsonString = "\"1997-07-16\""; | ||
string expectedString = "1997-07-16"; | ||
int expectedTokenLength = 10; | ||
DateTime expectedDateTime = DateTime.Parse(expectedString); | ||
|
||
byte[] utf8 = Encoding.UTF8.GetBytes(jsonString); | ||
|
||
ReadOnlySequence<byte> sequence = JsonTestHelper.CreateSegments(utf8); | ||
|
||
for (int j = 0; j < utf8.Length; j++) | ||
{ | ||
var utf8JsonReader = new Utf8JsonReader(sequence.Slice(0, j), isFinalBlock: false, default); | ||
ReadDateTimeHelper(ref utf8JsonReader, expectedDateTime, expectedTokenLength); | ||
|
||
Assert.Equal(0, utf8JsonReader.TokenStartIndex); | ||
|
||
long consumed = utf8JsonReader.BytesConsumed; | ||
utf8JsonReader = new Utf8JsonReader(sequence.Slice(consumed), isFinalBlock: true, utf8JsonReader.CurrentState); | ||
ReadDateTimeHelper(ref utf8JsonReader, expectedDateTime, expectedTokenLength); | ||
} | ||
} | ||
|
||
private static void ReadDateTimeHelper(ref Utf8JsonReader jsonReader, DateTime expectedValue, long expectedTokenLength) | ||
{ | ||
while (jsonReader.Read()) | ||
{ | ||
if (jsonReader.TokenType == JsonTokenType.String) | ||
{ | ||
long tokenLength = jsonReader.HasValueSequence ? jsonReader.ValueSequence.Length : jsonReader.ValueSpan.Length; | ||
Assert.Equal(expectedTokenLength, tokenLength); | ||
Assert.Equal(expectedValue, jsonReader.GetDateTime()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: We missed the asserts for |
||
} | ||
} | ||
} | ||
|
||
[Fact] | ||
public static void TestMultiSegmentStringConversionToDateTimeOffset() | ||
{ | ||
string jsonString = "\"1997-07-16\""; | ||
string expectedString = "1997-07-16"; | ||
int expectedTokenLength = 10; | ||
DateTimeOffset expectedDateTimeOffset = DateTimeOffset.Parse(expectedString); | ||
|
||
byte[] utf8 = Encoding.UTF8.GetBytes(jsonString); | ||
|
||
ReadOnlySequence<byte> sequence = JsonTestHelper.CreateSegments(utf8); | ||
|
||
for (int j = 0; j < utf8.Length; j++) | ||
{ | ||
var utf8JsonReader = new Utf8JsonReader(sequence.Slice(0, j), isFinalBlock: false, default); | ||
ReadDateTimeOffsetHelper(ref utf8JsonReader, expectedDateTimeOffset, expectedTokenLength); | ||
|
||
Assert.Equal(0, utf8JsonReader.TokenStartIndex); | ||
|
||
long consumed = utf8JsonReader.BytesConsumed; | ||
utf8JsonReader = new Utf8JsonReader(sequence.Slice(consumed), isFinalBlock: true, utf8JsonReader.CurrentState); | ||
ReadDateTimeOffsetHelper(ref utf8JsonReader, expectedDateTimeOffset, expectedTokenLength); | ||
} | ||
} | ||
|
||
private static void ReadDateTimeOffsetHelper(ref Utf8JsonReader jsonReader, DateTimeOffset expectedValue, long expectedTokenLength) | ||
{ | ||
while (jsonReader.Read()) | ||
{ | ||
if (jsonReader.TokenType == JsonTokenType.String) | ||
{ | ||
long tokenLength = jsonReader.HasValueSequence ? jsonReader.ValueSequence.Length : jsonReader.ValueSpan.Length; | ||
Assert.Equal(expectedTokenLength, tokenLength); | ||
Assert.Equal(expectedValue, jsonReader.GetDateTimeOffset()); | ||
} | ||
} | ||
} | ||
|
||
private static void SpanSequenceStatesAreEqualInvalidJson(byte[] dataUtf8, ReadOnlySequence<byte> sequence, int maxDepth, JsonCommentHandling commentHandling) | ||
{ | ||
var stateSpan = new JsonReaderState(new JsonReaderOptions { CommentHandling = commentHandling, MaxDepth = maxDepth }); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should seal the overrides in
JsonCollectionConverter
andJsonObjectConverter
as well.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed in 02ab96b