Skip to content

Commit 9f0bbab

Browse files
fix: IsFailingError respects default rule severity instead of always returning true (#66)
* Initial plan * fix: IsFailingError now respects default rule severity for codes without overrides Agent-Logs-Url: https://github.com/304NotModified/SLNX-validator/sessions/e9e9ca8e-b72a-4da4-8d65-36374c08b9ff Co-authored-by: 304NotModified <5808377+304NotModified@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 304NotModified <5808377+304NotModified@users.noreply.github.com>
1 parent a33939d commit 9f0bbab

3 files changed

Lines changed: 140 additions & 5 deletions

File tree

src/SLNX-validator.Core/Reporting/SeverityOverrides.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ public bool IsVisible(ValidationErrorCode code) =>
2626

2727
public bool IsFailingError(ValidationErrorCode code)
2828
{
29-
if (_overrides.TryGetValue(code, out var severity))
30-
return severity is RuleSeverity.BLOCKER or RuleSeverity.CRITICAL or RuleSeverity.MAJOR;
31-
return true; // default: all errors are failing
29+
var effectiveSeverity = GetEffectiveSeverity(code);
30+
return effectiveSeverity is RuleSeverity.BLOCKER or RuleSeverity.CRITICAL or RuleSeverity.MAJOR;
3231
}
3332

3433
public RuleSeverity GetEffectiveSeverity(ValidationErrorCode code)
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
using AwesomeAssertions;
2+
using JulianVerdurmen.SlnxValidator.Core.Reporting;
3+
using JulianVerdurmen.SlnxValidator.Core.ValidationResults;
4+
5+
namespace JulianVerdurmen.SlnxValidator.Core.Tests;
6+
7+
public class SeverityOverridesTests
8+
{
9+
#region IsFailingError – no overrides
10+
11+
[Test]
12+
public void IsFailingError_NoOverride_MajorDefaultCode_ReturnsTrue()
13+
{
14+
// Arrange
15+
var overrides = SeverityOverrides.Empty;
16+
17+
// Act
18+
var result = overrides.IsFailingError(ValidationErrorCode.FileNotFound);
19+
20+
// Assert
21+
result.Should().BeTrue();
22+
}
23+
24+
[Test]
25+
public void IsFailingError_NoOverride_MinorDefaultCode_ReturnsFalse()
26+
{
27+
// Arrange
28+
var overrides = SeverityOverrides.Empty;
29+
30+
// Act
31+
var result = overrides.IsFailingError(ValidationErrorCode.InvalidExtension);
32+
33+
// Assert
34+
result.Should().BeFalse();
35+
}
36+
37+
[Test]
38+
public void IsFailingError_NoOverride_MinorDefaultCode_InvalidWildcardUsage_ReturnsFalse()
39+
{
40+
// Arrange
41+
var overrides = SeverityOverrides.Empty;
42+
43+
// Act
44+
var result = overrides.IsFailingError(ValidationErrorCode.InvalidWildcardUsage);
45+
46+
// Assert
47+
result.Should().BeFalse();
48+
}
49+
50+
#endregion
51+
52+
#region IsFailingError – with overrides
53+
54+
[Test]
55+
public void IsFailingError_OverriddenToMinor_ReturnsFalse()
56+
{
57+
// Arrange
58+
var overrides = new SeverityOverrides(new Dictionary<ValidationErrorCode, RuleSeverity?>
59+
{
60+
{ ValidationErrorCode.FileNotFound, RuleSeverity.MINOR }
61+
});
62+
63+
// Act
64+
var result = overrides.IsFailingError(ValidationErrorCode.FileNotFound);
65+
66+
// Assert
67+
result.Should().BeFalse();
68+
}
69+
70+
[Test]
71+
public void IsFailingError_OverriddenToInfo_ReturnsFalse()
72+
{
73+
// Arrange
74+
var overrides = new SeverityOverrides(new Dictionary<ValidationErrorCode, RuleSeverity?>
75+
{
76+
{ ValidationErrorCode.FileNotFound, RuleSeverity.INFO }
77+
});
78+
79+
// Act
80+
var result = overrides.IsFailingError(ValidationErrorCode.FileNotFound);
81+
82+
// Assert
83+
result.Should().BeFalse();
84+
}
85+
86+
[Test]
87+
public void IsFailingError_OverriddenToMajor_ReturnsTrue()
88+
{
89+
// Arrange
90+
var overrides = new SeverityOverrides(new Dictionary<ValidationErrorCode, RuleSeverity?>
91+
{
92+
{ ValidationErrorCode.InvalidExtension, RuleSeverity.MAJOR }
93+
});
94+
95+
// Act
96+
var result = overrides.IsFailingError(ValidationErrorCode.InvalidExtension);
97+
98+
// Assert
99+
result.Should().BeTrue();
100+
}
101+
102+
[Test]
103+
public void IsFailingError_OverriddenToBlocker_ReturnsTrue()
104+
{
105+
// Arrange
106+
var overrides = new SeverityOverrides(new Dictionary<ValidationErrorCode, RuleSeverity?>
107+
{
108+
{ ValidationErrorCode.FileNotFound, RuleSeverity.BLOCKER }
109+
});
110+
111+
// Act
112+
var result = overrides.IsFailingError(ValidationErrorCode.FileNotFound);
113+
114+
// Assert
115+
result.Should().BeTrue();
116+
}
117+
118+
[Test]
119+
public void IsFailingError_OverriddenToCritical_ReturnsTrue()
120+
{
121+
// Arrange
122+
var overrides = new SeverityOverrides(new Dictionary<ValidationErrorCode, RuleSeverity?>
123+
{
124+
{ ValidationErrorCode.FileNotFound, RuleSeverity.CRITICAL }
125+
});
126+
127+
// Act
128+
var result = overrides.IsFailingError(ValidationErrorCode.FileNotFound);
129+
130+
// Assert
131+
result.Should().BeTrue();
132+
}
133+
134+
#endregion
135+
}

tests/SLNX-validator.Tests/ProgramIntegrationTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,17 @@ await File.WriteAllTextAsync(slnxPath, """
105105
}
106106

107107
[Test]
108-
public async Task Invoke_WithNonSlnxExtension_ReturnsNonZeroExitCode()
108+
public async Task Invoke_WithNonSlnxExtension_ReturnsZeroExitCode()
109109
{
110+
// InvalidExtension (SLNX002) has default severity MINOR, which does not cause exit code 1
110111
var path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".xml");
111112
await File.WriteAllTextAsync(path, "<Solution />");
112113

113114
try
114115
{
115116
var exitCode = await Program.Main([path]);
116117

117-
exitCode.Should().NotBe(0);
118+
exitCode.Should().Be(0);
118119
}
119120
finally
120121
{

0 commit comments

Comments
 (0)