public void ThrowsForInvalidParameters(int arrayLength, int offset, int length)
        {
            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);
            var array = new byte[arrayLength];

            for (var i = 0; i < array.Length; i++)
            {
                array[i] = (byte)(i + 1);
            }

            writer.Write(new Span <byte>(array, 0, 0));
            writer.Write(new Span <byte>(array, array.Length, 0));

            try
            {
                writer.Write(new Span <byte>(array, offset, length));
                Assert.True(false);
            }
            catch (Exception ex)
            {
                Assert.True(ex is ArgumentOutOfRangeException);
            }

            writer.Write(new Span <byte>(array, 0, array.Length));
            writer.Commit();

            Assert.Equal(array, Read());
        }
        public void CanWriteIntoHeadlessBuffer()
        {
            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);

            writer.Write(new byte[] { 1, 2, 3 });
            writer.Commit();

            Assert.Equal(new byte[] { 1, 2, 3 }, Read());
        }
        public void CanWriteWithOffsetAndLenght(int alloc, int offset, int length)
        {
            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);
            var array = new byte[] { 1, 2, 3 };

            writer.Write(new Span <byte>(array, offset, length));
            writer.Commit();

            Assert.Equal(array.Skip(offset).Take(length).ToArray(), Read());
        }
        public void CanWriteEmpty()
        {
            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);
            var array = new byte[] { };

            writer.Write(array);
            writer.Write(new Span <byte>(array, 0, array.Length));
            writer.Commit();

            Assert.Equal(array, Read());
        }
        public void CanWriteMultipleTimes()
        {
            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);

            writer.Write(new byte[] { 1 });
            writer.Write(new byte[] { 2 });
            writer.Write(new byte[] { 3 });
            writer.Commit();

            Assert.Equal(new byte[] { 1, 2, 3 }, Read());
        }
        public void SlicesSpanAndAdvancesAfterWrite()
        {
            int initialLength = Pipe.Writer.GetMemory().Length;

            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);

            writer.Write(new byte[] { 1, 2, 3 });
            writer.Commit();

            Assert.Equal(initialLength - 3, writer.Span.Length);
            Assert.Equal(Pipe.Writer.GetMemory().Length, writer.Span.Length);
            Assert.Equal(new byte[] { 1, 2, 3 }, Read());
        }
        public void CanWriteOverTheBlockLength()
        {
            Memory <byte>             memory = Pipe.Writer.GetMemory();
            OutputWriter <PipeWriter> writer = OutputWriter.Create(Pipe.Writer);

            IEnumerable <byte> source = Enumerable.Range(0, memory.Length).Select(i => (byte)i);

            byte[] expectedBytes = source.Concat(source).Concat(source).ToArray();

            writer.Write(expectedBytes);
            writer.Commit();

            Assert.Equal(expectedBytes, Read());
        }