diff --git a/src/DemaConsulting.ReqStream/TraceMatrix.cs b/src/DemaConsulting.ReqStream/TraceMatrix.cs index 0d5efb3..362f860 100644 --- a/src/DemaConsulting.ReqStream/TraceMatrix.cs +++ b/src/DemaConsulting.ReqStream/TraceMatrix.cs @@ -475,7 +475,7 @@ private void ExportRequirementSection(TextWriter writer, Section section, int de /// The section to check. /// The set of filter tags. /// True if the section has filtered content, false otherwise. - private bool SectionHasFilteredContent(Section section, HashSet? filterTags) + private static bool SectionHasFilteredContent(Section section, HashSet? filterTags) { // Check if section has any matching requirements if (filterTags == null || filterTags.Count == 0) diff --git a/test/DemaConsulting.ReqStream.Tests/ContextTests.cs b/test/DemaConsulting.ReqStream.Tests/ContextTests.cs index 36dfd24..cdcad5a 100644 --- a/test/DemaConsulting.ReqStream.Tests/ContextTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/ContextTests.cs @@ -148,15 +148,8 @@ public void Context_Create_ResultsFlag_SetsResultsFileProperty() [TestMethod] public void Context_Create_MissingResultsFilename_ThrowsException() { - try - { - Context.Create(["--results"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--results requires a filename argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--results"])); + Assert.Contains("--results requires a filename argument", ex.Message); } /// @@ -225,15 +218,8 @@ public void Context_Create_MatrixFile_SetsMatrixProperty() [TestMethod] public void Context_Create_UnsupportedArgument_ThrowsException() { - try - { - Context.Create(["--unsupported"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("Unsupported argument '--unsupported'", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--unsupported"])); + Assert.Contains("Unsupported argument '--unsupported'", ex.Message); } /// @@ -242,15 +228,8 @@ public void Context_Create_UnsupportedArgument_ThrowsException() [TestMethod] public void Context_Create_MissingLogFilename_ThrowsException() { - try - { - Context.Create(["--log"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--log requires a filename argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--log"])); + Assert.Contains("--log requires a filename argument", ex.Message); } /// @@ -259,15 +238,8 @@ public void Context_Create_MissingLogFilename_ThrowsException() [TestMethod] public void Context_Create_MissingReportFilename_ThrowsException() { - try - { - Context.Create(["--report"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--report requires a filename argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--report"])); + Assert.Contains("--report requires a filename argument", ex.Message); } /// @@ -276,15 +248,8 @@ public void Context_Create_MissingReportFilename_ThrowsException() [TestMethod] public void Context_Create_MissingMatrixFilename_ThrowsException() { - try - { - Context.Create(["--matrix"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--matrix requires a filename argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--matrix"])); + Assert.Contains("--matrix requires a filename argument", ex.Message); } /// @@ -293,15 +258,8 @@ public void Context_Create_MissingMatrixFilename_ThrowsException() [TestMethod] public void Context_Create_MissingReportDepth_ThrowsException() { - try - { - Context.Create(["--report-depth"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--report-depth requires a depth argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--report-depth"])); + Assert.Contains("--report-depth requires a depth argument", ex.Message); } /// @@ -310,15 +268,8 @@ public void Context_Create_MissingReportDepth_ThrowsException() [TestMethod] public void Context_Create_MissingMatrixDepth_ThrowsException() { - try - { - Context.Create(["--matrix-depth"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--matrix-depth requires a depth argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--matrix-depth"])); + Assert.Contains("--matrix-depth requires a depth argument", ex.Message); } /// @@ -327,35 +278,14 @@ public void Context_Create_MissingMatrixDepth_ThrowsException() [TestMethod] public void Context_Create_InvalidReportDepth_ThrowsException() { - try - { - Context.Create(["--report-depth", "invalid"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--report-depth requires a positive integer", ex.Message); - } + var ex1 = Assert.ThrowsExactly(() => Context.Create(["--report-depth", "invalid"])); + Assert.Contains("--report-depth requires a positive integer", ex1.Message); - try - { - Context.Create(["--report-depth", "0"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--report-depth requires a positive integer", ex.Message); - } + var ex2 = Assert.ThrowsExactly(() => Context.Create(["--report-depth", "0"])); + Assert.Contains("--report-depth requires a positive integer", ex2.Message); - try - { - Context.Create(["--report-depth", "-1"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--report-depth requires a positive integer", ex.Message); - } + var ex3 = Assert.ThrowsExactly(() => Context.Create(["--report-depth", "-1"])); + Assert.Contains("--report-depth requires a positive integer", ex3.Message); } /// @@ -364,25 +294,11 @@ public void Context_Create_InvalidReportDepth_ThrowsException() [TestMethod] public void Context_Create_InvalidMatrixDepth_ThrowsException() { - try - { - Context.Create(["--matrix-depth", "invalid"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--matrix-depth requires a positive integer", ex.Message); - } + var ex1 = Assert.ThrowsExactly(() => Context.Create(["--matrix-depth", "invalid"])); + Assert.Contains("--matrix-depth requires a positive integer", ex1.Message); - try - { - Context.Create(["--matrix-depth", "0"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--matrix-depth requires a positive integer", ex.Message); - } + var ex2 = Assert.ThrowsExactly(() => Context.Create(["--matrix-depth", "0"])); + Assert.Contains("--matrix-depth requires a positive integer", ex2.Message); } /// @@ -600,15 +516,8 @@ public void Context_Create_WithTestsPattern_ExpandsGlobPattern() [TestMethod] public void Context_Create_MissingRequirementsPattern_ThrowsException() { - try - { - Context.Create(["--requirements"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--requirements requires a pattern argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--requirements"])); + Assert.Contains("--requirements requires a pattern argument", ex.Message); } /// @@ -617,15 +526,8 @@ public void Context_Create_MissingRequirementsPattern_ThrowsException() [TestMethod] public void Context_Create_MissingTestsPattern_ThrowsException() { - try - { - Context.Create(["--tests"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--tests requires a pattern argument", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--tests"])); + Assert.Contains("--tests requires a pattern argument", ex.Message); } /// @@ -672,15 +574,8 @@ public void Context_Create_InvalidLogPath_ThrowsException() { var invalidPath = Path.Combine(_testDirectory, "nonexistent", "test.log"); - try - { - Context.Create(["--log", invalidPath]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("Failed to open log file", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--log", invalidPath])); + Assert.Contains("Failed to open log file", ex.Message); } /// @@ -720,15 +615,8 @@ public void Context_Create_FilterArgumentWithSpaces_TrimsAndParsesTagsCorrectly( [TestMethod] public void Context_Create_FilterArgumentMissingValue_ThrowsArgumentException() { - try - { - Context.Create(["--filter"]); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("--filter requires a comma-separated list of tags", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Context.Create(["--filter"])); + Assert.Contains("--filter requires a comma-separated list of tags", ex.Message); } /// diff --git a/test/DemaConsulting.ReqStream.Tests/RequirementsExportTests.cs b/test/DemaConsulting.ReqStream.Tests/RequirementsExportTests.cs index 150af66..6f2eebe 100644 --- a/test/DemaConsulting.ReqStream.Tests/RequirementsExportTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/RequirementsExportTests.cs @@ -183,15 +183,8 @@ public void Requirements_Export_NullFilePath_ThrowsArgumentException() File.WriteAllText(reqPath, yamlContent); var requirements = Requirements.Read(reqPath); - try - { - requirements.Export(null!); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("File path cannot be null or empty", ex.Message); - } + var ex = Assert.ThrowsExactly(() => requirements.Export(null!)); + Assert.Contains("File path cannot be null or empty", ex.Message); } /// @@ -211,15 +204,8 @@ public void Requirements_Export_EmptyFilePath_ThrowsArgumentException() File.WriteAllText(reqPath, yamlContent); var requirements = Requirements.Read(reqPath); - try - { - requirements.Export(string.Empty); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("File path cannot be null or empty", ex.Message); - } + var ex = Assert.ThrowsExactly(() => requirements.Export(string.Empty)); + Assert.Contains("File path cannot be null or empty", ex.Message); } /// diff --git a/test/DemaConsulting.ReqStream.Tests/RequirementsReadTests.cs b/test/DemaConsulting.ReqStream.Tests/RequirementsReadTests.cs index 3fb4ae6..a89b731 100644 --- a/test/DemaConsulting.ReqStream.Tests/RequirementsReadTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/RequirementsReadTests.cs @@ -326,16 +326,9 @@ public void Requirements_Read_DuplicateRequirementId_ThrowsException() var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("SYS-SEC-001", ex.Message); - Assert.Contains("Duplicate requirement ID", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("SYS-SEC-001", ex.Message); + Assert.Contains("Duplicate requirement ID", ex.Message); } /// @@ -383,15 +376,8 @@ public void Requirements_Read_FileNotFound_ThrowsException() { var nonExistentPath = Path.Combine(_testDirectory, "nonexistent.yaml"); - try - { - Requirements.Read(nonExistentPath); - Assert.Fail("Expected FileNotFoundException was not thrown"); - } - catch (FileNotFoundException ex) - { - Assert.Contains("Requirements file not found", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(nonExistentPath)); + Assert.Contains("Requirements file not found", ex.Message); } /// @@ -496,17 +482,10 @@ public void Requirements_Read_BlankRequirementId_ThrowsExceptionWithFileLocation var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Requirement ID cannot be blank", ex.Message); - Assert.Contains("System Security", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Requirement ID cannot be blank", ex.Message); + Assert.Contains("System Security", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -525,17 +504,10 @@ public void Requirements_Read_BlankRequirementTitle_ThrowsExceptionWithFileLocat var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Requirement title cannot be blank", ex.Message); - Assert.Contains("SYS-SEC-001", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Requirement title cannot be blank", ex.Message); + Assert.Contains("SYS-SEC-001", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -554,16 +526,9 @@ public void Requirements_Read_BlankSectionTitle_ThrowsExceptionWithFileLocation( var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Section title cannot be blank", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Section title cannot be blank", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -586,17 +551,10 @@ public void Requirements_Read_BlankTestNameInRequirement_ThrowsExceptionWithFile var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Test name cannot be blank", ex.Message); - Assert.Contains("SYS-SEC-001", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Test name cannot be blank", ex.Message); + Assert.Contains("SYS-SEC-001", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -621,17 +579,10 @@ public void Requirements_Read_BlankTestNameInMapping_ThrowsExceptionWithFileLoca var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Test name cannot be blank", ex.Message); - Assert.Contains("SYS-SEC-001", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Test name cannot be blank", ex.Message); + Assert.Contains("SYS-SEC-001", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -655,16 +606,9 @@ public void Requirements_Read_BlankMappingId_ThrowsExceptionWithFileLocation() var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Mapping requirement ID cannot be blank", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Mapping requirement ID cannot be blank", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -685,17 +629,10 @@ public void Requirements_Read_DuplicateRequirementId_ExceptionIncludesFileLocati var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("SYS-SEC-001", ex.Message); - Assert.Contains("Duplicate requirement ID", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("SYS-SEC-001", ex.Message); + Assert.Contains("Duplicate requirement ID", ex.Message); + Assert.Contains(filePath, ex.Message); } /// @@ -810,15 +747,8 @@ public void Requirements_Read_SingleFileWithParamsArray_WorksCorrectly() [TestMethod] public void Requirements_Read_NoArguments_ThrowsArgumentException() { - try - { - Requirements.Read(); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("At least one file path must be provided", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read()); + Assert.Contains("At least one file path must be provided", ex.Message); } /// @@ -827,15 +757,8 @@ public void Requirements_Read_NoArguments_ThrowsArgumentException() [TestMethod] public void Requirements_Read_NullArgument_ThrowsArgumentException() { - try - { - Requirements.Read(null!); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("At least one file path must be provided", ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(null!)); + Assert.Contains("At least one file path must be provided", ex.Message); } /// @@ -925,16 +848,9 @@ public void Requirements_Read_BlankTagName_ThrowsExceptionWithFileLocation() var filePath = Path.Combine(_testDirectory, "requirements.yaml"); File.WriteAllText(filePath, yamlContent); - try - { - Requirements.Read(filePath); - Assert.Fail("Expected InvalidOperationException was not thrown"); - } - catch (InvalidOperationException ex) - { - Assert.Contains("Tag name cannot be blank", ex.Message); - Assert.Contains("SYS-SEC-001", ex.Message); - Assert.Contains(filePath, ex.Message); - } + var ex = Assert.ThrowsExactly(() => Requirements.Read(filePath)); + Assert.Contains("Tag name cannot be blank", ex.Message); + Assert.Contains("SYS-SEC-001", ex.Message); + Assert.Contains(filePath, ex.Message); } } diff --git a/test/DemaConsulting.ReqStream.Tests/TraceMatrixExportTests.cs b/test/DemaConsulting.ReqStream.Tests/TraceMatrixExportTests.cs index 5770e82..de1faa1 100644 --- a/test/DemaConsulting.ReqStream.Tests/TraceMatrixExportTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/TraceMatrixExportTests.cs @@ -358,15 +358,8 @@ public void TraceMatrix_Export_NullFilePath_ThrowsArgumentException() // Create TraceMatrix var matrix = new TraceMatrix(requirements); - try - { - matrix.Export(null!); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("File path cannot be null or empty", ex.Message); - } + var ex = Assert.ThrowsExactly(() => matrix.Export(null!)); + Assert.Contains("File path cannot be null or empty", ex.Message); } /// @@ -392,15 +385,8 @@ public void TraceMatrix_Export_EmptyFilePath_ThrowsArgumentException() // Create TraceMatrix var matrix = new TraceMatrix(requirements); - try - { - matrix.Export(string.Empty); - Assert.Fail("Expected ArgumentException was not thrown"); - } - catch (ArgumentException ex) - { - Assert.Contains("File path cannot be null or empty", ex.Message); - } + var ex = Assert.ThrowsExactly(() => matrix.Export(string.Empty)); + Assert.Contains("File path cannot be null or empty", ex.Message); } /// diff --git a/test/DemaConsulting.ReqStream.Tests/TraceMatrixReadTests.cs b/test/DemaConsulting.ReqStream.Tests/TraceMatrixReadTests.cs index 45040da..1bdf865 100644 --- a/test/DemaConsulting.ReqStream.Tests/TraceMatrixReadTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/TraceMatrixReadTests.cs @@ -266,15 +266,8 @@ public void TraceMatrix_WithExtraTests_IgnoresUnreferencedTests() [TestMethod] public void TraceMatrix_NullRequirements_ThrowsArgumentNullException() { - try - { - _ = new TraceMatrix(null!, Array.Empty()); - Assert.Fail("Expected ArgumentNullException was not thrown"); - } - catch (ArgumentNullException ex) - { - Assert.Contains("requirements", ex.Message); - } + var ex = Assert.ThrowsExactly(() => _ = new TraceMatrix(null!, Array.Empty())); + Assert.Contains("requirements", ex.Message); } /// @@ -299,15 +292,8 @@ public void TraceMatrix_MissingFile_ThrowsFileNotFoundException() var nonExistentPath = Path.Combine(_testDirectory, "nonexistent.trx"); - try - { - _ = new TraceMatrix(requirements, nonExistentPath); - Assert.Fail("Expected FileNotFoundException was not thrown"); - } - catch (FileNotFoundException ex) - { - Assert.Contains("Test result file not found", ex.Message); - } + var ex = Assert.ThrowsExactly(() => _ = new TraceMatrix(requirements, nonExistentPath)); + Assert.Contains("Test result file not found", ex.Message); } ///