Skip to content

[.NET] More robust ndjson handling for Spec/UnitTests #406

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions dotnet/Gherkin.Specs/AstBuildingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ namespace Gherkin.Specs;
public class AstBuildingTests : EventTestBase
{
[Theory, MemberData(nameof(TestFileProvider.GetValidTestFiles), MemberType = typeof(TestFileProvider))]
public void TestSuccessfulAstBuilding(string testFeatureFile)
public async Task TestSuccessfulAstBuilding(string testFeatureFile)
{
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "good", ".ast.ndjson");
var expectedAstContent = GetExpectedContent(testFile.ExpectedFileFullPath);

var expectedGherkinDocumentEvent = NDJsonParser.Deserialize<Envelope>(expectedAstContent);
var expectedGherkinDocumentEvent = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);

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

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

[Theory, MemberData(nameof(TestFileProvider.GetInvalidTestFiles), MemberType = typeof(TestFileProvider))]
public void TestFailedAstBuilding(string testFeatureFile)
public async Task TestFailedAstBuilding(string testFeatureFile)
{
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "bad", ".errors.ndjson");
var expectedAstContent = GetExpectedContent(testFile.ExpectedFileFullPath);

var expectedGherkinDocumentEvent = NDJsonParser.Deserialize<Envelope>(expectedAstContent);
var expectedGherkinDocumentEvent = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);

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

Expand Down
21 changes: 0 additions & 21 deletions dotnet/Gherkin.Specs/DependencyValidationTests.cs

This file was deleted.

5 changes: 0 additions & 5 deletions dotnet/Gherkin.Specs/EventTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,4 @@ protected List<Envelope> ProcessGherkinEvents(string fullPathToTestFeatureFile,

return raisedEvents;
}

protected string GetExpectedContent(string expectedAstFile)
{
return File.ReadAllText(expectedAstFile, Encoding.UTF8);
}
}
4 changes: 2 additions & 2 deletions dotnet/Gherkin.Specs/Gherkin.Specs.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net9.0;net8.0</TargetFrameworks>
Expand All @@ -19,7 +19,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Text.Json" Version="8.0.5" />
<PackageReference Include="System.Text.Json" Version="9.0.5" />
</ItemGroup>

<ItemGroup>
Expand Down
21 changes: 10 additions & 11 deletions dotnet/Gherkin.Specs/Helper/NDJsonParser.cs
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
using System.Text.Json;
using System.Text.Json.Serialization;


namespace Gherkin.Specs.Helper;

public class NDJsonParser
{
public static List<T> Deserialize<T>(string ndjson)
static readonly JsonSerializerOptions s_SerializerOptions = new(JsonSerializerDefaults.Web)
{
var lines = ndjson.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
};

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

foreach (var line in lines)
await foreach (var deserializedObject in JsonSerializer.DeserializeAsyncEnumerable<T>(contentStream, true, s_SerializerOptions))
{
var deserializedObject = JsonSerializer.Deserialize<T>(line, new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
});
result.Add(deserializedObject);
}

Expand Down
6 changes: 2 additions & 4 deletions dotnet/Gherkin.Specs/PicklesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@ namespace Gherkin.Specs;
public class PicklesTests : EventTestBase
{
[Theory, MemberData(nameof(TestFileProvider.GetValidTestFiles), MemberType = typeof(TestFileProvider))]
public void TestPickleCompilation(string testFeatureFile)
public async Task TestPickleCompilation(string testFeatureFile)
{
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "good", ".pickles.ndjson");

var expectedContent = GetExpectedContent(testFile.ExpectedFileFullPath);

var expectedEvents = NDJsonParser.Deserialize<Envelope>(expectedContent);
var expectedEvents = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);

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

Expand Down
6 changes: 2 additions & 4 deletions dotnet/Gherkin.Specs/SourceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@ namespace Gherkin.Specs;
public class SourceTests : EventTestBase
{
[Theory, MemberData(nameof(TestFileProvider.GetValidTestFiles), MemberType = typeof(TestFileProvider))]
public void TestSourceMessage(string testFeatureFile)
public async Task TestSourceMessage(string testFeatureFile)
{
var testFile = GetFullPathToTestFeatureFile(testFeatureFile, "good", ".source.ndjson");

var expectedAstContent = GetExpectedContent(testFile.ExpectedFileFullPath);

var expectedGherkinDocumentEvent = NDJsonParser.Deserialize<Envelope>(expectedAstContent);
var expectedGherkinDocumentEvent = await NDJsonParser.DeserializeAsync<Envelope>(testFile.ExpectedFileFullPath);

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

Expand Down
2 changes: 1 addition & 1 deletion dotnet/Gherkin.Specs/Tokens/TokensGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public static string GenerateTokens(string featureFilePath)
var tokenFormatterBuilder = new TokenFormatterBuilder();
var parser = new Parser<object>(tokenFormatterBuilder);

using (var stream = new FileStream(featureFilePath, FileMode.Open))
using (var stream = File.OpenRead(featureFilePath))
{
using (var reader = new StreamReader(stream))
{
Expand Down
3 changes: 0 additions & 3 deletions dotnet/Gherkin.Specs/XUnitConfiguration.cs

This file was deleted.