Skip to content

Commit 4ecb7ea

Browse files
committed
test: update tests for stricter analyzers
Adapt to IList/IDictionary/IReadOnlyList interface changes from Core. Add braces to single-statement blocks (SA1503). Use string.Equals with StringComparison (MA0006). Add IFormatProvider to TryParse calls (MA0011). Update FilterNode regex timeout test to use named capture group (ExplicitCapture prevents backtracking on unnamed groups). Fix var usage (IDE0007/IDE0008) and remove unused usings (IDE0005). Co-Authored-By: Rooty
1 parent 41961f5 commit 4ecb7ea

24 files changed

Lines changed: 75 additions & 70 deletions

tests/FlowForge.Tests/Cli/JsonOutputTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void ExecutionResult_serializes_to_expected_json_shape()
4242
});
4343

4444
string json = JsonSerializer.Serialize(result, JsonOptions);
45-
using JsonDocument doc = JsonDocument.Parse(json);
45+
using var doc = JsonDocument.Parse(json);
4646
JsonElement root = doc.RootElement;
4747

4848
root.GetProperty("isDryRun").GetBoolean().Should().BeTrue();

tests/FlowForge.Tests/DependencyInjection/ServiceCollectionExtensionsTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using FlowForge.Core.Settings;
44
using FluentAssertions;
55
using Microsoft.Extensions.DependencyInjection;
6-
using Microsoft.Extensions.Logging;
76

87
namespace FlowForge.Tests.DependencyInjection;
98

tests/FlowForge.Tests/Execution/NodeRegistryTests.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ private static NodeDefinition MakeDef(string typeKey, object? config = null)
3030
if (config != null)
3131
{
3232
string json = JsonSerializer.Serialize(config);
33-
JsonDocument doc = JsonDocument.Parse(json);
33+
var doc = JsonDocument.Parse(json);
3434
configDict = doc.RootElement.EnumerateObject()
3535
.ToDictionary(p => p.Name, p => p.Value.Clone());
3636
}
@@ -40,7 +40,7 @@ private static NodeDefinition MakeDef(string typeKey, object? config = null)
4040
[Fact]
4141
public void CreateDefault_registers_all_11_node_types()
4242
{
43-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
43+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
4444

4545
registry.GetRegisteredTypeKeys().Should().HaveCount(11);
4646
}
@@ -49,15 +49,15 @@ public void CreateDefault_registers_all_11_node_types()
4949
[MemberData(nameof(AllTypeKeysData))]
5050
public void IsRegistered_returns_true_for_all_default_keys(string typeKey)
5151
{
52-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
52+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
5353

5454
registry.IsRegistered(typeKey).Should().BeTrue();
5555
}
5656

