public void BackpatchSize_should_backpatch_the_size(
            [Values(0, 1, 5)]
            int startPosition)
        {
            var bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            var length = bytes.Length - startPosition;
            var expectedBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            Array.Copy(BitConverter.GetBytes(length), 0, expectedBytes, startPosition, 4);

            using (var memoryStream = new MemoryStream())
            using (var stream = new BsonStreamAdapter(memoryStream))
            {
                stream.WriteBytes(bytes, 0, bytes.Length);
                var position = stream.Position;

                stream.BackpatchSize(startPosition);

                memoryStream.ToArray().Should().Equal(expectedBytes);
                stream.Position.Should().Be(position);
            }
        }
        public void WriteBytes_should_optimize_count_of_one()
        {
            using (var baseStream = Substitute.For<Stream>())
            using (var stream = new BsonStreamAdapter(baseStream))
            {
                var buffer = new byte[] { 1 };

                stream.WriteBytes(buffer, 0, 1);

                baseStream.Received(1).WriteByte(1);
            }
        }
        public void WriteBytes_should_have_expected_effect(
            int length,
            int offset,
            int count)
        {
            using (var memoryStream = new MemoryStream())
            using (var stream = new BsonStreamAdapter(memoryStream))
            {
                var buffer = Enumerable.Range(0, length).Select(n => (byte)n).ToArray();

                stream.WriteBytes(buffer, offset, count);

                memoryStream.ToArray().Should().Equal(buffer.Skip(offset).Take(count));
            }
        }
        public void WriteBytes_should_optimize_count_of_one()
        {
            var mockBaseStream = new Mock<Stream>();

            using (var baseStream = mockBaseStream.Object)
            using (var stream = new BsonStreamAdapter(baseStream))
            {
                var buffer = new byte[] { 1 };

                stream.WriteBytes(buffer, 0, 1);

                mockBaseStream.Verify(s => s.WriteByte(1), Times.Once);
            }
        }