Skip to content

Commit cbc2cb2

Browse files
authored
Merge pull request #285 from TestStack/feature/upgrade-donet
Upgrade to .net 8.0
2 parents 33fdc8c + ec85fb6 commit cbc2cb2

File tree

79 files changed

+582
-706
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+582
-706
lines changed

.github/workflows/build.yml

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
name: Build and Test
2+
on:
3+
push:
4+
pull_request:
5+
workflow_dispatch:
6+
7+
jobs:
8+
build:
9+
runs-on: ubuntu-latest
10+
outputs:
11+
semver: ${{ steps.gitversion.outputs.semVer }}
12+
fullsemver: ${{ steps.gitversion.outputs.fullSemVer }}
13+
nugetversion: ${{ steps.gitversion.outputs.fullSemVer }}
14+
15+
steps:
16+
- name: Checkout code
17+
uses: actions/checkout@v5
18+
with:
19+
fetch-depth: 0 # Required for GitVersion
20+
21+
- name: Install GitVersion
22+
uses: gittools/actions/gitversion/[email protected]
23+
with:
24+
versionSpec: '6.x'
25+
26+
- name: Determine Version
27+
uses: gittools/actions/gitversion/[email protected]
28+
id: gitversion
29+
30+
- name: Display GitVersion outputs
31+
run: |
32+
echo "Version: ${{ steps.gitversion.outputs.semVer }}"
33+
echo "AssemblyVersion: ${{ steps.gitversion.outputs.assemblySemVer }}"
34+
echo "FileVersion: ${{ steps.gitversion.outputs.assemblySemFileVer }}"
35+
echo "NuGet Version: ${{ steps.gitversion.outputs.fullSemVer }}"
36+
37+
- name: Setup .NET
38+
uses: actions/setup-dotnet@v5
39+
with:
40+
dotnet-version: '8.0.x'
41+
42+
- name: Build project
43+
working-directory: src
44+
run: dotnet build --configuration Release /p:Version=${{ steps.gitversion.outputs.assemblySemVer }} /p:AssemblyVersion=${{ steps.gitversion.outputs.assemblySemVer }} /p:FileVersion=${{ steps.gitversion.outputs.assemblySemFileVer }} /p:PackageVersion=${{ steps.gitversion.outputs.fullSemVer }}
45+
46+
- name: Run tests with coverage
47+
working-directory: src
48+
run: dotnet test --configuration Release --collect:"XPlat Code Coverage" --results-directory ../coverage
49+
50+
- name: Generate coverage report
51+
uses: danielpalme/[email protected]
52+
with:
53+
reports: 'coverage/**/coverage.cobertura.xml'
54+
targetdir: 'coverage-report'
55+
reporttypes: 'Html;Cobertura;TextSummary'
56+
57+
- name: Display Code Coverage Summary
58+
run: |
59+
echo "## 📊 Code Coverage Summary" >> $GITHUB_STEP_SUMMARY
60+
if [ -f "coverage-report/Summary.txt" ]; then
61+
echo '```' >> $GITHUB_STEP_SUMMARY
62+
cat coverage-report/Summary.txt >> $GITHUB_STEP_SUMMARY
63+
echo '```' >> $GITHUB_STEP_SUMMARY
64+
echo "### Build Log Coverage Summary:"
65+
cat coverage-report/Summary.txt
66+
else
67+
echo "⚠️ Coverage summary file not found"
68+
echo "⚠️ Coverage summary file not found" >> $GITHUB_STEP_SUMMARY
69+
fi
70+
71+
- name: Generate Rich Release Notes
72+
id: release_notes
73+
uses: mikepenz/[email protected]
74+
with:
75+
configuration: |
76+
{
77+
"template": "## 🚀 Release ${{ steps.gitversion.outputs.semVer }}\n\n### 📅 Release Information\n- **Version**: ${{ steps.gitversion.outputs.semVer }}\n- **NuGet Version**: ${{ steps.gitversion.outputs.fullSemVer }}\n- **Build Date**: $(date -u +'%Y-%m-%d %H:%M:%S UTC')\n- **Commit**: ${{ github.sha }}\n\n#{{CHANGELOG}}\n\n### 📊 Statistics\n- **Total Changes**: #{{UNCATEGORIZED_COUNT}} commits\n- **Contributors**: #{{CONTRIBUTORS}}\n\n---\n*Generated automatically by GitHub Actions*",
78+
"categories": [
79+
{
80+
"title": "## 🚀 Features",
81+
"labels": ["feature", "enhancement", "feat"]
82+
},
83+
{
84+
"title": "## 🐛 Bug Fixes",
85+
"labels": ["bug", "fix", "bugfix"]
86+
},
87+
{
88+
"title": "## 📚 Documentation",
89+
"labels": ["documentation", "docs"]
90+
},
91+
{
92+
"title": "## 🔧 Maintenance",
93+
"labels": ["maintenance", "chore", "refactor"]
94+
},
95+
{
96+
"title": "## ⚠️ Breaking Changes",
97+
"labels": ["breaking", "breaking-change"]
98+
}
99+
],
100+
"pr_template": "- #{{TITLE}} (#{{NUMBER}}) by @#{{AUTHOR}}",
101+
"empty_template": "- #{{TITLE}} (#{{HASH}}) by @#{{AUTHOR}}",
102+
"max_pull_requests": 200,
103+
"max_back_track_time_days": 365
104+
}
105+
env:
106+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
107+
108+
- name: Save Release Notes to File
109+
run: echo "${{ steps.release_notes.outputs.changelog }}" > release-notes.md
110+
111+
- name: Upload Release Notes as artifact
112+
uses: actions/upload-artifact@v4
113+
with:
114+
name: release-notes
115+
path: release-notes.md
116+
117+
- name: Create NuGet package
118+
working-directory: src
119+
run: dotnet pack --configuration Release --no-build /p:PackageVersion=${{ steps.gitversion.outputs.fullSemVer }} --output ../packages
120+
121+
- name: Upload NuGet package as artifact
122+
uses: actions/upload-artifact@v4
123+
with:
124+
name: nuget-package
125+
path: packages/*.nupkg
126+
127+
- name: Publish coverage report as artifact
128+
uses: actions/upload-artifact@v4
129+
with:
130+
name: coverage-report
131+
path: coverage-report/
132+
133+
publish-nuget:
134+
runs-on: ubuntu-latest
135+
needs: build
136+
if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch
137+
environment:
138+
name: Publish
139+
url: https://www.nuget.org/packages/TestStack.BDDfy/
140+
141+
steps:
142+
- name: Download NuGet package
143+
uses: actions/download-artifact@v5
144+
with:
145+
name: nuget-package
146+
path: packages
147+
148+
- name: Setup .NET
149+
uses: actions/setup-dotnet@v5
150+
with:
151+
dotnet-version: '8.0.x'
152+
153+
- name: Publish to NuGet
154+
run: dotnet nuget push packages/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
155+
156+
create-release-tag:
157+
runs-on: ubuntu-latest
158+
needs: [build, publish-nuget]
159+
if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch
160+
permissions:
161+
contents: write
162+
163+
steps:
164+
- name: Checkout code
165+
uses: actions/checkout@v5
166+
with:
167+
fetch-depth: 0
168+
token: ${{ secrets.GITHUB_TOKEN }}
169+
170+
- name: Check if tag already exists
171+
id: check_tag
172+
run: |
173+
TAG="v${{ needs.build.outputs.semver }}"
174+
if git rev-parse "$TAG" >/dev/null 2>&1; then
175+
echo "Tag $TAG already exists"
176+
echo "tag_exists=true" >> $GITHUB_OUTPUT
177+
else
178+
echo "Creating new tag: $TAG"
179+
echo "tag_exists=false" >> $GITHUB_OUTPUT
180+
echo "new_tag=$TAG" >> $GITHUB_OUTPUT
181+
fi
182+
183+
- name: Download Release Notes
184+
if: steps.check_tag.outputs.tag_exists == 'false'
185+
uses: actions/download-artifact@v5
186+
with:
187+
name: release-notes
188+
path: .
189+
190+
- name: Create Git Tag and GitHub Release
191+
if: steps.check_tag.outputs.tag_exists == 'false'
192+
run: |
193+
TAG="${{ steps.check_tag.outputs.new_tag }}"
194+
195+
# Configure git
196+
git config user.name "github-actions[bot]"
197+
git config user.email "github-actions[bot]@users.noreply.github.com"
198+
199+
# Create and push tag
200+
git tag -a "$TAG" -m "Release $TAG"
201+
git push origin "$TAG"
202+
203+
# Create GitHub release
204+
gh release create "$TAG" \
205+
--title "Release $TAG" \
206+
--notes-file release-notes.md \
207+
--generate-notes
208+
env:
209+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ tools/Cake/
2828
tools/GitReleaseNotes/
2929
tools/gitversion.commandline/
3030
artifacts/
31+
*.code-workspace
32+
**/coverage

