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