public async Task Test_IBufferWriterStream_WriteAsync_Array()
        {
            ArrayPoolBufferWriter <byte> writer = new ArrayPoolBufferWriter <byte>();
            Stream stream = ((IBufferWriter <byte>)writer).AsStream();

            byte[] data = Test_MemoryStream.CreateRandomData(64);

            // Same test as above, but using an asynchronous write instead
            await stream.WriteAsync(data, 0, data.Length);

            Assert.AreEqual(writer.WrittenCount, data.Length);
            Assert.IsTrue(writer.WrittenSpan.SequenceEqual(data));

            await Assert.ThrowsExceptionAsync <ArgumentNullException>(() => stream.WriteAsync(null, 0, 10));

            await Assert.ThrowsExceptionAsync <ArgumentOutOfRangeException>(() => stream.WriteAsync(data, -1, 10));

            await Assert.ThrowsExceptionAsync <ArgumentException>(() => stream.WriteAsync(data, 200, 10));

            await Assert.ThrowsExceptionAsync <ArgumentOutOfRangeException>(() => stream.WriteAsync(data, 0, -24));

            await Assert.ThrowsExceptionAsync <ArgumentException>(() => stream.WriteAsync(data, 0, 200));

            stream.Dispose();

            await Assert.ThrowsExceptionAsync <ObjectDisposedException>(() => stream.WriteAsync(data, 0, data.Length));
        }
        public void Test_IBufferWriterStream_Write_Array()
        {
            ArrayPoolBufferWriter <byte> writer = new ArrayPoolBufferWriter <byte>();
            Stream stream = ((IBufferWriter <byte>)writer).AsStream();

            byte[] data = Test_MemoryStream.CreateRandomData(64);

            // Write random data to the stream wrapping the buffer writer, and validate
            // that the state of the writer is consistent, and the written content matches.
            stream.Write(data, 0, data.Length);

            Assert.AreEqual(writer.WrittenCount, data.Length);
            Assert.IsTrue(writer.WrittenSpan.SequenceEqual(data));

            // A few tests with invalid inputs (null buffers, invalid indices, etc.)
            Assert.ThrowsException <ArgumentNullException>(() => stream.Write(null, 0, 10));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => stream.Write(data, -1, 10));
            Assert.ThrowsException <ArgumentException>(() => stream.Write(data, 200, 10));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => stream.Write(data, 0, -24));
            Assert.ThrowsException <ArgumentException>(() => stream.Write(data, 0, 200));

            stream.Dispose();

            Assert.ThrowsException <ObjectDisposedException>(() => stream.Write(data, 0, data.Length));
        }
        public async Task Test_IBufferWriterStream_WriteAsync_Memory()
        {
            ArrayPoolBufferWriter <byte> writer = new ArrayPoolBufferWriter <byte>();
            Stream stream = ((IBufferWriter <byte>)writer).AsStream();

            Memory <byte> data = Test_MemoryStream.CreateRandomData(64);

            // Same as the other asynchronous test above, but writing from a Memory<T>
            await stream.WriteAsync(data);

            Assert.AreEqual(writer.WrittenCount, data.Length);
            Assert.IsTrue(data.Span.SequenceEqual(writer.WrittenSpan));
        }
        public void Test_IBufferWriterStream_Write_Span()
        {
            ArrayPoolBufferWriter <byte> writer = new ArrayPoolBufferWriter <byte>();
            Stream stream = ((IBufferWriter <byte>)writer).AsStream();

            Memory <byte> data = Test_MemoryStream.CreateRandomData(64);

            // This will use the extension when on .NET Standard 2.0,
            // as the Stream class doesn't have Spam<T> or Memory<T>
            // public APIs there. This is the case eg. on UWP as well.
            stream.Write(data.Span);

            Assert.AreEqual(writer.WrittenCount, data.Length);
            Assert.IsTrue(data.Span.SequenceEqual(writer.WrittenSpan));
        }