GitVersion.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
mode: ContinuousDelivery
2-
next-version: 4.1.0
2+
next-version: 8.0.0
33
branches: {}
44
ignore:
55
sha: []

src/.editorconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[*.cs]
2+
3+
# Default severity for analyzer diagnostics with category 'Style'
4+
dotnet_analyzer_diagnostic.category-Style.severity = none

src/Directory.build.props

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<Project>
2+
<PropertyGroup>
3+
<TargetFrameworks>net8.0</TargetFrameworks>
4+
</PropertyGroup>
5+
</Project>

src/NuGet.config

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

src/Samples/TestStack.BDDfy.Samples/AssemblySetupFixture.cs

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -33,55 +33,36 @@ public AssemblySetupFixture()
3333
}
3434

3535
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
36-
public class AssemblyFixtureAttribute : Attribute
36+
public class AssemblyFixtureAttribute(Type fixtureType): Attribute
3737
{
38-
public AssemblyFixtureAttribute(Type fixtureType)
39-
{
40-
FixtureType = fixtureType;
41-
}
42-
43-
public Type FixtureType { get; private set; }
38+
public Type FixtureType { get; private set; } = fixtureType;
4439
}
4540

46-
public class XunitTestFrameworkWithAssemblyFixture : XunitTestFramework
41+
public class XunitTestFrameworkWithAssemblyFixture(IMessageSink messageSink): XunitTestFramework(messageSink)
4742
{
48-
public XunitTestFrameworkWithAssemblyFixture(IMessageSink messageSink)
49-
: base(messageSink)
50-
{ }
51-
5243
protected override ITestFrameworkExecutor CreateExecutor(AssemblyName assemblyName)
5344
=> new XunitTestFrameworkExecutorWithAssemblyFixture(assemblyName, SourceInformationProvider, DiagnosticMessageSink);
5445
}
5546

