using System;
using System.Linq;
using NUnit.Framework;
using Rhino.Mocks;
using Ringtoets.Piping.IO.Exceptions;
using Ringtoets.Piping.IO.SoilProfile;
using Ringtoets.Piping.IO.Test.TestHelpers;
namespace Ringtoets.Piping.IO.Test.SoilProfile
{
[TestFixture]
public class SoilProfile2DReaderTest
{
private MockRepository mocks;
private IRowBasedDatabaseReader reader;
private readonly byte[] someGeometry = StringGeometryHelper.GetBytes("" +
"" +
"001.1101.1" +
"" +
"" +
"001.1101.1" +
"" +
"");
[SetUp]
public void SetUp()
{
mocks = new MockRepository();
reader = mocks.DynamicMock();
}
[Test]
public void ReadFrom_InvalidCriticalProperty_ThrowsCriticalFileReadException()
{
// Setup
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).Throw(new InvalidCastException());
mocks.ReplayAll();
// Call
TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Kritieke fout opgetreden bij het uitlezen van waardes uit kolommen in de database.", exception.Message);
mocks.VerifyAll();
}
[Test]
public void ReadFrom_InvalidRequiredProperty_ThrowsPipingSoilProfileReadException()
{
// Setup
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).Return(1).Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.ProfileName)).Return("").Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.IntersectionX)).Throw(new InvalidCastException());
mocks.ReplayAll();
// Call
TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Ondergrondprofiel '' in database bevat geen geldige waarde in kolom 'IntersectionX'.", exception.Message);
mocks.VerifyAll();
}
[Test]
public void ReadFrom_DoubleNaNIntersectionX_ThrowsPipingSoilProfileReadException()
{
// Setup
string name = "profile";
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).Return(1).Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.ProfileName)).Return(name).Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.IntersectionX)).Return(double.NaN);
mocks.ReplayAll();
// Call
TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
// Assert
var exception = Assert.Throws(test);
var expectedMessage = string.Format("Geen geldige X waarde gevonden om intersectie te maken uit 2D profiel '{0}'.", name);
Assert.AreEqual(expectedMessage, exception.Message);
mocks.VerifyAll();
}
[Test]
public void ReadFrom_ZeroLayerCount_ThrowsPipingSoilProfileReadException()
{
// Setup
SetExpectations(0, "", 0.0, 1.0, 0.0, 0.0, 0.0, new byte[0]);
mocks.ReplayAll();
// Call
TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Geen lagen gevonden voor het profiel.", exception.Message);
mocks.VerifyAll();
}
[Test]
[TestCase(new byte[0])]
[TestCase(null)]
public void ReadFrom_EmptyGeometry_ThrowsPipingSoilProfileReadException(byte[] geometry)
{
// Setup
SetExpectations(1, "", 0.0, 1.0, 0.0, 0.0, 0.0, geometry);
mocks.ReplayAll();
// Call
TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Het XML-document dat de geometrie beschrijft voor de laag is niet geldig.", exception.Message);
mocks.VerifyAll();
}
[Test]
public void ReadFrom_InvalidIsAquifer_ReturnsProfileWithNullValuesOnLayer()
{
// Setup
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).Return(1).Repeat.Any();
reader.Expect(r => r.ReadOrNull(SoilProfileDatabaseColumns.IsAquifer)).Throw(new InvalidCastException());
mocks.ReplayAll();
// Call
TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("Ondergrondprofiel '' in database bevat geen geldige waarde in kolom 'IsAquifer'.", exception.Message);
mocks.VerifyAll();
}
[Test]
public void ReadFrom_NullValuesForLayer_ReturnsProfileWithNullValuesOnLayer()
{
// Setup
SetExpectations(1, "", 0.0, null, null, null, null, someGeometry);
mocks.ReplayAll();
// Call
var profile = SoilProfile2DReader.ReadFrom(reader);
// Assert
Assert.AreEqual(1, profile.Layers.Count());
Assert.AreEqual(1.1, profile.Bottom);
var pipingSoilLayer = profile.Layers.First();
Assert.AreEqual(1.1, pipingSoilLayer.Top);
Assert.IsNull(pipingSoilLayer.BelowPhreaticLevel);
Assert.IsNull(pipingSoilLayer.AbovePhreaticLevel);
Assert.IsNull(pipingSoilLayer.DryUnitWeight);
Assert.IsFalse(pipingSoilLayer.IsAquifer);
mocks.VerifyAll();
}
[Test]
[TestCase(1)]
[TestCase(2)]
[TestCase(3)]
public void ReadFrom_ProperValuesForNumberOfLayers_ReturnsProfileWithNumberOfLayers(int layerCount)
{
// Setup
var random = new Random(22);
var belowPhreaticLevel = random.NextDouble();
var abovePhreaticLevel = random.NextDouble();
var dryUnitWeight = random.NextDouble();
var intersectionX = 0.5;
SetExpectations(layerCount, "", intersectionX, 1.0, belowPhreaticLevel, abovePhreaticLevel, dryUnitWeight, someGeometry);
mocks.ReplayAll();
// Call
var profile = SoilProfile2DReader.ReadFrom(reader);
// Assert
Assert.AreEqual(layerCount, profile.Layers.Count());
Assert.AreEqual(1.1, profile.Bottom);
var pipingSoilLayer = profile.Layers.First();
Assert.AreEqual(1.1, pipingSoilLayer.Top);
Assert.AreEqual(belowPhreaticLevel, pipingSoilLayer.BelowPhreaticLevel);
Assert.AreEqual(abovePhreaticLevel, pipingSoilLayer.AbovePhreaticLevel);
Assert.AreEqual(dryUnitWeight, pipingSoilLayer.DryUnitWeight);
Assert.IsTrue(pipingSoilLayer.IsAquifer);
mocks.VerifyAll();
}
private void SetExpectations(int layerCount, string profileName, double intersectionX, double? isAquifer, double? belowPhreaticLevel, double? abovePhreaticLevel, double? dryUnitWeight, byte[] geometry)
{
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).Return(layerCount).Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.ProfileName)).Return(profileName).Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.IntersectionX)).Return(intersectionX).Repeat.Any();
reader.Expect(r => r.ReadOrNull(SoilProfileDatabaseColumns.IsAquifer)).Return(isAquifer).Repeat.Any();
reader.Expect(r => r.ReadOrNull(SoilProfileDatabaseColumns.BelowPhreaticLevel)).Return(belowPhreaticLevel).Repeat.Any();
reader.Expect(r => r.ReadOrNull(SoilProfileDatabaseColumns.AbovePhreaticLevel)).Return(abovePhreaticLevel).Repeat.Any();
reader.Expect(r => r.ReadOrNull(SoilProfileDatabaseColumns.DryUnitWeight)).Return(dryUnitWeight).Repeat.Any();
reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerGeometry)).Return(geometry).Repeat.Any();
}
}
}