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);
}
}
}