56-
public class XunitTestFrameworkExecutorWithAssemblyFixture : XunitTestFrameworkExecutor
47+
public class XunitTestFrameworkExecutorWithAssemblyFixture(AssemblyName assemblyName,
48+
ISourceInformationProvider sourceInformationProvider, IMessageSink diagnosticMessageSink): XunitTestFrameworkExecutor(assemblyName, sourceInformationProvider, diagnosticMessageSink)
5749
{
58-
public XunitTestFrameworkExecutorWithAssemblyFixture(AssemblyName assemblyName,
59-
ISourceInformationProvider sourceInformationProvider, IMessageSink diagnosticMessageSink)
60-
: base(assemblyName, sourceInformationProvider, diagnosticMessageSink)
61-
{
62-
}
63-
6450
protected override async void RunTestCases(IEnumerable<IXunitTestCase> testCases,
6551
IMessageSink executionMessageSink, ITestFrameworkExecutionOptions executionOptions)
6652
{
67-
using (
68-
var assemblyRunner = new XunitTestAssemblyRunnerWithAssemblyFixture(TestAssembly, testCases,
69-
DiagnosticMessageSink, executionMessageSink, executionOptions))
70-
await assemblyRunner.RunAsync();
53+
using var assemblyRunner = new XunitTestAssemblyRunnerWithAssemblyFixture(TestAssembly, testCases,
54+
DiagnosticMessageSink, executionMessageSink, executionOptions);
55+
await assemblyRunner.RunAsync();
7156
}
7257
}
7358

