public void SeekTest() {
using (MemoryStream memstream = new MemoryStream(this.content))
using (OffsetStream offsetstream = new OffsetStream(memstream, this.offset)) {
Assert.True(offsetstream.CanSeek);
Assert.AreEqual(memstream.CanSeek, offsetstream.CanSeek);
Assert.AreEqual(memstream.Position + this.offset, offsetstream.Position);
long pos = offsetstream.Seek(10, SeekOrigin.Begin);
Assert.AreEqual(110, pos);
Assert.AreEqual(10, memstream.Position);
pos = offsetstream.Seek(0, SeekOrigin.End);
Assert.AreEqual(offsetstream.Length, pos);
Assert.AreEqual(memstream.Length, memstream.Position);
pos = offsetstream.Seek(0, SeekOrigin.Current);
Assert.AreEqual(offsetstream.Length, pos);
Assert.AreEqual(memstream.Length, memstream.Position);
offsetstream.Seek(10, SeekOrigin.Begin);
pos = offsetstream.Seek(10, SeekOrigin.Current);
Assert.AreEqual(this.offset + 20, pos);
Assert.AreEqual(20, memstream.Position);
// negative seek
pos = offsetstream.Seek(-10, SeekOrigin.Current);
Assert.AreEqual(this.offset + 10, pos);
Assert.AreEqual(10, memstream.Position);
pos = offsetstream.Seek(-10, SeekOrigin.Current);
Assert.AreEqual(this.offset, pos);
Assert.AreEqual(0, memstream.Position);
// seek into illegal areas
Assert.Throws<IOException>(() => { pos = offsetstream.Seek(-10, SeekOrigin.Current); });
Assert.AreEqual(this.offset, pos);
Assert.AreEqual(0, memstream.Position);
}
// Using an unseekable stream should return CanSeek = false
var mockstream = new Mock<Stream>();
mockstream.SetupGet(s => s.CanSeek).Returns(false);
using (OffsetStream offsetstream = new OffsetStream(mockstream.Object)) {
Assert.False(offsetstream.CanSeek);
}
}