From 74d98e5110055c6acdb1f734c1393ce5ff4e34c2 Mon Sep 17 00:00:00 2001 From: Sebastian Schoder Moreno Date: Mon, 3 Oct 2022 18:12:04 +0200 Subject: [PATCH 1/2] Add Value property to JsonEncodedText --- .../System.Text.Json/ref/System.Text.Json.cs | 1 + .../src/System/Text/Json/JsonEncodedText.cs | 5 ++ .../JsonEncodedTextTests.cs | 87 ++++++++++++++++--- 3 files changed, 79 insertions(+), 14 deletions(-) diff --git a/src/libraries/System.Text.Json/ref/System.Text.Json.cs b/src/libraries/System.Text.Json/ref/System.Text.Json.cs index 760445230c506a..3afd4bfe4cec9c 100644 --- a/src/libraries/System.Text.Json/ref/System.Text.Json.cs +++ b/src/libraries/System.Text.Json/ref/System.Text.Json.cs @@ -130,6 +130,7 @@ public void Reset() { } private readonly object _dummy; private readonly int _dummyPrimitive; public System.ReadOnlySpan EncodedUtf8Bytes { get { throw null; } } + public string Value { get { throw null; } } public static System.Text.Json.JsonEncodedText Encode(System.ReadOnlySpan utf8Value, System.Text.Encodings.Web.JavaScriptEncoder? encoder = null) { throw null; } public static System.Text.Json.JsonEncodedText Encode(System.ReadOnlySpan value, System.Text.Encodings.Web.JavaScriptEncoder? encoder = null) { throw null; } public static System.Text.Json.JsonEncodedText Encode(string value, System.Text.Encodings.Web.JavaScriptEncoder? encoder = null) { throw null; } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/JsonEncodedText.cs b/src/libraries/System.Text.Json/src/System/Text/Json/JsonEncodedText.cs index 38e530ff3ea34c..bf6ba878e36421 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/JsonEncodedText.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/JsonEncodedText.cs @@ -24,6 +24,11 @@ namespace System.Text.Json /// public ReadOnlySpan EncodedUtf8Bytes => _utf8Value; + /// + /// Returns the UTF-16 encoded representation of the pre-encoded JSON text as a . + /// + public string Value => _value ?? string.Empty; + private JsonEncodedText(byte[] utf8Value) { Debug.Assert(utf8Value != null); diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs index 01350b7fd603e7..ae86f5992850ee 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs @@ -27,6 +27,7 @@ public static void Default() { JsonEncodedText text = default; Assert.True(text.EncodedUtf8Bytes.IsEmpty); + Assert.Equal("", text.Value); Assert.Equal(0, text.GetHashCode()); Assert.Equal("", text.ToString()); @@ -42,12 +43,20 @@ public static void Default() JsonEncodedText textByteEmpty = JsonEncodedText.Encode(Array.Empty()); Assert.True(textByteEmpty.EncodedUtf8Bytes.IsEmpty); + Assert.Equal("", textByteEmpty.Value); Assert.Equal("", textByteEmpty.ToString()); + Assert.Equal(text.Value, textByteEmpty.Value); + Assert.False(text.Equals(textByteEmpty)); + JsonEncodedText textCharEmpty = JsonEncodedText.Encode(Array.Empty()); Assert.True(textCharEmpty.EncodedUtf8Bytes.IsEmpty); + Assert.Equal("", textCharEmpty.Value); Assert.Equal("", textCharEmpty.ToString()); + Assert.Equal(text.Value, textCharEmpty.Value); + Assert.False(text.Equals(textCharEmpty)); + Assert.True(textCharEmpty.Equals(textByteEmpty)); Assert.Equal(textByteEmpty.GetHashCode(), textCharEmpty.GetHashCode()); } @@ -60,9 +69,9 @@ public static void NullEncoder(string message, string expectedMessage) JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan(), null); JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message), null); - Assert.Equal(expectedMessage, text.ToString()); - Assert.Equal(expectedMessage, textSpan.ToString()); - Assert.Equal(expectedMessage, textUtf8Span.ToString()); + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); Assert.True(text.Equals(textSpan)); Assert.True(text.Equals(textUtf8Span)); @@ -80,9 +89,9 @@ public static void CustomEncoder(string message, string expectedMessage) JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan(), encoder); JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message), encoder); - Assert.Equal(expectedMessage, text.ToString()); - Assert.Equal(expectedMessage, textSpan.ToString()); - Assert.Equal(expectedMessage, textUtf8Span.ToString()); + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); Assert.True(text.Equals(textSpan)); Assert.True(text.Equals(textUtf8Span)); @@ -99,9 +108,9 @@ public static void CustomEncoderCantOverrideHtml(string message, string expected JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan(), encoder); JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message), encoder); - Assert.Equal(expectedMessage, text.ToString()); - Assert.Equal(expectedMessage, textSpan.ToString()); - Assert.Equal(expectedMessage, textUtf8Span.ToString()); + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); Assert.True(text.Equals(textSpan)); Assert.True(text.Equals(textUtf8Span)); @@ -315,6 +324,56 @@ public static void GetUtf8BytesLargeTest(int stringLength) } } + [Theory] + [MemberData(nameof(JsonEncodedTextStrings))] + public static void GetValueTest(string message, string expectedMessage) + { + JsonEncodedText text = JsonEncodedText.Encode(message); + JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); + JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); + + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); + } + + [Theory] + [InlineData(100)] + [InlineData(1_000)] + [InlineData(10_000)] + public static void GetValueLargeTest(int stringLength) + { + { + var message = new string('a', stringLength); + var expectedMessage = new string('a', stringLength); + + JsonEncodedText text = JsonEncodedText.Encode(message); + JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); + JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); + + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); + } + { + var message = new string('>', stringLength); + var builder = new StringBuilder(); + for (int i = 0; i < stringLength; i++) + { + builder.Append("\\u003E"); + } + string expectedMessage = builder.ToString(); + + JsonEncodedText text = JsonEncodedText.Encode(message); + JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); + JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); + + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); + } + } + [Fact] public static void InvalidUTF16() { @@ -338,7 +397,7 @@ public static void InvalidUTF16() public static void ReplacementCharacterUTF8(byte[] dataUtf8, string expected) { JsonEncodedText text = JsonEncodedText.Encode(dataUtf8); - Assert.Equal(expected, text.ToString()); + Assert.Equal(expected, text.Value); } [Fact] @@ -464,16 +523,16 @@ public static void CustomEncoderClass() JsonEncodedText text; text = JsonEncodedText.Encode(message); - Assert.Equal(expected, text.ToString()); + Assert.Equal(expected, text.Value); text = JsonEncodedText.Encode(message, null); - Assert.Equal(expected, text.ToString()); + Assert.Equal(expected, text.Value); text = JsonEncodedText.Encode(message, JavaScriptEncoder.Default); - Assert.Equal(expected, text.ToString()); + Assert.Equal(expected, text.Value); text = JsonEncodedText.Encode(message, new CustomEncoderAllowingPlusSign()); - Assert.Equal("a+", text.ToString()); + Assert.Equal("a+", text.Value); } } } From 98de95721ea79c95d8d16aa2b220e1e7279acdb4 Mon Sep 17 00:00:00 2001 From: Sebastian Schoder Moreno Date: Wed, 5 Oct 2022 00:09:44 +0200 Subject: [PATCH 2/2] Split test --- .../JsonEncodedTextTests.cs | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs index ae86f5992850ee..0da487f9d42993 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonEncodedTextTests.cs @@ -343,35 +343,39 @@ public static void GetValueTest(string message, string expectedMessage) [InlineData(10_000)] public static void GetValueLargeTest(int stringLength) { - { - var message = new string('a', stringLength); - var expectedMessage = new string('a', stringLength); + var message = new string('a', stringLength); + var expectedMessage = new string('a', stringLength); - JsonEncodedText text = JsonEncodedText.Encode(message); - JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); - JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); + JsonEncodedText text = JsonEncodedText.Encode(message); + JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); + JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); - Assert.Equal(expectedMessage, text.Value); - Assert.Equal(expectedMessage, textSpan.Value); - Assert.Equal(expectedMessage, textUtf8Span.Value); - } + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); + } + + [Theory] + [InlineData(100)] + [InlineData(1_000)] + [InlineData(10_000)] + public static void GetValueLargeEscapedTest(int stringLength) + { + var message = new string('>', stringLength); + var builder = new StringBuilder(); + for (int i = 0; i < stringLength; i++) { - var message = new string('>', stringLength); - var builder = new StringBuilder(); - for (int i = 0; i < stringLength; i++) - { - builder.Append("\\u003E"); - } - string expectedMessage = builder.ToString(); + builder.Append("\\u003E"); + } + string expectedMessage = builder.ToString(); - JsonEncodedText text = JsonEncodedText.Encode(message); - JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); - JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); + JsonEncodedText text = JsonEncodedText.Encode(message); + JsonEncodedText textSpan = JsonEncodedText.Encode(message.AsSpan()); + JsonEncodedText textUtf8Span = JsonEncodedText.Encode(Encoding.UTF8.GetBytes(message)); - Assert.Equal(expectedMessage, text.Value); - Assert.Equal(expectedMessage, textSpan.Value); - Assert.Equal(expectedMessage, textUtf8Span.Value); - } + Assert.Equal(expectedMessage, text.Value); + Assert.Equal(expectedMessage, textSpan.Value); + Assert.Equal(expectedMessage, textUtf8Span.Value); } [Fact]