public void EmptyStringTest()
        {
            var str = string.Empty;

            using var stream = new MemoryStream();
            using (var writer = new BinaryWriter(stream))
            {
                writer.WriteString(str);
            }

            stream.Seek(0, SeekOrigin.Begin);
            using var reader = new Infrastructure.BinaryReader(stream);
            Assert.AreEqual(str, reader.ReadString());
            Assert.Throws <EndOfStreamException>(() => reader.Read <int>());
            Assert.Throws <EndOfStreamException>(() => reader.ReadString());
        }
        public void StringThatCannotFitBufferTests(int bufferSize)
        {
            var str = CreateString((bufferSize + sizeof(char)) / sizeof(char));

            using var stream = new MemoryStream();
            using (var writer = new BinaryWriter(stream))
            {
                writer.WriteString(str);
            }

            stream.Seek(0, SeekOrigin.Begin);
            using var reader = new Infrastructure.BinaryReader(stream);
            Assert.AreEqual(str, reader.ReadString());
            Assert.Throws <EndOfStreamException>(() => reader.Read <int>());
            Assert.Throws <EndOfStreamException>(() => reader.ReadString());
        }
        public void ManyStringBoundaryTests(int bufferSize)
        {
            const string str = "Test";

            using var stream = new MemoryStream();
            using (var writer = new BinaryWriter(stream))
            {
                for (var i = 0; i < bufferSize / (sizeof(int) + sizeof(char) * str.Length); i++)
                {
                    writer.WriteString(str);
                }
            }

            stream.Seek(0, SeekOrigin.Begin);
            using var reader = new Infrastructure.BinaryReader(stream);
            for (var i = 0; i < bufferSize / (sizeof(int) + sizeof(char) * str.Length); i++)
            {
                Assert.AreEqual(str, reader.ReadString());
            }
            Assert.Throws <EndOfStreamException>(() => reader.Read <int>());
            Assert.Throws <EndOfStreamException>(() => reader.ReadString());
        }
        public void EndOfStreamTests(int bufferSize)
        {
            var str = CreateString(bufferSize / sizeof(char));

            using var stream = new MemoryStream();
            using (var writer = new BinaryWriter(stream))
            {
                writer.WriteString(str);
            }

            using var newStream = new MemoryStream(stream.ToArray().Take((int)stream.Length - sizeof(char)).ToArray());
            using var reader    = new Infrastructure.BinaryReader(newStream);
            Assert.Throws <EndOfStreamException>(() => reader.ReadString());
        }
        public void UnmanagedTest()
        {
            using var stream = new MemoryStream();
            using (var writer = new BinaryWriter(stream))
            {
                writer.Write(1);
                writer.Dispose(); // double dispose is OK
            }

            stream.Seek(0, SeekOrigin.Begin);
            using var reader = new Infrastructure.BinaryReader(stream);
            Assert.AreEqual(1, reader.Read <int>());
            Assert.Throws <EndOfStreamException>(() => reader.Read <int>());
            Assert.Throws <EndOfStreamException>(() => reader.ReadString());
            reader.Dispose(); // double dispose is OK
        }
        public void ManyUnmanagedBoundaryTests(int bufferSize)
        {
            using var stream = new MemoryStream();
            using (var writer = new BinaryWriter(stream))
            {
                for (var i = 0; i < bufferSize / sizeof(int); i++)
                {
                    writer.Write(i);
                }
            }

            stream.Seek(0, SeekOrigin.Begin);
            using var reader = new Infrastructure.BinaryReader(stream);
            for (var i = 0; i < bufferSize / sizeof(int); i++)
            {
                Assert.AreEqual(i, reader.Read <int>());
            }
            Assert.Throws <EndOfStreamException>(() => reader.Read <int>());
            Assert.Throws <EndOfStreamException>(() => reader.ReadString());
        }