public void ThrowIfEndOfStream_should_throw_when_position_plus_length_exceeds_2GB()
        {
            using (var buffer = new ByteArrayBuffer(new byte[1024]))
            using (var subject = new ByteBufferStream(buffer))
            {
                subject.Position = 1024;
                subject.WriteInt32(int.MaxValue - 128);
                subject.Position = 1024;

                Action action = () => subject.ReadSlice(); // indirectly calls private ThrowIfEndOfStream method

                action.ShouldThrow<EndOfStreamException>();
            }
        }
        public void ReadSlice_should_return_expected_result(int length, byte[] bytes)
        {
            var buffer = Substitute.For<IByteBuffer>();
            buffer.AccessBackingBytes(Arg.Any<int>()).Returns(x => { var p = (int)x[0]; return new ArraySegment<byte>(bytes, p, bytes.Length - p); });
            buffer.IsReadOnly.Returns(true);
            buffer.Length.Returns(bytes.Length);
            var subject = new ByteBufferStream(buffer);
            var expectedPosition = length;

            subject.ReadSlice();

            subject.Position.Should().Be(expectedPosition);
            subject.Buffer.Received(1).GetSlice(0, bytes.Length);
        }
        public void ReadSlice_should_return_expected_result(int length, byte[] bytes)
        {
            var mockBuffer = new Mock<IByteBuffer>();
            mockBuffer.Setup(s => s.AccessBackingBytes(It.IsAny<int>())).Returns((int p) => { return new ArraySegment<byte>(bytes, p, bytes.Length - p); });
            mockBuffer.SetupGet(s => s.IsReadOnly).Returns(true);
            mockBuffer.SetupGet(s => s.Length).Returns(bytes.Length);
            var subject = new ByteBufferStream(mockBuffer.Object);
            var expectedPosition = length;

            subject.ReadSlice();

            subject.Position.Should().Be(expectedPosition);
            mockBuffer.Verify(b => b.GetSlice(0, bytes.Length), Times.Once);
        }