5757
[Fact]
5858
public void GetSource_returns_ISourceNode_for_FolderInput()
5959
{
60-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
60+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
6161
NodeDefinition def = MakeDef("FolderInput", new { path = "/tmp" });
6262

6363
ISourceNode source = registry.GetSource(def);
@@ -69,7 +69,7 @@ public void GetSource_returns_ISourceNode_for_FolderInput()
6969
[Fact]
7070
public void GetTransform_returns_ITransformNode_for_RenamePattern()
7171
{
72-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
72+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
7373
NodeDefinition def = MakeDef("RenamePattern", new { pattern = "{name}{ext}" });
7474

7575
ITransformNode transform = registry.GetTransform(def);
@@ -81,7 +81,7 @@ public void GetTransform_returns_ITransformNode_for_RenamePattern()
8181
[Fact]
8282
public void GetOutput_returns_IOutputNode_for_FolderOutput()
8383
{
84-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
84+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
8585
NodeDefinition def = MakeDef("FolderOutput", new { path = "/tmp" });
8686

8787
IOutputNode output = registry.GetOutput(def);
@@ -93,31 +93,31 @@ public void GetOutput_returns_IOutputNode_for_FolderOutput()
9393
[Fact]
9494
public void IsRegistered_returns_false_for_unknown_key()
9595
{
96-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
96+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
9797

9898
registry.IsRegistered("TotallyFakeNode").Should().BeFalse();
9999
}
100100

101101
[Fact]
102102
public void GetCategoryForTypeKey_returns_Source_for_FolderInput()
103103
{
104-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
104+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
105105

106106
registry.GetCategoryForTypeKey("FolderInput").Should().Be(NodeCategory.Source);
107107
}
108108

109109
[Fact]
110110
public void GetCategoryForTypeKey_returns_Transform_for_Filter()
111111
{
112-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
112+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
113113

114114
registry.GetCategoryForTypeKey("Filter").Should().Be(NodeCategory.Transform);
115115
}
116116

117117
[Fact]
118118
public void GetCategoryForTypeKey_returns_Output_for_FolderOutput()
119119
{
120-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
120+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
121121

122122
registry.GetCategoryForTypeKey("FolderOutput").Should().Be(NodeCategory.Output);
123123
}
@@ -126,7 +126,7 @@ public void GetCategoryForTypeKey_returns_Output_for_FolderOutput()
126126
[MemberData(nameof(AllTypeKeysData))]
127127
public void GetDisplayName_returns_non_empty_string_for_all_keys(string typeKey)
128128
{
129-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
129+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
130130

131131
string displayName = registry.GetDisplayName(typeKey);
132132

@@ -137,7 +137,7 @@ public void GetDisplayName_returns_non_empty_string_for_all_keys(string typeKey)
137137
[MemberData(nameof(AllTypeKeysData))]
138138
public void GetConfigSchema_returns_non_null_non_empty_list_for_all_keys(string typeKey)
139139
{
140-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
140+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
141141

142142
IReadOnlyList<ConfigField> schema = registry.GetConfigSchema(typeKey);
143143

@@ -148,7 +148,7 @@ public void GetConfigSchema_returns_non_null_non_empty_list_for_all_keys(string
148148
[Fact]
149149
public void GetSource_throws_for_unregistered_typeKey()
150150
{
151-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
151+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
152152
NodeDefinition def = MakeDef("NonExistent");
153153

154154
Action act = () => registry.GetSource(def);
@@ -160,7 +160,7 @@ public void GetSource_throws_for_unregistered_typeKey()
160160
[Fact]
161161
public void GetTransform_throws_for_unregistered_typeKey()
162162
{
163-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
163+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
164164
NodeDefinition def = MakeDef("NonExistent");
165165

166166
Action act = () => registry.GetTransform(def);
@@ -172,7 +172,7 @@ public void GetTransform_throws_for_unregistered_typeKey()
172172
[Fact]
173173
public void GetOutput_throws_for_unregistered_typeKey()
174174
{
175-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
175+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
176176
NodeDefinition def = MakeDef("NonExistent");
177177

178178
Action act = () => registry.GetOutput(def);
@@ -184,7 +184,7 @@ public void GetOutput_throws_for_unregistered_typeKey()
184184
[Fact]
185185
public void GetSource_throws_when_node_is_transform()
186186
{
187-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
187+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
188188
NodeDefinition def = MakeDef("RenamePattern", new { pattern = "{name}{ext}" });
189189

190190
Action act = () => registry.GetSource(def);
@@ -196,7 +196,7 @@ public void GetSource_throws_when_node_is_transform()
196196
[Fact]
197197
public void GetTransform_throws_when_node_is_source()
198198
{
199-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
199+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
200200
NodeDefinition def = MakeDef("FolderInput", new { path = "/tmp" });
201201

202202
Action act = () => registry.GetTransform(def);
@@ -208,7 +208,7 @@ public void GetTransform_throws_when_node_is_source()
208208
[Fact]
209209
public void GetOutput_throws_when_node_is_source()
210210
{
211-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
211+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
212212
NodeDefinition def = MakeDef("FolderInput", new { path = "/tmp" });
213213

214214
Action act = () => registry.GetOutput(def);

tests/FlowForge.Tests/Execution/Phase1IntegrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class Phase1IntegrationTests
1010
{
1111
private static PipelineRunner CreateRunner()
1212
{
13-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
13+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
1414
return new PipelineRunner(registry, NullLogger<PipelineRunner>.Instance, maxConcurrency: 2);
1515
}
1616

tests/FlowForge.Tests/Execution/PipelineRunnerProgressTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void Report(T value)
2828

2929
private static PipelineRunner CreateRunner()
3030
{
31-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
31+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
3232
return new PipelineRunner(registry, NullLogger<PipelineRunner>.Instance, maxConcurrency: 2);
3333
}
3434

@@ -70,7 +70,7 @@ public async Task RunAsync_ReportsFilesDiscovered_DuringEnumeration()
7070

7171
await runner.RunAsync(pipeline, dryRun: true, progress);
7272

73-
List<FilesDiscovered> discovered = progress.Events.OfType<FilesDiscovered>().ToList();
73+
var discovered = progress.Events.OfType<FilesDiscovered>().ToList();
7474
discovered.Should().NotBeEmpty();
7575
discovered[discovered.Count - 1].TotalCount.Should().Be(3);
7676
}
@@ -118,7 +118,7 @@ public async Task RunAsync_ReportsFileProcessed_PerJob()
118118

119119
await runner.RunAsync(pipeline, dryRun: true, progress);
120120

121-
List<FileProcessed> processed = progress.Events.OfType<FileProcessed>().ToList();
121+
var processed = progress.Events.OfType<FileProcessed>().ToList();
122122
processed.Should().HaveCount(3);
123123
processed.Should().OnlyContain(fp => fp.Job.Status == FileJobStatus.Succeeded);
124124
}

tests/FlowForge.Tests/Execution/PipelineRunnerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class PipelineRunnerTests
1010
{
1111
private static PipelineRunner CreateRunner()
1212
{
13-
NodeRegistry registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
13+
var registry = NodeRegistry.CreateDefault(NullLoggerFactory.Instance);
1414
return new PipelineRunner(registry, NullLogger<PipelineRunner>.Instance, maxConcurrency: 2);
1515
}
1616

tests/FlowForge.Tests/Helpers/ConfigHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ internal static class ConfigHelper
55
public static Dictionary<string, System.Text.Json.JsonElement> MakeConfig(params (string Key, string Value)[] pairs)
66
{
77
var dict = new Dictionary<string, System.Text.Json.JsonElement>();
8-
foreach (var pair in pairs)
8+
foreach ((string Key, string Value) pair in pairs)
99
{
1010
dict[pair.Key] = System.Text.Json.JsonSerializer.Deserialize<System.Text.Json.JsonElement>($"\"{pair.Value}\"");
1111
}

tests/FlowForge.Tests/Helpers/PipelineBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ public PipelineGraph Build()
5757
private static NodeDefinition CreateNode(string typeKey, object config)
5858
{
5959
string json = JsonSerializer.Serialize(config);
60-
JsonDocument doc = JsonDocument.Parse(json);
61-
Dictionary<string, JsonElement> configDict = doc.RootElement
60+
var doc = JsonDocument.Parse(json);
61+
var configDict = doc.RootElement
6262
.EnumerateObject()
6363
.ToDictionary(p => p.Name, p => p.Value.Clone());
6464

tests/FlowForge.Tests/Helpers/TestFileFactory.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ public static void CreateTestImage(string filePath, int width = 100, int height
1010
{
1111
string? dir = Path.GetDirectoryName(filePath);
1212
if (dir != null)
13+
{
1314
Directory.CreateDirectory(dir);
15+
}
1416

1517
using var image = new Image<Rgba32>(width, height, Color.CornflowerBlue);
1618
image.SaveAsJpeg(filePath);
@@ -21,7 +23,9 @@ public static void CreateTestPng(string filePath, int width = 100, int height =
2123
{
2224
string? dir = Path.GetDirectoryName(filePath);
2325
if (dir != null)
26+
{
2427
Directory.CreateDirectory(dir);
28+
}
2529

2630
using var image = new Image<Rgba32>(width, height, Color.CornflowerBlue);
2731
image.SaveAsPng(filePath);
@@ -32,7 +36,9 @@ public static void CreateTestBmp(string filePath, int width = 100, int height =
3236
{
3337
string? dir = Path.GetDirectoryName(filePath);
3438
if (dir != null)
39+
{
3540
Directory.CreateDirectory(dir);
41+
}
3642

3743
using var image = new Image<Rgba32>(width, height, Color.CornflowerBlue);
3844
image.SaveAsBmp(filePath);
@@ -46,10 +52,14 @@ public static void CreateTestImages(string directory, params string[] fileNames)
4652
{
4753
string ext = Path.GetExtension(fileName).ToLowerInvariant();
4854
string filePath = Path.Combine(directory, fileName);
49-
if (ext == ".png")
55+
if (string.Equals(ext, ".png", StringComparison.Ordinal))
56+
{
5057
CreateTestPng(filePath);
58+
}
5159
else
60+
{
5261
CreateTestImage(filePath);
62+
}
5363
}
5464
}
5565
}

tests/FlowForge.Tests/Nodes/FilterNodeTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class FilterNodeTests
1313
private static Dictionary<string, JsonElement> MakeConfig(object conditions)
1414
{
1515
string json = JsonSerializer.Serialize(new { conditions });
16-
JsonDocument doc = JsonDocument.Parse(json);
16+
var doc = JsonDocument.Parse(json);
1717
return doc.RootElement.EnumerateObject()
1818
.ToDictionary(p => p.Name, p => p.Value.Clone());
1919
}
@@ -178,10 +178,10 @@ public async Task File_not_matching_extension_is_marked_skipped()
178178
public async Task Regex_timeout_sets_failed_and_returns_empty()
179179
{
180180
var node = new FilterNode(NullLogger<FilterNode>.Instance);
181-
// Catastrophic backtracking pattern: (a+)+ against a long string of 'a's followed by '!'
181+
// Catastrophic backtracking pattern: named group still captured with ExplicitCapture
182182
node.Configure(MakeConfig(new[]
183183
{
184-
new { field = "filename", @operator = "matches", value = @"^(a+)+$" }
184+
new { field = "filename", @operator = "matches", value = @"^(?<g>a+)+$" }
185185
}));
186186

187187
var job = new FileJob

0 commit comments

Comments
 (0)