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);
}