From 63dcd5c023b608d09052a84b9e566ab73ca6cbe4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 23:18:56 +0000 Subject: [PATCH 1/2] Initial plan From 67b86f0a0e2805c44812dd7902fae794ac620430 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 23:24:59 +0000 Subject: [PATCH 2/2] Add ReqStream_EnforcementMode self-validation test Co-authored-by: Malcolmnixon <1863707+Malcolmnixon@users.noreply.github.com> --- requirements.yaml | 6 ++ src/DemaConsulting.ReqStream/Validation.cs | 101 ++++++++++++++++++ .../ProgramTests.cs | 5 +- 3 files changed, 110 insertions(+), 2 deletions(-) diff --git a/requirements.yaml b/requirements.yaml index bb6d743..26a0b54 100644 --- a/requirements.yaml +++ b/requirements.yaml @@ -436,6 +436,7 @@ sections: - Program_Run_WithEnforcementAndUnsatisfiedRequirements_Fails - Program_Run_WithEnforcementAndNoTests_Fails - Program_Run_WithEnforcementAndFailedTests_Fails + - ReqStream_EnforcementMode - title: Platform Support requirements: @@ -451,6 +452,7 @@ sections: - "windows@ReqStream_TraceMatrix" - "windows@ReqStream_ReportExport" - "windows@ReqStream_TagsFiltering" + - "windows@ReqStream_EnforcementMode" - id: PLT-002 title: The tool shall run on Linux operating systems. @@ -464,6 +466,7 @@ sections: - "ubuntu@ReqStream_TraceMatrix" - "ubuntu@ReqStream_ReportExport" - "ubuntu@ReqStream_TagsFiltering" + - "ubuntu@ReqStream_EnforcementMode" - id: PLT-004 title: The tool shall support .NET 8.0 runtime. @@ -476,6 +479,7 @@ sections: - "dotnet8.x@ReqStream_TraceMatrix" - "dotnet8.x@ReqStream_ReportExport" - "dotnet8.x@ReqStream_TagsFiltering" + - "dotnet8.x@ReqStream_EnforcementMode" - id: PLT-005 title: The tool shall support .NET 9.0 runtime. @@ -489,6 +493,7 @@ sections: - "dotnet9.x@ReqStream_TraceMatrix" - "dotnet9.x@ReqStream_ReportExport" - "dotnet9.x@ReqStream_TagsFiltering" + - "dotnet9.x@ReqStream_EnforcementMode" - id: PLT-006 title: The tool shall support .NET 10.0 runtime. @@ -502,3 +507,4 @@ sections: - "dotnet10.x@ReqStream_TraceMatrix" - "dotnet10.x@ReqStream_ReportExport" - "dotnet10.x@ReqStream_TagsFiltering" + - "dotnet10.x@ReqStream_EnforcementMode" diff --git a/src/DemaConsulting.ReqStream/Validation.cs b/src/DemaConsulting.ReqStream/Validation.cs index c0a904d..42d2f43 100644 --- a/src/DemaConsulting.ReqStream/Validation.cs +++ b/src/DemaConsulting.ReqStream/Validation.cs @@ -50,6 +50,7 @@ public static void Run(Context context) RunTraceMatrixTest(context, testResults); RunReportExportTest(context, testResults); RunTagsFilteringTest(context, testResults); + RunEnforcementModeTest(context, testResults); // Calculate totals var totalTests = testResults.Results.Count; @@ -396,6 +397,106 @@ private static void RunTagsFilteringTest(Context context, DemaConsulting.TestRes FinalizeTestResult(test, startTime, testResults); } + /// + /// Runs a test for enforcement mode functionality. + /// + /// The context for output. + /// The test results collection. + private static void RunEnforcementModeTest(Context context, DemaConsulting.TestResults.TestResults testResults) + { + var startTime = DateTime.UtcNow; + var test = CreateTestResult("ReqStream_EnforcementMode"); + + try + { + using var tempDir = new TemporaryDirectory(); + + // Create a requirements file with a requirement linked to a test + var reqFile = Path.Combine(tempDir.DirectoryPath, "enforce-requirements.yaml"); + var reqYaml = @"sections: + - title: Enforce Test + requirements: + - id: ENF-001 + title: Enforcement requirement + tests: + - Test_Enforce_Validation +"; + File.WriteAllText(reqFile, reqYaml); + + // Create a TRX file with a passing test + var trxFile = Path.Combine(tempDir.DirectoryPath, "test-results.trx"); + var testData = new DemaConsulting.TestResults.TestResults { Name = "EnforceTests" }; + testData.Results.Add(new DemaConsulting.TestResults.TestResult + { + Name = "Test_Enforce_Validation", + ClassName = "EnforceTests", + CodeBase = "Tests.dll", + Outcome = DemaConsulting.TestResults.TestOutcome.Passed, + Duration = TimeSpan.FromSeconds(1) + }); + File.WriteAllText(trxFile, TrxSerializer.Serialize(testData)); + + using (new DirectorySwitch(tempDir.DirectoryPath)) + { + // Verify that --enforce succeeds when all requirements are satisfied + int exitCode; + using (var testContext = Context.Create(["--silent", "--requirements", "*-requirements.yaml", + "--tests", "*.trx", "--enforce"])) + { + Program.Run(testContext); + exitCode = testContext.ExitCode; + } + + if (exitCode != 0) + { + test.Outcome = DemaConsulting.TestResults.TestOutcome.Failed; + test.ErrorMessage = $"Enforcement with satisfied requirements should succeed, but exited with code {exitCode}"; + context.WriteError($"✗ Enforcement Mode Test - FAILED: {test.ErrorMessage}"); + } + else + { + // Create an unsatisfied requirements file for the second check + var unsatisfiedReqFile = Path.Combine(tempDir.DirectoryPath, "unsatisfied-requirements.yaml"); + var unsatisfiedYaml = @"sections: + - title: Unsatisfied Test + requirements: + - id: UNS-001 + title: Unsatisfied requirement + tests: + - Test_NonExistent +"; + File.WriteAllText(unsatisfiedReqFile, unsatisfiedYaml); + + // Verify that --enforce fails when requirements are not satisfied + using (var testContext = Context.Create(["--silent", "--requirements", "unsatisfied-requirements.yaml", + "--tests", "*.trx", "--enforce"])) + { + Program.Run(testContext); + exitCode = testContext.ExitCode; + } + + if (exitCode == 0) + { + test.Outcome = DemaConsulting.TestResults.TestOutcome.Failed; + test.ErrorMessage = "Enforcement with unsatisfied requirements should fail, but succeeded"; + context.WriteError($"✗ Enforcement Mode Test - FAILED: {test.ErrorMessage}"); + } + else + { + test.Outcome = DemaConsulting.TestResults.TestOutcome.Passed; + context.WriteLine("✓ Enforcement Mode Test - PASSED"); + } + } + } + } + catch (Exception ex) + { + HandleTestException(test, context, "Enforcement Mode Test", ex); + } + + FinalizeTestResult(test, startTime, testResults); + } + /// /// Writes test results to a file in TRX or JUnit format. /// diff --git a/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs b/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs index c91acc5..c83eb8b 100644 --- a/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs +++ b/test/DemaConsulting.ReqStream.Tests/ProgramTests.cs @@ -130,8 +130,9 @@ public void Program_Run_WithValidateFlag_RunsValidation() Assert.Contains("Trace Matrix Test - PASSED", logContent); Assert.Contains("Report Export Test - PASSED", logContent); Assert.Contains("Tags Filtering Test - PASSED", logContent); - Assert.Contains("Total Tests: 4", logContent); - Assert.Contains("Passed: 4", logContent); + Assert.Contains("Enforcement Mode Test - PASSED", logContent); + Assert.Contains("Total Tests: 5", logContent); + Assert.Contains("Passed: 5", logContent); Assert.Contains("Failed: 0", logContent); }