Skip to content

Commit 6c83337

Browse files
committed
[.NET] More robust ndjson handling for Spec/UnitTests
1 parent fc9b7d7 commit 6c83337

File tree

8 files changed

+21
-54
lines changed

8 files changed

+21
-54
lines changed

dotnet/Gherkin.Specs/AstBuildingTests.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ namespace Gherkin.Specs;
88
public class AstBuildingTests : EventTestBase
99
{
1010
[Theory, MemberData(nameof(TestFileProvider.GetValidTestFiles), MemberType = typeof(TestFileProvider))]
11-
public void TestSuccessfulAstBuilding(string testFeatureFile)
11+
public async Task TestSuccessfulAstBuilding(string testFeatureFile)
1212
{
1313
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "good", ".ast.ndjson");
14-
var expectedAstContent = GetExpectedContent(testFile.ExpectedFileFullPath);
1514

16-
var expectedGherkinDocumentEvent = NDJsonParser.Deserialize<Envelope>(expectedAstContent);
15+
var expectedGherkinDocumentEvent = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);
1716

1817
var raisedEvents = ProcessGherkinEvents(testFile.FullPath, false, true, false);
1918

@@ -22,12 +21,11 @@ public void TestSuccessfulAstBuilding(string testFeatureFile)
2221
}
2322

2423
[Theory, MemberData(nameof(TestFileProvider.GetInvalidTestFiles), MemberType = typeof(TestFileProvider))]
25-
public void TestFailedAstBuilding(string testFeatureFile)
24+
public async Task TestFailedAstBuilding(string testFeatureFile)
2625
{
2726
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "bad", ".errors.ndjson");
28-
var expectedAstContent = GetExpectedContent(testFile.ExpectedFileFullPath);
2927

30-
var expectedGherkinDocumentEvent = NDJsonParser.Deserialize<Envelope>(expectedAstContent);
28+
var expectedGherkinDocumentEvent = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);
3129

3230
var raisedEvents = ProcessGherkinEvents(testFile.FullPath, false, true, false);
3331

dotnet/Gherkin.Specs/DependencyValidationTests.cs

Lines changed: 0 additions & 21 deletions
This file was deleted.

dotnet/Gherkin.Specs/EventTestBase.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,4 @@ protected List<Envelope> ProcessGherkinEvents(string fullPathToTestFeatureFile,
7171

7272
return raisedEvents;
7373
}
74-
75-
protected string GetExpectedContent(string expectedAstFile)
76-
{
77-
return File.ReadAllText(expectedAstFile, Encoding.UTF8);
78-
}
7974
}

dotnet/Gherkin.Specs/Gherkin.Specs.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFrameworks>net9.0;net8.0</TargetFrameworks>
@@ -19,7 +19,7 @@
1919
</ItemGroup>
2020

2121
<ItemGroup>
22-
<PackageReference Include="System.Text.Json" Version="8.0.5" />
22+
<PackageReference Include="System.Text.Json" Version="9.0.5" />
2323
</ItemGroup>
2424

2525
<ItemGroup>

dotnet/Gherkin.Specs/Helper/NDJsonParser.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
using System.Text.Json;
22
using System.Text.Json.Serialization;
33

4-
54
namespace Gherkin.Specs.Helper;
65

76
public class NDJsonParser
87
{
9-
public static List<T> Deserialize<T>(string ndjson)
8+
static readonly JsonSerializerOptions s_SerializerOptions = new(JsonSerializerDefaults.Web)
109
{
11-
var lines = ndjson.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
10+
Converters =
11+
{
12+
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
13+
}
14+
};
1215

16+
public static async Task<List<T>> DeserializeAsync<T>(string expectedFile)
17+
{
1318
var result = new List<T>();
19+
using var contentStream = File.OpenRead(expectedFile);
1420

15-
foreach (var line in lines)
21+
await foreach (var deserializedObject in JsonSerializer.DeserializeAsyncEnumerable<T>(contentStream, true, s_SerializerOptions))
1622
{
17-
var deserializedObject = JsonSerializer.Deserialize<T>(line, new JsonSerializerOptions(JsonSerializerDefaults.Web)
18-
{
19-
Converters =
20-
{
21-
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
22-
}
23-
});
2423
result.Add(deserializedObject);
2524
}
2625

dotnet/Gherkin.Specs/PicklesTests.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ namespace Gherkin.Specs;
88
public class PicklesTests : EventTestBase
99
{
1010
[Theory, MemberData(nameof(TestFileProvider.GetValidTestFiles), MemberType = typeof(TestFileProvider))]
11-
public void TestPickleCompilation(string testFeatureFile)
11+
public async Task TestPickleCompilation(string testFeatureFile)
1212
{
1313
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "good", ".pickles.ndjson");
1414

15-
var expectedContent = GetExpectedContent(testFile.ExpectedFileFullPath);
16-
17-
var expectedEvents = NDJsonParser.Deserialize<Envelope>(expectedContent);
15+
var expectedEvents = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);
1816

1917
var raisedEvents = ProcessGherkinEvents(testFile.FullPath, false, false, true);
2018

dotnet/Gherkin.Specs/SourceTests.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ namespace Gherkin.Specs;
88
public class SourceTests : EventTestBase
99
{
1010
[Theory, MemberData(nameof(TestFileProvider.GetValidTestFiles), MemberType = typeof(TestFileProvider))]
11-
public void TestSourceMessage(string testFeatureFile)
11+
public async Task TestSourceMessage(string testFeatureFile)
1212
{
1313
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "good", ".source.ndjson");
1414

15-
var expectedAstContent = GetExpectedContent(testFile.ExpectedFileFullPath);
16-
17-
var expectedGherkinDocumentEvent = NDJsonParser.Deserialize<Envelope>(expectedAstContent);
15+
var expectedGherkinDocumentEvent = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);
1816

1917
var raisedEvents = ProcessGherkinEvents(testFile.FullPath, true, false, false);
2018

dotnet/Gherkin.Specs/Tokens/TokensGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public static string GenerateTokens(string featureFilePath)
77
var tokenFormatterBuilder = new TokenFormatterBuilder();
88
var parser = new Parser<object>(tokenFormatterBuilder);
99

10-
using (var stream = new FileStream(featureFilePath, FileMode.Open))
10+
using (var stream = File.OpenRead(featureFilePath))
1111
{
1212
using (var reader = new StreamReader(stream))
1313
{

0 commit comments

Comments
 (0)