public void TestOperations() { // invalid operations using (var stack = new StreamStack()) { AssertException(() => stack.Push(null)); Assert.IsNull(stack.GetStream<Stream>()); stack.Push(new MemoryStream()); AssertException(() => stack.Seek(0, SeekOrigin.Current)); } // stream access using (var stack = new StreamStack()) { var buffer = new MemoryStream(); var test = new TestStream(buffer); stack.Push(buffer); Assert.AreEqual(stack.Top, buffer); stack.Push(test); Assert.AreEqual(stack.Top, test); Assert.AreEqual(stack.GetStream<MemoryStream>(), buffer); Assert.AreEqual(stack.GetStream<TestStream>(), test); } // stream flush using (var stack = new StreamStack()) { var stream1 = new TestStream(new MemoryStream()); var stream2 = new TestStream(stream1); stack.Push(stream1); stack.Push(stream2); stack.Flush(); Assert.IsTrue(stream1.Flushed); Assert.IsTrue(stream2.Flushed); } // stream read using (var stack = new StreamStack()) { var buffer = new MemoryStream(); StreamWrite(buffer, "test"); buffer.Position = 0; stack.Push(buffer); stack.Push(new TestStream(stack.Top)); Assert.AreEqual(StreamRead(stack), "test"); } // stream write using (var stack = new StreamStack()) { var buffer = new MemoryStream(); stack.Push(buffer); stack.Push(new TestStream(stack.Top)); StreamWrite(stack, "test"); buffer.Position = 0; Assert.AreEqual(StreamRead(buffer), "test"); } // stream disposal using (var stack = new StreamStack()) { var stream1 = new TestStream(new MemoryStream()); var stream2 = new TestStream(stream1); stack.Push(stream1); stack.Push(stream2); stack.Dispose(); Assert.IsTrue(stream1.Disposed); Assert.IsTrue(stream2.Disposed); } }