Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/Structures/StructuresCharacteristicsCsvReaderTest.cs =================================================================== diff -u -r50d02243937ff6a19020bf095c778252c1c47561 -ref33df6df23a479f0002ee7ac929865c53ed6d82 --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/Structures/StructuresCharacteristicsCsvReaderTest.cs (.../StructuresCharacteristicsCsvReaderTest.cs) (revision 50d02243937ff6a19020bf095c778252c1c47561) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/Structures/StructuresCharacteristicsCsvReaderTest.cs (.../StructuresCharacteristicsCsvReaderTest.cs) (revision ef33df6df23a479f0002ee7ac929865c53ed6d82) @@ -147,9 +147,9 @@ { // Setup string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, - Path.Combine("Structures", - "StructuresCharacteristicsCsvFiles", - fileName)); + Path.Combine("Structures", + "StructuresCharacteristicsCsvFiles", + fileName)); using (var reader = new StructuresCharacteristicsCsvReader(filePath)) { @@ -233,8 +233,8 @@ // Setup string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, Path.Combine("Structures", - "StructuresCharacteristicsCsvFiles", - fileName)); + "StructuresCharacteristicsCsvFiles", + fileName)); using (var reader = new StructuresCharacteristicsCsvReader(filePath)) { @@ -284,5 +284,509 @@ Assert.AreEqual(expectedMessage, message); } } + + [Test] + public void ReadLine_EmptyFile_ThrowCriticalFileReadException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "EmptyFile.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 1: Het bestand is leeg.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + [TestCase("InvalidFile_LocationIdMissing.csv")] + [TestCase("InvalidFile_ParameterIdMissing.csv")] + [TestCase("InvalidFile_NumericValueMissing.csv")] + [TestCase("InvalidFile_VarianceValueMissing.csv")] + [TestCase("InvalidFile_BooleanMissing.csv")] + public void ReadLine_FileLackingLocationIdColumn_ThrowCriticalFileReadException(string fileName) + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", + "StructuresCharacteristicsCsvFiles", + fileName)); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedHeaderColumnsText = "identificatie, kunstwerken.identificatie, numeriekewaarde, standarddeviatie.variance, boolean"; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 1: Het bestand is niet geschikt om kunstwerken parameters uit te lezen (Verwachte koptekst moet de volgende kolommen bevatten: {1}.", + filePath, expectedHeaderColumnsText); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + [TestCase("InvalidFile_DuplicateLocationId.csv", "identificatie")] + [TestCase("InvalidFile_DuplicateParameterId.csv", "kunstwerken.identificatie")] + [TestCase("InvalidFile_DuplicateNumericalValue.csv", "numeriekewaarde")] + [TestCase("InvalidFile_DuplicateVarianceValue.csv", "standarddeviatie.variance")] + [TestCase("InvalidFile_DuplicateBoolean.csv", "boolean")] + public void ReadLine_DuplicateColumn_ThrowCriticalFileReadException(string fileName, string columnName) + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", + "StructuresCharacteristicsCsvFiles", + fileName)); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 1: De kolom '{1}' mag maar 1x gedefinieerd zijn.", + filePath, columnName); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_NoLocations_ReturnNull() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "ValidFile_0Locations.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + StructuresParameterRow parameter = reader.ReadLine(); + + // Assert + Assert.IsNull(parameter); + } + } + + [Test] + public void ReadLine_LineMissingSeparatorCharacter_ThrowLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineLackingSeparator.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Regel ontbreekt het verwachte scheidingsteken (het karakter: ;).", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineMissingValues_ThrowLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineMissingValues.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Regel verwacht van 20 elementen, maar het zijn er 19.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithExtraValues_ThrowLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineWithExtraValues.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Regel verwacht van 20 elementen, maar het zijn er 22.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithNoValueForLocationId_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineWithExtraValues.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Regel verwacht van 20 elementen, maar het zijn er 22.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + [TestCase("1")] + [TestCase("2")] + public void ReadLine_LineWithNoValueForLocationId_ThrowsLineParseException(string fileNamePostFix) + { + // Setup + string fileName = string.Format("InvalidFile_1Location_SecondLineLocationIdEmpty{0}.csv", + fileNamePostFix); + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", fileName)); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: 'Identificatie' kolom mag geen lege waardes bevatten.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + [TestCase("1")] + [TestCase("2")] + public void ReadLine_LineWithNoValueForParameterId_ThrowsLineParseException(string fileNamePostFix) + { + // Setup + string fileName = string.Format("InvalidFile_1Location_SecondLineParameterIdEmpty{0}.csv", + fileNamePostFix); + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", fileName)); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: 'Kunstwerken.identificatie' kolom mag geen lege waardes bevatten.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithPlainTextForNumericValue_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineNumericValueNotNumber.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Nummerieke waarde kan niet worden omgezet naar een getal.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithNumericValueTooLarge_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineNumericValueTooLarge.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Nummerieke waarde is te groot of te klein om ingelezen te worden.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithNumericValueTooSmall_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineNumericValueTooSmall.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Nummerieke waarde is te groot of te klein om ingelezen te worden.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithPlainTextForVarianceValue_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceValueNotNumber.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Variantie waarde kan niet worden omgezet naar een getal.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithVarianceValueTooLarge_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceValueTooLarge.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Variantie waarde is te groot of te klein om ingelezen te worden.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithVarianceValueTooSmall_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceValueTooSmall.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: Variantie waarde is te groot of te klein om ingelezen te worden.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithPlainTextForVarianceType_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceTypeNotNumber.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: De 'Boolean' kolom mag uitsluitend de waardes '0' of '1' bevatten, of mag leeg zijn.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithVarianceTypeTooLarge_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceTypeTooLarge.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: De 'Boolean' kolom mag uitsluitend de waardes '0' of '1' bevatten, of mag leeg zijn.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithVarianceTypeTooSmall_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceTypeTooSmall.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: De 'Boolean' kolom mag uitsluitend de waardes '0' of '1' bevatten, of mag leeg zijn.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithVarianceTypeMinusOne_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceTypeValueMinusOne.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: De 'Boolean' kolom mag uitsluitend de waardes '0' of '1' bevatten, of mag leeg zijn.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + public void ReadLine_LineWithVarianceTypeTwo_ThrowsLineParseException() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "InvalidFile_1Location_SecondLineVarianceTypeValueTwo.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + TestDelegate call = () => reader.ReadLine(); + + // Assert + string message = Assert.Throws(call).Message; + string expectedMessage = string.Format("Fout bij het lezen van bestand '{0}' op regel 2: De 'Boolean' kolom mag uitsluitend de waardes '0' of '1' bevatten, of mag leeg zijn.", + filePath); + Assert.AreEqual(expectedMessage, message); + } + } + + [Test] + [TestCase(1, "KUNST1", "KW_HOOGTE1", 45.0, 0.0, VarianceType.CoefficientOfVariation)] + [TestCase(3, "KUNST1", "KW_HOOGTE3", 18.5, 0.05, VarianceType.StandardDeviation)] + [TestCase(13, "KUNST2", "KW_HOOGTE5", double.NaN, 0.05, VarianceType.StandardDeviation)] + public void ReadLine_ValidFile_ReturnDataFromLine(int lineNumber, string expectedLocationId, string paramterId, + double expectedNumericValue, double expectedVarianceValue, VarianceType expectedType) + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "ValidFile_2Locations_AllHeightStructureParameters.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + StructuresParameterRow parameter = null; + for (int i = 0; i < lineNumber; i++) + { + parameter = reader.ReadLine(); + } + + // Assert + Assert.IsNotNull(parameter); + Assert.AreEqual(expectedLocationId, parameter.LocationId); + Assert.AreEqual(paramterId, parameter.ParameterId); + Assert.AreEqual(expectedNumericValue, parameter.NumericalValue); + Assert.AreEqual(expectedVarianceValue, parameter.VarianceValue); + Assert.AreEqual(expectedType, parameter.VarianceType); + } + } + + [Test] + public void ReadLine_ValidFileWithEmptyVarianceValue_ReturnNaN() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "ValidFile_1Location_AllHeightStructureParameters_VarianceValueEmpty.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + StructuresParameterRow parameter = reader.ReadLine(); + + // Assert + Assert.IsNaN(parameter.VarianceValue); + } + } + + [Test] + public void ReadLine_ValidFileWithEmptyVarianceType_ReturnNotSpecified() + { + // Setup + string filePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, + Path.Combine("Structures", "StructuresCharacteristicsCsvFiles", "ValidFile_1Location_AllHeightStructureParameters_VarianceTypeEmpty.csv")); + + using (var reader = new StructuresCharacteristicsCsvReader(filePath)) + { + // Call + StructuresParameterRow parameter = reader.ReadLine(); + + // Assert + Assert.AreEqual(VarianceType.NotSpecified, parameter.VarianceType); + } + } } } \ No newline at end of file