Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/AssemblyInfo.cs
===================================================================
diff -u -ra950714ad9510756331d862aa35695fa0b2ed03b -ra6ba313236d0ff8d2f219fc8249b700b1eade338
--- Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/AssemblyInfo.cs (.../AssemblyInfo.cs) (revision a950714ad9510756331d862aa35695fa0b2ed03b)
+++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/AssemblyInfo.cs (.../AssemblyInfo.cs) (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -5,4 +5,5 @@
[assembly: AssemblyTitle("Ringtoets.Piping.IO")]
[assembly: AssemblyProduct("Ringtoets.Piping.IO")]
[assembly: Guid("f5af3cbe-d10c-42a5-b625-95222648aeaf")]
-[assembly: InternalsVisibleTo("Ringtoets.Piping.IO.Test")]
\ No newline at end of file
+[assembly: InternalsVisibleTo("Ringtoets.Piping.IO.Test")]
+[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
\ No newline at end of file
Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile1DReader.cs
===================================================================
diff -u -r069921ae1e06e13d8e5e19dd9caa5e8f7b9e1f35 -ra6ba313236d0ff8d2f219fc8249b700b1eade338
--- Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile1DReader.cs (.../SoilProfile1DReader.cs) (revision 069921ae1e06e13d8e5e19dd9caa5e8f7b9e1f35)
+++ Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile1DReader.cs (.../SoilProfile1DReader.cs) (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -7,13 +7,17 @@
namespace Ringtoets.Piping.IO.SoilProfile
{
+ ///
+ /// This class is responsible for reading 1d profile definitions from the Soil database using a constructed reader
+ /// and transform the definitions to a .
+ ///
internal static class SoilProfile1DReader
{
///
/// Reads a 1D profile from the given .
///
- ///
- ///
+ /// A which is used to read row values from.
+ /// A new , which is based on the information from the database.
/// Thrown when reading the profile encountered an unrecoverable error.
/// Thrown when reading the profile encountered a recoverable error.
internal static PipingSoilProfile ReadFrom(IRowBasedReader reader)
Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile2DReader.cs
===================================================================
diff -u -r069921ae1e06e13d8e5e19dd9caa5e8f7b9e1f35 -ra6ba313236d0ff8d2f219fc8249b700b1eade338
--- Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile2DReader.cs (.../SoilProfile2DReader.cs) (revision 069921ae1e06e13d8e5e19dd9caa5e8f7b9e1f35)
+++ Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile2DReader.cs (.../SoilProfile2DReader.cs) (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -7,13 +7,17 @@
namespace Ringtoets.Piping.IO.SoilProfile
{
+ ///
+ /// This class is responsible for reading 2d profile definitions from the Soil database using a constructed reader
+ /// and transform the definitions to a .
+ ///
internal static class SoilProfile2DReader
{
-
///
/// Reads information for a profile from the database and creates a based on the information.
///
- /// A new with information from the database.
+ /// A which is used to read row values from.
+ /// A new , which is based on the information from the database.
/// Thrown when reading the profile encountered an unrecoverable error.
/// Thrown when
///
Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/PipingSoilProfilesImporter.cs
===================================================================
diff -u -r069921ae1e06e13d8e5e19dd9caa5e8f7b9e1f35 -ra6ba313236d0ff8d2f219fc8249b700b1eade338
--- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/PipingSoilProfilesImporter.cs (.../PipingSoilProfilesImporter.cs) (revision 069921ae1e06e13d8e5e19dd9caa5e8f7b9e1f35)
+++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/PipingSoilProfilesImporter.cs (.../PipingSoilProfilesImporter.cs) (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
-using System.IO;
using Core.Common.Base;
using log4net;
using Ringtoets.Piping.Data;
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Builders/SoilLayer1DTest.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Builders/SoilLayer1DTest.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Builders/SoilLayer1DTest.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,56 @@
+using System;
+using NUnit.Framework;
+using Ringtoets.Piping.IO.Builders;
+
+namespace Ringtoets.Piping.IO.Test.Builders
+{
+ [TestFixture]
+ public class SoilLayer1DTest
+ {
+ [Test]
+ public void Constructor_WithTop_TopSet()
+ {
+ // Setup
+ var random = new Random(22);
+ var top = random.NextDouble();
+
+ // Call
+ var layer = new SoilLayer1D(top);
+
+ // Assert
+ Assert.AreEqual(top, layer.Top);
+ }
+
+ [Test]
+ [TestCase(1.0)]
+ [TestCase(1.0+1e-12)]
+ [TestCase(2.0)]
+ public void AsPipingSoilLayer_PropertiesSetWithDifferentIsAquifer_PropertiesAreSetInPipingSoilLayer(double isAquifer)
+ {
+ // Setup
+ var random = new Random(22);
+ var top = random.NextDouble();
+ var abovePhreaticLevel = random.NextDouble();
+ var belowPhreaticLevel = random.NextDouble();
+ var dryUnitWeight = random.NextDouble();
+
+ var layer = new SoilLayer1D(top)
+ {
+ IsAquifer = isAquifer,
+ AbovePhreaticLevel = abovePhreaticLevel,
+ BelowPhreaticLevel = belowPhreaticLevel,
+ DryUnitWeight = dryUnitWeight
+ };
+
+ // Call
+ var result = layer.AsPipingSoilLayer();
+
+ // Assert
+ Assert.AreEqual(top, result.Top);
+ Assert.AreEqual(isAquifer.Equals(1.0), result.IsAquifer);
+ Assert.AreEqual(abovePhreaticLevel, result.AbovePhreaticLevel);
+ Assert.AreEqual(belowPhreaticLevel, result.BelowPhreaticLevel);
+ Assert.AreEqual(dryUnitWeight, result.DryUnitWeight);
+ }
+ }
+}
\ No newline at end of file
Fisheye: Tag a6ba313236d0ff8d2f219fc8249b700b1eade338 refers to a dead (removed) revision in file `Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSoilLayer2DReaderTest.cs'.
Fisheye: No comparison available. Pass `N' to diff?
Fisheye: Tag a6ba313236d0ff8d2f219fc8249b700b1eade338 refers to a dead (removed) revision in file `Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSoilProfileReaderTest.cs'.
Fisheye: No comparison available. Pass `N' to diff?
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Ringtoets.Piping.IO.Test.csproj
===================================================================
diff -u -rf69d756f50ae1464a1a11f0780b6d6aa646f3114 -ra6ba313236d0ff8d2f219fc8249b700b1eade338
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Ringtoets.Piping.IO.Test.csproj (.../Ringtoets.Piping.IO.Test.csproj) (revision f69d756f50ae1464a1a11f0780b6d6aa646f3114)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Ringtoets.Piping.IO.Test.csproj (.../Ringtoets.Piping.IO.Test.csproj) (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -39,11 +39,15 @@
..\..\..\..\lib\nunit.framework.dll
+
+ ..\..\..\..\lib\Rhino.Mocks.dll
+
+
@@ -54,12 +58,16 @@
-
-
+
+
+
+
+
+
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/CriticalProfilePropertiesTest.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/CriticalProfilePropertiesTest.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/CriticalProfilePropertiesTest.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,92 @@
+using System;
+using NUnit.Framework;
+using Rhino.Mocks;
+using Ringtoets.Piping.IO.Exceptions;
+using Ringtoets.Piping.IO.Properties;
+using Ringtoets.Piping.IO.SoilProfile;
+
+namespace Ringtoets.Piping.IO.Test.SoilProfile
+{
+ [TestFixture]
+ public class CriticalProfilePropertiesTest
+ {
+ private MockRepository mocks;
+
+ [SetUp]
+ public void SetUp()
+ {
+ mocks = new MockRepository();
+ }
+
+ [Test]
+ public void Constructor_WithReaderValuesValid_SetProperties()
+ {
+ // Setup
+ var reader = mocks.StrictMock();
+ string profileName = "profile";
+ var layerCount = 1;
+
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.ProfileName)).IgnoreArguments().Return(profileName);
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).IgnoreArguments().Return(layerCount);
+
+ mocks.ReplayAll();
+
+ // Call
+ var properties = new CriticalProfileProperties(reader);
+
+ // Assert
+ Assert.AreEqual(profileName, properties.ProfileName);
+ Assert.AreEqual(layerCount, properties.LayerCount);
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void Constructor_WithReaderInvalidProfileName_SetProperties()
+ {
+ // Setup
+ var reader = mocks.StrictMock();
+ var layerCount = 1;
+ var invalidCastException = new InvalidCastException();
+
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.ProfileName)).IgnoreArguments().Throw(invalidCastException);
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).IgnoreArguments().Return(layerCount).Repeat.Any();
+
+ mocks.ReplayAll();
+
+ // Call
+ TestDelegate test = () => new CriticalProfileProperties(reader);
+
+ // Assert
+ var exception = Assert.Throws(test);
+ Assert.AreSame(invalidCastException, exception.InnerException);
+ Assert.AreSame(Resources.PipingSoilProfileReader_Critical_Unexpected_value_on_column, exception.Message);
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void Constructor_WithReaderInvalidLayerCount_SetProperties()
+ {
+ // Setup
+ var reader = mocks.StrictMock();
+ string profileName = "profile";
+ var invalidCastException = new InvalidCastException();
+
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.ProfileName)).IgnoreArguments().Return(profileName).Repeat.Any();
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.LayerCount)).Throw(invalidCastException);
+
+ mocks.ReplayAll();
+
+ // Call
+ TestDelegate test = () => new CriticalProfileProperties(reader);
+
+ // Assert
+ var exception = Assert.Throws(test);
+ Assert.AreSame(invalidCastException, exception.InnerException);
+ Assert.AreSame(Resources.PipingSoilProfileReader_Critical_Unexpected_value_on_column, exception.Message);
+
+ mocks.VerifyAll();
+ }
+ }
+}
\ No newline at end of file
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilLayer2DReaderTest.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilLayer2DReaderTest.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilLayer2DReaderTest.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,252 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Globalization;
+using System.Linq;
+using NUnit.Framework;
+using Ringtoets.Piping.Data;
+using Ringtoets.Piping.IO.Builders;
+using Ringtoets.Piping.IO.SoilProfile;
+using Ringtoets.Piping.IO.Test.TestHelpers;
+
+namespace Ringtoets.Piping.IO.Test.SoilProfile
+{
+ public class PipingSoilLayer2DReaderTest
+ {
+ [Test]
+ [TestCase(0)]
+ [TestCase(1)]
+ public void Constructor_AnyByteArray_ReturnsNewInstance(int size)
+ {
+ // Call
+ var result = new SoilLayer2DReader(new byte[size]);
+
+ // Assert
+ Assert.NotNull(result);
+ }
+
+ [Test]
+ public void Read_MalformedXmlDocument_ThrowsSoilLayer2DConversionException()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("test");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ TestDelegate test = () => reader.Read();
+
+ // Assert
+ Assert.Throws(test);
+ }
+
+ [Test]
+ public void Read_XmlDocumentWithoutSaneContent_ReturnsLayerWithoutOuterLoopAndEmptyInnerLoops()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.IsNull(result.OuterLoop);
+ CollectionAssert.IsEmpty(result.InnerLoops);
+ }
+
+ [Test]
+ public void Read_XmlDocumentWithEmptyOuterLoop_ReturnsLayerWithEmptyOuterLoop()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.NotNull(result);
+ CollectionAssert.IsEmpty(result.OuterLoop);
+ CollectionAssert.IsEmpty(result.InnerLoops);
+ }
+
+ [Test]
+ public void Read_XmlDocumentWithEmptyInnerLoop_ReturnsLayerWithOneEmptyInnerLoop()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.IsNull(result.OuterLoop);
+ Assert.AreEqual(1, result.InnerLoops.Count());
+ CollectionAssert.IsEmpty(result.InnerLoops.ElementAt(0));
+ }
+
+ [Test]
+ public void Read_XmlDocumentWithEmptyInnerLoopAndOuterLoop_ReturnsLayerWithEmptyInnerLoopAndEmptyOuterLoop()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.NotNull(result);
+ CollectionAssert.IsEmpty(result.OuterLoop);
+ Assert.AreEqual(1, result.InnerLoops.Count());
+ CollectionAssert.IsEmpty(result.InnerLoops.ElementAt(0));
+ }
+
+ [Test]
+ [SetCulture("nl-NL")]
+ public void Read_NLXmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint()
+ {
+ Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint();
+ }
+
+ [Test]
+ [SetCulture("en-US")]
+ public void Read_ENXmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint()
+ {
+ Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint();
+ }
+
+ private void Read_XmlDocumentPointInOuterLoop_ReturnsLayerWithOuterLoopWithPoint()
+ {
+ // Setup
+ var random = new Random(22);
+ var invariantCulture = CultureInfo.InvariantCulture;
+
+ var x1 = random.NextDouble();
+ var x2 = random.NextDouble();
+ var y1 = random.NextDouble();
+ var y2 = random.NextDouble();
+
+ var x1String = x1.ToString(invariantCulture);
+ var x2String = x2.ToString(invariantCulture);
+ var y1String = y1.ToString(invariantCulture);
+ var y2String = y2.ToString(invariantCulture);
+ var parsedX1 = double.Parse(x1String, invariantCulture);
+ var parsedX2 = double.Parse(x2String, invariantCulture);
+ var parsedY1 = double.Parse(y1String, invariantCulture);
+ var parsedY2 = double.Parse(y2String, invariantCulture);
+ var sometempvarforbassie = string.Format(invariantCulture, "" +
+ "{0}0.1{1}" +
+ "{2}0.1{3}" +
+ "" +
+ "{0}0.1{1}" +
+ "{2}0.1{3}" +
+ "",
+ x1String, y1String, x2String, y2String);
+ var bytes = StringGeometryHelper.GetBytes(sometempvarforbassie);
+ var xmlDoc = bytes;
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.NotNull(result);
+ Segment2D expectedSegment = new Segment2D(new Point2D(parsedX1, parsedY1), new Point2D(parsedX2, parsedY2));
+ CollectionAssert.AreEqual(new List {expectedSegment, expectedSegment}, result.OuterLoop);
+ }
+
+ [Test]
+ public void Read_XmlDocumentPointsInInnerLoop_ReturnsLayerWithInnerLoopWithSegment()
+ {
+ // Setup
+ var random = new Random(22);
+ var invariantCulture = CultureInfo.InvariantCulture;
+
+ var x1 = random.NextDouble();
+ var x2 = random.NextDouble();
+ var y1 = random.NextDouble();
+ var y2 = random.NextDouble();
+
+ var x1String = x1.ToString(invariantCulture);
+ var x2String = x2.ToString(invariantCulture);
+ var y1String = y1.ToString(invariantCulture);
+ var y2String = y2.ToString(invariantCulture);
+ var parsedX1 = double.Parse(x1String, invariantCulture);
+ var parsedX2 = double.Parse(x2String, invariantCulture);
+ var parsedY1 = double.Parse(y1String, invariantCulture);
+ var parsedY2 = double.Parse(y2String, invariantCulture);
+ var xmlDoc = StringGeometryHelper.GetBytes(string.Format(invariantCulture, "" +
+ "{0}0.1{1}" +
+ "{2}0.1{3}" +
+ "" +
+ "{0}0.1{1}" +
+ "{2}0.1{3}" +
+ "", x1String, y1String, x2String, y2String));
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.NotNull(result);
+ Segment2D expectedSegment = new Segment2D(new Point2D(parsedX1, parsedY1), new Point2D(parsedX2, parsedY2));
+ var expectedCollection = new Collection> { new List { expectedSegment, expectedSegment } };
+ CollectionAssert.AreEqual(expectedCollection, result.InnerLoops);
+ }
+
+ [Test]
+ public void Read_XmlDocumentSinglePointOuterLoopGeometryCurve_ThrowsSoilLayer2DConversionException()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("10.11.1");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ TestDelegate test = () => { reader.Read(); };
+
+ // Assert
+ Assert.Throws(test);
+ }
+
+ [Test]
+ public void Read_XmlDocumentSinglePointInnerLoopGeometryCurve_ThrowsSoilLayer2DConversionException()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("00.11.1");
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ TestDelegate test = () => { reader.Read(); };
+
+ // Assert
+ Assert.Throws(test);
+ }
+
+ [Test]
+ public void Read_XmlDocumentEqualSegments_ReturnsTwoEqualSegments()
+ {
+ // Setup
+ var xmlDoc = StringGeometryHelper.GetBytes("" +
+ "" +
+ "001.1101.1" +
+ "" +
+ "" +
+ "001.1101.1" +
+ "" +
+ "");
+
+ var reader = new SoilLayer2DReader(xmlDoc);
+
+ // Call
+ var result = reader.Read();
+
+ // Assert
+ Assert.AreEqual(2, result.OuterLoop.Count());
+ Assert.AreEqual(result.OuterLoop.ElementAt(0), result.OuterLoop.ElementAt(1));
+ }
+ }
+}
\ No newline at end of file
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilProfileReaderTest.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilProfileReaderTest.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilProfileReaderTest.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,499 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using Core.Common.TestUtils;
+using NUnit.Framework;
+using Ringtoets.Piping.Data;
+using Ringtoets.Piping.IO.Exceptions;
+using Ringtoets.Piping.IO.Properties;
+using Ringtoets.Piping.IO.SoilProfile;
+using Ringtoets.Piping.IO.Test.TestHelpers;
+
+namespace Ringtoets.Piping.IO.Test.SoilProfile
+{
+ public class PipingSoilProfileReaderTest
+ {
+ private readonly string testDataPath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Piping.IO, "PipingSoilProfilesReader");
+
+ [Test]
+ public void Constructor_NonExistingPath_ThrowsCriticalFileReadException()
+ {
+ // Setup
+ var testFile = Path.Combine(testDataPath, "none.soil");
+
+ // Call
+ TestDelegate test = () => new PipingSoilProfileReader(testFile).Dispose();
+
+ // Assert
+ var exception = Assert.Throws(test);
+ Assert.AreEqual(String.Format(Resources.Error_File_0_does_not_exist, testFile), exception.Message);
+ }
+
+ [Test]
+ [TestCase(null)]
+ [TestCase("")]
+ public void Constructor_FileNullOrEmpty_ThrowsCriticalFileReadException(string fileName)
+ {
+ // Call
+ TestDelegate test = () => new PipingSoilProfileReader(fileName).Dispose();
+
+ // Assert
+ var exception = Assert.Throws(test);
+ Assert.AreEqual(Resources.Error_Path_must_be_specified, exception.Message);
+ }
+
+ [Test]
+ [TestCase("text.txt")]
+ [TestCase("empty.soil")]
+ public void Constructor_IncorrectFormatFileOrInvalidSchema_ThrowsPipingCriticalFileReadException(string dbName)
+ {
+ // Setup
+ var dbFile = Path.Combine(testDataPath, dbName);
+
+ // Precondition
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile), "Precondition: file can be opened for edits.");
+
+ // Call
+ TestDelegate test = () => new PipingSoilProfileReader(dbFile).Dispose();
+
+ // Assert
+ var exception = Assert.Throws(test);
+ Assert.AreEqual(String.Format(Resources.Error_SoilProfile_read_from_database, dbName), exception.Message);
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile));
+ }
+
+ [Test]
+ public void Constructor_IncorrectVersion_ThrowsCriticalFileReadException()
+ {
+ // Setup
+ var version = "15.0.5.0";
+ var dbName = "incorrectversion.soil";
+ var dbFile = Path.Combine(testDataPath, dbName);
+
+ // Precondition
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile), "Precondition: file can be opened for edits.");
+
+ // Call
+ TestDelegate test = () => new PipingSoilProfileReader(dbFile).Dispose();
+
+ // Assert
+ var exception = Assert.Throws(test);
+ Assert.AreEqual(String.Format(Resources.PipingSoilProfileReader_Database_file_0_incorrect_version_requires_1, dbName, version), exception.Message);
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile));
+ }
+
+ [Test]
+ public void ReadProfile_AfterDatabaseHasBeenRead_ReturnsNull()
+ {
+ // Setup
+ var testFile = "1dprofile.soil";
+ var dbFile = Path.Combine(testDataPath, testFile);
+
+ using (var pipingSoilProfileReader = new PipingSoilProfileReader(dbFile))
+ {
+ while (pipingSoilProfileReader.HasNext)
+ {
+ pipingSoilProfileReader.ReadProfile();
+ }
+
+ // Call & Assert
+ Assert.IsNull(pipingSoilProfileReader.ReadProfile());
+ }
+ }
+
+ [Test]
+ public void ReadProfile_DatabaseWith1DAnd2DProfilesWithSameName_ReturnTwoProfilesWithSameName()
+ {
+ // Setup
+ var testFile = "combined1d2d.soil";
+ var dbFile = Path.Combine(testDataPath, testFile);
+
+ using (var pipingSoilProfilesReader = new PipingSoilProfileReader(dbFile))
+ {
+ var result = new Collection();
+
+ // Call
+ while (pipingSoilProfilesReader.HasNext)
+ {
+ result.Add(pipingSoilProfilesReader.ReadProfile());
+ }
+
+ // Assert
+ Assert.AreEqual(2, result.Count);
+ Assert.AreEqual(result[0].Name, result[1].Name);
+ }
+ }
+
+ [Test]
+ public void ReadProfile_DatabaseProfileWithInvalid2dLayerGeometry_SkipsTheProfile()
+ {
+ // Setup
+ var testFile = "invalid2dGeometry.soil";
+ using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile)))
+ {
+ // Call
+ TestDelegate profile = () => pipingSoilProfilesReader.ReadProfile();
+
+ // Assert
+ var exception = Assert.Throws(profile);
+ Assert.AreEqual(Resources.SoilLayer2DReader_Geometry_contains_no_valid_xml, exception.Message);
+
+ // Call
+ var pipingSoilProfile = pipingSoilProfilesReader.ReadProfile();
+
+ // Assert
+ Assert.AreEqual("Profile2", pipingSoilProfile.Name);
+ Assert.AreEqual(3, pipingSoilProfile.Layers.Count());
+
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(testFile));
+ }
+ }
+
+ [Test]
+ public void ReadProfile_DatabaseProfileWithVerticalSegmentAtX_SkipsTheProfile()
+ {
+ // Setup
+ var testFile = "vertical2dGeometry.soil";
+ using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile)))
+ {
+ // Call
+ TestDelegate profile = () => pipingSoilProfilesReader.ReadProfile();
+
+ // Assert
+ var exception = Assert.Throws(profile);
+ var message = String.Format(Resources.Error_Can_not_determine_1D_profile_with_vertical_segments_at_x, 85.2);
+ Assert.AreEqual(message, exception.Message);
+
+ // Call
+ var pipingSoilProfile = pipingSoilProfilesReader.ReadProfile();
+
+ // Assert
+ Assert.AreEqual("Profile2", pipingSoilProfile.Name);
+ Assert.AreEqual(3, pipingSoilProfile.Layers.Count());
+
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(testFile));
+ }
+ }
+
+ [Test]
+ public void ReadProfile_DatabaseProfileWithoutValuesForLayerProperties_ReturnsProfileWithAllLayers()
+ {
+ // Setup
+ var testFile = "1dprofileNoValues.soil";
+ using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile)))
+ {
+ // Call
+ var profile = pipingSoilProfilesReader.ReadProfile();
+
+ // Assert
+ Assert.AreEqual("Profile", profile.Name);
+ Assert.AreEqual(3, profile.Layers.Count());
+ CollectionAssert.AreEqual(Enumerable.Repeat(false, 3), profile.Layers.Select(l => l.IsAquifer));
+ CollectionAssert.AreEqual(Enumerable.Repeat((double?)null, 3), profile.Layers.Select(l => l.AbovePhreaticLevel));
+ CollectionAssert.AreEqual(Enumerable.Repeat((double?)null, 3), profile.Layers.Select(l => l.BelowPhreaticLevel));
+ CollectionAssert.AreEqual(Enumerable.Repeat((double?)null, 3), profile.Layers.Select(l => l.DryUnitWeight));
+ }
+ }
+
+ [Test]
+ public void ReadProfile_DatabaseWith1DProfile3Layers_ReturnsProfile()
+ {
+ // Setup
+ var testFile = "1dprofile.soil";
+ var dbFile = Path.Combine(testDataPath, testFile);
+ using (var reader = new PipingSoilProfileReader(dbFile))
+ {
+ // Call
+ var profile = reader.ReadProfile();
+
+ // Assert
+ CollectionAssert.AreEqual(new[]
+ {
+ false,
+ false,
+ true
+ }, profile.Layers.Select(l => l.IsAquifer));
+ CollectionAssert.AreEqual(new[]
+ {
+ 0.001,
+ 0.001,
+ 0.001
+ }, profile.Layers.Select(l => l.AbovePhreaticLevel));
+ CollectionAssert.AreEqual(new[]
+ {
+ 0.001,
+ 0.001,
+ 0.001
+ }, profile.Layers.Select(l => l.BelowPhreaticLevel));
+ CollectionAssert.AreEqual(new double?[]
+ {
+ null,
+ null,
+ null
+ }, profile.Layers.Select(l => l.DryUnitWeight));
+ }
+ }
+
+ [Test]
+ public void Dispose_AfterConstruction_CorrectlyReleasesFile()
+ {
+ // Setup
+ var testFile = "1dprofile.soil";
+ var dbFile = Path.Combine(testDataPath, testFile);
+
+ // Precondition
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile), "Precondition failed: The file should be writable to begin with.");
+
+ // Call
+ new PipingSoilProfileReader(dbFile).Dispose();
+
+ // Assert
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile));
+ }
+
+ [Test]
+ public void Dispose_WhenReadProfile_CorrectlyReleasesFile()
+ {
+ // Setup
+ var testFile = "1dprofile.soil";
+ var dbFile = Path.Combine(testDataPath, testFile);
+
+ // Precondition
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile), "Precondition failed: The file should be writable to begin with.");
+
+ PipingSoilProfileReader pipingSoilProfilesReader = null;
+ PipingSoilProfile profile = null;
+ try
+ {
+ pipingSoilProfilesReader = new PipingSoilProfileReader(dbFile);
+ profile = pipingSoilProfilesReader.ReadProfile();
+ }
+ finally
+ {
+ // Call
+ if (pipingSoilProfilesReader != null)
+ {
+ pipingSoilProfilesReader.Dispose();
+ }
+ }
+
+ // Assert
+ Assert.NotNull(profile);
+ Assert.IsTrue(FileHelper.CanOpenFileForWrite(dbFile));
+ }
+
+ [Test]
+ [SetCulture("nl-NL")]
+ public void GivenDatabaseWith1DProfileAndDutchLocale_WhenReadingTheCompleteDatabase_ReturnsCompleteSoilProfile()
+ {
+ GivenDatabaseWith1DProfile_WhenReadingTheCompleteDatabase_ReturnsCompleteSoilProfile();
+ }
+
+ [Test]
+ [SetCulture("en-US")]
+ public void GivenDatabaseWith1DProfileAndEnglishLocale_WhenReadingTheCompleteDatabase_ReturnsCompleteSoilProfile()
+ {
+ GivenDatabaseWith1DProfile_WhenReadingTheCompleteDatabase_ReturnsCompleteSoilProfile();
+ }
+
+ [Test]
+ [SetCulture("nl-NL")]
+ public void GivenACompleteDatabaseAndDutchLocale_WhenReadingTheCompleteDatabase_Returns2ProfilesWithLayersAndGeometries()
+ {
+ GivenACompleteDatabase_WhenReadingTheCompleteDatabase_Returns2ProfilesWithLayersAndGeometries();
+ }
+
+ [Test]
+ [SetCulture("en-US")]
+ public void GivenACompleteDatabaseAndEnglishLocale_WhenReadingTheCompleteDatabase_Returns2ProfilesWithLayersAndGeometries()
+ {
+ GivenACompleteDatabase_WhenReadingTheCompleteDatabase_Returns2ProfilesWithLayersAndGeometries();
+ }
+
+ private void GivenDatabaseWith1DProfile_WhenReadingTheCompleteDatabase_ReturnsCompleteSoilProfile()
+ {
+ // Setup
+ var testFile = "1dprofile.soil";
+ using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile)))
+ {
+ // Call
+ var result = new Collection();
+ var skipped = 0;
+
+ while (pipingSoilProfilesReader.HasNext)
+ {
+ try
+ {
+ result.Add(pipingSoilProfilesReader.ReadProfile());
+ }
+ catch
+ {
+ skipped++;
+ }
+ }
+
+ // Assert
+ Assert.AreEqual(0, skipped);
+ Assert.AreEqual(1, result.Count);
+ Assert.AreEqual(-2.1, result[0].Bottom);
+ CollectionAssert.AreEqual(new[]
+ {
+ 3.3,
+ 2.2,
+ 1.1
+ }, result[0].Layers.Select(l => l.Top));
+ }
+ }
+
+ private void GivenACompleteDatabase_WhenReadingTheCompleteDatabase_Returns2ProfilesWithLayersAndGeometries()
+ {
+ // Setup
+ var testFile = "complete.soil";
+ using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile)))
+ {
+ // Call
+ ICollection result = new List();
+ int skipped = 0;
+
+ while (pipingSoilProfilesReader.HasNext)
+ {
+ try
+ {
+ result.Add(pipingSoilProfilesReader.ReadProfile());
+ }
+ catch
+ {
+ skipped++;
+ }
+ }
+
+ // Assert
+ Assert.AreEqual(0, skipped);
+ Assert.AreEqual(26, result.Count);
+ CollectionAssert.AreEqual(new[]
+ {
+ "AD640M00_Segment_36005_1D1",
+ "AD640M00_Segment_36005_1D2",
+ "Segment_36005_1D1",
+ "Segment_36005_1D10",
+ "Segment_36005_1D2",
+ "Segment_36005_1D3",
+ "Segment_36005_1D4",
+ "Segment_36005_1D5",
+ "Segment_36005_1D6",
+ "Segment_36005_1D7",
+ "Segment_36005_1D8",
+ "Segment_36005_1D9",
+ "Segment_36006_1D1",
+ "Segment_36006_1D2",
+ "Segment_36006_1D3",
+ "Segment_36006_1D4",
+ "Segment_36006_1D5",
+ "Segment_36006_1D6",
+ "Segment_36007_1D1",
+ "Segment_36007_1D2",
+ "Segment_36007_1D3",
+ "Segment_36007_1D4",
+ "Segment_36007_1D5",
+ "Segment_36007_1D6",
+ "Segment_36007_1D7",
+ "Segment_36007_1D8"
+ }, result.Select(p => p.Name));
+
+ CollectionAssert.AreEqual(new[]
+ {
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -45,
+ -52,
+ -52,
+ -52,
+ -52,
+ -24,
+ -21.25,
+ -21,
+ -21
+ }, result.Select(p => p.Bottom));
+
+ CollectionAssert.AreEqual(new[]
+ {
+ 9,
+ 7,
+ 8,
+ 3,
+ 6,
+ 6,
+ 5,
+ 5,
+ 6,
+ 4,
+ 4,
+ 3,
+ 7,
+ 7,
+ 7,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 4,
+ 5,
+ 4,
+ 4,
+ 2,
+ 3
+ }, result.Select(p => p.Layers.Count()));
+
+ var firstProfile = result.FirstOrDefault(l => l.Name == "AD640M00_Segment_36005_1D1");
+ Assert.NotNull(firstProfile);
+ var expectedFirstProfileLayersTops = new[]
+ {
+ 5.9075,
+ 3.250,
+ 2.750,
+ 1.250,
+ 1.0,
+ -2.5,
+ -13,
+ -17,
+ -25,
+ };
+ CollectionAssert.AllItemsAreUnique(firstProfile.Layers.Select(l => l.Top));
+ CollectionAssert.AreEqual(expectedFirstProfileLayersTops, firstProfile.Layers.Select(l => l.Top), new DoubleWithToleranceComparer(1e-6));
+
+ var secondProfile = result.FirstOrDefault(l => l.Name == "AD640M00_Segment_36005_1D2");
+ Assert.NotNull(secondProfile);
+ var expectedSecondProfileLayersTops = new[]
+ {
+ 5.9075,
+ 3.25,
+ -0.5,
+ -0.75,
+ -13,
+ -17,
+ -25,
+ };
+ CollectionAssert.AllItemsAreUnique(secondProfile.Layers.Select(l => l.Top));
+ CollectionAssert.AreEqual(expectedSecondProfileLayersTops, secondProfile.Layers.Select(l => l.Top), new DoubleWithToleranceComparer(1e-6));
+ }
+ }
+ }
+}
\ No newline at end of file
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/SoilProfile1DReaderTest.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/SoilProfile1DReaderTest.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/SoilProfile1DReaderTest.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,123 @@
+using System;
+using System.Linq;
+using NUnit.Framework;
+using Rhino.Mocks;
+using Ringtoets.Piping.IO.Exceptions;
+using Ringtoets.Piping.IO.SoilProfile;
+
+namespace Ringtoets.Piping.IO.Test.SoilProfile
+{
+ [TestFixture]
+ public class SoilProfile1DReaderTest
+ {
+ private MockRepository mocks;
+ private IRowBasedReader reader;
+
+ [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 = () => SoilProfile1DReader.ReadFrom(reader);
+
+ // Assert
+ Assert.Throws(test);
+
+ 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.Bottom)).Throw(new InvalidCastException());
+
+ mocks.ReplayAll();
+
+ // Call
+ TestDelegate test = () => SoilProfile1DReader.ReadFrom(reader);
+
+ // Assert
+ Assert.Throws(test);
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void ReadFrom_ZeroLayerCount_ThrowsPipingSoilProfileReadException()
+ {
+ // Setup
+ SetExpectations(0, "", 0.0, 0.0, 1.0, 0.0, 0.0, 0.0);
+
+ mocks.ReplayAll();
+
+ // Call
+ TestDelegate test = () => SoilProfile1DReader.ReadFrom(reader);
+
+ // Assert
+ Assert.Throws(test);
+
+ 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 top = random.NextDouble();
+ var bottom = random.NextDouble();
+
+ SetExpectations(layerCount, "", bottom, top, 1.0, belowPhreaticLevel, abovePhreaticLevel, dryUnitWeight);
+
+ mocks.ReplayAll();
+
+ // Call
+ var profile = SoilProfile1DReader.ReadFrom(reader);
+
+ Assert.AreEqual(bottom, profile.Bottom);
+
+ // Assert
+ Assert.AreEqual(layerCount, profile.Layers.Count());
+
+ var pipingSoilLayer = profile.Layers.First();
+ Assert.AreEqual(top, 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 bottom, double top, double? isAquifer, double? belowPhreaticLevel, double? abovePhreaticLevel, double? dryUnitWeight)
+ {
+ 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.Bottom)).Return(bottom).Repeat.Any();
+ reader.Expect(r => r.Read(SoilProfileDatabaseColumns.Top)).Return(top).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();
+ }
+ }
+}
\ No newline at end of file
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/SoilProfile2DReaderTest.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/SoilProfile2DReaderTest.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/SoilProfile2DReaderTest.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,170 @@
+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 IRowBasedReader 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
+ Assert.Throws(test);
+
+ 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
+ Assert.Throws(test);
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void ReadFrom_DoubleNaNIntersectionX_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)).Return(double.NaN);
+
+ mocks.ReplayAll();
+
+ // Call
+ TestDelegate test = () => SoilProfile2DReader.ReadFrom(reader);
+
+ // Assert
+ Assert.Throws(test);
+
+ 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
+ Assert.Throws(test);
+
+ 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
+ Assert.Throws(test);
+
+ 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();
+ }
+ }
+}
\ No newline at end of file
Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/TestHelpers/StringGeometryHelper.cs
===================================================================
diff -u
--- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/TestHelpers/StringGeometryHelper.cs (revision 0)
+++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/TestHelpers/StringGeometryHelper.cs (revision a6ba313236d0ff8d2f219fc8249b700b1eade338)
@@ -0,0 +1,14 @@
+using System;
+
+namespace Ringtoets.Piping.IO.Test.TestHelpers
+{
+ public class StringGeometryHelper
+ {
+ public static byte[] GetBytes(string str)
+ {
+ byte[] bytes = new byte[str.Length * sizeof(char)];
+ Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
+ return bytes;
+ }
+ }
+}
\ No newline at end of file