using System.IO; using System.Linq; using System.Text; using Deltares.Geometry; using Deltares.Geotechnics.IO.Importers; using Deltares.Standard.Language; using Deltares.Standard.Logging; using NUnit.Framework; namespace Deltares.Geotechnics.IO.Tests { [TestFixture] public class SurfaceLinesImporterTest { private string testDataFolder; private const string surfaceLinesFilename = "surfacelines.csv"; private const double tolerance = 0.0000001; [TestFixtureSetUp] public void TestFixtureSetUp() { testDataFolder = Path.Combine(@"..\..\..\data", "Geotechnics", "CSVImportTest"); } /// /// Test that the soil profiles importer returns a warning message if the file is empty. /// [Test] public void EmptySurfacelineFileResultsInWarningMessage() { // empty file (header only) var testFile = Path.Combine("TestFiles","empty_surfacelines.csv"); File.WriteAllText(testFile, @"LocationID;Geologischprofiel;X_GridPoint;Y_GridPoint;ScenarioClusterID;X1;Y1;Z1;.....;Xn;Yn;Zn;(Profiel)", Encoding.ASCII); // setup importer, not using factory var importer = new SurfaceLinesImporter(); // error messages are returned as list of strings, which are to be logged etc. by the application Assert.AreEqual(0, importer.ErrorMessages.Count); var segments = importer.ReadSurfacesLines(testFile); Assert.Greater(importer.ErrorMessages.Count, 0); Assert.NotNull(importer.ErrorMessages.FirstOrDefault(m => m.Message.Contains( LocalizationManager.GetTranslatedText(typeof(SoilSegmentsImporter), "SurfacelineCsvFileEmptyWarning").Replace("{0}", "")))); File.Delete(testFile); } /// /// Check if Import() returns correct surface lines. /// The values that are checked in this test were looked up in the testfile "surfacelines.csv" /// [Test] [Combinatorial] public void ImportReturnsCorrectSurfaceLinesMode( [Values(surfaceLinesFilename, "surfacelinesDAM.csv")] string fileName, [Values(true, true)] bool geometryMustContainPoint) { var surfaceLinesImporter = new SurfaceLinesImporter(); var surfaceLines = surfaceLinesImporter.ReadSurfacesLines(Path.Combine(testDataFolder, fileName)); Assert.AreEqual(32, surfaceLines.Count, "Read incorrect number of surface lines"); var surfaceLine = surfaceLines.FirstOrDefault(x => x.Name.Equals("dijkring10_dwp36_9")); Assert.IsNotNull(surfaceLine); Assert.AreEqual(geometryMustContainPoint, surfaceLine.CharacteristicPoints.GeometryMustContainPoint); Assert.AreSame(surfaceLine.Geometry, surfaceLine.CharacteristicPoints.Geometry); Assert.AreEqual(0.0, surfaceLine.Geometry.Points[0].X, tolerance); Assert.AreEqual(1.06, surfaceLine.Geometry.Points[0].Z, tolerance); Assert.AreEqual(100.0, surfaceLine.Geometry.Points[30].X, tolerance); Assert.AreEqual(-0.61, surfaceLine.Geometry.Points[30].Z, tolerance); } /// /// Check if Import() returns correct surface lines. /// The values that are checked in this test were looked up in the testfile "surfacelines.csv" /// [Test] [TestCase(surfaceLinesFilename)] // Ringtoets format [TestCase("surfacelinesDAM.csv")] // Dam format public void ReadSurfacesLines2ReturnsCorrectSurfaceLines(string fileName) { var surfaceLinesImporter = new SurfaceLinesImporter(); var surfacelines = surfaceLinesImporter.ReadSurfacesLines(Path.Combine(testDataFolder, fileName)); Assert.AreEqual(32, surfacelines.Count, "Read incorrect number of surface lines"); var surfaceLineGeometry = surfacelines.FirstOrDefault(x => x.Name.Equals("dijkring10_dwp36_9")); Assert.IsNotNull(surfaceLineGeometry); Assert.AreEqual(0.0, surfaceLineGeometry.Geometry.Points[0].X, tolerance); Assert.AreEqual(1.06, surfaceLineGeometry.Geometry.Points[0].Z, tolerance); Assert.AreEqual(100.0, surfaceLineGeometry.Geometry.Points[30].X, tolerance); Assert.AreEqual(-0.61, surfaceLineGeometry.Geometry.Points[30].Z, tolerance); } [Test] public void ReadSurfacesLines_CoordinatesNotInLineNonDecreasingLocalX_StillImported() { var surfaceLinesImporter = new SurfaceLinesImporter(); var surfacelines = surfaceLinesImporter.ReadSurfacesLines(Path.Combine(testDataFolder, "TheGoodAndTheUgly_surfaceline.csv")); Assert.AreEqual(0, surfaceLinesImporter.ErrorMessages.Count(m => m.MessageType == LogMessageType.Error)); Assert.AreEqual(2, surfacelines.Count , "All (2) surface lines should be imported."); CollectionAssert.AreEquivalent(new[] { "TheGoodOne", "TheUglyOne" }, surfacelines.Select(sl => sl.Name).ToArray()); } [Test] public void ReadSurfacesLines_CoordinatesDecreasingLocalX_SkipAndError() { var surfaceLinesImporter = new SurfaceLinesImporter(); var surfacelines = surfaceLinesImporter.ReadSurfacesLines(Path.Combine(testDataFolder, "TheGoodAndTheBad_surfaceline.csv")); Assert.AreEqual(1, surfaceLinesImporter.ErrorMessages.Count(m => m.MessageType == LogMessageType.Error)); Assert.AreEqual(1, surfacelines.Count, "Not all surface lines should be imported."); Assert.IsNotNull(surfacelines.FirstOrDefault(sl => sl.Name == "TheGoodOne")); Assert.IsNull(surfacelines.FirstOrDefault(sl => sl.Name == "TheBadOne")); } [Test] public void SurfaceLine_Imp0rt_CheckIfCoordinateConverterHasBeenInitialized() { var surfaceLinesImporter = new SurfaceLinesImporter(); var surfacelines = surfaceLinesImporter.ReadSurfacesLines(Path.Combine(testDataFolder, "TheGoodAndTheBad_surfaceline.csv")); var surfaceLine = surfacelines.FirstOrDefault(sl => sl.Name == "TheGoodOne"); Assert.IsNotNull(surfaceLine, "Pre condition of test fails"); Assert.Greater(surfaceLine.Geometry.Points.Count,0,"Pre condition of test fails"); //global coordinates of the good one //x=100, y=100 //x=101, y=101 //x=102, y=102 //etc. var localizedPoint = surfaceLine.Geometry.GetLocalPoint(new GeometryPoint(110, 110, 5)); Assert.IsNotNull(localizedPoint, "CoordinateSystemConverter of LocalizedGeometryPointString is not initialised"); Assert.AreEqual(14, localizedPoint.X, 0.5); } } }