// Copyright (C) Stichting Deltares 2018. All rights reserved.
//
// This file is part of the application DAM - UI.
//
// DAM - UI is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using Deltares.Geotechnics.SurfaceLines;
using Deltares.Standard.Logging;
namespace Deltares.Dam.Tests
{
using System.Linq;
using Data;
using NUnit.Framework;
using System.IO;
[TestFixture]
public class CsvImporterTest
{
private string dataFolder;
private string importFolder;
///
/// Setup for whole testfixture
///
[TestFixtureSetUp]
public void FixtureSetup()
{
dataFolder = Path.Combine(Directory.GetCurrentDirectory(), @"TestData\");
importFolder = Path.Combine(Directory.GetCurrentDirectory(), "TmpImportFiles");
Directory.CreateDirectory(importFolder);
}
///
/// Setup for single test
///
[SetUp]
public void Setup()
{
if (Directory.Exists(importFolder))
Directory.Delete(importFolder, true);
Directory.CreateDirectory(importFolder);
File.Copy(Path.Combine(dataFolder, @"HoekscheWaardCsv\soilmaterials.mdb"), Path.Combine(importFolder, "soilmaterials.mdb"));
CreateCharacteristicPointsFile();
CreateLocationsFile();
CreateSegmentsFor1DProfilesFile();
CreateSurfaceLinesFiles();
CreateSoilProfilesFile();
CreateScenarios();
}
///
/// Create csv file with 1D soilprofiles
///
private void CreateSoilProfilesFile()
{
using (var writer = File.CreateText(importFolder + "\\soilprofiles.csv"))
{
writer.WriteLine("soilprofile_id;top_level;soil_name;soiltype");
writer.WriteLine("1DP1;10;HW-OBO;zand");
writer.WriteLine("1DP1;-0.6;HW-DUN;veen");
writer.WriteLine("1DP1;-1.8;HW-DUOzand;veen");
writer.WriteLine("1DP1;-2.8;HW-HVN;zand");
writer.WriteLine("1DP1;-4;HW-HVN;zand");
writer.WriteLine("1DP1;-5;Alg-zand (0-30);zand");
writer.WriteLine("1DP2;10;HW-OBO;zand");
writer.WriteLine("1DP2;-0.7;HW-DUN;veen");
writer.WriteLine("1DP2;-1.5;HW-DUOzand;veen");
writer.WriteLine("1DP2;-2.4;HW-HVN;zand");
writer.WriteLine("1DP2;-4.3;HW-HVN;zand");
writer.WriteLine("1DP2;-5.3;Alg-zand (0-30);zand");
}
}
///
/// Create csv file with scenarios
///
private void CreateScenarios()
{
using (var writer = File.CreateText(importFolder + "\\scenarios.csv"))
{
writer.WriteLine("location_id;location_scenario_id;water_height;dike_table_height;safety_factor_stability_inner_slope;safety_factor_piping;water_height_decimerings_hoogte;max_waterheight");
writer.WriteLine("LOC1;1;1.14;4.6;1.17;1.2;0.4;4");
}
}
///
/// Create csv file with surface lines
///
private void CreateSurfaceLinesFiles()
{
using (var writer = File.CreateText(importFolder + "\\surfacelines.csv"))
{
writer.WriteLine(
"Profielnaam;Geologischprofiel;X_GridPoint;Y_GridPoint;ScenarioClusterID;X1;Y1;Z1;.....;Xn;Yn;Zn;(Profiel)");
writer.WriteLine(
"D1;;63,310;0,000;1;0,000;0,000;0,680;21,110;0,000;1,120;31,600;0,000;1,300;31,730;0,000;1,610;32,210;0,000;1,670;35,580;0,000;1,580;40,480;0,000;1,940;47,860;0,000;3,790;50,110;0,000;4,460;51,750;0,000;4,662;52,630;0,000;4,770;54,250;0,000;4,690;55,170;0,000;4,460;58,850;0,000;2,980;60,290;0,000;2,460;63,310;0,000;1,360;67,900;0,000;1,070;69,410;0,000;0,600;69,800;0,000;0,480;70,530;0,000;0,000;70,820;0,000;-0,190;71,550;0,000;-0,600;72,370;0,000;-1,060;72,380;0,000;-1,170;72,550;0,000;-1,460;73,860;0,000;-1,390;73,990;0,000;-1,0;74,570;0,000;-0,840;74,970;0,000;-0,600;76,170;0,000;0,110;86,660;0,000;0,270;103,280;0,000;0,220;117,940;0,000;0,120");
}
}
///
/// Create csv file with segments containing 1d soilprofiles
///
private void CreateSegmentsFor1DProfilesFile()
{
using (var writer = File.CreateText(importFolder + "\\segments.csv"))
{
writer.WriteLine("segment_id;soilprofile_id;probability;calculation_type");
writer.WriteLine("1;1DP1;80;Stability");
writer.WriteLine("1;1DP2;20;Stability");
writer.WriteLine("1;1DP2;100;Piping");
writer.WriteLine("2;1DP2;100;Stability");
writer.WriteLine("2;1DP1;100;Piping");
}
}
///
/// Create csv file with locations
///
private void CreateLocationsFile()
{
using (var writer = File.CreateText(importFolder + "\\locations.csv"))
{
writer.WriteLine("location_id;surfaceline_id;segment_id;geo_x;geo_y;x_soilgeometry2D_origin;Pl1_id;polderlevel;head_pl2;head_pl3;grass_quality;direction;ophoogmateriaaldijk;ophoogmateriaalberm;dempingsfactor_pl3;dempingsfactor_pl4;Sheetpile_x;Sheetpile_y;Sheetpile_z;Sheetpile_length;use_original_plline_assignments");
writer.WriteLine("LOC1;D1;1;414.950;91.850;14.0;PL1A;0.1;4.0;3.0;4.3;1.0;ophoogmateriaaldijk;ophoogmateriaalberm;0.31;0.41;432.1;0.0;654.3;22.0;true");
}
}
///
/// Create csv file with characteristic points
///
private void CreateCharacteristicPointsFile()
{
using (var writer = File.CreateText(importFolder + "\\characteristicpoints.csv"))
{
writer.WriteLine(
"Profielnaam;X_Maaiveld binnenwaarts;Y_Maaiveld binnenwaarts;Z_Maaiveld binnenwaarts;X_Insteek sloot polderzijde;Y_Insteek sloot polderzijde;Z_Insteek sloot polderzijde;X_Slootbodem polderzijde;Y_Slootbodem polderzijde;Z_Slootbodem polderzijde;X_Slootbodem dijkzijde;Y_Slootbodem dijkzijde;Z_Slootbodem dijkzijde;X_Insteek sloot dijkzijde;Y_Insteek_sloot dijkzijde;Z_Insteek sloot dijkzijde;X_Teen dijk binnenwaarts;Y_Teen dijk binnenwaarts;Z_Teen dijk binnenwaarts;X_Kruin binnenberm;Y_Kruin binnenberm;Z_Kruin binnenberm;X_Insteek binnenberm;Y_Insteek binnenberm;Z_Insteek binnenberm;X_Kruin binnentalud;Y_Kruin binnentalud;Z_Kruin binnentalud;X_Verkeersbelasting kant binnenwaarts;Y_Verkeersbelasting kant binnenwaarts;Z_Verkeersbelasting kant binnenwaarts;X_Verkeersbelasting kant buitenwaarts;Y_Verkeersbelasting kant buitenwaarts;Z_Verkeersbelasting kant buitenwaarts;X_Kruin buitentalud;Y_Kruin buitentalud;Z_Kruin buitentalud;X_Insteek buitenberm;Y_Insteek buitenberm;Z_Insteek buitenberm;X_Kruin buitenberm;Y_Kruin buitenberm;Z_Kruin buitenberm;X_Teen dijk buitenwaarts;Y_Teen dijk buitenwaarts;Z_Teen dijk buitenwaarts;X_Maaiveld buitenwaarts;Y_Maaiveld buitenwaarts;Z_Maaiveld buitenwaarts;Volgnummer");
writer.WriteLine(
"D1;117,94;0;0,12;-1;-1;-1;73,99;0;-1,0;72,55;0;-1,46;67,9;0;1,07;63,31;0;1,36;-1;-1;-1;-1;-1;-1;55,17;0;4,46;54,25;0;4,69;51,75;0;4,662;50,11;0;4,46;40,48;0;1,94;32,21;0;1,67;31,6;0;1,3;0;0;0,68;1");
}
}
///
/// Test
///
[Test]
public void CvsImporter_ImportFromNonExistingDirectory_AddsMessageWithFatalErrorType()
{
ImportDirector.Construct("C:\\SomeNoneExistingDirectory", null);
Assert.AreEqual(1, LogManager.Messages.Count);
Assert.AreEqual(LogMessageType.FatalError, LogManager.Messages[0].MessageType);
}
///
/// Test
///
[Test]
public void CvsImporter_ImportWithIncompleteLocationTable_AddsMessageWithWarning()
{
File.Delete(importFolder + "\\locations.csv");
using (var writer = File.CreateText(importFolder + "\\locations.csv"))
{
writer.WriteLine("location_id;surfaceline_id;segment_id;geo_x;geo_y;polderlevel;head_pl2;head_pl3;grass_quality;direction");
writer.WriteLine("LOC1;D1;ok;414.950;91.850;0.1;4.0;3.0;4.3;1.0");
}
ImportDirector.Construct(importFolder, null);
Assert.AreEqual(LogMessageType.Warning, LogManager.Messages[0].MessageType);
}
///
/// Test
///
[Test]
public void CanImportDikeWith2DSoilGeometries()
{
File.Delete(importFolder + "\\segments.csv");
File.Delete(importFolder + "\\soilprofiles.csv");
using (var writer = File.CreateText(importFolder + "\\segments.csv"))
{
writer.WriteLine("segment_id;soilgeometry2D_name;probability;calculation_type");
writer.WriteLine("1;Geometrie 1;80;Stability");
writer.WriteLine("1;Geometrie 2;20;Stability");
writer.WriteLine("1;Geometrie 1 piping;100;Piping");
writer.WriteLine("2;Geometrie 2;100;Stability");
writer.WriteLine("2;Geometrie 1 piping;100;Piping");
}
using (var waterBoard = ImportDirector.Construct(importFolder, null))
{
Assert.AreEqual(2, waterBoard.Segments.Count);
Assert.AreEqual("Geometrie 1", waterBoard.Segments[0].GetMostProbableGeometry2DName(FailureMechanismSystemType.StabilityInside));
Assert.AreEqual("Geometrie 1 piping", waterBoard.Segments[1].GetMostProbableGeometry2DName(FailureMechanismSystemType.Piping));
Assert.AreEqual("Geometrie 2", waterBoard.Segments[1].GetMostProbableGeometry2DName(FailureMechanismSystemType.StabilityInside));
Assert.AreEqual("Geometrie 1 piping", waterBoard.Segments[1].GetMostProbableGeometry2DName(FailureMechanismSystemType.Piping));
}
}
///
/// Test
///
[Test]
public void CanImportDikeWith1DSoilGeometries()
{
using(var waterBoard = ImportDirector.Construct(importFolder, null)) {
var dike = waterBoard.Dikes[0];
Assert.IsNotNull(dike);
Assert.AreEqual(2, dike.SoilProfiles.Count, "SoilProfiles.Count");
Assert.AreEqual(2, waterBoard.Segments.Count, "Segments.Count");
Assert.AreEqual(1, dike.SurfaceLines2.Count, "SurfaceLines.Count");
Assert.AreEqual(1, dike.Locations.Count);
Assert.AreEqual("LOC1", dike.Locations[0].Name);
Assert.AreEqual("D1", dike.Locations[0].SurfaceLine2.Name);
Assert.AreEqual("1", dike.Locations[0].Segment.Name);
Assert.AreEqual(414.950, dike.Locations[0].XRd);
Assert.AreEqual(91.850, dike.Locations[0].YRd);
Assert.AreEqual(0.1, dike.Locations[0].PolderLevel);
Assert.AreEqual(4.0, dike.Locations[0].HeadPL2);
Assert.AreEqual(14.0, dike.Locations[0].XSoilGeometry2DOrigin);
Assert.AreEqual("ophoogmateriaaldijk", dike.Locations[0].DikeEmbankmentMaterial);
Assert.AreEqual("ophoogmateriaalberm", dike.Locations[0].ShoulderEmbankmentMaterial);
Assert.AreEqual(0.31, dike.Locations[0].DampingFactorPL3);
Assert.AreEqual(0.41, dike.Locations[0].DampingFactorPL4);
Assert.AreEqual(13, dike.SurfaceLines2[0].CharacteristicPoints.Count(cp => cp.CharacteristicPointType != CharacteristicPointType.None));
Assert.IsNotNull(dike.SurfaceLines2[0].CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide));
}
}
///
/// Test
///
[Test]
public void SoilProfilesOfImportedDikeHaveSameInstance()
{
var waterBoard = ImportDirector.Construct(importFolder, null);
var dike = waterBoard.Dikes[0];
Assert.AreSame(dike.SoilProfiles[0], waterBoard.Segments[0].GetMostProbableProfile(FailureMechanismSystemType.StabilityInside));
}
///
/// Test
///
///
/// Test
///
[Test]
public void SoilProfilesOfImportedDikeHaveCorrectProbability()
{
var waterBoard = ImportDirector.Construct(importFolder, null);
var dike = waterBoard.Dikes[0];
Assert.AreEqual(80, waterBoard.Segments[0].GetSoilProfileProbability(dike.SoilProfiles[0], FailureMechanismSystemType.StabilityInside));
Assert.AreEqual(100, waterBoard.Segments[0].GetSoilProfileProbability(dike.SoilProfiles[1], FailureMechanismSystemType.Piping));
}
///
/// Test
///
[Test]
public void SegmentsOfImportedDikeHaveCorrectMostProbabableSoilProfile()
{
var waterBoard = ImportDirector.Construct(importFolder, null);
Assert.AreEqual("1DP1", waterBoard.Segments[0].GetMostProbableProfile(FailureMechanismSystemType.StabilityInside).Name);
Assert.AreEqual("1DP2", waterBoard.Segments[0].GetMostProbableProfile(FailureMechanismSystemType.Piping).Name);
}
///
/// Test
///
[Test]
public void SurfaceLinesOfImportedDikeHaveSameInstance()
{
var waterBoard = ImportDirector.Construct(importFolder, null);
var dike = waterBoard.Dikes[0];
Assert.AreSame(dike.Locations[0].SurfaceLine2, dike.SurfaceLines2[0]);
}
///
/// Test
///
[Test]
public void CanImportDikeWithMinimalInput()
{
var waterBoard = ImportDirector.Construct(importFolder, null);
var dike = waterBoard.Dikes[0];
Assert.IsNotNull(dike);
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
if (Directory.Exists(importFolder))
Directory.Delete(importFolder, true);
}
}
}