Index: Core/Common/test/Core.Common.TestUtils/TestHelper.cs =================================================================== diff -u -ra85e384df91356b2c2716591531a863e01da876b -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Core/Common/test/Core.Common.TestUtils/TestHelper.cs (.../TestHelper.cs) (revision a85e384df91356b2c2716591531a863e01da876b) +++ Core/Common/test/Core.Common.TestUtils/TestHelper.cs (.../TestHelper.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -575,10 +575,7 @@ { foreach (string message in messages) { - if (!renderedMessages.Contains(message)) - { - Assert.Fail("Message \"{0}\" not found in messages of log4net", message); - } + CollectionAssert.Contains(renderedMessages, message); } } Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Builders/FileReaderErrorMessageBuilder.cs =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.IO/Builders/FileReaderErrorMessageBuilder.cs (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Builders/FileReaderErrorMessageBuilder.cs (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -0,0 +1,59 @@ +namespace Ringtoets.Piping.IO.Builders +{ + /// + /// Class to help create consistent file reader error messages. + /// + public class FileReaderErrorMessageBuilder + { + private readonly string filePath; + private string location; + private string subject; + + /// + /// Initializes a new instance of the class. + /// + /// The file path to the file where the error occurred. + public FileReaderErrorMessageBuilder(string filePath) + { + this.filePath = filePath; + } + + /// + /// Builds the specified error message. + /// + /// The message about the error that has occurred. + /// The full error message. + public string Build(string errorMessage) + { + return string.Format("Fout bij het lezen van bestand '{0}'{1}{2}: {3}", + filePath, + location ?? string.Empty, + subject ?? string.Empty, + errorMessage); + } + + /// + /// Adds file location information to the error message. + /// + /// The location description. + /// The builder being configured. + /// line 7 + public FileReaderErrorMessageBuilder WithLocation(string locationDescription) + { + location = " " + locationDescription; + return this; + } + + /// + /// Adds the subject where the error occurred to the error message. + /// + /// The subject description. + /// The builder being configured. + /// soil profile 'blabla' + public FileReaderErrorMessageBuilder WithSubject(string subjectDescription) + { + subject = string.Format(" ({0})", subjectDescription); + return this; + } + } +} \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/FileUtils.cs =================================================================== diff -u -rc1e31ab57c197658d1c75750feef8856df7e9f6b -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/FileUtils.cs (.../FileUtils.cs) (revision c1e31ab57c197658d1c75750feef8856df7e9f6b) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/FileUtils.cs (.../FileUtils.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -1,6 +1,7 @@ using System; using System.IO; +using Ringtoets.Piping.IO.Builders; using Ringtoets.Piping.IO.Properties; namespace Ringtoets.Piping.IO @@ -19,7 +20,8 @@ { if (String.IsNullOrWhiteSpace(path)) { - throw new ArgumentException(Resources.Error_Path_must_be_specified); + var message = new FileReaderErrorMessageBuilder(path).Build(Resources.Error_Path_must_be_specified); + throw new ArgumentException(message); } string name; @@ -29,12 +31,15 @@ } catch (ArgumentException e) { - throw new ArgumentException(String.Format(Resources.Error_Path_cannot_contain_Characters_0_, - String.Join(", ", Path.GetInvalidFileNameChars())), e); + var message = new FileReaderErrorMessageBuilder(path) + .Build(String.Format(Resources.Error_Path_cannot_contain_Characters_0_, + String.Join(", ", Path.GetInvalidFileNameChars()))); + throw new ArgumentException(message, e); } if (String.Empty == name) { - throw new ArgumentException(Resources.Error_Path_must_not_point_to_folder); + var message = new FileReaderErrorMessageBuilder(path).Build(Resources.Error_Path_must_not_point_to_folder); + throw new ArgumentException(message); } } } Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/PipingSurfaceLinesCsvReader.cs =================================================================== diff -u -r458ef844024d216a682e09fe8193fd6188921bc2 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/PipingSurfaceLinesCsvReader.cs (.../PipingSurfaceLinesCsvReader.cs) (revision 458ef844024d216a682e09fe8193fd6188921bc2) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/PipingSurfaceLinesCsvReader.cs (.../PipingSurfaceLinesCsvReader.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -5,7 +5,7 @@ using System.Linq; using Ringtoets.Piping.Data; - +using Ringtoets.Piping.IO.Builders; using Ringtoets.Piping.IO.Exceptions; using Ringtoets.Piping.IO.Properties; @@ -143,7 +143,7 @@ } /// - /// Checks if the geometry dfining the surface line is valid. + /// Checks if the geometry defining the surface line is valid. /// /// The surface line to be checked. /// Surface line geometry is invalid @@ -154,9 +154,7 @@ { if (lCoordinates[i - 1] > lCoordinates[i]) { - var message = string.Format(Resources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLineName_0_has_reclining_geometry, - surfaceLine.Name); - throw new LineParseException(message); + throw CreateLineParseException(lineNumber, surfaceLine.Name, Resources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_has_reclining_geometry); } } } @@ -180,9 +178,8 @@ { if (!readText.Contains(separator)) { - var message = string.Format(Resources.PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_lacks_separator_1_, - lineNumber, separator); - throw new LineParseException(message); + throw CreateLineParseException(lineNumber, string.Format(Resources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_separator_0_, + separator)); } return readText.Split(separator) .TakeWhile(text => !String.IsNullOrEmpty(text)) @@ -209,9 +206,7 @@ var worldCoordinateValues = ParseWorldCoordinateValuesAndHandleParseErrors(tokenizedString, surfaceLineName); if (worldCoordinateValues.Length % expectedValuesForPoint != 0) { - var message = string.Format(Resources.PipingSurfaceLinesCsvReader_ReadLine_File_SurfaceLineName_0_lacks_values_for_coordinate_triplet, - surfaceLineName); - throw new LineParseException(message); + throw CreateLineParseException(lineNumber, surfaceLineName, Resources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_lacks_values_for_coordinate_triplet); } int coordinateCount = worldCoordinateValues.Length / expectedValuesForPoint; @@ -239,9 +234,7 @@ var name = tokenizedString.Any() ? tokenizedString[0].Trim() : string.Empty; if (string.IsNullOrEmpty(name)) { - var message = string.Format(Resources.PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_no_ID, - lineNumber); - throw new LineParseException(message); + throw CreateLineParseException(lineNumber, Resources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_ID); } return name; } @@ -268,15 +261,11 @@ } catch (FormatException e) { - var message = string.Format(Resources.Error_File_has_not_double_SurfaceLineName_0_, - surfaceLineName); - throw new LineParseException(message, e); + throw CreateLineParseException(lineNumber, surfaceLineName, Resources.Error_SurfaceLine_has_not_double, e); } catch (OverflowException e) { - var message = string.Format(Resources.Error_File_parsing_causes_overflow_SurfaceLineName_0_, - surfaceLineName); - throw new LineParseException(message, e); + throw CreateLineParseException(lineNumber, surfaceLineName, Resources.Error_SurfaceLine_parsing_causes_overflow, e); } } @@ -295,15 +284,17 @@ } catch (FileNotFoundException e) { - throw new CriticalFileReadException(Resources.Error_File_does_not_exist, e); + string message = new FileReaderErrorMessageBuilder(path).Build(Resources.Error_File_does_not_exist); + throw new CriticalFileReadException(message, e); } catch (DirectoryNotFoundException e) { - throw new CriticalFileReadException(Resources.Error_Directory_missing, e); + string message = new FileReaderErrorMessageBuilder(path).Build(Resources.Error_Directory_missing); + throw new CriticalFileReadException(message, e); } catch (IOException e) { - var message = string.Format(Resources.Error_General_IO_ErrorMessage_0_, e.Message); + var message = new FileReaderErrorMessageBuilder(path).Build(string.Format(Resources.Error_General_IO_ErrorMessage_0_, e.Message)); throw new CriticalFileReadException(message, e); } } @@ -321,16 +312,63 @@ { if (!IsHeaderValid(header)) { - throw new CriticalFileReadException(Resources.PipingSurfaceLinesCsvReader_File_invalid_header); + throw CreateCriticalFileReadException(currentLine, Resources.PipingSurfaceLinesCsvReader_File_invalid_header); } } else { - throw new CriticalFileReadException(Resources.Error_File_empty); + throw CreateCriticalFileReadException(currentLine, Resources.Error_File_empty); } } /// + /// Throws a configured instance of . + /// + /// The line number being read. + /// The critical error message. + /// Optional: exception that caused this exception to be thrown. + /// Calling this method causes this exception to be thrown. + private CriticalFileReadException CreateCriticalFileReadException(int currentLine, string criticalErrorMessage, Exception innerException = null) + { + string locationDescription = string.Format(Resources.TextFile_On_LineNumber_0_, currentLine); + var message = new FileReaderErrorMessageBuilder(filePath).WithLocation(locationDescription) + .Build(criticalErrorMessage); + return new CriticalFileReadException(message, innerException); + } + + /// + /// Throws a configured instance of . + /// + /// The line number being read. + /// The critical error message. + /// Calling this method causes this exception to be thrown. + private LineParseException CreateLineParseException(int currentLine, string lineParseErrorMessage) + { + string locationDescription = string.Format(Resources.TextFile_On_LineNumber_0_, currentLine); + var message = new FileReaderErrorMessageBuilder(filePath).WithLocation(locationDescription) + .Build(lineParseErrorMessage); + return new LineParseException(message); + } + + /// + /// Throws a configured instance of . + /// + /// The line number being read. + /// The name of the surfaceline being read. + /// The critical error message. + /// /// Optional: exception that caused this exception to be thrown. + /// Calling this method causes this exception to be thrown. + private LineParseException CreateLineParseException(int currentLine, string surfaceLineName, string lineParseErrorMessage, Exception innerException = null) + { + string locationDescription = string.Format(Resources.TextFile_On_LineNumber_0_, currentLine); + string subjectDescription = string.Format(Resources.PipingSurfaceLinesCsvReader_SurfaceLineName_0_, surfaceLineName); + var message = new FileReaderErrorMessageBuilder(filePath).WithLocation(locationDescription) + .WithSubject(subjectDescription) + .Build(lineParseErrorMessage); + return new LineParseException(message, innerException); + } + + /// /// Counts the remaining non-empty lines. /// /// The reader at the row from which counting should start. @@ -367,12 +405,11 @@ } catch (OutOfMemoryException e) { - var message = string.Format(Resources.Error_File_contains_Line_0_too_big, currentLine); - throw new CriticalFileReadException(message, e); + throw CreateCriticalFileReadException(currentLine, Resources.Error_File_does_not_exist, e); } catch (IOException e) { - var message = string.Format(Resources.Error_General_IO_ErrorMessage_0_, e.Message); + var message = new FileReaderErrorMessageBuilder(filePath).Build(string.Format(Resources.Error_General_IO_ErrorMessage_0_, e.Message)); throw new CriticalFileReadException(message, e); } } Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.Designer.cs =================================================================== diff -u -r458ef844024d216a682e09fe8193fd6188921bc2 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 458ef844024d216a682e09fe8193fd6188921bc2) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -79,15 +79,6 @@ } /// - /// Looks up a localized string similar to Het bestand heeft op regel {0} teveel tekst om in het RAM geheugen opgeslagen te worden.. - /// - public static string Error_File_contains_Line_0_too_big { - get { - return ResourceManager.GetString("Error_File_contains_Line_0_too_big", resourceCulture); - } - } - - /// /// Looks up a localized string similar to Het bestand bestaat niet.. /// public static string Error_File_does_not_exist { @@ -106,33 +97,24 @@ } /// - /// Looks up a localized string similar to Het bestand heeft voor profielmeting {0} een waarde die niet omgezet kan worden naar een getal.. + /// Looks up a localized string similar to Er is een onverwachte fout opgetreden tijdens het inlezen van het bestand: {0}. /// - public static string Error_File_has_not_double_SurfaceLineName_0_ { + public static string Error_General_IO_ErrorMessage_0_ { get { - return ResourceManager.GetString("Error_File_has_not_double_SurfaceLineName_0_", resourceCulture); + return ResourceManager.GetString("Error_General_IO_ErrorMessage_0_", resourceCulture); } } /// - /// Looks up a localized string similar to Het bestand heeft voor profielmeting {0} een waarde die te groot of te klein is om ingelezen te worden.. + /// Looks up a localized string similar to Regel bevat teveel tekst om in het RAM geheugen opgeslagen te worden.. /// - public static string Error_File_parsing_causes_overflow_SurfaceLineName_0_ { + public static string Error_Line_too_big_for_RAM { get { - return ResourceManager.GetString("Error_File_parsing_causes_overflow_SurfaceLineName_0_", resourceCulture); + return ResourceManager.GetString("Error_Line_too_big_for_RAM", resourceCulture); } } /// - /// Looks up a localized string similar to Er is een onverwachte fout opgetreden tijdens het inlezen van het bestand: {0}. - /// - public static string Error_General_IO_ErrorMessage_0_ { - get { - return ResourceManager.GetString("Error_General_IO_ErrorMessage_0_", resourceCulture); - } - } - - /// /// Looks up a localized string similar to Bestandspad mag niet de volgende tekens bevatten: {0}. /// public static string Error_Path_cannot_contain_Characters_0_ { @@ -179,6 +161,24 @@ } /// + /// Looks up a localized string similar to Profielmeting heeft een waarde die niet omgezet kan worden naar een getal.. + /// + public static string Error_SurfaceLine_has_not_double { + get { + return ResourceManager.GetString("Error_SurfaceLine_has_not_double", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profielmeting heeft een waarde die te groot of te klein is om ingelezen te worden.. + /// + public static string Error_SurfaceLine_parsing_causes_overflow { + get { + return ResourceManager.GetString("Error_SurfaceLine_parsing_causes_overflow", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Kan de geometrie van laag nummer '{0}' in profiel '{1}' niet interpreteren.. /// public static string PipingSoilProfileReader_CouldNotParseGeometryOfLayer_0_InProfile_1_ { @@ -224,43 +224,52 @@ } /// - /// Looks up a localized string similar to Het bestand heeft op regel {0} geen verwacht scheidingsteken (het karakter: {1}).. + /// Looks up a localized string similar to Regel heeft geen ID.. /// - public static string PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_lacks_separator_1_ { + public static string PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_ID { get { - return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_lacks_separator_1_", resourceCulture); + return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_ID", resourceCulture); } } /// - /// Looks up a localized string similar to Het bestand heeft geen ID op regel {0}.. + /// Looks up a localized string similar to Regel ontbreekt het verwachte scheidingsteken (het karakter: {0}).. /// - public static string PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_no_ID { + public static string PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_separator_0_ { get { - return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_no_ID", resourceCulture); + return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_separator_0_", resourceCulture); } } /// - /// Looks up a localized string similar to In het bestand voor profielmeting {0} ontbreken er waardes om een 3D (X,Y,Z) punt aan te maken.. + /// Looks up a localized string similar to Profielmeting heeft een teruglopende geometrie (Punten behoren een oplopende set L-coordinaten te hebben in het lokaal coördinatenstelsel).. /// - public static string PipingSurfaceLinesCsvReader_ReadLine_File_SurfaceLineName_0_lacks_values_for_coordinate_triplet { + public static string PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_has_reclining_geometry { get { - return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_File_SurfaceLineName_0_lacks_values_for_coor" + - "dinate_triplet", resourceCulture); + return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_has_reclining_geometry", resourceCulture); } } /// - /// Looks up a localized string similar to Profielmeting {0} van bestand heeft een teruglopende geometrie (Punten behoren een oplopende set L-coordinaten te hebben in het lokaal coördinatenstelsel).. + /// Looks up a localized string similar to Voor profielmeting ontbreken er waardes om een 3D (X,Y,Z) punt aan te maken.. /// - public static string PipingSurfaceLinesCsvReader_ReadLine_SurfaceLineName_0_has_reclining_geometry { + public static string PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_lacks_values_for_coordinate_triplet { get { - return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_SurfaceLineName_0_has_reclining_geometry", resourceCulture); + return ResourceManager.GetString("PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_lacks_values_for_coordinate_trip" + + "let", resourceCulture); } } /// + /// Looks up a localized string similar to profielmeting '{0}'. + /// + public static string PipingSurfaceLinesCsvReader_SurfaceLineName_0_ { + get { + return ResourceManager.GetString("PipingSurfaceLinesCsvReader_SurfaceLineName_0_", resourceCulture); + } + } + + /// /// Looks up a localized string similar to De segmenten van de geometrie van de laag vormen geen lus.. /// public static string SoilLayer2D_Error_Loop_contains_disconnected_segments { @@ -295,5 +304,14 @@ return ResourceManager.GetString("SoilLayer2DReader_Geometry_is_null", resourceCulture); } } + + /// + /// Looks up a localized string similar to op regel {0}. + /// + public static string TextFile_On_LineNumber_0_ { + get { + return ResourceManager.GetString("TextFile_On_LineNumber_0_", resourceCulture); + } + } } } Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.resx =================================================================== diff -u -r458ef844024d216a682e09fe8193fd6188921bc2 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.resx (.../Resources.resx) (revision 458ef844024d216a682e09fe8193fd6188921bc2) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Properties/Resources.resx (.../Resources.resx) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -123,20 +123,20 @@ Het bestandspad verwijst naar een map die niet bestaat. - - Het bestand heeft op regel {0} teveel tekst om in het RAM geheugen opgeslagen te worden. + + Regel bevat teveel tekst om in het RAM geheugen opgeslagen te worden. Het bestand bestaat niet. Het bestand is leeg. - - Het bestand heeft voor profielmeting {0} een waarde die niet omgezet kan worden naar een getal. + + Profielmeting heeft een waarde die niet omgezet kan worden naar een getal. - - Het bestand heeft voor profielmeting {0} een waarde die te groot of te klein is om ingelezen te worden. + + Profielmeting heeft een waarde die te groot of te klein is om ingelezen te worden. Er is een onverwachte fout opgetreden tijdens het inlezen van het bestand: {0} @@ -162,17 +162,17 @@ Het bestand is niet geschikt om profielmetingen uit te lezen (Verwachte header: locationid;X1;Y1;Z1). - - Profielmeting {0} van bestand heeft een teruglopende geometrie (Punten behoren een oplopende set L-coordinaten te hebben in het lokaal coördinatenstelsel). + + Profielmeting heeft een teruglopende geometrie (Punten behoren een oplopende set L-coordinaten te hebben in het lokaal coördinatenstelsel). - - Het bestand heeft op regel {0} geen verwacht scheidingsteken (het karakter: {1}). + + Regel ontbreekt het verwachte scheidingsteken (het karakter: {0}). - - In het bestand voor profielmeting {0} ontbreken er waardes om een 3D (X,Y,Z) punt aan te maken. + + Voor profielmeting ontbreken er waardes om een 3D (X,Y,Z) punt aan te maken. - - Het bestand heeft geen ID op regel {0}. + + Regel heeft geen ID. Kan de geometrie van laag nummer '{0}' in profiel '{1}' niet interpreteren. @@ -195,4 +195,10 @@ Coördinaat van een punt bevat ongeldige waarde. + + op regel {0} + + + profielmeting '{0}' + \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/Ringtoets.Piping.IO.csproj =================================================================== diff -u -r2afad189e942019ef3da47d72e134f3a4c6c7884 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/Ringtoets.Piping.IO.csproj (.../Ringtoets.Piping.IO.csproj) (revision 2afad189e942019ef3da47d72e134f3a4c6c7884) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/Ringtoets.Piping.IO.csproj (.../Ringtoets.Piping.IO.csproj) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -50,6 +50,7 @@ Properties\GlobalAssembly.cs + Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Builders/FileReaderErrorMessageBuilderTest.cs =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Builders/FileReaderErrorMessageBuilderTest.cs (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Builders/FileReaderErrorMessageBuilderTest.cs (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -0,0 +1,78 @@ +using NUnit.Framework; + +using Ringtoets.Piping.IO.Builders; + +namespace Ringtoets.Piping.IO.Test.Builders +{ + [TestFixture] + public class FileReaderErrorMessageBuilderTest + { + [Test] + public void Build_BasedOnPathAndMessage_ReturnBuiltErrorMessage() + { + // Setup + const string filePath = ""; + const string errorMessage = "test test 1,2,3"; + + // Call + var message = new FileReaderErrorMessageBuilder(filePath).Build(errorMessage); + + // Assert + var expectedMessage = string.Format("Fout bij het lezen van bestand '{0}': {1}", + filePath, errorMessage); + Assert.AreEqual(expectedMessage, message); + } + + [Test] + public void Build_BasedOnPathAndMessageWithLocation_ReturnBuiltErrorMessage() + { + // Setup + const string filePath = ""; + const string errorMessage = "test test 1,2,3"; + const string location = ""; + + // Call + var message = new FileReaderErrorMessageBuilder(filePath).WithLocation(location).Build(errorMessage); + + // Assert + var expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' {1}: {2}", + filePath, location, errorMessage); + Assert.AreEqual(expectedMessage, message); + } + + [Test] + public void Build_BasedOnPathAndMessageWithSubject_ReturnBuiltErrorMessage() + { + // Setup + const string filePath = ""; + const string errorMessage = "test test 1,2,3"; + const string subject = ""; + + // Call + var message = new FileReaderErrorMessageBuilder(filePath).WithSubject(subject).Build(errorMessage); + + // Assert + var expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' ({1}): {2}", + filePath, subject, errorMessage); + Assert.AreEqual(expectedMessage, message); + } + + [Test] + public void Build_BasedOnPathAndMessageWithSubjectAndLocation_ReturnBuiltErrorMessage() + { + // Setup + const string filePath = ""; + const string errorMessage = "test test 1,2,3"; + const string subject = ""; + const string location = ""; + + // Call + var message = new FileReaderErrorMessageBuilder(filePath).WithSubject(subject).WithLocation(location).Build(errorMessage); + + // Assert + var expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' {1} ({2}): {3}", + filePath, location, subject, errorMessage); + Assert.AreEqual(expectedMessage, message); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/FileUtilsTest.cs =================================================================== diff -u -r5462a7ee52b9491f269d489a094d359f4f02f270 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/FileUtilsTest.cs (.../FileUtilsTest.cs) (revision 5462a7ee52b9491f269d489a094d359f4f02f270) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/FileUtilsTest.cs (.../FileUtilsTest.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -34,7 +34,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual("Bestandspad mag niet leeg of ongedefinieerd zijn.", exception.Message); + var expectedMessage = string.Format("Fout bij het lezen van bestand '{0}': Bestandspad mag niet leeg of ongedefinieerd zijn.", invalidPath); + Assert.AreEqual(expectedMessage, exception.Message); } [Test] @@ -50,8 +51,8 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = String.Format("Bestandspad mag niet de volgende tekens bevatten: {0}", - string.Join(", ", invalidFileNameChars)); + var expectedMessage = String.Format("Fout bij het lezen van bestand '{0}': Bestandspad mag niet de volgende tekens bevatten: {1}", + invalidPath, string.Join(", ", invalidFileNameChars)); Assert.AreEqual(expectedMessage, exception.Message); } @@ -66,7 +67,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual("Bestandspad mag niet naar een map verwijzen.", exception.Message); + var expectedMessage = String.Format("Fout bij het lezen van bestand '{0}': Bestandspad mag niet naar een map verwijzen.", folderPath); + Assert.AreEqual(expectedMessage, exception.Message); } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSurfaceLinesCsvReaderTest.cs =================================================================== diff -u -r458ef844024d216a682e09fe8193fd6188921bc2 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSurfaceLinesCsvReaderTest.cs (.../PipingSurfaceLinesCsvReaderTest.cs) (revision 458ef844024d216a682e09fe8193fd6188921bc2) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/PipingSurfaceLinesCsvReaderTest.cs (.../PipingSurfaceLinesCsvReaderTest.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -6,6 +6,7 @@ using NUnit.Framework; +using Ringtoets.Piping.IO.Builders; using Ringtoets.Piping.IO.Exceptions; using Ringtoets.Piping.IO.Test.TestHelpers; @@ -29,7 +30,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_Path_must_be_specified, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).Build(IOResources.Error_Path_must_be_specified); + Assert.AreEqual(expectedMessage, exception.Message); } [Test] @@ -47,8 +49,8 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = String.Format(IOResources.Error_Path_cannot_contain_Characters_0_, - String.Join(", ", Path.GetInvalidFileNameChars())); + var expectedMessage = new FileReaderErrorMessageBuilder(corruptPath).Build(String.Format(IOResources.Error_Path_cannot_contain_Characters_0_, + String.Join(", ", Path.GetInvalidFileNameChars()))); Assert.AreEqual(expectedMessage, exception.Message); } @@ -60,7 +62,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_Path_must_not_point_to_folder, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(testDataPath).Build(IOResources.Error_Path_must_not_point_to_folder); + Assert.AreEqual(expectedMessage, exception.Message); } [Test] @@ -125,7 +128,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_File_does_not_exist, exception.Message); + var expectedError = new FileReaderErrorMessageBuilder(path).Build(IOResources.Error_File_does_not_exist); + Assert.AreEqual(expectedError, exception.Message); Assert.IsInstanceOf(exception.InnerException); } } @@ -146,7 +150,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_Directory_missing, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).Build(IOResources.Error_Directory_missing); + Assert.AreEqual(expectedMessage, exception.Message); Assert.IsInstanceOf(exception.InnerException); } } @@ -167,7 +172,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_File_empty, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 1").Build(IOResources.Error_File_empty); + Assert.AreEqual(expectedMessage, exception.Message); } } @@ -187,7 +193,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.PipingSurfaceLinesCsvReader_File_invalid_header, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 1").Build(IOResources.PipingSurfaceLinesCsvReader_File_invalid_header); + Assert.AreEqual(expectedMessage, exception.Message); } } @@ -211,7 +218,7 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format("Het bestand is niet geschikt om profielmetingen uit te lezen (Verwachte header: locationid;X1;Y1;Z1).", path); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 1").Build("Het bestand is niet geschikt om profielmetingen uit te lezen (Verwachte header: locationid;X1;Y1;Z1)."); Assert.AreEqual(expectedMessage, exception.Message); } } @@ -299,7 +306,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_File_does_not_exist, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).Build(IOResources.Error_File_does_not_exist); + Assert.AreEqual(expectedMessage, exception.Message); Assert.IsInstanceOf(exception.InnerException); } } @@ -320,7 +328,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_Directory_missing, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).Build(IOResources.Error_Directory_missing); + Assert.AreEqual(expectedMessage, exception.Message); Assert.IsInstanceOf(exception.InnerException); } } @@ -341,7 +350,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.Error_File_empty, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 1").Build(IOResources.Error_File_empty); + Assert.AreEqual(expectedMessage, exception.Message); } } @@ -361,7 +371,8 @@ // Assert var exception = Assert.Throws(call); - Assert.AreEqual(IOResources.PipingSurfaceLinesCsvReader_File_invalid_header, exception.Message); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 1").Build(IOResources.PipingSurfaceLinesCsvReader_File_invalid_header); + Assert.AreEqual(expectedMessage, exception.Message); } } @@ -385,7 +396,9 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format("Het bestand is niet geschikt om profielmetingen uit te lezen (Verwachte header: locationid;X1;Y1;Z1).", path); + var expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 1") + .Build("Het bestand is niet geschikt om profielmetingen uit te lezen (Verwachte header: locationid;X1;Y1;Z1)."); Assert.AreEqual(expectedMessage, exception.Message); } } @@ -409,7 +422,10 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.Error_File_has_not_double_SurfaceLineName_0_, "InvalidSurfaceLine"); + var expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 2") + .WithSubject("profielmeting 'InvalidSurfaceLine'") + .Build(IOResources.Error_SurfaceLine_has_not_double); Assert.AreEqual(expectedMessage, exception.Message); Assert.IsInstanceOf(exception.InnerException); } @@ -437,7 +453,10 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.Error_File_parsing_causes_overflow_SurfaceLineName_0_, "InvalidSurfaceLine"); + var expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 2") + .WithSubject("profielmeting 'InvalidSurfaceLine'") + .Build(IOResources.Error_SurfaceLine_parsing_causes_overflow); Assert.AreEqual(expectedMessage, exception.Message); Assert.IsInstanceOf(exception.InnerException); } @@ -460,11 +479,11 @@ // Assert // 1st line has no text at all: var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_no_ID, 2); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 2").Build(IOResources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_ID); Assert.AreEqual(expectedMessage, exception.Message); // 2nd line has only whitespace text: - expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_no_ID, 3); + expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 3").Build(IOResources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_ID); exception = Assert.Throws(call); Assert.AreEqual(expectedMessage, exception.Message); } @@ -486,7 +505,7 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_lacks_separator_1_, 2, ';'); + var expectedMessage = new FileReaderErrorMessageBuilder(path).WithLocation("op regel 2").Build(string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_separator_0_, ';')); Assert.AreEqual(expectedMessage, exception.Message); } } @@ -507,7 +526,9 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_File_Line_0_lacks_separator_1_, 2, ';'); + var expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 2") + .Build(string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_separator_0_, ';')); Assert.AreEqual(expectedMessage, exception.Message); } } @@ -529,12 +550,18 @@ // Assert // 1st row lacks 1 coordinate value: var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_File_SurfaceLineName_0_lacks_values_for_coordinate_triplet, "LacksOneCoordinate"); + var expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 2") + .WithSubject("profielmeting 'LacksOneCoordinate'") + .Build(IOResources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_lacks_values_for_coordinate_triplet); Assert.AreEqual(expectedMessage, exception.Message); // 2nd row lacks 2 coordinate values: exception = Assert.Throws(call); - expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_File_SurfaceLineName_0_lacks_values_for_coordinate_triplet, "LacksTwoCoordinates"); + expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 3") + .WithSubject("profielmeting 'LacksTwoCoordinates'") + .Build(IOResources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_lacks_values_for_coordinate_triplet); Assert.AreEqual(expectedMessage, exception.Message); } } @@ -555,8 +582,10 @@ // Assert var exception = Assert.Throws(call); - var expectedMessage = string.Format(IOResources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLineName_0_has_reclining_geometry, - "ArtifcialLocal"); + var expectedMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 2") + .WithSubject("profielmeting 'ArtificialLocal'") + .Build(IOResources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_has_reclining_geometry); Assert.AreEqual(expectedMessage, exception.Message); } } Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Ringtoets.Piping.IO.Test.csproj =================================================================== diff -u -r2f3973a8a6122be9d4c0a0db7a27dc3ca68580e3 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Ringtoets.Piping.IO.Test.csproj (.../Ringtoets.Piping.IO.Test.csproj) (revision 2f3973a8a6122be9d4c0a0db7a27dc3ca68580e3) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/Ringtoets.Piping.IO.Test.csproj (.../Ringtoets.Piping.IO.Test.csproj) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -56,6 +56,7 @@ + Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilProfileReaderTest.cs =================================================================== diff -u -r458ef844024d216a682e09fe8193fd6188921bc2 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilProfileReaderTest.cs (.../PipingSoilProfileReaderTest.cs) (revision 458ef844024d216a682e09fe8193fd6188921bc2) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SoilProfile/PipingSoilProfileReaderTest.cs (.../PipingSoilProfileReaderTest.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -41,7 +41,9 @@ // Assert var exception = Assert.Throws(test); - Assert.AreEqual(Resources.Error_Path_must_be_specified, exception.Message); + var expectedMessage = String.Format("Fout bij het lezen van bestand '{0}': {1}", + fileName, Resources.Error_Path_must_be_specified); + Assert.AreEqual(expectedMessage, exception.Message); } [Test] Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/SurfaceLines/InvalidRow_NotMonotinocallyIncreasingLCoordinates.csv =================================================================== diff -u -raadb1baaa37bf77a4174819851b07bc155028649 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/SurfaceLines/InvalidRow_NotMonotinocallyIncreasingLCoordinates.csv (.../InvalidRow_NotMonotinocallyIncreasingLCoordinates.csv) (revision aadb1baaa37bf77a4174819851b07bc155028649) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/SurfaceLines/InvalidRow_NotMonotinocallyIncreasingLCoordinates.csv (.../InvalidRow_NotMonotinocallyIncreasingLCoordinates.csv) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -1,2 +1,2 @@ Profielnaam;X1;Y1;Z1;...;Xn;Yn;Zn -ArtifcialLocal;1.0;1.0;1.0;3.0;3.0;3.0;2.0;2.0;2.0;4.0;4.0;4.0 +ArtificialLocal;1.0;1.0;1.0;3.0;3.0;3.0;2.0;2.0;2.0;4.0;4.0;4.0 Index: Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/PipingSurfaceLineCsvImporterTest.cs =================================================================== diff -u -rd992a9538644381321f71d536c9ea85813d4c443 -rf45d2d498e0354eb99e75191465d4cd5dc4dca13 --- Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/PipingSurfaceLineCsvImporterTest.cs (.../PipingSurfaceLineCsvImporterTest.cs) (revision d992a9538644381321f71d536c9ea85813d4c443) +++ Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/PipingSurfaceLineCsvImporterTest.cs (.../PipingSurfaceLineCsvImporterTest.cs) (revision f45d2d498e0354eb99e75191465d4cd5dc4dca13) @@ -10,6 +10,7 @@ using Rhino.Mocks; using Ringtoets.Piping.Data; +using Ringtoets.Piping.IO.Builders; using Ringtoets.Piping.IO.Test.TestHelpers; using Ringtoets.Piping.Plugin.FileImporter; @@ -256,8 +257,8 @@ Action call = () => importedItem = importer.ImportItem(corruptPath, observableSurfaceLinesList); // Assert - var internalErrorMessage = String.Format(PipingIOResources.Error_Path_cannot_contain_Characters_0_, - String.Join(", ", Path.GetInvalidFileNameChars())); + var internalErrorMessage = new FileReaderErrorMessageBuilder(corruptPath).Build(String.Format(PipingIOResources.Error_Path_cannot_contain_Characters_0_, + String.Join(", ", Path.GetInvalidFileNameChars()))); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_Critical_error_reading_File_0_Cause_1_, corruptPath, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1); @@ -288,7 +289,7 @@ Action call = () => importedItem = importer.ImportItem(corruptPath, observableSurfaceLinesList); // Assert - var internalErrorMessage = PipingIOResources.Error_File_does_not_exist; + var internalErrorMessage = new FileReaderErrorMessageBuilder(corruptPath).Build(PipingIOResources.Error_File_does_not_exist); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_Critical_error_reading_File_0_Cause_1_, corruptPath, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1); @@ -319,7 +320,9 @@ Action call = () => importedItem = importer.ImportItem(corruptPath, observableSurfaceLinesList); // Assert - var internalErrorMessage = PipingIOResources.Error_File_empty; + var internalErrorMessage = new FileReaderErrorMessageBuilder(corruptPath) + .WithLocation("op regel 1") + .Build(PipingIOResources.Error_File_empty); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_Critical_error_reading_File_0_Cause_1_, corruptPath, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1); @@ -350,7 +353,9 @@ Action call = () => importedItem = importer.ImportItem(corruptPath, observableSurfaceLinesList); // Assert - var internalErrorMessage = PipingIOResources.PipingSurfaceLinesCsvReader_File_invalid_header; + var internalErrorMessage = new FileReaderErrorMessageBuilder(corruptPath) + .WithLocation("op regel 1") + .Build(PipingIOResources.PipingSurfaceLinesCsvReader_File_invalid_header); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_Critical_error_reading_File_0_Cause_1_, corruptPath, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1); @@ -390,7 +395,7 @@ Action call = () => importedItem = importer.ImportItem(copyTargetPath, observableSurfaceLinesList); // Assert - var internalErrorMessage = PipingIOResources.Error_File_does_not_exist; + var internalErrorMessage = new FileReaderErrorMessageBuilder(copyTargetPath).Build(PipingIOResources.Error_File_does_not_exist); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_Critical_error_reading_File_0_Cause_1_, copyTargetPath, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1); @@ -436,8 +441,10 @@ Action call = () => importedItem = importer.ImportItem(corruptPath, observableSurfaceLinesList); // Assert - var internalErrorMessage = String.Format(PipingIOResources.Error_File_has_not_double_SurfaceLineName_0_, - "InvalidRow"); + var internalErrorMessage = new FileReaderErrorMessageBuilder(corruptPath) + .WithLocation("op regel 3") + .WithSubject("profielmeting 'InvalidRow'") + .Build(PipingIOResources.Error_SurfaceLine_has_not_double); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_ReadPipingSurfaceLines_Parse_error_File_0_SurfaceLinesNumber_1_Message_2_, corruptPath, 2, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1); @@ -480,8 +487,10 @@ Action call = () => importedItem = importer.ImportItem(path, observableSurfaceLinesList); // Assert - var internalErrorMessage = String.Format(PipingIOResources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLineName_0_has_reclining_geometry, - "Rotterdam1"); + var internalErrorMessage = new FileReaderErrorMessageBuilder(path) + .WithLocation("op regel 2") + .WithSubject("profielmeting 'Rotterdam1'") + .Build(PipingIOResources.PipingSurfaceLinesCsvReader_ReadLine_SurfaceLine_has_reclining_geometry); var expectedLogMessage = string.Format(ApplicationResources.PipingSurfaceLinesCsvImporter_ReadPipingSurfaceLines_Parse_error_File_0_SurfaceLinesNumber_1_Message_2_, path, 1, internalErrorMessage); TestHelper.AssertLogMessageIsGenerated(call, expectedLogMessage, 1);