private void Assert(BsonTrie<int> trie, string name)
        {
            var subject = new TrieNameDecoder<int>(trie);

            using (var memoryStream = new MemoryStream())
            using (var bsonStream = new BsonStreamAdapter(memoryStream))
            {
                bsonStream.WriteCString(name);
                bsonStream.WriteInt32(20);
                bsonStream.Position = 0;

                var result = subject.Decode(bsonStream, Utf8Encodings.Strict);

                result.Should().Be(name);
            }
        }
        public void WriteCString_should_write_expected_bytes_when_size_is_near_tempUtf8_length(
            [Values(-1, 0, 1)]
            int delta)
        {
            var stream = new MemoryStream();
            var subject = new BsonStreamAdapter(stream);
            var subjectReflector = new Reflector(subject);
            var size = subjectReflector._tempUtf8.Length + delta;
            var length = size - 1;
            var value = new string('a', length);
            var expectedBytes = Enumerable.Repeat<byte>(97, length).Concat(new byte[] { 0 }).ToArray();

            subject.WriteCString(value);

            stream.ToArray().Should().Equal(expectedBytes);
        }
        public void WriteCString_should_write_expected_bytes(string value, byte[] expectedBytes)
        {
            var stream = new MemoryStream();
            var subject = new BsonStreamAdapter(stream);

            subject.WriteCString(value);

            stream.ToArray().Should().Equal(expectedBytes);
        }
        public void WriteCString_should_throw_when_value_is_null()
        {
            var stream = Substitute.For<Stream>();
            var subject = new BsonStreamAdapter(stream);

            Action action = () => subject.WriteCString(null);

            action.ShouldThrow<ArgumentNullException>().And.ParamName.Should().Be("value");
        }
        public void WriteCString_should_throw_when_value_contains_null_bytes()
        {
            var stream = new MemoryStream();
            var subject = new BsonStreamAdapter(stream);
            var value = "a\0b";

            Action action = () => subject.WriteCString(value);

            action.ShouldThrow<ArgumentException>().And.ParamName.Should().Be("value");
        }
        public void WriteCString_should_throw_when_subject_is_disposed()
        {
            var stream = Substitute.For<Stream>();
            var subject = new BsonStreamAdapter(stream);
            var value = "abc";
            subject.Dispose();

            Action action = () => subject.WriteCString(value);

            action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
        }
        public void WriteCString_should_throw_when_value_with_maxByteCount_near_tempUtf8_contains_nulls(
            [Values(-1, 0, 1)] int delta)
        {
            var stream = new MemoryStream();
            var subject = new BsonStreamAdapter(stream);
            var subjectReflector = new Reflector(subject);
            var valueLength = (subjectReflector._tempUtf8.Length / 3) + delta;
            var length1 = valueLength / 2;
            var length2 = valueLength - length1 - 1;
            var value = new string('x', length1) + '\0' + new string('x', length2);

            Action action = () => subject.WriteCString(value);

            action.ShouldThrow<ArgumentException>().And.ParamName.Should().Be("value");
        }