Index: DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvReaderUtilities.cs =================================================================== diff -u -r3140 -r3148 --- DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvReaderUtilities.cs (.../CsvReaderUtilities.cs) (revision 3140) +++ DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvReaderUtilities.cs (.../CsvReaderUtilities.cs) (revision 3148) @@ -25,7 +25,7 @@ using System.IO; using System.Linq; -namespace Deltares.LayerOnSlopeTool.Data.CsvImporters +namespace Deltares.LayerOnSlopeTool.Importer { /// /// Holds the utility functions for reading csv files. Index: DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterLocations.cs =================================================================== diff -u -r3140 -r3148 --- DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterLocations.cs (.../CsvImporterLocations.cs) (revision 3140) +++ DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterLocations.cs (.../CsvImporterLocations.cs) (revision 3148) @@ -24,9 +24,10 @@ using System.IO; using System.Linq; using System.Threading; +using Deltares.LayerOnSlopeTool.Data.CsvImporters; using LumenWorks.Framework.IO.Csv; -namespace Deltares.LayerOnSlopeTool.Data.CsvImporters +namespace Deltares.LayerOnSlopeTool.Importer { /// /// Holds the importer for the locations from csv files @@ -144,12 +145,18 @@ } int colIndexLocationId = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.LocationColumnName); + CheckColumn(colIndexLocationId, fileName, CsvColumnNames.LocationColumnName); int colIndexSurfaceLineId = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SurfaceLineColumnName); + CheckColumn(colIndexSurfaceLineId, fileName, CsvColumnNames.SurfaceLineColumnName); int colIndexXSoilGeometry2DOrigin = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.XSoilGeometry2DOriginColumnName); int colIndexDikeEmbankmentMaterial = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.DikeEmbankmentMaterialColumnName); + CheckColumn(colIndexDikeEmbankmentMaterial, fileName, CsvColumnNames.DikeEmbankmentMaterialColumnName); int colSoilGeometryName = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SoilGeometryNameColumnName); + CheckColumn(colSoilGeometryName, fileName, CsvColumnNames.SoilGeometryNameColumnName); int colLayerMaterial = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.LayerMaterialColumnName); + CheckColumn(colLayerMaterial, fileName, CsvColumnNames.LayerMaterialColumnName); int colLayerThickness = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.LayerThicknessColumnName); + CheckColumn(colLayerThickness, fileName, CsvColumnNames.LayerThicknessColumnName); var index = 1; while (csv.ReadNextRecord()) @@ -159,7 +166,7 @@ try { locationRecord.LocationRecordId = index++; - + /* * Required columns */ @@ -216,5 +223,14 @@ { get { return errorMessages; } } + + private void CheckColumn(int index, string fileName, string fieldName) + { + if (index < 0) + { + var csvHeaderFieldError = "The header misses the field: "; + throw new ArgumentException(string.Format("{0} : {1} {2}", fileName, csvHeaderFieldError, fieldName)); + } + } } } Index: DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterCharacteristicPoints.cs =================================================================== diff -u -r3140 -r3148 --- DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterCharacteristicPoints.cs (.../CsvImporterCharacteristicPoints.cs) (revision 3140) +++ DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterCharacteristicPoints.cs (.../CsvImporterCharacteristicPoints.cs) (revision 3148) @@ -24,9 +24,11 @@ using System.IO; using System.Linq; using System.Threading; +using Deltares.LayerOnSlopeTool.Data; +using Deltares.LayerOnSlopeTool.Data.CsvImporters; using LumenWorks.Framework.IO.Csv; -namespace Deltares.LayerOnSlopeTool.Data.CsvImporters +namespace Deltares.LayerOnSlopeTool.Importer { /// /// Holds the importer for the characteristic points from csv files Index: DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterHelper.cs =================================================================== diff -u -r3140 -r3148 --- DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterHelper.cs (.../CsvImporterHelper.cs) (revision 3140) +++ DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterHelper.cs (.../CsvImporterHelper.cs) (revision 3148) @@ -22,7 +22,7 @@ using System; using LumenWorks.Framework.IO.Csv; -namespace Deltares.LayerOnSlopeTool.Data.CsvImporters +namespace Deltares.LayerOnSlopeTool.Importer { /// /// Holds the helper functions for reading csv files. Index: DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.ImporterTests/CsvImportersTests.cs =================================================================== diff -u -r3140 -r3148 --- DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.ImporterTests/CsvImportersTests.cs (.../CsvImportersTests.cs) (revision 3140) +++ DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.ImporterTests/CsvImportersTests.cs (.../CsvImportersTests.cs) (revision 3148) @@ -22,13 +22,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Deltares.LayerOnSlopeTool.Data.CsvImporters; +using Deltares.LayerOnSlopeTool.Importer; using NUnit.Framework; -namespace Deltares.LayerOnSlopeTool.Io.Tests +namespace Deltares.LayerOnSlopeTool.ImporterTests { [TestFixture] public class CsvImportersTests @@ -80,6 +77,209 @@ CheckCharacteristicPoints(characteristicPointsRecords); } + [Test] + [ExpectedException(typeof(ArgumentException))] + public void CharacteristicPointsImporterIllegalHeaderTest() + { + const string importFile = "characteristicpoints.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateCharacteristicPointsFileWithIllegalHeader(testFilePath); + CsvImporterCharacteristicPoints csvImporterCharacteristicPoints = new CsvImporterCharacteristicPoints(testFilePath); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void CharacteristicPointsImporterTooFewItemsHeaderTest() + { + const string importFile = "characteristicpoints.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateCharacteristicPointsFileWithTooFewItems(testFilePath); + CsvImporterCharacteristicPoints csvImporterCharacteristicPoints = new CsvImporterCharacteristicPoints(testFilePath); + } + + + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "The file name for the Characteristic Points csv is empty.")] + public void CharacteristicPointsImporterEmptyFileNameTest() + { + const string importFile = ""; + CsvImporterCharacteristicPoints csvImporterCharacteristicPoints = new CsvImporterCharacteristicPoints(importFile); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "The Characteristic Points csv file with name BlablaBla could not be found.")] + public void CharacteristicPointsImporterNotExistingFileNameTest() + { + const string importFile = "BlablaBla"; + CsvImporterCharacteristicPoints csvImporterCharacteristicPoints = new CsvImporterCharacteristicPoints(importFile); + } + + [Test] + public void SurfaceLinesImporterCorrectFileTest() + { + const string importFile = "surfacelines.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateSurfaceLinesFile(testFilePath); + CsvImporterSurfaceLines csvImporterSurfaceLines = new CsvImporterSurfaceLines(testFilePath); + IList surfaceLineRecords = csvImporterSurfaceLines.ImportedItems; + + CheckSurfaceLine(surfaceLineRecords); + } + + [Test] + public void SurfaceLinesWithLocationIdImporterCorrectFileTest() + { + const string importFile = "surfacelines.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateSurfaceLinesFileWithLocationId(testFilePath); + CsvImporterSurfaceLines csvImporterSurfaceLines = new CsvImporterSurfaceLines(testFilePath); + IList surfaceLineRecords = csvImporterSurfaceLines.ImportedItems; + + CheckSurfaceLine(surfaceLineRecords); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "The file name for the Surface Lines csv is empty.")] + public void SurfaceLinesImporterEmptyFileNameTest() + { + const string importFile = ""; + CsvImporterSurfaceLines csvImporterSurfaceLines = new CsvImporterSurfaceLines(importFile); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "The Surface Lines csv file with name BlablaBla could not be found.")] + public void SurfaceLinesImporterNotExistingFileNameTest() + { + const string importFile = "BlablaBla"; + CsvImporterSurfaceLines csvImporterSurfaceLines = new CsvImporterSurfaceLines(importFile); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SurfaceLinesImporterIllegalHeaderTest() + { + const string importFile = "surfacelines.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateSurfaceLinesFileWithIllegalHeaders(testFilePath); + CsvImporterSurfaceLines csvImporterSurfaceLines = new CsvImporterSurfaceLines(testFilePath); + } + + [Test] + public void SurfaceLinesImporterIllegalValuesTest() + { + const string importFile = "surfacelines.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateSurfaceLinesFileWithIllegalValues(testFilePath); + CsvImporterSurfaceLines csvImporterSurfaceLines = new CsvImporterSurfaceLines(testFilePath); + Assert.AreEqual(1, csvImporterSurfaceLines.ErrorMessages.Count); + } + + [Test] + public void LocationsImporterCorrectFileTest() + { + const double tolerance = 0.001; + const string importFile = "locations.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateValidLocationsFile(testFilePath); + CsvImporterLocations csvImporterLocations = new CsvImporterLocations(testFilePath); + IList locationRecords = csvImporterLocations.ImportedItems; + Assert.AreEqual(2, locationRecords.Count); + Assert.AreEqual("25-2-2-A-1-A", locationRecords[1].LocationId); + Assert.AreEqual("25-2-2-A-1-A", locationRecords[1].SurfaceLineId); + Assert.AreEqual("Secondstifile.sti", locationRecords[1].SoilGeometryName); + Assert.AreEqual(1.1, locationRecords[1].XSoilGeometry2DOrigin, tolerance); + Assert.AreEqual(0.8, locationRecords[1].LayerThickness, tolerance); + Assert.AreEqual("zand", locationRecords[1].LayerMaterial); + Assert.AreEqual("klei2", locationRecords[1].DikeEmbankmentMaterial); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "The file name for the Locations csv is empty.")] + public void LocationsImporterEmptyFileNameTest() + { + const string importFile = ""; + CsvImporterLocations csvImporterLocations = new CsvImporterLocations(importFile); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "The Locations csv file with name BlablaBla could not be found.")] + public void LocationsImporterNotExistingFileNameTest() + { + const string importFile = "BlablaBla"; + CsvImporterLocations csvImporterLocations = new CsvImporterLocations(importFile); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void LocationsImporterFileWithMissingRequiredColumn() + { + const string importFile = "locations.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateLocationsFileWithMissingRequiredColumn(testFilePath); + CsvImporterLocations csvImporterLocations = new CsvImporterLocations(testFilePath); + } + + [Test] + public void LocationsImporterIllegalValuesTest() + { + const string importFile = "locations.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + File.Delete(testFilePath); + CreateLocationsFileWithIllegalValues(testFilePath); + CsvImporterLocations csvImporterLocations = new CsvImporterLocations(testFilePath); + Assert.AreEqual(2, csvImporterLocations.ErrorMessages.Count); + } + + private static void CheckSurfaceLine(IList surfaceLineRecords) + { + Assert.AreEqual("D1", surfaceLineRecords[0].SurfaceLineId); + Assert.AreEqual(0.0, surfaceLineRecords[0].Xcoors[0]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[0]); + Assert.AreEqual(0.680, surfaceLineRecords[0].Zcoors[0]); + + Assert.AreEqual(21.110, surfaceLineRecords[0].Xcoors[1]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[1]); + Assert.AreEqual(1.120, surfaceLineRecords[0].Zcoors[1]); + + Assert.AreEqual(31.600, surfaceLineRecords[0].Xcoors[2]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[2]); + Assert.AreEqual(1.300, surfaceLineRecords[0].Zcoors[2]); + + Assert.AreEqual(52.630, surfaceLineRecords[0].Xcoors[10]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[10]); + Assert.AreEqual(4.770, surfaceLineRecords[0].Zcoors[10]); + + Assert.AreEqual(72.370, surfaceLineRecords[0].Xcoors[22]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[22]); + Assert.AreEqual(-1.060, surfaceLineRecords[0].Zcoors[22]); + + Assert.AreEqual(86.660, surfaceLineRecords[0].Xcoors[30]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[30]); + Assert.AreEqual(0.270, surfaceLineRecords[0].Zcoors[30]); + + Assert.AreEqual(117.940, surfaceLineRecords[0].Xcoors[32]); + Assert.AreEqual(0.0, surfaceLineRecords[0].Ycoors[32]); + Assert.AreEqual(0.120, surfaceLineRecords[0].Zcoors[32]); + } + private static void CreateCharacteristicPointsFile(string filePath) { using (var writer = File.CreateText(filePath)) @@ -183,6 +383,14 @@ } } + private static void CreateCharacteristicPointsFileWithTooFewItems(string filePath) + { + using (var writer = File.CreateText(filePath)) + { + writer.WriteLine("Profielnaam;X_Maaiveld binnenwaarts;Z_Maaiveld binnenwaarts;X_Insteek sloot polderzijde;"); + writer.WriteLine("D1;117.94;0;0.12;"); + } + } private static void CreateSurfaceLinesFile(string filePath) { using (var writer = File.CreateText(filePath)) @@ -235,7 +443,7 @@ } } - private static void CreateLocationsFileWithObsoleteColumn(string filePath) + private static void CreateLocationsFileWithMissingRequiredColumn(string filePath) { using (var writer = File.CreateText(filePath)) { @@ -247,5 +455,31 @@ "25-2-2-A-1-A;25-2-2-A-1-A;106;66586;424173;2;25-2-2-A-1-A;-0.25;-0.25;0.8727;-0.25;-0.25;1;1;klei;klei2;1;2;3;12;FALSE;1.3;10;1.5;30;40;ExpertKnowledgeRRD;1;2;Uniform;0.1;1.2;1.3;1.4;0.01;0.02;0.03;1.1;1.2;klei;1.0;1.1;1.2;2.0;2.1;0.5;0.6;0.1;0.2;0.6;1.6;0.2;0.3;2.0;0.2;0.5;0.9;3.5;0.2;SlopeAdaptionBeforeShoulderAdaption;4.5;6.5;0.25;FALSE;0.8;FALSE;0.9;FALSE;1.9;FALSE;1.8;FALSE;1.7;FALSE;0.7;FALSE;1.6;FALSE;1.4;1.5;1.6;ForbiddenZone;0.9;2.1; 1.1;0.11;FALSE; 1.0;TRUE;0.1;SemiTimeDependent;55.5;2.2;2.3;2.4;2.5"); } } + + private static void CreateValidLocationsFile(string filePath) + { + using (var writer = File.CreateText(filePath)) + { + writer.WriteLine( + "location_id;surfaceline_id;soilgeometry2D_name;x_soilgeometry2D_origin;slope_layer_thickness;slope_layer_material;Ophoogmateriaaldijk;"); + writer.WriteLine( + "16-1-1-C-3-Z;16-1-1-C-3-Z;Firststifile.sti;0.9;1.2;klei;klei2;"); + writer.WriteLine( + "25-2-2-A-1-A;25-2-2-A-1-A;Secondstifile.sti;1.1;0.8;zand;klei2;"); + } + } + + private static void CreateLocationsFileWithIllegalValues(string filePath) + { + using (var writer = File.CreateText(filePath)) + { + writer.WriteLine( + "location_id;surfaceline_id;soilgeometry2D_name;x_soilgeometry2D_origin;slope_layer_thickness;slope_layer_material;Ophoogmateriaaldijk;polderlevel;polderlevellow;head_pl2;head_pl3;head_pl4;"); + writer.WriteLine( + "16-1-1-C-3-Z;16-1-1-C-3-Z;Firststifile.sti;0.ssw9;1.2;klei;klei2;-0.6;-0.9,2.1;2.2;2.5;"); + writer.WriteLine( + "25-2-2-A-1-A;25-2-2-A-1-A;Secondstifile.sti;1.1;0qwerty.8;zand;klei2;"); + } + } } } Index: DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterSurfaceLines.cs =================================================================== diff -u -r3140 -r3148 --- DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterSurfaceLines.cs (.../CsvImporterSurfaceLines.cs) (revision 3140) +++ DamTools/LayerOnSlopeTool/trunk/src/Deltares.LayerOnSlopeTool.Importer/CsvImporterSurfaceLines.cs (.../CsvImporterSurfaceLines.cs) (revision 3148) @@ -26,7 +26,7 @@ using System.Threading; using LumenWorks.Framework.IO.Csv; -namespace Deltares.LayerOnSlopeTool.Data.CsvImporters +namespace Deltares.LayerOnSlopeTool.Importer { /// /// Holds the importer for the surface lines from csv files @@ -102,7 +102,7 @@ if (!File.Exists(filename)) { - throw new ArgumentException(string.Format("The Surface Lines csv file with name {0} could not be found..", filename)); + throw new ArgumentException(string.Format("The Surface Lines csv file with name {0} could not be found.", filename)); } // This is a 'dynamic' csv file, i.e. the number of columns is not known and can vary per row. So make sure of a