public static void StreamDisposed_ExpectedObjectDisposedException(Action <HttpResponseStreamWriter> action)
    {
        var httpResponseStreamWriter = new HttpResponseStreamWriter(new MemoryStream(), Encoding.UTF8, 10, ArrayPool <byte> .Shared, ArrayPool <char> .Shared);

        httpResponseStreamWriter.Dispose();

        Assert.Throws <ObjectDisposedException>(() =>
        {
            action(httpResponseStreamWriter);
        });
    }
    public static async Task StreamDisposed_ExpectedObjectDisposedExceptionAsync(Func <HttpResponseStreamWriter, Task> function)
    {
        var httpResponseStreamWriter = new HttpResponseStreamWriter(new MemoryStream(), Encoding.UTF8, 10, ArrayPool <byte> .Shared, ArrayPool <char> .Shared);

        httpResponseStreamWriter.Dispose();

        await Assert.ThrowsAsync <ObjectDisposedException>(() =>
        {
            return(function(httpResponseStreamWriter));
        });
    }
    public async Task DoesNotDispose_UnderlyingStream_OnDisposingWriter()
    {
        // Arrange
        var stream = new TestMemoryStream();
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

        // Act
        await writer.WriteAsync("Hello world");

        writer.Dispose();

        // Assert
        Assert.Equal(0, stream.DisposeCallCount);
    }
        public async Task DoesNotFlush_UnderlyingStream_OnDisposingWriter()
        {
            // Arrange
            var stream = new TestMemoryStream();
            var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

            // Act
            await writer.WriteAsync("Hello");
            writer.Dispose();

            // Assert
            Assert.Equal(0, stream.FlushCallCount);
            Assert.Equal(0, stream.FlushAsyncCallCount);
        }
    public async Task FlushesBuffer_OnDispose(int byteLength)
    {
        // Arrange
        var stream = new TestMemoryStream();
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);
        await writer.WriteAsync(new string('a', byteLength));

        // Act
        writer.Dispose();

        // Assert
        Assert.Equal(0, stream.FlushCallCount);
        Assert.Equal(0, stream.FlushAsyncCallCount);
        Assert.Equal(byteLength, stream.Length);
    }
    public async Task FlushWriteThrows_DontFlushInDispose(int byteLength)
    {
        // Arrange
        var stream = new TestMemoryStream()
        {
            ThrowOnWrite = true
        };
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

        await writer.WriteAsync(new string('a', byteLength));

        await Assert.ThrowsAsync <IOException>(() => writer.FlushAsync());

        // Act
        writer.Dispose();

        // Assert
        Assert.Equal(1, stream.WriteAsyncCallCount);
        Assert.Equal(0, stream.WriteCallCount);
        Assert.Equal(0, stream.FlushCallCount);
        Assert.Equal(0, stream.FlushAsyncCallCount);
        Assert.Equal(0, stream.Length);
    }
        public async Task FlushWriteThrows_DontFlushInDispose(int byteLength)
        {
            // Arrange
            var stream = new TestMemoryStream() { ThrowOnWrite = true };
            var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

            await writer.WriteAsync(new string('a', byteLength));
            await Assert.ThrowsAsync<IOException>(() =>  writer.FlushAsync());

            // Act
            writer.Dispose();

            // Assert
            Assert.Equal(1, stream.WriteAsyncCallCount);
            Assert.Equal(0, stream.WriteCallCount);
            Assert.Equal(0, stream.FlushCallCount);
            Assert.Equal(0, stream.FlushAsyncCallCount);
            Assert.Equal(0, stream.Length);
        }
        public async Task FlushesBuffer_OnDispose(int byteLength)
        {
            // Arrange
            var stream = new TestMemoryStream();
            var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);
            await writer.WriteAsync(new string('a', byteLength));

            // Act
            writer.Dispose();

            // Assert
            Assert.Equal(0, stream.FlushCallCount);
            Assert.Equal(0, stream.FlushAsyncCallCount);
            Assert.Equal(byteLength, stream.Length);
        }