public async Task ShouldReadThePrefaceFromStream()
        {
            var buffer = new BufferReadStream(50, 50);

            Array.Copy(ClientPreface.Bytes, buffer.Buffer, ClientPreface.Length);
            buffer.Written = ClientPreface.Length;
            await ClientPreface.ReadAsync(buffer);
        }
        public async Task ShouldErrorIfStreamEnds()
        {
            var buffer = new BufferReadStream(50, 50);

            Array.Copy(ClientPreface.Bytes, buffer.Buffer, ClientPreface.Length);
            buffer.Written = ClientPreface.Length - 1; // Miss one byte
            await Assert.ThrowsAsync <EndOfStreamException>(
                () => ClientPreface.ReadAsync(buffer).AsTask());
        }
            public async Task ShouldYieldAnErrorIfNotEnoughDataIsAvailable()
            {
                var source = new BufferReadStream(111, 50);

                source.Written = 111;
                // need 112 bytes, but only 111 are available
                var dest = new ArraySegment <byte>(new byte[112]);
                await Assert.ThrowsAsync <EndOfStreamException>(
                    async() => await source.ReadAll(dest));

                Assert.Equal(4, source.NrReads);
            }
        public async Task ShouldErrorIfStreamDoesNotContainPreface()
        {
            var buffer = new BufferReadStream(50, 50);

            Array.Copy(ClientPreface.Bytes, buffer.Buffer, ClientPreface.Length);
            buffer.Buffer[22] = (byte)'l';
            buffer.Written    = ClientPreface.Length;
            var ex = await Assert.ThrowsAsync <Exception>(
                () => ClientPreface.ReadAsync(buffer).AsTask());

            Assert.Equal("Invalid prefix received", ex.Message);
        }
            public async Task ShouldReadAllRequiredDataFromAConnection()
            {
                // Read 111 bytes in 3 parts
                var source = new BufferReadStream(111, 50);

                for (var i = 0; i < 111; i++)
                {
                    source.Buffer[i] = (byte)i;
                }
                source.Written = 111;
                var dest     = new byte[111];
                var destView = new ArraySegment <byte>(dest);
                await source.ReadAll(destView);

                for (var i = 0; i < 111; i++)
                {
                    Assert.Equal(source.Buffer[i], dest[i]);
                }
                Assert.Equal(3, source.NrReads);
            }