using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Deltares.DeltaModel; using Deltares.Geotechnics.IO.Importers; using Deltares.Geotechnics.Mechanisms; using Deltares.Standard.IO; using Deltares.Standard.Language; using Deltares.Standard.TestUtils; using NUnit.Framework; namespace Deltares.Geotechnics.IO.Tests { /// /// Import soil segments Importer for both segments.csv and soilprofiles.csv (DAM style) /// [TestFixture] internal class SegmentsImporterTest { /// /// Test that the soil segments importer returns a warning message if the file is empty. /// [Test] public void EmptySegmentsFileResultsInWarningMessage() { // empty file (header only) var testFile = "TestFiles/empty_segments.csv"; File.WriteAllText(testFile, @"segment_id;soilprofile_id;probability;calculation_type", Encoding.ASCII); // setup importer, not using factory var importer = new SoilSegmentsImporter(); var soilProfiles = new List(); soilProfiles.Add(new SoilProfile1D { Name = "Dummy1D"}); soilProfiles.Add(new SoilProfile2D { Name = "Dummy2D" }); // 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.ReadSoilSegments(testFile, soilProfiles); Assert.Greater(importer.ErrorMessages.Count, 0); Assert.NotNull(importer.ErrorMessages.FirstOrDefault(m => m.Message.Contains( LocalizationManager.GetTranslatedText(typeof(SoilSegmentsImporter), "SegmentsCsvFileEmptyWarning").Replace("{0}","")))); File.Delete(testFile); } [Test] public void ImportSoilProfilesAndSegmentsFromCsvFiles() { const string segmentfile = "segments.csv"; const string soilprofilefile = "soilprofiles.csv"; var dir = @"..\..\..\data\Dam\Waterboards\Delfland\regionaal\csv files\"; var deltaModel = new DeltaModel.DeltaModel(); var deltaModelFactory = new DeltaModelFactory(deltaModel); var multiImporter = new MultiImporter(); var profileImporter = new SoilProfilesImporter { FileName = dir + soilprofilefile, Factory = deltaModelFactory }; multiImporter.Importers.Add(profileImporter); var segmentsImporter = new SoilSegmentsImporter { FileName = dir + segmentfile, Factory = deltaModelFactory }; multiImporter.Importers.Add(segmentsImporter); multiImporter.DataFactory = deltaModelFactory; multiImporter.ImportAll(null); checkProfiles(deltaModel); } [Test] public void ImportSoilProfilesAndSegmentsFromCsvFilesChangedOrder() { const string segmentfile = "segments.csv"; const string soilprofilefile = "soilprofiles.csv"; var dir = @"..\..\..\data\Dam\Waterboards\Delfland\regionaal\csv files\"; var deltaModel = new DeltaModel.DeltaModel(); var deltaModelFactory = new DeltaModelFactory(deltaModel); var multiImporter = new MultiImporter(); var segmentsImporter = new SoilSegmentsImporter { FileName = dir + segmentfile, Factory = deltaModelFactory }; multiImporter.Importers.Add(segmentsImporter); var profileImporter = new SoilProfilesImporter { FileName = dir + soilprofilefile, Factory = deltaModelFactory }; multiImporter.Importers.Add(profileImporter); multiImporter.DataFactory = deltaModelFactory; multiImporter.ImportAll(null); checkProfiles(deltaModel); } /// /// Test the read methods used in D-SoilModel /// [Test] public void ReadSoilSegmentsFromCsvFiles() { const string segmentfile = "segments.csv"; const string soilprofilefile = "soilprofiles.csv"; var dir = @"..\..\..\data\Dam\Waterboards\Delfland\regionaal\csv files\"; var deltaModel = new DeltaModel.DeltaModel(); var importer = new SoilProfilesImporter(); var profiles = importer.ReadSoilProfiles(dir + soilprofilefile, deltaModel.Soils); var segmentsImporter = new SoilSegmentsImporter(); var segments = segmentsImporter.ReadSoilSegments(dir + segmentfile, new List(profiles)); deltaModel.SoilProfiles1D.AddRange(profiles); deltaModel.SoilSegments.AddRange(segments); checkProfiles(deltaModel); } private void checkProfiles(DeltaModel.DeltaModel deltaModel) { //Assert.AreEqual(deltaModel.SoilProfiles1D.Count, 147); Assert.AreEqual(deltaModel.SoilSegments.Count, 10); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.Mechanism == Mechanism.Piping), 5); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.Mechanism == Mechanism.Stability), 5); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.SegmentId == "1"), 2); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.SegmentId == "2"), 2); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.SegmentId == "3"), 2); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.SegmentId == "4"), 2); Assert.AreEqual(deltaModel.SoilSegments.Count(s => s.SegmentId == "5"), 2); // check sum of probabilities foreach (var segment in deltaModel.SoilSegments) { double probability = 0; foreach (var profile in segment.StochasticSoilModel.StochasticSoilProfiles) { probability += profile.Probability; } Assert.AreEqual(probability, 1.0, 0.000001); } // check that all soilprofiles (1D) are assigned a value foreach (var segment in deltaModel.SoilSegments) { foreach (var profile in segment.StochasticSoilModel.StochasticSoilProfiles) { Assert.IsTrue(profile.Profile != null, "Stochastic SoilProfile is not assigned a value"); Assert.IsTrue(profile.Profile is SoilProfile1D, "Only 1D soilprofiles are expected in this test"); var profile1D = (SoilProfile1D) profile.Profile; Assert.IsTrue(profile1D.Layers.Count > 0); } } } } }