diff --git a/src/DemaConsulting.ReqStream/Requirements.cs b/src/DemaConsulting.ReqStream/Requirements.cs index a98b114..870b286 100644 --- a/src/DemaConsulting.ReqStream/Requirements.cs +++ b/src/DemaConsulting.ReqStream/Requirements.cs @@ -215,13 +215,9 @@ private void ReadFile(string path) // Recursively process any included files if (document.Includes != null) { - // Process each included file - foreach (var include in document.Includes) + // Process each included file by resolving paths and recursively reading + foreach (var includePath in document.Includes.Select(include => Path.Combine(baseDirectory, include))) { - // Resolve the include path relative to the current file - var includePath = Path.Combine(baseDirectory, include); - - // Recursively read the included file ReadFile(includePath); } } diff --git a/src/DemaConsulting.ReqStream/TraceMatrix.cs b/src/DemaConsulting.ReqStream/TraceMatrix.cs index 623edc0..35c55cb 100644 --- a/src/DemaConsulting.ReqStream/TraceMatrix.cs +++ b/src/DemaConsulting.ReqStream/TraceMatrix.cs @@ -222,16 +222,9 @@ private bool IsRequirementSatisfied(Requirement requirement, Section rootSection } // All tests must have been executed and passed - foreach (var testName in allTests) - { - var result = GetTestResult(testName); - if (result == null || result.Executed == 0 || result.Passed != result.Executed) - { - return false; - } - } - - return true; + return allTests + .Select(testName => GetTestResult(testName)) + .All(result => result != null && result.Executed > 0 && result.Passed == result.Executed); } /// @@ -249,13 +242,9 @@ private static void CollectAllTests(Requirement requirement, Section rootSection } // Recursively add tests from children - foreach (var childId in requirement.Children) + foreach (var childReq in requirement.Children.Select(childId => FindRequirement(rootSection, childId)).Where(childReq => childReq != null)) { - var childReq = FindRequirement(rootSection, childId); - if (childReq != null) - { - CollectAllTests(childReq, rootSection, allTests); - } + CollectAllTests(childReq!, rootSection, allTests); } } @@ -268,25 +257,16 @@ private static void CollectAllTests(Requirement requirement, Section rootSection private static Requirement? FindRequirement(Section section, string requirementId) { // Search in current section - foreach (var req in section.Requirements) + var requirement = section.Requirements.FirstOrDefault(req => req.Id == requirementId); + if (requirement != null) { - if (req.Id == requirementId) - { - return req; - } + return requirement; } // Search in child sections - foreach (var childSection in section.Sections) - { - var found = FindRequirement(childSection, requirementId); - if (found != null) - { - return found; - } - } - - return null; + return section.Sections + .Select(childSection => FindRequirement(childSection, requirementId)) + .FirstOrDefault(found => found != null); } /// @@ -356,24 +336,19 @@ private void ExportRequirementSection(TextWriter writer, Section section, int de var failed = 0; var notExecuted = 0; - foreach (var testName in requirement.Tests) + foreach (var result in requirement.Tests.Select(testName => GetTestResult(testName))) { - var result = GetTestResult(testName); if (result == null || result.Executed == 0) { notExecuted++; } + else if (result.Executed - result.Passed > 0) + { + failed++; + } else { - var failedCount = result.Executed - result.Passed; - if (failedCount > 0) - { - failed++; - } - else - { - passed++; - } + passed++; } } @@ -453,18 +428,14 @@ private static HashSet CollectTestNames(Section section) var testNames = new HashSet(); // Collect tests from requirements in this section - foreach (var requirement in section.Requirements) + foreach (var test in section.Requirements.SelectMany(requirement => requirement.Tests)) { - foreach (var test in requirement.Tests) - { - testNames.Add(test); - } + testNames.Add(test); } // Recursively collect tests from child sections - foreach (var childSection in section.Sections) + foreach (var childTests in section.Sections.Select(childSection => CollectTestNames(childSection))) { - var childTests = CollectTestNames(childSection); testNames.UnionWith(childTests); } diff --git a/test/DemaConsulting.ReqStream.Tests/ContextTests.cs b/test/DemaConsulting.ReqStream.Tests/ContextTests.cs index ca232c1..8d959f4 100644 --- a/test/DemaConsulting.ReqStream.Tests/ContextTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/ContextTests.cs @@ -391,7 +391,7 @@ public void Context_Create_InvalidMatrixDepth_ThrowsException() public void Context_WriteLine_NormalMode_WritesToConsole() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -414,7 +414,7 @@ public void Context_WriteLine_NormalMode_WritesToConsole() public void Context_WriteLine_SilentMode_DoesNotWriteToConsole() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -437,7 +437,7 @@ public void Context_WriteLine_SilentMode_DoesNotWriteToConsole() public void Context_WriteError_NormalMode_WritesToConsole() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -461,7 +461,7 @@ public void Context_WriteError_NormalMode_WritesToConsole() public void Context_WriteError_SilentMode_DoesNotWriteToConsole() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -505,7 +505,7 @@ public void Context_Create_WithLogFile_WritesToLogFile() public void Context_Create_WithLogFileAndSilent_WritesToLogOnly() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -653,9 +653,10 @@ public void Context_Dispose_WithLogFile_ClosesLogFile() { var logPath = Path.Combine(_testDirectory, "test.log"); - var context = Context.Create(["--log", logPath, "--silent"]); - context.WriteLine("Test message"); - context.Dispose(); + using (var context = Context.Create(["--log", logPath, "--silent"])) + { + context.WriteLine("Test message"); + } // Should be able to delete the file after dispose File.Delete(logPath); diff --git a/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs b/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs index 8911a90..130a8e3 100644 --- a/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs @@ -57,7 +57,7 @@ public void TestCleanup() public void Program_Run_WithVersionFlag_PrintsVersion() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -84,7 +84,7 @@ public void Program_Run_WithVersionFlag_PrintsVersion() public void Program_Run_WithHelpFlag_PrintsHelp() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -349,7 +349,7 @@ public void Program_Run_WithTraceMatrixExport_GeneratesMatrix() public void Program_Run_WithVersionAndHelp_ProcessesVersionFirst() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -376,7 +376,7 @@ public void Program_Run_WithVersionAndHelp_ProcessesVersionFirst() public void Program_Run_WithHelpAndValidate_ProcessesHelpFirst() { var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try @@ -484,7 +484,7 @@ public void Program_Run_WithEnforcementAndUnsatisfiedRequirements_Fails() // Save current directory and change to test directory var originalDir = Directory.GetCurrentDirectory(); var originalOut = Console.Out; - var output = new StringWriter(); + using var output = new StringWriter(); Console.SetOut(output); try