public void ReadByte(int size)
        {
            var data = GenerateData(size);

            using (var memoryStream = new MemoryStream(data, writable: false))
                using (var cachingStream = new CachingStream(memoryStream, Ownership.Owns))
                {
                    for (int i = 0; i < size; i++)
                    {
                        Assert.AreEqual(data[i], cachingStream.ReadByte());
                    }
                    Assert.AreEqual(size, (int)cachingStream.Position);

                    Assert.AreEqual(-1, cachingStream.ReadByte());
                    Assert.AreEqual(size, (int)cachingStream.Position);
                }
        }
        public void SeekAndReadByte()
        {
            Random random = new Random(2);
            var    data   = GenerateData(123456);

            using (var memoryStream = new MemoryStream(data, writable: false))
                using (var cachingStream = new CachingStream(memoryStream, Ownership.Owns))
                {
                    for (int i = 0; i < 100; i++)
                    {
                        int offset = random.Next(data.Length - 1);
                        cachingStream.Position = offset;
                        Assert.AreEqual(data[offset], cachingStream.ReadByte());
                    }
                }
        }
        public void Dispose()
        {
            var data = GenerateData(1000);

            using (var memoryStream = new MemoryStream(data, writable: false))
                using (var cachingStream = new CachingStream(memoryStream, Ownership.Owns))
                {
                    cachingStream.Dispose();

                    Assert.Throws <ObjectDisposedException>(() => { cachingStream.Flush(); });
                    Assert.Throws <ObjectDisposedException>(() => { var temp = cachingStream.Length; });
                    Assert.Throws <ObjectDisposedException>(() => { var temp = cachingStream.Position; });
                    Assert.Throws <ObjectDisposedException>(() => { cachingStream.Position = 1; });
                    Assert.Throws <ObjectDisposedException>(() => cachingStream.ReadByte());
                    Assert.Throws <ObjectDisposedException>(() => cachingStream.Read(new byte[10], 0, 1));
                    Assert.Throws <ObjectDisposedException>(() => cachingStream.Seek(1, SeekOrigin.Begin));
                }
        }