public void InputOutputSizeCombosFromUtf32()
        {
            for (int i = 0; i < BufferSizeRange; i++)
            {
                string inputString           = TextEncoderTestHelper.GenerateValidString(i, 0, TextEncoderConstants.Utf8TwoBytesLastCodePoint);
                ReadOnlySpan <byte> input    = Text.Encoding.UTF32.GetBytes(inputString);
                Span <byte>         expected = Text.Encoding.UTF8.GetBytes(inputString);

                for (int j = 0; j < BufferSizeRange * 4; j++)
                {
                    Span <byte> output = new byte[j];
                    var         status = Encodings.Utf32.ToUtf8(input, output, out int consumed, out int written);
                    if (status == OperationStatus.DestinationTooSmall)
                    {
                        Assert.True(consumed < input.Length, "consumed is too large");
                        Assert.True(written < expected.Length, "written is too large");
                    }
                    else
                    {
                        Assert.Equal(OperationStatus.Done, status);
                        Assert.Equal(input.Length, consumed);
                        Assert.Equal(expected.Length, written);
                    }

                    Assert.True(expected.Slice(0, written).SequenceEqual(output.Slice(0, written)), "Incorrect byte sequence");
                }
            }
        }
        public void InputBufferContainsNonASCII(TextEncoderTestHelper.CodePointSubset subset)
        {
            string inputString = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, subset);

            ValidateFromUtf16(inputString);
            ValidateFromUtf32(inputString);
        }
        public void InputBufferEmpty(TextEncoderTestHelper.SupportedEncoding from)
        {
            string inputString = TextEncoderTestHelper.GenerateValidString(0, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);

            byte[]      expectedBytes;
            Span <byte> encodedBytes;

            int bytesWritten;

            switch (from)
            {
            case TextEncoderTestHelper.SupportedEncoding.FromUtf8:
                byte[] inputStringUtf8 = testEncoder.GetBytes(inputString);
                expectedBytes = Text.Encoding.Convert(testEncoder, testEncoder, inputStringUtf8);
                encodedBytes  = Span <byte> .Empty;     // Output buffer is size 0
                Assert.True(utf8.TryEncode(ReadOnlySpan <byte> .Empty, encodedBytes, out int charactersConsumed, out bytesWritten));
                Assert.Equal(0, charactersConsumed);
                encodedBytes = new Span <byte>(new byte[1]);       // Output buffer is not size 0
                Assert.True(utf8.TryEncode(ReadOnlySpan <byte> .Empty, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(0, charactersConsumed);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf16:
                byte[] inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                expectedBytes = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                encodedBytes  = Span <byte> .Empty;
                Assert.True(utf8.TryEncode(ReadOnlySpan <char> .Empty, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(0, charactersConsumed);
                encodedBytes = new Span <byte>(new byte[1]);
                Assert.True(utf8.TryEncode(ReadOnlySpan <char> .Empty, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(0, charactersConsumed);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromString:
                inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                expectedBytes    = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                encodedBytes     = Span <byte> .Empty;
                Assert.True(utf8.TryEncode("", encodedBytes, out bytesWritten));
                encodedBytes = new Span <byte>(new byte[1]);
                Assert.True(utf8.TryEncode("", encodedBytes, out bytesWritten));
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf32:
            default:
                byte[] inputStringUtf32 = testEncoderUtf32.GetBytes(inputString);
                expectedBytes = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputStringUtf32);
                encodedBytes  = Span <byte> .Empty;
                Assert.True(utf8.TryEncode(ReadOnlySpan <uint> .Empty, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(0, charactersConsumed);
                encodedBytes = new Span <byte>(new byte[1]);
                Assert.True(utf8.TryEncode(ReadOnlySpan <uint> .Empty, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(0, charactersConsumed);
                break;
            }

            Assert.Equal(expectedBytes.Length, bytesWritten);
            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
        }
        public void OutputEmptyFromUtf32()
        {
            string inputString        = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);
            ReadOnlySpan <byte> input = Text.Encoding.UTF32.GetBytes(inputString);

            Assert.Equal(OperationStatus.DestinationTooSmall, Encodings.Utf32.ToUtf8(input, Span <byte> .Empty, out int consumed, out int written));
            Assert.Equal(0, consumed);
            Assert.Equal(0, written);
        }
        public void OutputBufferEmpty(TextEncoderTestHelper.SupportedEncoding from)
        {
            string inputString = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);

            byte[]      expectedBytes;
            Span <byte> encodedBytes = Span <byte> .Empty;

            int bytesWritten;
            int charactersConsumed;

            switch (from)
            {
            case TextEncoderTestHelper.SupportedEncoding.FromUtf8:
                byte[] inputStringUtf8 = testEncoder.GetBytes(inputString);
                expectedBytes = Text.Encoding.Convert(testEncoder, testEncoder, inputStringUtf8);
                ReadOnlySpan <byte> inputUtf8 = inputStringUtf8;
                Assert.False(utf8.TryEncode(inputUtf8, encodedBytes, out charactersConsumed, out bytesWritten));
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf16:
                byte[] inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                expectedBytes = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                ReadOnlySpan <char> inputUtf16 = inputStringUtf16.AsSpan().NonPortableCast <byte, char>();
                Assert.False(utf8.TryEncode(inputUtf16, encodedBytes, out charactersConsumed, out bytesWritten));
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromString:
                inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                expectedBytes    = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                string inputStr = inputString;
                Assert.False(utf8.TryEncode(inputStr, encodedBytes, out bytesWritten));
                charactersConsumed = 0;
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf32:
            default:
                byte[] inputStringUtf32 = testEncoderUtf32.GetBytes(inputString);
                expectedBytes = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputStringUtf32);
                ReadOnlySpan <uint> input = inputStringUtf32.AsSpan().NonPortableCast <byte, uint>();
                Assert.False(utf8.TryEncode(input, encodedBytes, out charactersConsumed, out bytesWritten));
                break;
            }

            Assert.Equal(0, charactersConsumed);
            Assert.Equal(0, bytesWritten);
            Assert.True(Span <byte> .Empty.SequenceEqual(encodedBytes));
        }
        public void InputLargerThanOutputFromUtf32()
        {
            string inputString           = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);
            ReadOnlySpan <byte> input    = Text.Encoding.UTF32.GetBytes(inputString);
            Span <byte>         expected = Text.Encoding.UTF8.GetBytes(inputString);

            Span <byte> output = new byte[expected.Length / 2];

            Assert.Equal(OperationStatus.DestinationTooSmall, Encodings.Utf32.ToUtf8(input, output, out int consumed, out int written));
            Assert.True(consumed < input.Length, "Unexpectedly consumed entire input");
            Assert.True(written < expected.Length, "Unexpectedly wrote entire output");
            Assert.True(expected.Slice(0, written).SequenceEqual(output.Slice(0, written)), "Incorrect byte sequence");

            input    = input.Slice(consumed);
            expected = expected.Slice(written);
            output   = new byte[expected.Length];
            Assert.Equal(OperationStatus.Done, Encodings.Utf32.ToUtf8(input, output, out consumed, out written));
            Assert.Equal(input.Length, consumed);
            Assert.Equal(expected.Length, written);
            Assert.True(expected.SequenceEqual(output), "Incorrect byte sequence");
        }
        public void OutputLargerThatInputFromUtf32()
        {
            string inputString1           = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);
            string inputString2           = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);
            ReadOnlySpan <byte> input1    = Text.Encoding.UTF32.GetBytes(inputString1);
            ReadOnlySpan <byte> input2    = Text.Encoding.UTF32.GetBytes(inputString1);
            Span <byte>         expected1 = Text.Encoding.UTF8.GetBytes(inputString1);
            Span <byte>         expected2 = Text.Encoding.UTF8.GetBytes(inputString2);

            Span <byte> output = new byte[expected1.Length + expected2.Length];

            Assert.Equal(OperationStatus.Done, Encodings.Utf32.ToUtf8(input1, output, out int consumed1, out int written1));
            Assert.Equal(input1.Length, consumed1);
            Assert.Equal(expected1.Length, written1);

            Assert.Equal(OperationStatus.Done, Encodings.Utf32.ToUtf8(input2, output.Slice(written1), out int consumed2, out int written2));
            Assert.Equal(input2.Length, consumed2);
            Assert.Equal(expected2.Length, written2);

            Assert.True(expected1.SequenceEqual(output.Slice(0, written1)));
            Assert.True(expected2.SequenceEqual(output.Slice(written1)));
        }
        public void OutputBufferLargerThanInputBuffer(TextEncoderTestHelper.SupportedEncoding from)
        {
            string inputString1 = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);
            string inputString2 = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);

            byte[]      expectedBytes1;
            byte[]      expectedBytes2;
            Span <byte> encodedBytes;

            int expectedBytesWritten;

            int bytesWritten;

            switch (from)
            {
            case TextEncoderTestHelper.SupportedEncoding.FromUtf8:
                byte[] inputString1Utf8 = testEncoder.GetBytes(inputString1);
                byte[] inputString2Utf8 = testEncoder.GetBytes(inputString2);
                expectedBytes1       = Text.Encoding.Convert(testEncoder, testEncoder, inputString1Utf8);
                expectedBytes2       = Text.Encoding.Convert(testEncoder, testEncoder, inputString2Utf8);
                expectedBytesWritten = expectedBytes1.Length + expectedBytes2.Length;
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                ReadOnlySpan <byte> firstUtf8  = inputString1Utf8;
                ReadOnlySpan <byte> secondUtf8 = inputString2Utf8;

                Assert.True(utf8.TryEncode(firstUtf8, encodedBytes, out int charactersConsumed, out bytesWritten));
                Assert.Equal(firstUtf8.Length, charactersConsumed);
                Assert.Equal(expectedBytes1.Length, bytesWritten);

                Assert.True(utf8.TryEncode(secondUtf8, encodedBytes.Slice(bytesWritten), out charactersConsumed, out bytesWritten));
                Assert.Equal(secondUtf8.Length, charactersConsumed);
                Assert.Equal(expectedBytes2.Length, bytesWritten);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf16:
                byte[] inputString1Utf16 = testEncoderUnicode.GetBytes(inputString1);
                byte[] inputString2Utf16 = testEncoderUnicode.GetBytes(inputString2);
                expectedBytes1       = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputString1Utf16);
                expectedBytes2       = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputString2Utf16);
                expectedBytesWritten = expectedBytes1.Length + expectedBytes2.Length;
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                string firstInputStr  = inputString1;
                string secondInputStr = inputString2;

                Assert.True(utf8.TryEncode(firstInputStr, encodedBytes, out bytesWritten));
                Assert.Equal(expectedBytes1.Length, bytesWritten);

                Assert.True(utf8.TryEncode(secondInputStr, encodedBytes.Slice(bytesWritten), out bytesWritten));
                Assert.Equal(expectedBytes2.Length, bytesWritten);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromString:
                inputString1Utf16    = testEncoderUnicode.GetBytes(inputString1);
                inputString2Utf16    = testEncoderUnicode.GetBytes(inputString2);
                expectedBytes1       = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputString1Utf16);
                expectedBytes2       = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputString2Utf16);
                expectedBytesWritten = expectedBytes1.Length + expectedBytes2.Length;
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                ReadOnlySpan <char> firstUtf16  = inputString1Utf16.AsSpan().NonPortableCast <byte, char>();
                ReadOnlySpan <char> secondUtf16 = inputString2Utf16.AsSpan().NonPortableCast <byte, char>();

                Assert.True(utf8.TryEncode(firstUtf16, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(firstUtf16.Length, charactersConsumed);
                Assert.Equal(expectedBytes1.Length, bytesWritten);

                Assert.True(utf8.TryEncode(secondUtf16, encodedBytes.Slice(bytesWritten), out charactersConsumed, out bytesWritten));
                Assert.Equal(secondUtf16.Length, charactersConsumed);
                Assert.Equal(expectedBytes2.Length, bytesWritten);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf32:
            default:
                byte[] inputString1Utf32 = testEncoderUtf32.GetBytes(inputString1);
                byte[] inputString2Utf32 = testEncoderUtf32.GetBytes(inputString2);
                expectedBytes1       = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputString1Utf32);
                expectedBytes2       = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputString2Utf32);
                expectedBytesWritten = expectedBytes1.Length + expectedBytes2.Length;
                encodedBytes         = new Span <byte>(new byte[expectedBytesWritten]);
                ReadOnlySpan <uint> firstInput  = inputString1Utf32.AsSpan().NonPortableCast <byte, uint>();
                ReadOnlySpan <uint> secondInput = inputString2Utf32.AsSpan().NonPortableCast <byte, uint>();

                Assert.True(utf8.TryEncode(firstInput, encodedBytes, out charactersConsumed, out bytesWritten));
                Assert.Equal(firstInput.Length, charactersConsumed);
                Assert.Equal(expectedBytes1.Length, bytesWritten);

                Assert.True(utf8.TryEncode(secondInput, encodedBytes.Slice(bytesWritten), out charactersConsumed, out bytesWritten));
                Assert.Equal(secondInput.Length, charactersConsumed);
                Assert.Equal(expectedBytes2.Length, bytesWritten);
                break;
            }

            var expectedBytes = new byte[expectedBytesWritten];

            Array.Copy(expectedBytes1, expectedBytes, expectedBytes1.Length);
            Array.Copy(expectedBytes2, 0, expectedBytes, expectedBytes1.Length, expectedBytes2.Length);

            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes));
        }
        public void InputBufferLargerThanOutputBuffer(TextEncoderTestHelper.SupportedEncoding from)
        {
            string inputString = TextEncoderTestHelper.GenerateValidString(TextEncoderConstants.DataLength, 0, TextEncoderConstants.Utf8ThreeBytesLastCodePoint);

            byte[]      expectedBytes;
            Span <byte> encodedBytes1;
            Span <byte> encodedBytes2;

            int expectedBytesWritten;

            int bytesWritten1;
            int bytesWritten2;

            switch (from)
            {
            case TextEncoderTestHelper.SupportedEncoding.FromUtf8:
                byte[] inputStringUtf8 = testEncoder.GetBytes(inputString);
                expectedBytes        = Text.Encoding.Convert(testEncoder, testEncoder, inputStringUtf8);
                expectedBytesWritten = expectedBytes.Length;
                encodedBytes1        = new Span <byte>(new byte[expectedBytesWritten / 2]);
                ReadOnlySpan <byte> inputUtf8 = inputStringUtf8;
                Assert.False(utf8.TryEncode(inputUtf8, encodedBytes1, out int charactersConsumed1, out bytesWritten1));
                encodedBytes2 = new Span <byte>(new byte[expectedBytesWritten - bytesWritten1]);
                Assert.True(utf8.TryEncode(inputUtf8.Slice(charactersConsumed1), encodedBytes2, out int charactersConsumed2, out bytesWritten2));
                Assert.Equal(inputUtf8.Length, charactersConsumed1 + charactersConsumed2);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf16:
                byte[] inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                expectedBytes        = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                expectedBytesWritten = expectedBytes.Length;
                encodedBytes1        = new Span <byte>(new byte[expectedBytesWritten / 2]);
                ReadOnlySpan <char> inputUtf16 = inputStringUtf16.AsSpan().NonPortableCast <byte, char>();
                Assert.False(utf8.TryEncode(inputUtf16, encodedBytes1, out charactersConsumed1, out bytesWritten1));
                encodedBytes2 = new Span <byte>(new byte[expectedBytesWritten - bytesWritten1]);
                Assert.True(utf8.TryEncode(inputUtf16.Slice(charactersConsumed1), encodedBytes2, out charactersConsumed2, out bytesWritten2));
                Assert.Equal(inputUtf16.Length, charactersConsumed1 + charactersConsumed2);
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromString:        // Open issue: https://github.com/dotnet/corefxlab/issues/1515
                /*inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                 * expectedBytes = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                 * expectedBytesWritten = expectedBytes.Length;
                 * encodedBytes1 = new Span<byte>(new byte[expectedBytesWritten / 2]);
                 * string inputStr = inputString;
                 * Assert.False(utf8.TryEncode(inputStr, encodedBytes1, out bytesWritten1));
                 * encodedBytes2 = new Span<byte>(new byte[expectedBytesWritten - bytesWritten1]);
                 * Assert.True(utf8.TryEncode(inputStr.Substring(charactersConsumed1), encodedBytes2, out bytesWritten2));*/
                return;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf32:
            default:
                byte[] inputStringUtf32 = testEncoderUtf32.GetBytes(inputString);
                expectedBytes        = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputStringUtf32);
                expectedBytesWritten = expectedBytes.Length;
                encodedBytes1        = new Span <byte>(new byte[expectedBytesWritten / 2]);
                ReadOnlySpan <uint> input = inputStringUtf32.AsSpan().NonPortableCast <byte, uint>();
                Assert.False(utf8.TryEncode(input, encodedBytes1, out charactersConsumed1, out bytesWritten1));
                encodedBytes2 = new Span <byte>(new byte[expectedBytesWritten - bytesWritten1]);
                Assert.True(utf8.TryEncode(input.Slice(charactersConsumed1), encodedBytes2, out charactersConsumed2, out bytesWritten2));
                Assert.Equal(input.Length, charactersConsumed1 + charactersConsumed2);
                break;
            }

            Assert.Equal(expectedBytesWritten, bytesWritten1 + bytesWritten2);

            var encodedBytes = new Span <byte>(new byte[expectedBytesWritten]);

            encodedBytes1.CopyTo(encodedBytes);
            encodedBytes2.CopyTo(encodedBytes.Slice(encodedBytes1.Length));

            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes));
        }
        public void InputOutputBufferSizeCombinations(TextEncoderTestHelper.SupportedEncoding from)
        {
            string inputString;
            int    bytesWritten;

            byte[]      expectedBytes;
            Span <byte> encodedBytes;
            int         expectedBytesWritten;
            bool        retVal;
            int         testUpToCharLength = 30;

            switch (from)
            {
            case TextEncoderTestHelper.SupportedEncoding.FromUtf8:
                for (int i = 0; i < testUpToCharLength; i++)
                {
                    inputString = TextEncoderTestHelper.GenerateValidString(i, 0, TextEncoderConstants.Utf8TwoBytesLastCodePoint);
                    byte[] inputStringUtf8 = testEncoder.GetBytes(inputString);
                    expectedBytes        = Text.Encoding.Convert(testEncoder, testEncoder, inputStringUtf8);
                    expectedBytesWritten = expectedBytes.Length;
                    ReadOnlySpan <byte> inputUtf8 = inputStringUtf8;

                    for (int j = 0; j < testUpToCharLength * 4; j++)
                    {
                        encodedBytes = new Span <byte>(new byte[j]);
                        retVal       = utf8.TryEncode(inputUtf8, encodedBytes, out int charactersConsumed, out bytesWritten);
                        if (expectedBytesWritten > j)       // output buffer is too small
                        {
                            Assert.False(retVal);
                            Assert.True(charactersConsumed < inputUtf8.Length);
                            Assert.True(expectedBytesWritten > bytesWritten);
                            Assert.True(expectedBytes.AsSpan().Slice(0, bytesWritten).SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                        else
                        {
                            Assert.True(retVal);
                            Assert.Equal(charactersConsumed, inputUtf8.Length);
                            Assert.Equal(expectedBytesWritten, bytesWritten);
                            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                    }
                }
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf16:
                for (int i = 0; i < testUpToCharLength; i++)
                {
                    inputString = TextEncoderTestHelper.GenerateValidString(i, 0, TextEncoderConstants.Utf8TwoBytesLastCodePoint);
                    byte[] inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                    expectedBytes        = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                    expectedBytesWritten = expectedBytes.Length;
                    ReadOnlySpan <char> inputUtf16 = inputStringUtf16.AsSpan().NonPortableCast <byte, char>();

                    for (int j = 0; j < testUpToCharLength * 4; j++)
                    {
                        encodedBytes = new Span <byte>(new byte[j]);
                        retVal       = utf8.TryEncode(inputUtf16, encodedBytes, out int charactersConsumed, out bytesWritten);
                        if (expectedBytesWritten > j)       // output buffer is too small
                        {
                            Assert.False(retVal);
                            Assert.True(charactersConsumed < inputUtf16.Length);
                            Assert.True(expectedBytesWritten > bytesWritten);
                            Assert.True(expectedBytes.AsSpan().Slice(0, bytesWritten).SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                        else
                        {
                            Assert.True(retVal);
                            Assert.Equal(charactersConsumed, inputUtf16.Length);
                            Assert.Equal(expectedBytesWritten, bytesWritten);
                            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                    }
                }
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromString:
                for (int i = 0; i < testUpToCharLength; i++)
                {
                    inputString = TextEncoderTestHelper.GenerateValidString(i, 0, TextEncoderConstants.Utf8TwoBytesLastCodePoint);
                    byte[] inputStringUtf16 = testEncoderUnicode.GetBytes(inputString);
                    expectedBytes        = Text.Encoding.Convert(testEncoderUnicode, testEncoder, inputStringUtf16);
                    expectedBytesWritten = expectedBytes.Length;
                    string inputStr = inputString;

                    for (int j = 0; j < testUpToCharLength * 4; j++)
                    {
                        encodedBytes = new Span <byte>(new byte[j]);
                        retVal       = utf8.TryEncode(inputStr, encodedBytes, out bytesWritten);
                        if (expectedBytesWritten > j)       // output buffer is too small
                        {
                            Assert.False(retVal);
                            Assert.True(expectedBytesWritten > bytesWritten);
                            Assert.True(expectedBytes.AsSpan().Slice(0, bytesWritten).SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                        else
                        {
                            Assert.True(retVal);
                            Assert.Equal(expectedBytesWritten, bytesWritten);
                            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                    }
                }
                break;

            case TextEncoderTestHelper.SupportedEncoding.FromUtf32:
            default:
                for (int i = 0; i < testUpToCharLength; i++)
                {
                    inputString = TextEncoderTestHelper.GenerateValidString(i, 0, TextEncoderConstants.Utf8TwoBytesLastCodePoint);
                    byte[] inputStringUtf32 = testEncoderUtf32.GetBytes(inputString);
                    expectedBytes        = Text.Encoding.Convert(testEncoderUtf32, testEncoder, inputStringUtf32);
                    expectedBytesWritten = expectedBytes.Length;
                    ReadOnlySpan <uint> input = inputStringUtf32.AsSpan().NonPortableCast <byte, uint>();

                    for (int j = 0; j < testUpToCharLength * 4; j++)
                    {
                        encodedBytes = new Span <byte>(new byte[j]);
                        retVal       = utf8.TryEncode(input, encodedBytes, out int charactersConsumed, out bytesWritten);
                        if (expectedBytesWritten > j)       // output buffer is too small
                        {
                            Assert.False(retVal);
                            Assert.True(charactersConsumed < input.Length);
                            Assert.True(expectedBytesWritten > bytesWritten);
                            Assert.True(expectedBytes.AsSpan().Slice(0, bytesWritten).SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                        else
                        {
                            Assert.True(retVal);
                            Assert.Equal(charactersConsumed, input.Length);
                            Assert.Equal(expectedBytesWritten, bytesWritten);
                            Assert.True(expectedBytes.AsSpan().SequenceEqual(encodedBytes.Slice(0, bytesWritten)));
                        }
                    }
                }
                break;
            }
        }