public void InputEndsTooEarlyAndRestartsFromUtf32() { uint[] codepoints1 = TextEncoderTestHelper.GenerateValidUtf32CodePoints(TextEncoderConstants.DataLength); uint[] codepoints2 = TextEncoderTestHelper.GenerateValidUtf32CodePoints(TextEncoderConstants.DataLength); uint[] inputAll = new uint[codepoints1.Length + codepoints2.Length]; Array.Copy(codepoints1, inputAll, codepoints1.Length); Array.Copy(codepoints2, 0, inputAll, codepoints1.Length, codepoints2.Length); ReadOnlySpan <byte> expected = Text.Encoding.Convert(Text.Encoding.UTF32, Text.Encoding.UTF8, MemoryMarshal.AsBytes(inputAll.AsSpan()).ToArray()); Span <byte> output = new byte[expected.Length]; ReadOnlySpan <byte> input = MemoryMarshal.AsBytes(inputAll.AsSpan(0, codepoints1.Length)); input = input.Slice(0, input.Length - 2); // Strip a couple bytes from last good code point Assert.Equal(OperationStatus.NeedMoreData, Encodings.Utf32.ToUtf8(input, output, out int consumed, out int written)); Assert.True(input.Length > consumed, "Consumed too many bytes [first half]"); Assert.NotEqual(expected.Length, written); Assert.True(expected.Slice(0, written).SequenceEqual(output.Slice(0, written)), "Invalid output sequence [first half]"); input = MemoryMarshal.AsBytes(inputAll.AsSpan()).Slice(consumed); expected = expected.Slice(written); 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.Slice(0, written)), "Invalid output sequence [second half]"); }