public void TestCanReadWriteSeek()
        {
            var buffer = new byte[1024];

            using (var bounded = new BoundStream(new CanReadWriteSeekStream(true, false, false, false), 0, -1, false)) {
                Assert.IsTrue(bounded.CanRead);
                Assert.IsFalse(bounded.CanWrite);
                Assert.IsFalse(bounded.CanSeek);
                Assert.IsFalse(bounded.CanTimeout);

                Assert.Throws <NotImplementedException> (() => bounded.Read(buffer, 0, buffer.Length));
                Assert.Throws <NotSupportedException> (() => bounded.Write(buffer, 0, buffer.Length));
                Assert.Throws <NotSupportedException> (() => bounded.Seek(0, SeekOrigin.End));
            }

            using (var bounded = new BoundStream(new CanReadWriteSeekStream(false, true, false, false), 0, -1, false)) {
                Assert.IsFalse(bounded.CanRead);
                Assert.IsTrue(bounded.CanWrite);
                Assert.IsFalse(bounded.CanSeek);
                Assert.IsFalse(bounded.CanTimeout);

                Assert.Throws <NotSupportedException> (() => bounded.Read(buffer, 0, buffer.Length));
                Assert.Throws <NotImplementedException> (() => bounded.Write(buffer, 0, buffer.Length));
                Assert.Throws <NotSupportedException> (() => bounded.Seek(0, SeekOrigin.End));
            }

            using (var bounded = new BoundStream(new CanReadWriteSeekStream(false, false, true, false), 0, -1, false)) {
                Assert.IsFalse(bounded.CanRead);
                Assert.IsFalse(bounded.CanWrite);
                Assert.IsTrue(bounded.CanSeek);
                Assert.IsFalse(bounded.CanTimeout);

                Assert.Throws <NotSupportedException> (() => bounded.Read(buffer, 0, buffer.Length));
                Assert.Throws <NotSupportedException> (() => bounded.Write(buffer, 0, buffer.Length));
                Assert.Throws <NotImplementedException> (() => bounded.Seek(0, SeekOrigin.End));
            }
        }
        public void TestSeek()
        {
            using (var memory = new MemoryStream()) {
                var buffer = Encoding.ASCII.GetBytes("This is some text...");

                memory.Write(buffer, 0, buffer.Length);

                using (var bounded = new BoundStream(memory, 5, -1, true)) {
                    long   position;
                    string text;
                    int    n;

                    // make sure that BoundStream will properly reset the underlying stream
                    Assert.AreEqual(0, bounded.Position);
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    // force eos state to be true
                    bounded.Read(buffer, 0, buffer.Length);

                    position = bounded.Seek(-1 * n, SeekOrigin.End);
                    Assert.AreEqual(0, position, "SeekOrigin.End");
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    position = bounded.Seek(0, SeekOrigin.Begin);
                    Assert.AreEqual(0, position, "SeekOrigin.Begin");
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    position = bounded.Seek(-1 * n, SeekOrigin.Current);
                    Assert.AreEqual(0, position, "SeekOrigin.Current");
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    // now try seeking out of bounds
                    Assert.Throws <IOException> (() => bounded.Seek(-1, SeekOrigin.Begin));
                    Assert.Throws <IOException> (() => bounded.Seek(-1 * buffer.Length, SeekOrigin.End));
                }
            }

            using (var memory = new MemoryStream()) {
                var buffer = Encoding.ASCII.GetBytes("This is some text...");

                memory.Write(buffer, 0, buffer.Length);

                using (var bounded = new BoundStream(memory, 5, buffer.Length, true)) {
                    long   position;
                    string text;
                    int    n;

                    // make sure that BoundStream will properly reset the underlying stream
                    Assert.AreEqual(0, bounded.Position);
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    position = bounded.Seek(0, SeekOrigin.Begin);
                    Assert.AreEqual(0, position, "SeekOrigin.Begin");
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    position = bounded.Seek(-1 * n, SeekOrigin.Current);
                    Assert.AreEqual(0, position, "SeekOrigin.Current");
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    position = bounded.Seek(-1 * n, SeekOrigin.End);
                    Assert.AreEqual(0, position, "SeekOrigin.End");
                    n    = bounded.Read(buffer, 0, buffer.Length);
                    text = Encoding.ASCII.GetString(buffer, 0, n);
                    Assert.AreEqual("is some text...", text);

                    // now try seeking out of bounds
                    Assert.Throws <IOException> (() => bounded.Seek(-1, SeekOrigin.Begin));
                    Assert.Throws <IOException> (() => bounded.Seek(-1 * buffer.Length, SeekOrigin.End));
                    Assert.Throws <IOException> (() => bounded.Seek(5, SeekOrigin.End));
                }
            }
        }