Ejemplo n.º 1
0
        public void InputContainsSomeInvalidDataFromUtf16()
        {
            string inputStringEndsWithLow = TextEncoderTestHelper.GenerateInvalidStringEndsWithLow(TextEncoderConstants.DataLength);

            byte[] inputBytes            = Text.Encoding.Unicode.GetBytes(inputStringEndsWithLow);
            ReadOnlySpan <byte> input    = MemoryMarshal.AsBytes(inputStringEndsWithLow.AsSpan());
            ReadOnlySpan <byte> expected = Text.Encoding.Convert(Text.Encoding.Unicode, Text.Encoding.UTF8, inputBytes);
            int         expectedWritten  = TextEncoderTestHelper.GetUtf8ByteCount(inputStringEndsWithLow.AsSpan());
            Span <byte> output           = new byte[expectedWritten + 10];

            Assert.Equal(OperationStatus.InvalidData, Encodings.Utf16.ToUtf8(input, output, out int consumed, out int written));
            Assert.True(consumed < input.Length, "Consumed too many input characters");
            Assert.Equal(expectedWritten, written);
            Assert.True(expected.Slice(0, written).SequenceEqual(output.Slice(0, written)), "Invalid output sequence [ends with low]");

            string inputStringInvalid = TextEncoderTestHelper.GenerateStringWithInvalidChars(TextEncoderConstants.DataLength);

            inputBytes      = Text.Encoding.Unicode.GetBytes(inputStringInvalid);
            input           = MemoryMarshal.AsBytes(inputStringInvalid.AsSpan());
            expected        = Text.Encoding.Convert(Text.Encoding.Unicode, Text.Encoding.UTF8, inputBytes);
            expectedWritten = TextEncoderTestHelper.GetUtf8ByteCount(inputStringInvalid.AsSpan());
            output          = new byte[expectedWritten + 10];
            Assert.Equal(OperationStatus.InvalidData, Encodings.Utf16.ToUtf8(input, output, out consumed, out written));
            Assert.True(consumed < input.Length, "Consumed more input than expected");
            Assert.Equal(expectedWritten, written);
            Assert.True(expected.Slice(0, written).SequenceEqual(output.Slice(0, written)), "Invalid output sequence [invalid]");
        }
Ejemplo n.º 2
0
        //[InlineData(TextEncoderTestHelper.SupportedEncoding.FromUtf32)] // Open issue: https://github.com/dotnet/corefxlab/issues/1513
        public void InputBufferContainsSomeInvalidData(TextEncoderTestHelper.SupportedEncoding from)
        {
            string inputStringEndsWithLow = TextEncoderTestHelper.GenerateInvalidStringEndsWithLow(TextEncoderConstants.DataLength);
            string inputStringInvalid     = TextEncoderTestHelper.GenerateStringWithInvalidChars(TextEncoderConstants.DataLength);

            byte[] inputUtf8Bytes = TextEncoderTestHelper.GenerateUtf8BytesWithInvalidBytes(TextEncoderConstants.DataLength);

            byte[]      expectedBytes;
            Span <byte> encodedBytes;

            int expectedBytesWritten;
            int bytesWritten;

            switch (from)
            {
            case TextEncoderTestHelper.SupportedEncoding.FromUtf8:
                expectedBytes = Text.Encoding.Convert(testEncoder, testEncoder, inputUtf8Bytes);
                ReadOnlySpan <byte> inputUtf8 = inputUtf8Bytes;
                expectedBytesWritten = TextEncoderTestHelper.GetUtf8ByteCount(inputUtf8);
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                Assert.False(utf8.TryEncode(inputUtf8, encodedBytes, out int charactersConsumed, out bytesWritten));
                Assert.True(charactersConsumed < inputUtf8Bytes.Length);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf16:
                byte[] inputStringUtf16 = testEncoderUnicode.GetBytes(inputStringEndsWithLow);
                expectedBytes = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                ReadOnlySpan <char> inputUtf16 = inputStringEndsWithLow.AsSpan();
                expectedBytesWritten = TextEncoderTestHelper.GetUtf8ByteCount(inputUtf16);
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten + 10]);
                Assert.False(utf8.TryEncode(inputUtf16, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.True(charactersConsumed < inputStringEndsWithLow.Length);
                inputStringUtf16     = testEncoderUnicode.GetBytes(inputStringInvalid);
                expectedBytes        = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                inputUtf16           = inputStringInvalid.AsSpan();
                expectedBytesWritten = TextEncoderTestHelper.GetUtf8ByteCount(inputUtf16);
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                Assert.False(utf8.TryEncode(inputUtf16, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.True(charactersConsumed < inputStringInvalid.Length);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromString:
                inputStringUtf16 = testEncoderUnicode.GetBytes(inputStringEndsWithLow);
                expectedBytes    = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                string inputStr = inputStringEndsWithLow;
                expectedBytesWritten = TextEncoderTestHelper.GetUtf8ByteCount(inputStr);
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten + 10]);
                Assert.False(utf8.TryEncode(inputStr, encodedBytes, out bytesWritten));
                inputStringUtf16     = testEncoderUnicode.GetBytes(inputStringInvalid);
                expectedBytes        = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                inputStr             = inputStringInvalid;
                expectedBytesWritten = TextEncoderTestHelper.GetUtf8ByteCount(inputStr);
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                Assert.False(utf8.TryEncode(inputStr, encodedBytes, out bytesWritten));
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf32:      // Invalid if codePoint > 0x10FFFF
            default:
                expectedBytes = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputUtf8Bytes);
                ReadOnlySpan <uint> input = inputUtf8Bytes.AsSpan().NonPortableCast <byte, uint>();
                expectedBytesWritten = TextEncoderTestHelper.GetUtf8ByteCount(input);
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                Assert.False(utf8.TryEncode(input, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.True(charactersConsumed < inputUtf8Bytes.Length);
                break;
            }

            Assert.Equal(expectedBytesWritten, bytesWritten);
            Assert.True(expectedBytes.AsSpan().Slice(0, expectedBytesWritten).SequenceEqual(encodedBytes));
        }