74-
public class XunitTestAssemblyRunnerWithAssemblyFixture : XunitTestAssemblyRunner
59+
public class XunitTestAssemblyRunnerWithAssemblyFixture(ITestAssembly testAssembly,
60+
IEnumerable<IXunitTestCase> testCases,
61+
IMessageSink diagnosticMessageSink,
62+
IMessageSink executionMessageSink,
63+
ITestFrameworkExecutionOptions executionOptions): XunitTestAssemblyRunner(testAssembly, testCases, diagnosticMessageSink, executionMessageSink, executionOptions)
7564
{
76-
readonly Dictionary<Type, object> assemblyFixtureMappings = new Dictionary<Type, object>();
77-
78-
public XunitTestAssemblyRunnerWithAssemblyFixture(ITestAssembly testAssembly,
79-
IEnumerable<IXunitTestCase> testCases,
80-
IMessageSink diagnosticMessageSink,
81-
IMessageSink executionMessageSink,
82-
ITestFrameworkExecutionOptions executionOptions)
83-
: base(testAssembly, testCases, diagnosticMessageSink, executionMessageSink, executionOptions)
84-
{ }
65+
readonly Dictionary<Type, object> assemblyFixtureMappings = new();
8566

8667
protected override async Task AfterTestAssemblyStartingAsync()
8768
{
@@ -118,24 +99,17 @@ protected override Task<RunSummary> RunTestCollectionAsync(IMessageBus messageBu
11899
=> new XunitTestCollectionRunnerWithAssemblyFixture(assemblyFixtureMappings, testCollection, testCases, DiagnosticMessageSink, messageBus, TestCaseOrderer, new ExceptionAggregator(Aggregator), cancellationTokenSource).RunAsync();
119100
}
120101

121-
public class XunitTestCollectionRunnerWithAssemblyFixture : XunitTestCollectionRunner
102+
public class XunitTestCollectionRunnerWithAssemblyFixture(Dictionary<Type, object> assemblyFixtureMappings,
103+
ITestCollection testCollection,
104+
IEnumerable<IXunitTestCase> testCases,
105+
IMessageSink diagnosticMessageSink,
106+
IMessageBus messageBus,
107+
ITestCaseOrderer testCaseOrderer,
108+
ExceptionAggregator aggregator,
109+
CancellationTokenSource cancellationTokenSource): XunitTestCollectionRunner(testCollection, testCases, diagnosticMessageSink, messageBus, testCaseOrderer, aggregator, cancellationTokenSource)
122110
{
123-
readonly Dictionary<Type, object> assemblyFixtureMappings;
124-
readonly IMessageSink diagnosticMessageSink;
125-
126-
public XunitTestCollectionRunnerWithAssemblyFixture(Dictionary<Type, object> assemblyFixtureMappings,
127-
ITestCollection testCollection,
128-
IEnumerable<IXunitTestCase> testCases,
129-
IMessageSink diagnosticMessageSink,
130-
IMessageBus messageBus,
131-
ITestCaseOrderer testCaseOrderer,
132-
ExceptionAggregator aggregator,
133-
CancellationTokenSource cancellationTokenSource)
134-
: base(testCollection, testCases, diagnosticMessageSink, messageBus, testCaseOrderer, aggregator, cancellationTokenSource)
135-
{
136-
this.assemblyFixtureMappings = assemblyFixtureMappings;
137-
this.diagnosticMessageSink = diagnosticMessageSink;
138-
}
111+
readonly Dictionary<Type, object> assemblyFixtureMappings = assemblyFixtureMappings;
112+
readonly IMessageSink diagnosticMessageSink = diagnosticMessageSink;
139113

140114
protected override Task<RunSummary> RunTestClassAsync(ITestClass testClass, IReflectionTypeInfo @class, IEnumerable<IXunitTestCase> testCases)
141115
{

0 commit comments

Comments
 (0)