Index: doc/dsoilmodel/queries/All1dProfilesAndLayersAndLayerPropertiesAndMaterialProperties.sql =================================================================== diff -u --- doc/dsoilmodel/queries/All1dProfilesAndLayersAndLayerPropertiesAndMaterialProperties.sql (revision 0) +++ doc/dsoilmodel/queries/All1dProfilesAndLayersAndLayerPropertiesAndMaterialProperties.sql (revision 3ab625a7c585b86be669fef127b79d73c0de1d7e) @@ -0,0 +1,25 @@ +SELECT + p.SP1D_Name as ProfileName, + p.BottomLevel as Bottom, + l.TopLevel as Top, + sum(case when lpv.PN_Name = 'IsAquifer' then lpv.PV_Value end) IsAquifer, + sum(case when mat.PN_Name = 'AbovePhreaticLevel' then mat.PV_Value end) AbovePhreaticLevel, + sum(case when mat.PN_Name = 'BelowPhreaticLevel' then mat.PV_Value end) BelowPhreaticLevel, + sum(case when mat.PN_Name = 'PermeabKx' then mat.PV_Value end) PermeabKx, + sum(case when mat.PN_Name = 'DiameterD70' then mat.PV_Value end) DiameterD70, + sum(case when mat.PN_Name = 'WhitesConstant' then mat.PV_Value end) WhitesConstant, + sum(case when mat.PN_Name = 'BeddingAngle' then mat.PV_Value end) BeddingAngle +FROM SoilProfile1D as p + JOIN SoilLayer1D as l ON l.SP1D_ID = p.SP1D_ID + JOIN ( + SELECT m.MA_ID, pn.PN_Name, pv.PV_Value + FROM ParameterNames as pn + JOIN ParameterValues as pv ON pn.PN_ID = pv.PN_ID + JOIN Materials as m ON m.MA_ID = pv.MA_ID) as mat ON l.MA_ID = mat.MA_ID + JOIN ( + SELECT pv.SL1D_ID, pn.PN_Name, pv.PV_Value + FROM ParameterNames as pn + JOIN LayerParameterValues as pv ON pn.PN_ID = pv.PN_ID) as lpv ON lpv.SL1D_ID = l.SL1D_ID +GROUP BY l.SL1D_ID + +ORDER BY ProfileName \ No newline at end of file Index: doc/dsoilmodel/queries/All2dProfilesAndLayersAndLayerPropertiesAndMaterialProperties.sql =================================================================== diff -u --- doc/dsoilmodel/queries/All2dProfilesAndLayersAndLayerPropertiesAndMaterialProperties.sql (revision 0) +++ doc/dsoilmodel/queries/All2dProfilesAndLayersAndLayerPropertiesAndMaterialProperties.sql (revision 3ab625a7c585b86be669fef127b79d73c0de1d7e) @@ -0,0 +1,26 @@ +SELECT + p.SP2D_Name as ProfileName, + l.GeometrySurface as LayerGeometry, + mpl.X as IntersectionX, + sum(case when lpv.PN_Name = 'IsAquifer' then lpv.PV_Value end) IsAquifer, + sum(case when mat.PN_Name = 'AbovePhreaticLevel' then mat.PV_Value end) AbovePhreaticLevel, + sum(case when mat.PN_Name = 'BelowPhreaticLevel' then mat.PV_Value end) BelowPhreaticLevel, + sum(case when mat.PN_Name = 'PermeabKx' then mat.PV_Value end) PermeabKx, + sum(case when mat.PN_Name = 'DiameterD70' then mat.PV_Value end) DiameterD70, + sum(case when mat.PN_Name = 'WhitesConstant' then mat.PV_Value end) WhitesConstant, + sum(case when mat.PN_Name = 'BeddingAngle' then mat.PV_Value end) BeddingAngle +FROM MechanismPointLocation as m +JOIN MechanismPointLocation as mpl ON p.SP2D_ID = mpl.SP2D_ID +JOIN SoilProfile2D as p ON m.SP2D_ID = p.SP2D_ID +JOIN SoilLayer2D as l ON l.SP2D_ID = p.SP2D_ID +JOIN ( + SELECT m.MA_ID, pn.PN_Name, pv.PV_Value + FROM ParameterNames as pn + JOIN ParameterValues as pv ON pn.PN_ID = pv.PN_ID + JOIN Materials as m ON m.MA_ID = pv.MA_ID) as mat ON l.MA_ID = mat.MA_ID +JOIN ( + SELECT pv.SL2D_ID, pn.PN_Name, pv.PV_Value + FROM ParameterNames as pn + JOIN LayerParameterValues as pv ON pn.PN_ID = pv.PN_ID) as lpv ON lpv.SL2D_ID = l.SL2D_ID +WHERE m.ME_ID = 4 +GROUP BY l.SL2D_ID \ No newline at end of file Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/PipingSoilProfileReader.cs =================================================================== diff -u -rd0e0e368f3f1b297abe0e073a2c313fd38c77c16 -r3ab625a7c585b86be669fef127b79d73c0de1d7e --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/PipingSoilProfileReader.cs (.../PipingSoilProfileReader.cs) (revision d0e0e368f3f1b297abe0e073a2c313fd38c77c16) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/PipingSoilProfileReader.cs (.../PipingSoilProfileReader.cs) (revision 3ab625a7c585b86be669fef127b79d73c0de1d7e) @@ -23,7 +23,8 @@ private const int pipingMechanismId = 4; private SQLiteConnection connection; - private SQLiteDataReader dataReader; + + private const string isAquiferColumn = "IsAquifer"; private const string profileNameColumn = "ProfileName"; private const string intersectionXColumn = "IntersectionX"; private const string bottomColumn = "Bottom"; @@ -35,8 +36,11 @@ private const string diameterD70Column = "DiameterD70"; private const string whitesConstantColumn = "WhitesConstant"; private const string beddingAngleColumn = "BeddingAngle"; - private const string dimensionsColumn = "Dimensions"; + private const string mechanismParameterName = "mechanism"; + private string query1d; + private string query2d; + /// /// Creates a new instance of which will use the /// as its source. @@ -54,9 +58,10 @@ } PrepareConnection(dbFile); + PrepareQueries(); Connect(); } - + /// /// Creates instances of based on the database file of the . /// @@ -67,32 +72,38 @@ { var pipingSoilProfileBuilders = new Dictionary(); - CreateDataReader(); - - while (dataReader.Read()) + using (var dataReader = CreateDataReader(query2d, new SQLiteParameter { - var profileName = (string)dataReader[profileNameColumn]; - var dimensions = (long) dataReader[dimensionsColumn]; - if (dimensions == 2) + DbType = DbType.Int32, + Value = pipingMechanismId, + ParameterName = mechanismParameterName + })) + { + while (dataReader.Read()) { - var intersectionX = (double) dataReader[intersectionXColumn]; + var profileName = TryRead(dataReader, profileNameColumn); + var intersectionX = TryRead(dataReader, intersectionXColumn); if (!pipingSoilProfileBuilders.ContainsKey(profileName)) { pipingSoilProfileBuilders.Add(profileName, new SoilProfileBuilder2D(profileName, intersectionX)); } var soilProfile2DBuilder = pipingSoilProfileBuilders[profileName] as SoilProfileBuilder2D; - if(soilProfile2DBuilder == null) + if (soilProfile2DBuilder == null) { throw new PipingSoilProfileReadException(Resources.Error_CannotCombine2DAnd1DLayersInProfile); } - soilProfile2DBuilder.Add(ReadPiping2DSoilLayer()); + soilProfile2DBuilder.Add(ReadPiping2DSoilLayer(dataReader)); } - else + } + using (var dataReader = CreateDataReader(query1d)) + { + while (dataReader.Read()) { - var bottom = (double)dataReader[bottomColumn]; + var profileName = TryRead(dataReader, profileNameColumn); + var bottom = TryRead(dataReader, bottomColumn); if (!pipingSoilProfileBuilders.ContainsKey(profileName)) { pipingSoilProfileBuilders.Add(profileName, new SoilProfileBuilder1D(profileName, bottom)); @@ -103,27 +114,34 @@ { throw new PipingSoilProfileReadException(Resources.Error_CannotCombine2DAnd1DLayersInProfile); } - soilProfile1DBuilder.Add(ReadPipingSoilLayer()); + soilProfile1DBuilder.Add(ReadPipingSoilLayer(dataReader)); } } return pipingSoilProfileBuilders.Select(keyValue => keyValue.Value.Build()); } - private PipingSoilLayer ReadPipingSoilLayer() + private T TryRead(SQLiteDataReader dataReader, string columnName) { - var columnValue = (double) dataReader[topColumn]; + try + { + return (T)dataReader[columnName]; + } + catch (InvalidCastException) + { + throw new PipingSoilProfileReadException(String.Format(Resources.PipingSoilProfileReader_InvalidValueOnColumn, columnName)); + } + } + + private PipingSoilLayer ReadPipingSoilLayer(SQLiteDataReader dataReader) + { + var columnValue = TryRead(dataReader, topColumn); var pipingSoilLayer = new PipingSoilLayer(columnValue); return pipingSoilLayer; } public void Dispose() { - if (dataReader != null) - { - dataReader.Close(); - dataReader.Dispose(); - } connection.Close(); connection.Dispose(); } @@ -153,97 +171,95 @@ } } - private SoilLayer2D ReadPiping2DSoilLayer() + private SoilLayer2D ReadPiping2DSoilLayer(SQLiteDataReader dataReader) { - var columnValue = dataReader[layerGeometryColumn]; - var geometry = (byte[]) columnValue; + var geometry = TryRead(dataReader, layerGeometryColumn); return new PipingSoilLayer2DReader(geometry).Read(); } + private void PrepareQueries() + { + string sharedSelectColumns = string.Format(string.Join(" ", + "sum(case when lpv.PN_Name = 'IsAquifer' then lpv.PV_Value end) {0},", + "sum(case when mat.PN_Name = 'AbovePhreaticLevel' then mat.PV_Value end) {1},", + "sum(case when mat.PN_Name = 'BelowPhreaticLevel' then mat.PV_Value end) {2},", + "sum(case when mat.PN_Name = 'PermeabKx' then mat.PV_Value end) {3},", + "sum(case when mat.PN_Name = 'DiameterD70' then mat.PV_Value end) {4},", + "sum(case when mat.PN_Name = 'WhitesConstant' then mat.PV_Value end) {5},", + "sum(case when mat.PN_Name = 'BeddingAngle' then mat.PV_Value end) {6}"), + isAquiferColumn, + abovePhreaticLevelColumn, + belowPhreaticLevelColumn, + permeabKxColumn, + diameterD70Column, + whitesConstantColumn, + beddingAngleColumn + ); + + query1d = string.Format(string.Join(" ", "SELECT", + "p.SP1D_Name as {0},", + "p.BottomLevel as {1},", + "l.TopLevel as {2},", + sharedSelectColumns, + "FROM SoilProfile1D as p", + "JOIN SoilLayer1D as l ON l.SP1D_ID = p.SP1D_ID", + "JOIN (", + "SELECT m.MA_ID, pn.PN_Name, pv.PV_Value", + "FROM ParameterNames as pn", + "JOIN ParameterValues as pv ON pn.PN_ID = pv.PN_ID", + "JOIN Materials as m ON m.MA_ID = pv.MA_ID) as mat ON l.MA_ID = mat.MA_ID", + "JOIN (", + "SELECT pv.SL1D_ID, pn.PN_Name, pv.PV_Value", + "FROM ParameterNames as pn", + "JOIN LayerParameterValues as pv ON pn.PN_ID = pv.PN_ID) as lpv ON lpv.SL1D_ID = l.SL1D_ID", + "GROUP BY l.SL1D_ID", + "ORDER BY ProfileName"), + profileNameColumn, + bottomColumn, + topColumn); + + query2d = string.Format(string.Join(" ", "SELECT", + "p.SP2D_Name as {0},", + "l.GeometrySurface as {1}, ", + "mpl.X as {2},", + sharedSelectColumns, + "FROM MechanismPointLocation as m ", + "JOIN MechanismPointLocation as mpl ON p.SP2D_ID = mpl.SP2D_ID ", + "JOIN SoilProfile2D as p ON m.SP2D_ID = p.SP2D_ID ", + "JOIN SoilLayer2D as l ON l.SP2D_ID = p.SP2D_ID ", + "JOIN (", + "SELECT m.MA_ID, pn.PN_Name, pv.PV_Value", + "FROM ParameterNames as pn", + "JOIN ParameterValues as pv ON pn.PN_ID = pv.PN_ID", + "JOIN Materials as m ON m.MA_ID = pv.MA_ID) as mat ON l.MA_ID = mat.MA_ID", + "JOIN (", + "SELECT pv.SL2D_ID, pn.PN_Name, pv.PV_Value", + "FROM ParameterNames as pn", + "JOIN LayerParameterValues as pv ON pn.PN_ID = pv.PN_ID) as lpv ON lpv.SL2D_ID = l.SL2D_ID", + "WHERE m.ME_ID = @{3}", + "GROUP BY l.SL2D_ID"), + profileNameColumn, + layerGeometryColumn, + intersectionXColumn, + mechanismParameterName); + } + /// /// Creates a new data reader to use in this class, based on a query which returns all the known soil layers for which its profile has a X coordinate defined for piping. /// - private void CreateDataReader() + private SQLiteDataReader CreateDataReader(string queryString, params SQLiteParameter[] parameters) { - var mechanismParameterName = "mechanism"; using (var query = new SQLiteCommand(connection) { - CommandText = string.Format(string.Join( - " ", - "SELECT", - "p.SP2D_Name as {0},", - "l.GeometrySurface as {1},", - "mpl.X as {2},", - "null as {3},", - "null as {4},", - "sum(case when mat.PN_Name = 'AbovePhreaticLevel' then mat.PV_Value end) {5},", - "sum(case when mat.PN_Name = 'BelowPhreaticLevel' then mat.PV_Value end) {6},", - "sum(case when mat.PN_Name = 'PermeabKx' then mat.PV_Value end) {7},", - "sum(case when mat.PN_Name = 'DiameterD70' then mat.PV_Value end) {8},", - "sum(case when mat.PN_Name = 'WhitesConstant' then mat.PV_Value end) {9},", - "sum(case when mat.PN_Name = 'BeddingAngle' then mat.PV_Value end) {10},", - "2 as {11}", - "FROM MechanismPointLocation as m", - "JOIN MechanismPointLocation as mpl ON p.SP2D_ID = mpl.SP2D_ID", - "JOIN SoilProfile2D as p ON m.SP2D_ID = p.SP2D_ID", - "JOIN SoilLayer2D as l ON l.SP2D_ID = p.SP2D_ID", - "JOIN (", - "SELECT m.MA_ID, pn.PN_Name, pv.PV_Value", - "FROM ParameterNames as pn", - "JOIN ParameterValues as pv ON pn.PN_ID = pv.PN_ID", - "JOIN Materials as m ON m.MA_ID = pv.MA_ID) as mat ON l.MA_ID = mat.MA_ID", - "WHERE m.ME_ID = @{12}", - "GROUP BY l.SL2D_ID", - "UNION", - "SELECT", - "p.SP1D_Name as {0},", - "null as {1},", - "null as {2},", - "p.BottomLevel as {3},", - "l.TopLevel as {4},", - "sum(case when mat.PN_Name = 'AbovePhreaticLevel' then mat.PV_Value end) {5},", - "sum(case when mat.PN_Name = 'BelowPhreaticLevel' then mat.PV_Value end) {6},", - "sum(case when mat.PN_Name = 'PermeabKx' then mat.PV_Value end) {7},", - "sum(case when mat.PN_Name = 'DiameterD70' then mat.PV_Value end) {8},", - "sum(case when mat.PN_Name = 'WhitesConstant' then mat.PV_Value end) {9},", - "sum(case when mat.PN_Name = 'BeddingAngle' then mat.PV_Value end) {10},", - "1 as {11}", - "FROM SoilProfile1D as p", - "JOIN SoilLayer1D as l ON l.SP1D_ID = p.SP1D_ID", - "JOIN (", - "SELECT m.MA_ID, pn.PN_Name, pv.PV_Value", - "FROM ParameterNames as pn", - "JOIN ParameterValues as pv ON pn.PN_ID = pv.PN_ID", - "JOIN Materials as m ON m.MA_ID = pv.MA_ID) as mat ON l.MA_ID = mat.MA_ID", - "GROUP BY l.SL1D_ID", - "ORDER BY ProfileName" - ), - profileNameColumn, - layerGeometryColumn, - intersectionXColumn, - bottomColumn, - topColumn, - abovePhreaticLevelColumn, - belowPhreaticLevelColumn, - permeabKxColumn, - diameterD70Column, - whitesConstantColumn, - beddingAngleColumn, - dimensionsColumn, - mechanismParameterName) + CommandText = queryString }) { - query.Parameters.Add(new SQLiteParameter - { - DbType = DbType.Int32, - Value = pipingMechanismId, - ParameterName = mechanismParameterName - }); + query.Parameters.AddRange(parameters); try { - dataReader = query.ExecuteReader(); + return query.ExecuteReader(); } catch (SQLiteException e) { Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.Designer.cs =================================================================== diff -u -r30c4782361bd6f897f02df74461a73b60bc4a085 -r3ab625a7c585b86be669fef127b79d73c0de1d7e --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 30c4782361bd6f897f02df74461a73b60bc4a085) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 3ab625a7c585b86be669fef127b79d73c0de1d7e) @@ -196,6 +196,15 @@ } /// + /// Looks up a localized string similar to Ondergrondprofiel in database bevat geen geldige waarde in kolom {0}.. + /// + public static string PipingSoilProfileReader_InvalidValueOnColumn { + get { + return ResourceManager.GetString("PipingSoilProfileReader_InvalidValueOnColumn", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Het bestand op '{0}' is niet geschikt om dwarsdoorsneden uit te lezen (Verwachte header: locationid;X1;Y1;Z1).. /// public static string PipingSurfaceLinesCsvReader_File_0_invalid_header { Index: src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.resx =================================================================== diff -u -r30c4782361bd6f897f02df74461a73b60bc4a085 -r3ab625a7c585b86be669fef127b79d73c0de1d7e --- src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.resx (.../Resources.resx) (revision 30c4782361bd6f897f02df74461a73b60bc4a085) +++ src/Plugins/Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.resx (.../Resources.resx) (revision 3ab625a7c585b86be669fef127b79d73c0de1d7e) @@ -174,4 +174,7 @@ Kan geen 2D en 1D lagen combineren in een profiel. + + Ondergrondprofiel in database bevat geen geldige waarde in kolom {0}. + \ No newline at end of file Index: src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSoilProfileReaderTest.cs =================================================================== diff -u -rd0e0e368f3f1b297abe0e073a2c313fd38c77c16 -r3ab625a7c585b86be669fef127b79d73c0de1d7e --- src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSoilProfileReaderTest.cs (.../PipingSoilProfileReaderTest.cs) (revision d0e0e368f3f1b297abe0e073a2c313fd38c77c16) +++ src/Plugins/Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSoilProfileReaderTest.cs (.../PipingSoilProfileReaderTest.cs) (revision 3ab625a7c585b86be669fef127b79d73c0de1d7e) @@ -51,6 +51,10 @@ // 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."); + var pipingSoilProfilesReader = new PipingSoilProfileReader(dbFile); pipingSoilProfilesReader.Read(); @@ -78,7 +82,7 @@ [Test] [TestCase(null)] [TestCase("")] - public void ReadSoilProfiles_NullOrEmpty_ThrowsArgumentException(string fileName) + public void Read_NullOrEmpty_ThrowsArgumentException(string fileName) { // Call TestDelegate test = () => new PipingSoilProfileReader(fileName); @@ -89,7 +93,7 @@ } [Test] - public void ReadSoilProfiles_IncorrectFormatFile_ThrowsSqLiteException() + public void Read_IncorrectFormatFile_ThrowsSqLiteException() { // Setup var dbName = "text"; @@ -107,10 +111,10 @@ } [Test] - public void ReadProfiles_DatabaseWith1DAnd2DProfilesWithSameName_ThrowsPipingSoilProfileReadException() + public void Read_DatabaseWith1DAnd2DProfilesWithSameName_ThrowsPipingSoilProfileReadException() { // Setup - var testFile = "Combined1dAnd2d.soil"; + var testFile = "combined1d2d.soil"; using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile))) { // Call @@ -123,17 +127,34 @@ } [Test] + public void Read_DatabaseWithNullValueForBottom_ThrowsPipingSoilProfileReadException() + { + // Setup + var testFile = "invalidbottom.soil"; + using (var pipingSoilProfilesReader = new PipingSoilProfileReader(Path.Combine(testDataPath, testFile))) + { + // Call + TestDelegate test = () => pipingSoilProfilesReader.Read(); + + // Assert + var exception = Assert.Throws(test); + var message = String.Format(Resources.PipingSoilProfileReader_InvalidValueOnColumn, "Bottom"); + Assert.AreEqual(message, exception.Message); + } + } + + [Test] [SetCulture("nl-NL")] - public void ReadProfiles_NLDatabaseWith1DProfile_ReturnsCompleteSoilProfile() + public void Read_NLDatabaseWith1DProfile_ReturnsCompleteSoilProfile() { - ReadProfiles_DatabaseWith1DProfile_ReturnsCompleteSoilProfile(); + Read_DatabaseWith1DProfile_ReturnsCompleteSoilProfile(); } [Test] [SetCulture("en-US")] - public void ReadProfiles_ENDatabaseWith1DProfile_ReturnsCompleteSoilProfile() + public void Read_ENDatabaseWith1DProfile_ReturnsCompleteSoilProfile() { - ReadProfiles_DatabaseWith1DProfile_ReturnsCompleteSoilProfile(); + Read_DatabaseWith1DProfile_ReturnsCompleteSoilProfile(); } [Test] @@ -150,7 +171,7 @@ ReadSoilProfiles_CompleteDatabase_Returns2ProfilesWithLayersAndGeometries(); } - public void ReadProfiles_DatabaseWith1DProfile_ReturnsCompleteSoilProfile() + public void Read_DatabaseWith1DProfile_ReturnsCompleteSoilProfile() { // Setup var testFile = "1dprofile.soil"; @@ -161,12 +182,12 @@ // Assert Assert.AreEqual(1, result.Length); - Assert.AreEqual(-12, result[0].Bottom); - CollectionAssert.AreEquivalent(new[] + Assert.AreEqual(-2.1, result[0].Bottom); + CollectionAssert.AreEqual(new[] { - 60, - 0.63, - -7.0 + 3.3, + 2.2, + 1.1 }, result[0].Layers.Select(l => l.Top)); } } @@ -181,165 +202,104 @@ PipingSoilProfile[] result = pipingSoilProfilesReader.Read().ToArray(); // Assert - Assert.AreEqual(36, result.Length); + Assert.AreEqual(26, result.Length); CollectionAssert.AreEquivalent(new[] { - "10Y_005_STBI_p", - "10Y_024_STBI_p", - "10Y_041_STBI_p", - "10Y_042_STBI_p", - "10Y_043_STBI_p", - "10Y_054_STBI_p", - "10Y_066_STBI_p", - "10Y_090_STBI_p", - "10Y_102_STBI_p", - "10Y_117_STBI_p", - "10Y_130_STBI_p", - "10Y_149_STBI_p", - "10Z_157_STBI_p", - "10Z_165_STBI_p", - "10Z_181_STBI_p", - "10Z_186_STBI_p", - "10Z_199_STBI_p", - "10Z_228_STBI_p", - "10Z_258_STBI_p", - "10Z_275_STBI_p", - "10Z_282_STBI_p", - "10Z_286_STBI_p", - "10Z_311_STBI_p", - "10Z_327_STBI_p", - "10Z_352_STBI_p", - "10Z_358_STBI_p", - "10Z_369_STBI_p", - "10Z_380_STBI_p", - "10Z_390_STBI_p", - "10Z_400_STBI_p", - "10Z_421_STBI_p", - "10Z_432_STBI_p", - "10Z_460_STBI_p", - "10Y_091_STBI_p", - "10Y_005_STBI", - "10Y_041_STBI" + "AD640M00_Segment_36005_1D1", + "AD640M00_Segment_36005_1D2", + "Segment_36005_1D1", + "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_36005_1D10", + "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.AreEquivalent(new[] { - -10, - -12.0, - -10.8, - -10, - -21.5, - -21.5, - -21.5, - -22.0, - -24.0, - -21.5, - -21.5, - -22.0, - -24.17, - -24.8, - -25.0, - -24.0, - -22.8, - -23.8, - -24.2, - -24.5, - -24.0, - -23.7, - -24.4, - -24.0, - -31.5, - -23.2, - -23.9, - -23.1, - -23.5, - -23.125, - -22.5, - -21.88, - -22.0, - 40.0, - 40.0, - 40.0 + -39.999943172545208, + -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.AreEquivalent(new[] { - 6, - 3, - 2, - 3, - 2, - 2, - 2, - 2, - 3, - 2, - 2, - 2, - 2, - 3, - 3, - 3, - 2, - 2, - 2, - 2, - 3, - 2, - 3, - 3, - 2, - 2, - 3, - 2, - 2, - 2, - 2, - 2, - 3, - 1, - 1, - 1 + 8,8,8,6,6,5,5,6,4,4,3,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 == "10Y_005_STBI"); + var firstProfile = result.FirstOrDefault(l => l.Name == "AD640M00_Segment_36005_1D1"); Assert.NotNull(firstProfile); var expectedFirstProfileLayersTops = new[] { - -3.5, - -1.2, - 0.63, - 1.088434916, - 1.947578092, - 2.473341176 + 3.12499857931363, + 2.3749957379408912, + 1.1874992896568151, + 0.12499005519541202, + -5.1250298344137661, + -14.000011365490959, + -19.000022730981915, + -30.000056827454785, }; CollectionAssert.AllItemsAreUnique(firstProfile.Layers.Select(l => l.Top)); - Assert.AreEqual(6, firstProfile.Layers.Count(l => expectedFirstProfileLayersTops.Contains(l.Top, new DoubleComparer()))); + CollectionAssert.AreEqual(expectedFirstProfileLayersTops, firstProfile.Layers.Select(l => l.Top)); - var secondProfile = result.FirstOrDefault(l => l.Name == "10Y_041_STBI"); + var secondProfile = result.FirstOrDefault(l => l.Name == "AD640M00_Segment_36005_1D2"); Assert.NotNull(secondProfile); var expectedSecondProfileLayersTops = new[] { - -1.5, - -1.180438596, - 0.333203067 + 5.9075002357930053, + 4.3475186908270276, + 3.25, + -0.5, + -0.75, + -13, + -17, + -25, }; CollectionAssert.AllItemsAreUnique(secondProfile.Layers.Select(l => l.Top)); - Assert.AreEqual(3, secondProfile.Layers.Count(l => expectedSecondProfileLayersTops.Contains(l.Top, new DoubleComparer()))); + CollectionAssert.AreEqual(expectedSecondProfileLayersTops, secondProfile.Layers.Select(l => l.Top)); } } } - - internal class DoubleComparer : IEqualityComparer - { - public bool Equals(double x, double y) - { - return Math.Abs(x - y) < Math2D.EpsilonForComparisons; - } - - public int GetHashCode(double obj) - { - return obj.GetHashCode(); - } - } } \ No newline at end of file Index: test-data/Plugins/Wti/IO/PipingSoilProfilesReader/1dprofile.soil =================================================================== diff -u -r92ea66818567a23223b31d658ef8db3349f9e8f0 -r3ab625a7c585b86be669fef127b79d73c0de1d7e Binary files differ Index: test-data/Plugins/Wti/IO/PipingSoilProfilesReader/Combined1dAnd2d.soil =================================================================== diff -u -r1d5aa9555ab25c06f0a322173953a79c6ead1404 -r3ab625a7c585b86be669fef127b79d73c0de1d7e Binary files differ Index: test-data/Plugins/Wti/IO/PipingSoilProfilesReader/combined1d2d.soil =================================================================== diff -u Binary files differ Index: test-data/Plugins/Wti/IO/PipingSoilProfilesReader/complete.soil =================================================================== diff -u -re5c186677d0ef8697eb04ea571b7c4ef8268183c -r3ab625a7c585b86be669fef127b79d73c0de1d7e Binary files differ Index: test-data/Plugins/Wti/IO/PipingSoilProfilesReader/emptyschema.soil =================================================================== diff -u Binary files differ Index: test-data/Plugins/Wti/IO/PipingSoilProfilesReader/invalidbottom.soil =================================================================== diff -u Binary files differ