public async Task ReadAsync_FillsBuffer()
        {
            // Arrange
            var input    = "Hello world";
            var encoding = Encoding.Unicode;
            var stream   = new TranscodingReadStream(new MemoryStream(encoding.GetBytes(input)), encoding);
            var bytes    = new byte[3];
            var expected = Encoding.UTF8.GetBytes(input.Substring(0, bytes.Length));

            // Act
            var readBytes = await stream.ReadAsync(bytes, 0, bytes.Length);

            // Assert
            Assert.Equal(3, readBytes);
            Assert.Equal(expected, bytes);
            Assert.Equal(0, stream.ByteBufferCount);
            Assert.Equal(8, stream.CharBufferCount);
            Assert.Equal(0, stream.OverflowCount);
        }
        public async Task ReadAsync_SingleByte()
        {
            // Arrange
            var input    = "Hello world";
            var encoding = Encoding.Unicode;
            var stream   = new TranscodingReadStream(new MemoryStream(encoding.GetBytes(input)), encoding);
            var bytes    = new byte[4];

            // Act
            var readBytes = await stream.ReadAsync(bytes, 0, 1);

            // Assert
            Assert.Equal(1, readBytes);
            Assert.Equal((byte)'H', bytes[0]);
            Assert.Equal(0, bytes[1]);

            Assert.Equal(0, stream.ByteBufferCount);
            Assert.Equal(10, stream.CharBufferCount);
            Assert.Equal(0, stream.OverflowCount);
        }
        private static async Task <TranscodingReadStream> ReadAsync_WithOverflowBufferAtCharBufferBoundaries(string input, int bufferSize)
        {
            // Arrange
            // Test ensures that the overflow buffer works correctly
            var encoding = Encoding.Unicode;
            var stream   = new TranscodingReadStream(new MemoryStream(encoding.GetBytes(input)), encoding);
            var bytes    = new byte[1];
            var expected = Encoding.UTF8.GetBytes(input);

            // Act
            int read;
            var buffer = new byte[bufferSize];
            var actual = new List <byte>();

            while ((read = await stream.ReadAsync(buffer)) != 0)
            {
                actual.AddRange(buffer);
            }

            Assert.Equal(expected, actual);
            return(stream);
        }