seb-win-refactoring/SafeExamBrowser.Configuration.UnitTests/SubStreamTests.cs

187 lines
4.7 KiB
C#

/*
* Copyright (c) 2022 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
namespace SafeExamBrowser.Configuration.UnitTests
{
[TestClass]
public class SubStreamTests
{
private Mock<Stream> stream;
[TestInitialize]
public void Initialize()
{
stream = new Mock<Stream>();
stream.SetupGet(s => s.CanRead).Returns(true);
stream.SetupGet(s => s.CanSeek).Returns(true);
stream.SetupGet(s => s.Length).Returns(1000);
}
[TestMethod]
public void MustSetPropertiesCorrectly()
{
var sut = new SubStream(stream.Object, 100, 200);
Assert.IsTrue(sut.CanRead);
Assert.IsTrue(sut.CanSeek);
Assert.IsFalse(sut.CanWrite);
Assert.AreEqual(200, sut.Length);
Assert.AreEqual(0, sut.Position);
}
[TestMethod]
public void MustReadCorrectly()
{
var position = 750L;
var sut = new SubStream(stream.Object, 100, 200);
stream.SetupGet(s => s.Position).Returns(position);
stream.SetupSet(s => s.Position = It.IsAny<long>()).Callback<long>(p => position = p);
stream.Setup(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())).Returns<byte[], int, int>((a, o, c) => c);
sut.Position = 50;
var bytesRead = sut.Read(new byte[25], 0, 25);
stream.Verify(s => s.Read(It.IsAny<byte[]>(), 0, 25), Times.Once);
Assert.AreEqual(25, bytesRead);
Assert.AreEqual(75, sut.Position);
Assert.AreEqual(750, position);
sut.Position = 150;
bytesRead = sut.Read(new byte[75], 0, 75);
stream.Verify(s => s.Read(It.IsAny<byte[]>(), 0, 50), Times.Once);
Assert.AreEqual(50, bytesRead);
Assert.AreEqual(200, sut.Position);
Assert.AreEqual(750, position);
}
[TestMethod]
public void MustNotReadOutsideOfBounds()
{
var sut = new SubStream(stream.Object, 100, 200);
sut.Position = -1;
var bytesRead = sut.Read(new byte[0], 0, 0);
Assert.AreEqual(0, bytesRead);
stream.Verify(s => s.ReadByte(), Times.Never);
stream.Verify(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), Times.Never);
sut.Position = 500;
bytesRead = sut.Read(new byte[0], 0, 0);
Assert.AreEqual(0, bytesRead);
stream.Verify(s => s.ReadByte(), Times.Never);
stream.Verify(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), Times.Never);
}
[TestMethod]
public void MustReadByteCorrectly()
{
var sut = new SubStream(stream.Object, 100, 200);
sut.Position = -100;
Assert.AreEqual(-1, sut.ReadByte());
sut.Position = 200;
Assert.AreEqual(-1, sut.ReadByte());
sut.Position = 25;
sut.ReadByte();
stream.Verify(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), Times.Once);
}
[TestMethod]
public void MustSeekCorrectly()
{
var sut = new SubStream(stream.Object, 100, 200);
sut.Seek(10, SeekOrigin.Begin);
Assert.AreEqual(10, sut.Position);
sut.Seek(15, SeekOrigin.Current);
Assert.AreEqual(25, sut.Position);
sut.Seek(-5, SeekOrigin.Current);
Assert.AreEqual(20, sut.Position);
sut.Seek(-50, SeekOrigin.End);
Assert.AreEqual(150, sut.Position);
sut.Seek(10, SeekOrigin.End);
Assert.AreEqual(210, sut.Position);
sut.Seek(-10, SeekOrigin.Begin);
Assert.AreEqual(-10, sut.Position);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void MustNotAllowNonReadableStream()
{
stream.SetupGet(s => s.CanRead).Returns(false);
new SubStream(stream.Object, 0, 0);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void MustNotAllowNonSeekableStream()
{
stream.SetupGet(s => s.CanSeek).Returns(false);
new SubStream(stream.Object, 0, 0);
}
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void MustNotAllowOffsetSmallerThanZero()
{
new SubStream(stream.Object, -1, 100);
}
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void MustNotAllowLengthSmallerThanOne()
{
new SubStream(stream.Object, 100, 0);
}
[TestMethod]
[ExpectedException(typeof(NotSupportedException))]
public void MustNotSupportFlushing()
{
new SubStream(stream.Object, 100, 100).Flush();
}
[TestMethod]
[ExpectedException(typeof(NotSupportedException))]
public void MustNotSupportChangingLength()
{
new SubStream(stream.Object, 100, 100).SetLength(100);
}
[TestMethod]
[ExpectedException(typeof(NotSupportedException))]
public void MustNotSupportWriting()
{
new SubStream(stream.Object, 100, 100).Write(new byte[0], 0, 0);
}
}
}