public async Task Completes_With_Last_Read()
        {
            var pipe      = new Pipe();
            var decryptor = new UniformPipelineReader(pipe.Reader);

            pipe.Writer.Write(Samples.MinimalPacket);
            pipe.Writer.Complete();

            await Task.Delay(100);

            var result = await decryptor.Reader.ReadAsync();

            Assert.IsTrue(result.IsCompleted);
        }
        public async Task Completes_After_Read_Async_Is_Called()
        {
            var pipe      = new Pipe();
            var decryptor = new UniformPipelineReader(pipe.Reader);

            bool completed = false;

            decryptor.Reader.OnWriterCompleted((e, o) => completed = true, null);

            var reading = decryptor.Reader.ReadAsync();

            pipe.Writer.Complete();
            var result = await reading;

            await Task.Delay(10);

            Assert.IsTrue(completed && result.IsCompleted);
        }
        public async Task Handles_Partial_Packet_Writes()
        {
            var pipe      = new Pipe();
            var decryptor = new UniformPipelineReader(pipe.Reader);

            pipe.Writer.Write(new Span <byte>(Samples.UnencryptedC1Packet, 0, 3));
            await pipe.Writer.FlushAsync();

            var read = decryptor.Reader.ReadAsync();
            await Task.Delay(50);

            Assert.IsFalse(read.IsCompleted);

            pipe.Writer.Write(new Span <byte>(Samples.UnencryptedC1Packet, 3, Samples.UnencryptedC1Packet.Length - 3));
            await pipe.Writer.FlushAsync();

            await Task.Delay(50);

            Assert.IsTrue(read.IsCompleted);
        }