From 18ae01ef5953166fb7b709778952dc2ccc88b048 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:34:20 +0000 Subject: [PATCH 001/192] chore(deps): update dependency nuget.protocol to v7 (#3788) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d5240f97bb..be8ceaf8ac 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -52,7 +52,7 @@ - + From 312ab9872772896ad8f5132594a24cbbe638a7c0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:40:21 +0000 Subject: [PATCH 002/192] feat(benchmarks): add summary generation for runtime and build benchmarks in PR body --- .github/scripts/process-benchmarks.js | 115 +++++++++++++++++-------- .github/workflows/speed-comparison.yml | 30 +++++++ 2 files changed, 108 insertions(+), 37 deletions(-) diff --git a/.github/scripts/process-benchmarks.js b/.github/scripts/process-benchmarks.js index 1a58bb5282..f46ff58c51 100644 --- a/.github/scripts/process-benchmarks.js +++ b/.github/scripts/process-benchmarks.js @@ -212,50 +212,14 @@ These benchmarks were automatically generated on **${timestamp}** from the lates **Environment:** ${environmentInfo.os || 'Ubuntu Latest'} • ${environmentInfo.sdk || '.NET 10'} ::: -## šŸŽÆ Executive Summary - -TUnit demonstrates significant performance advantages across all testing scenarios: - -
- -### Average Performance vs Other Frameworks - -- **${avgSpeedups.vsXUnit}x faster** than xUnit v3 -- **${avgSpeedups.vsNUnit}x faster** than NUnit -- **${avgSpeedups.vsMSTest}x faster** than MSTest - -
- ---- - ## šŸš€ Runtime Performance `; // Add runtime results Object.entries(categories.runtime).forEach(([testClass, data]) => { - const comparison = comparisons[testClass]; - mainPage += `\n### ${testClass}\n\n`; - if (comparison && comparison.aotSpeedup) { - mainPage += `:::tip Native AOT Performance\n`; - mainPage += `TUnit with Native AOT compilation is **${comparison.aotSpeedup}x faster** than regular JIT!\n`; - mainPage += `:::\n\n`; - } - - // Add speedup badges - if (comparison) { - const badges = []; - if (comparison.vsXUnit) badges.push(`**${comparison.vsXUnit}x faster** than xUnit`); - if (comparison.vsNUnit) badges.push(`**${comparison.vsNUnit}x faster** than NUnit`); - if (comparison.vsMSTest) badges.push(`**${comparison.vsMSTest}x faster** than MSTest`); - - if (badges.length > 0) { - mainPage += `**Performance:** ${badges.join(' • ')}\n\n`; - } - } - // Add table mainPage += `| Framework | Version | Mean | Median | StdDev |\n`; mainPage += `|-----------|---------|------|--------|--------|\n`; @@ -267,6 +231,34 @@ Object.entries(categories.runtime).forEach(([testClass, data]) => { }); mainPage += '\n'; + + // Add Mermaid bar chart + mainPage += `
\nšŸ“Š Visual Comparison\n\n`; + mainPage += '```mermaid\n%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%%\nxychart-beta\n'; + mainPage += ` title "${testClass} - Mean Execution Time (Lower is Better)"\n`; + mainPage += ' x-axis ['; + + // Add framework names for x-axis + const chartData = data.map(row => { + const name = row.Method.includes('TUnit_AOT') ? 'TUnit (AOT)' : row.Method; + const meanValue = parseMeanValue(row.Mean); + return { name, value: meanValue }; + }); + + mainPage += chartData.map(d => `"${d.name}"`).join(', '); + mainPage += ']\n'; + mainPage += ' y-axis "Time (ms)" 0 --> '; + + // Set y-axis max to 120% of the highest value for better visualization + const maxValue = Math.max(...chartData.map(d => d.value)); + mainPage += Math.ceil(maxValue * 1.2); + mainPage += '\n'; + + mainPage += ' bar ['; + mainPage += chartData.map(d => d.value.toFixed(2)).join(', '); + mainPage += ']\n'; + mainPage += '```\n\n'; + mainPage += `
\n\n`; }); // Add build time results @@ -285,6 +277,34 @@ if (Object.keys(categories.build).length > 0) { }); mainPage += '\n'; + + // Add Mermaid bar chart for build performance + mainPage += `
\nšŸ“Š Visual Comparison\n\n`; + mainPage += '```mermaid\n%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%%\nxychart-beta\n'; + mainPage += ` title "Build Time Comparison - Mean Compilation Time (Lower is Better)"\n`; + mainPage += ' x-axis ['; + + // Add framework names for x-axis + const chartData = data.map(row => { + const name = row.Method; + const meanValue = parseMeanValue(row.Mean); + return { name, value: meanValue }; + }); + + mainPage += chartData.map(d => `"${d.name}"`).join(', '); + mainPage += ']\n'; + mainPage += ' y-axis "Time (ms)" 0 --> '; + + // Set y-axis max to 120% of the highest value for better visualization + const maxValue = Math.max(...chartData.map(d => d.value)); + mainPage += Math.ceil(maxValue * 1.2); + mainPage += '\n'; + + mainPage += ' bar ['; + mainPage += chartData.map(d => d.value.toFixed(2)).join(', '); + mainPage += ']\n'; + mainPage += '```\n\n'; + mainPage += `
\n\n`; }); } @@ -400,9 +420,30 @@ fs.writeFileSync( ); console.log(` āœ“ Updated ${historicalFile} (${historical.length} data points)`); +// Generate benchmark summary for PR body +const benchmarkSummary = { + runtime: Object.keys(categories.runtime), + build: Object.keys(categories.build), + timestamp: timestamp, + environment: `${environmentInfo.os || 'Ubuntu Latest'} • ${environmentInfo.sdk || '.NET 10'}` +}; + +fs.writeFileSync( + path.join(STATIC_DIR, 'summary.json'), + JSON.stringify(benchmarkSummary, null, 2) +); +console.log(` āœ“ Created ${STATIC_DIR}/summary.json`); + console.log('\nāœ… Benchmark processing complete!\n'); console.log(`Summary:`); console.log(` - Runtime categories: ${stats.runtimeCategories}`); console.log(` - Build categories: ${stats.buildCategories}`); console.log(` - Total benchmarks: ${stats.totalBenchmarks}`); -console.log(` - Output files: 3 (markdown + 2 JSON files)`); +console.log(` - Output files: 4 (markdown + 3 JSON files)`); +console.log(`\nšŸ“Š Benchmarks produced:`); +console.log(`\nRuntime Benchmarks:`); +Object.keys(categories.runtime).forEach(cat => console.log(` - ${cat}`)); +if (Object.keys(categories.build).length > 0) { + console.log(`\nBuild Benchmarks:`); + Object.keys(categories.build).forEach(cat => console.log(` - ${cat}`)); +} diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 316ddff2d3..d28d08f107 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -160,6 +160,27 @@ jobs: run: | node .github/scripts/process-benchmarks.js + - name: Generate Benchmark List + id: benchmark_list + run: | + # Read the summary.json file and format it for the PR body + SUMMARY=$(cat docs/static/benchmarks/summary.json) + RUNTIME_BENCHMARKS=$(echo "$SUMMARY" | grep -A 100 '"runtime"' | grep -o '"[^"]*Tests"' | sed 's/"//g' | sed 's/^/- /' | tr '\n' '|') + BUILD_BENCHMARKS=$(echo "$SUMMARY" | grep -A 100 '"build"' | grep -o '"[^"]*"' | sed 's/"//g' | grep -v 'runtime\|build\|timestamp\|environment' | sed 's/^/- /' | tr '\n' '|') + + # Replace | with newlines for proper formatting + RUNTIME_LIST=$(echo "$RUNTIME_BENCHMARKS" | sed 's/|/\n/g') + BUILD_LIST=$(echo "$BUILD_BENCHMARKS" | sed 's/|/\n/g') + + # Set output with proper escaping + echo "runtime_benchmarks<> $GITHUB_OUTPUT + echo "$RUNTIME_LIST" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + echo "build_benchmarks<> $GITHUB_OUTPUT + echo "$BUILD_LIST" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + - name: Check for Changes id: check_changes run: | @@ -187,10 +208,19 @@ jobs: This PR updates the benchmark documentation with the latest results from the Speed Comparison workflow. + ### Benchmarks Produced + + #### Runtime Benchmarks + ${{ steps.benchmark_list.outputs.runtime_benchmarks }} + + #### Build Benchmarks + ${{ steps.benchmark_list.outputs.build_benchmarks }} + ### Changes - Updated benchmark data in `docs/static/benchmarks/latest.json` - Updated historical trends in `docs/static/benchmarks/historical.json` - Regenerated benchmark documentation in `docs/docs/benchmarks/index.md` + - Updated benchmark summary in `docs/static/benchmarks/summary.json` ### Workflow Run - **Run ID**: ${{ github.run_id }} From 44ac0b0062035994d15bd9a420999a2feaa69a43 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:42:49 +0000 Subject: [PATCH 003/192] fix: update GitHub token to use ADMIN_TOKEN for benchmark workflows --- .github/workflows/speed-comparison.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index d28d08f107..67e5136da5 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -135,7 +135,7 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.ADMIN_TOKEN }} - name: Download All Runtime Benchmark Artifacts uses: actions/download-artifact@v6 @@ -198,7 +198,7 @@ jobs: id: create_pr uses: peter-evans/create-pull-request@v7 with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.ADMIN_TOKEN }} commit-message: 'chore: update benchmark results' branch: automated-benchmarks-update delete-branch: true @@ -236,10 +236,12 @@ jobs: documentation draft: false - - name: Enable Auto-Merge + - name: Merge PR Immediately if: steps.check_changes.outputs.has_changes == 'true' && steps.create_pr.outputs.pull-request-number != '' env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.ADMIN_TOKEN }} run: | - gh pr merge ${{ steps.create_pr.outputs.pull-request-number }} --auto --squash --delete-branch + # Wait a moment for PR to be fully created + sleep 5 + gh pr merge ${{ steps.create_pr.outputs.pull-request-number }} --squash --delete-branch --admin From 3f9790f32aa313ce5ac4e615f7b6b5d6e9513e97 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:52:12 +0000 Subject: [PATCH 004/192] chore(deps): update tunit to 1.0.78 (#3789) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index be8ceaf8ac..3f2141dd84 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index f1ba496a75..0bb4259733 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 287051cd44..45f7c0723a 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 3075c21f6c..29ac371ea2 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 7da16ebe3d..6acb29b07d 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 87db30ee23..d1f6d6dfed 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 25055774d9..5f8bef5d2a 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index ff5e5de922..142edd7810 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index c375f81c6f..948ae0ad1f 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 81e211a631f05d7b37d8077034b78b006698b798 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:58:29 +0000 Subject: [PATCH 005/192] chore: update benchmark results (#3757) Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- docs/docs/benchmarks/index.md | 82 ++++++++++--------- docs/static/benchmarks/historical.json | 10 +++ docs/static/benchmarks/latest.json | 108 ++++++++++++------------- docs/static/benchmarks/summary.json | 10 +++ 4 files changed, 118 insertions(+), 92 deletions(-) create mode 100644 docs/static/benchmarks/summary.json diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 2c5b59a725..b0bb83b7cc 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,45 +7,37 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-10** from the latest CI run. +These benchmarks were automatically generated on **2025-11-11** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100-rc.2.25502.107 +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: -## šŸŽÆ Executive Summary - -TUnit demonstrates significant performance advantages across all testing scenarios: - -
- -### Average Performance vs Other Frameworks - -- **1.2x faster** than xUnit v3 -- **1.2x faster** than NUnit -- **1.0x faster** than MSTest - -
- ---- - ## šŸš€ Runtime Performance ### results -:::tip Native AOT Performance -TUnit with Native AOT compilation is **11.22x faster** than regular JIT! -::: - -**Performance:** **1.19x faster** than xUnit • **1.17x faster** than NUnit • **1.00x faster** than MSTest - | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| šŸ† **TUnit** | 1.0.39 | 495.43 ms | 495.43 ms | 2.042 ms | -| NUnit | 4.4.0 | 578.77 ms | 580.83 ms | 7.718 ms | -| MSTest | 4.0.1 | 495.62 ms | 496.03 ms | 6.128 ms | -| xUnit3 | 3.2.0 | 591.61 ms | 591.28 ms | 9.984 ms | -| šŸ† **TUnit (AOT)** | 1.0.39 | 44.15 ms | 44.00 ms | 3.244 ms | +| šŸ† **TUnit** | 1.0.78 | 580.4 ms | 578.3 ms | 7.38 ms | +| NUnit | 4.4.0 | 1,211.6 ms | 1,209.8 ms | 9.40 ms | +| MSTest | 4.0.2 | 2,995.4 ms | 2,996.6 ms | 7.68 ms | +| xUnit3 | 3.2.0 | 3,086.8 ms | 3,086.9 ms | 11.28 ms | +| šŸ† **TUnit (AOT)** | 1.0.78 | 130.8 ms | 130.8 ms | 0.47 ms | + +
+šŸ“Š Visual Comparison + +```mermaid +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%% +xychart-beta + title "results - Mean Execution Time (Lower is Better)" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit (AOT)"] + y-axis "Time (ms)" 0 --> 697 + bar [580.40, 1.00, 2.00, 3.00, 130.80] +``` + +
--- @@ -56,10 +48,24 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| šŸ† **TUnit** | 1.0.39 | 1.788 s | 1.789 s | 0.0352 s | -| Build_NUnit | 4.4.0 | 1.570 s | 1.571 s | 0.0178 s | -| Build_MSTest | 4.0.1 | 1.657 s | 1.661 s | 0.0240 s | -| Build_xUnit3 | 3.2.0 | 1.577 s | 1.575 s | 0.0136 s | +| šŸ† **TUnit** | 1.0.78 | 1.791 s | 1.788 s | 0.0257 s | +| Build_NUnit | 4.4.0 | 1.560 s | 1.565 s | 0.0213 s | +| Build_MSTest | 4.0.2 | 1.652 s | 1.656 s | 0.0123 s | +| Build_xUnit3 | 3.2.0 | 1.546 s | 1.551 s | 0.0203 s | + +
+šŸ“Š Visual Comparison + +```mermaid +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%% +xychart-beta + title "Build Time Comparison - Mean Compilation Time (Lower is Better)" + x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] + y-axis "Time (ms)" 0 --> 3 + bar [1.79, 1.56, 1.65, 1.55] +``` + +
--- @@ -70,10 +76,10 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.0.39 | +| **TUnit** | 1.0.78 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | -| **MSTest** | 4.0.1 | +| **MSTest** | 4.0.2 | ### Test Scenarios @@ -88,8 +94,8 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0-rc.2.25502.107, 10.0.25.50307), X64 RyuJIT x86-64-v3 -- **SDK**: .NET SDK 10.0.100-rc.2.25502.107 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 +- **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -112,4 +118,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-10T00:29:09.704Z* +*Last generated: 2025-11-11T22:58:18.735Z* diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 9912b13410..f224d6dfaf 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -38,5 +38,15 @@ "count": 1 }, "environment": "Ubuntu" + }, + { + "date": "2025-11-11", + "averageSpeedups": { + "vsXUnit": "0.0", + "vsNUnit": "0.0", + "vsMSTest": "0.0", + "count": 1 + }, + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 145489d3e1..076f04121d 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-10T00:29:09.704Z", + "timestamp": "2025-11-11T22:58:18.735Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100-rc.2.25502.107", - "host": ".NET 10.0.0 (10.0.0-rc.2.25502.107, 10.0.25.50307), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { "results": [ { "Method": "TUnit", - "Version": "1.0.39", - "Mean": "495.43 ms", - "Error": "2.303 ms", - "StdDev": "2.042 ms", - "Median": "495.43 ms" + "Version": "1.0.78", + "Mean": "580.4 ms", + "Error": "8.32 ms", + "StdDev": "7.38 ms", + "Median": "578.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "578.77 ms", - "Error": "9.242 ms", - "StdDev": "7.718 ms", - "Median": "580.83 ms" + "Mean": "1,211.6 ms", + "Error": "10.05 ms", + "StdDev": "9.40 ms", + "Median": "1,209.8 ms" }, { "Method": "MSTest", - "Version": "4.0.1", - "Mean": "495.62 ms", - "Error": "7.338 ms", - "StdDev": "6.128 ms", - "Median": "496.03 ms" + "Version": "4.0.2", + "Mean": "2,995.4 ms", + "Error": "8.66 ms", + "StdDev": "7.68 ms", + "Median": "2,996.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "591.61 ms", - "Error": "10.673 ms", - "StdDev": "9.984 ms", - "Median": "591.28 ms" + "Mean": "3,086.8 ms", + "Error": "12.06 ms", + "StdDev": "11.28 ms", + "Median": "3,086.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.0.39", - "Mean": "44.15 ms", - "Error": "1.112 ms", - "StdDev": "3.244 ms", - "Median": "44.00 ms" + "Version": "1.0.78", + "Mean": "130.8 ms", + "Error": "0.50 ms", + "StdDev": "0.47 ms", + "Median": "130.8 ms" } ] }, @@ -53,58 +53,58 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.0.39", - "Mean": "1.788 s", - "Error": "0.0343 s", - "StdDev": "0.0352 s", - "Median": "1.789 s" + "Version": "1.0.78", + "Mean": "1.791 s", + "Error": "0.0290 s", + "StdDev": "0.0257 s", + "Median": "1.788 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.570 s", - "Error": "0.0201 s", - "StdDev": "0.0178 s", - "Median": "1.571 s" + "Mean": "1.560 s", + "Error": "0.0240 s", + "StdDev": "0.0213 s", + "Median": "1.565 s" }, { "Method": "Build_MSTest", - "Version": "4.0.1", - "Mean": "1.657 s", - "Error": "0.0256 s", - "StdDev": "0.0240 s", - "Median": "1.661 s" + "Version": "4.0.2", + "Mean": "1.652 s", + "Error": "0.0132 s", + "StdDev": "0.0123 s", + "Median": "1.656 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.577 s", - "Error": "0.0154 s", - "StdDev": "0.0136 s", - "Median": "1.575 s" + "Mean": "1.546 s", + "Error": "0.0217 s", + "StdDev": "0.0203 s", + "Median": "1.551 s" } ] }, "comparisons": { "results": { - "tunitMean": 495.43, - "tunitAOTMean": 44.15, - "vsXUnit": "1.19", - "vsNUnit": "1.17", - "vsMSTest": "1.00", - "aotSpeedup": "11.22" + "tunitMean": 580.4, + "tunitAOTMean": 130.8, + "vsXUnit": "0.01", + "vsNUnit": "0.00", + "vsMSTest": "0.00", + "aotSpeedup": "4.44" } }, "averageSpeedups": { - "vsXUnit": "1.2", - "vsNUnit": "1.2", - "vsMSTest": "1.0", + "vsXUnit": "0.0", + "vsNUnit": "0.0", + "vsMSTest": "0.0", "count": 1 }, "stats": { "runtimeCategories": 1, "buildCategories": 1, "totalBenchmarks": 2, - "lastUpdated": "2025-11-10T00:29:09.702Z" + "lastUpdated": "2025-11-11T22:58:18.734Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json new file mode 100644 index 0000000000..d91d4c1bd0 --- /dev/null +++ b/docs/static/benchmarks/summary.json @@ -0,0 +1,10 @@ +{ + "runtime": [ + "results" + ], + "build": [ + "BuildTime" + ], + "timestamp": "2025-11-11", + "environment": "Ubuntu Latest • .NET SDK 10.0.100" +} \ No newline at end of file From 9bbc55262566a640f6086bfa370f2b152268ef4e Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 11 Nov 2025 23:29:46 +0000 Subject: [PATCH 006/192] feat(tests): add SetupTeardownTests for comprehensive resource management in unit tests --- .github/workflows/speed-comparison.yml | 2 +- .../UnifiedTests/SetupTeardownTests.cs | 380 ++++++++++++++++++ 2 files changed, 381 insertions(+), 1 deletion(-) create mode 100644 tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 67e5136da5..510e5d4f3e 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -45,7 +45,7 @@ jobs: environment: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Pull Requests' }} strategy: matrix: - class: [DataDrivenTests, AsyncTests, ScaleTests, MatrixTests, MassiveParallelTests] + class: [DataDrivenTests, AsyncTests, ScaleTests, MatrixTests, MassiveParallelTests, SetupTeardownTests] fail-fast: false runs-on: ubuntu-latest concurrency: diff --git a/tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs b/tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs new file mode 100644 index 0000000000..613d9a842a --- /dev/null +++ b/tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs @@ -0,0 +1,380 @@ +using System.Text; +using System.Threading.Tasks; + +namespace UnifiedTests; + +[TestClass] +#if XUNIT3 +public class SetupTeardownTests : IDisposable +#else +public class SetupTeardownTests +#endif +{ + // Simulated expensive state + private byte[] _databaseConnection; + private List _tempFiles; + private HttpClient _httpClient; + private StringBuilder _logBuilder; + +#if TUNIT + [Before(Test)] + public async Task Setup() +#elif XUNIT3 + public SetupTeardownTests() +#elif NUNIT + [SetUp] + public async Task Setup() +#elif MSTEST + [TestInitialize] + public async Task Setup() +#else + public async Task Setup() +#endif + { +#if XUNIT3 + SetupCore().GetAwaiter().GetResult(); + } + + private async Task SetupCore() + { +#endif + // Simulate expensive database connection initialization + _databaseConnection = new byte[1024 * 100]; // 100KB allocation + for (int i = 0; i < _databaseConnection.Length; i++) + { + _databaseConnection[i] = (byte)(i % 256); + } + + // Simulate file system setup + _tempFiles = []; + await Task.Delay(5); // Simulate async I/O + + // Simulate HTTP client initialization + _httpClient = new HttpClient + { + Timeout = TimeSpan.FromSeconds(30) + }; + + // Simulate logging infrastructure + _logBuilder = new StringBuilder(1000); + _logBuilder.AppendLine($"Test started at {DateTime.UtcNow}"); + + // Simulate loading configuration + await Task.Delay(5); + } + +#if TUNIT + [After(Test)] + public async Task Cleanup() +#elif XUNIT3 + public void Dispose() +#elif NUNIT + [TearDown] + public async Task Cleanup() +#elif MSTEST + [TestCleanup] + public async Task Cleanup() +#else + public async Task Cleanup() +#endif + { +#if XUNIT3 + CleanupCore().GetAwaiter().GetResult(); + } + + private async Task CleanupCore() + { +#endif + // Simulate database connection cleanup + if (_databaseConnection != null) + { + Array.Clear(_databaseConnection, 0, _databaseConnection.Length); + _databaseConnection = null!; + } + + // Simulate file cleanup + if (_tempFiles != null) + { + await Task.Delay(5); // Simulate async I/O + _tempFiles.Clear(); + _tempFiles = null!; + } + + // Cleanup HTTP client + _httpClient?.Dispose(); + _httpClient = null!; + + // Finalize logging + if (_logBuilder != null) + { + _logBuilder.AppendLine($"Test completed at {DateTime.UtcNow}"); + _logBuilder.Clear(); + _logBuilder = null!; + } + + await Task.Delay(5); // Simulate async cleanup + } + + [Test] + public void DatabaseOperationTest() + { + // Simulate database query + var sum = 0; + for (int i = 0; i < 1000; i++) + { + sum += _databaseConnection[i]; + } + _logBuilder.AppendLine($"Database operation result: {sum}"); + } + + [Test] + public async Task AsyncDatabaseOperationTest() + { + // Simulate async database operation + await Task.Delay(10); + var sum = 0; + for (int i = 0; i < 1000; i++) + { + sum += _databaseConnection[i]; + } + _logBuilder.AppendLine($"Async database operation result: {sum}"); + } + + [Test] + public void FileSystemOperationTest() + { + // Simulate file operations + for (int i = 0; i < 10; i++) + { + _tempFiles.Add($"temp_file_{i}.txt"); + } + _logBuilder.AppendLine($"Created {_tempFiles.Count} temp files"); + } + + [Test] + public async Task AsyncFileSystemOperationTest() + { + // Simulate async file operations + await Task.Delay(10); + for (int i = 0; i < 10; i++) + { + _tempFiles.Add($"async_temp_file_{i}.txt"); + } + _logBuilder.AppendLine($"Created {_tempFiles.Count} temp files asynchronously"); + } + + [Test] + public void HttpClientOperationTest() + { + // Simulate HTTP client usage + var timeout = _httpClient.Timeout; + _logBuilder.AppendLine($"HTTP client timeout: {timeout.TotalSeconds}s"); + } + + [Test] + public async Task AsyncHttpClientOperationTest() + { + // Simulate async HTTP operation + await Task.Delay(10); + var timeout = _httpClient.Timeout; + _logBuilder.AppendLine($"Async HTTP client timeout: {timeout.TotalSeconds}s"); + } + + [Test] + public void LoggingOperationTest() + { + // Simulate logging + for (int i = 0; i < 50; i++) + { + _logBuilder.AppendLine($"Log entry {i}"); + } + } + + [Test] + public async Task AsyncLoggingOperationTest() + { + // Simulate async logging + await Task.Delay(10); + for (int i = 0; i < 50; i++) + { + _logBuilder.AppendLine($"Async log entry {i}"); + } + } + + [Test] + public void MemoryIntensiveOperationTest() + { + // Simulate memory-intensive operation + var tempBuffer = new byte[1024 * 50]; // 50KB + for (int i = 0; i < tempBuffer.Length; i++) + { + tempBuffer[i] = _databaseConnection[i % _databaseConnection.Length]; + } + var sum = tempBuffer.Sum(b => (int)b); + _logBuilder.AppendLine($"Memory operation result: {sum}"); + } + + [Test] + public async Task AsyncMemoryIntensiveOperationTest() + { + // Simulate async memory-intensive operation + await Task.Delay(10); + var tempBuffer = new byte[1024 * 50]; // 50KB + for (int i = 0; i < tempBuffer.Length; i++) + { + tempBuffer[i] = _databaseConnection[i % _databaseConnection.Length]; + } + var sum = tempBuffer.Sum(b => (int)b); + _logBuilder.AppendLine($"Async memory operation result: {sum}"); + } + + [Test] + public void ComputationTest() + { + // Simulate computation + var result = 0; + for (int i = 0; i < 10000; i++) + { + result += i * i; + } + _logBuilder.AppendLine($"Computation result: {result}"); + } + + [Test] + public async Task AsyncComputationTest() + { + // Simulate async computation + await Task.Delay(10); + var result = 0; + for (int i = 0; i < 10000; i++) + { + result += i * i; + } + _logBuilder.AppendLine($"Async computation result: {result}"); + } + + [Test] + public void StringManipulationTest() + { + // Simulate string operations + var sb = new StringBuilder(); + for (int i = 0; i < 100; i++) + { + sb.Append($"Item {i}, "); + } + _logBuilder.AppendLine($"String length: {sb.Length}"); + } + + [Test] + public async Task AsyncStringManipulationTest() + { + // Simulate async string operations + await Task.Delay(10); + var sb = new StringBuilder(); + for (int i = 0; i < 100; i++) + { + sb.Append($"Item {i}, "); + } + _logBuilder.AppendLine($"Async string length: {sb.Length}"); + } + + [Test] + public void CollectionOperationTest() + { + // Simulate collection operations + var numbers = Enumerable.Range(0, 1000).ToList(); + var filtered = numbers.Where(n => n % 2 == 0).ToList(); + _logBuilder.AppendLine($"Filtered count: {filtered.Count}"); + } + + [Test] + public async Task AsyncCollectionOperationTest() + { + // Simulate async collection operations + await Task.Delay(10); + var numbers = Enumerable.Range(0, 1000).ToList(); + var filtered = numbers.Where(n => n % 2 == 0).ToList(); + _logBuilder.AppendLine($"Async filtered count: {filtered.Count}"); + } + + [Test] + public void DateTimeOperationTest() + { + // Simulate datetime operations + var start = DateTime.UtcNow; + var timestamps = new List(); + for (int i = 0; i < 100; i++) + { + timestamps.Add(start.AddSeconds(i)); + } + _logBuilder.AppendLine($"Timestamps created: {timestamps.Count}"); + } + + [Test] + public async Task AsyncDateTimeOperationTest() + { + // Simulate async datetime operations + await Task.Delay(10); + var start = DateTime.UtcNow; + var timestamps = new List(); + for (int i = 0; i < 100; i++) + { + timestamps.Add(start.AddSeconds(i)); + } + _logBuilder.AppendLine($"Async timestamps created: {timestamps.Count}"); + } + + [Test] + public void DictionaryOperationTest() + { + // Simulate dictionary operations + var dict = new Dictionary(); + for (int i = 0; i < 100; i++) + { + dict[$"key_{i}"] = i * 2; + } + _logBuilder.AppendLine($"Dictionary size: {dict.Count}"); + } + + [Test] + public async Task AsyncDictionaryOperationTest() + { + // Simulate async dictionary operations + await Task.Delay(10); + var dict = new Dictionary(); + for (int i = 0; i < 100; i++) + { + dict[$"key_{i}"] = i * 2; + } + _logBuilder.AppendLine($"Async dictionary size: {dict.Count}"); + } + + [Test] + public void JsonOperationTest() + { + // Simulate JSON serialization + var data = new + { + Id = 123, + Name = "Test Data", + Values = Enumerable.Range(0, 50).ToArray() + }; + var json = System.Text.Json.JsonSerializer.Serialize(data); + _logBuilder.AppendLine($"JSON length: {json.Length}"); + } + + [Test] + public async Task AsyncJsonOperationTest() + { + // Simulate async JSON operations + await Task.Delay(10); + var data = new + { + Id = 123, + Name = "Test Data", + Values = Enumerable.Range(0, 50).ToArray() + }; + var json = System.Text.Json.JsonSerializer.Serialize(data); + _logBuilder.AppendLine($"Async JSON length: {json.Length}"); + } +} From 092bd471667cb73b655d8c09e80405e8f364f033 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 11 Nov 2025 23:57:18 +0000 Subject: [PATCH 007/192] Add performance benchmarks documentation for TUnit --- .github/scripts/docs/docs/benchmarks/index.md | 69 ++ .github/scripts/process-benchmarks.js | 153 +-- docs/docs/benchmarks/index.md | 117 ++- docs/docusaurus.config.ts | 5 + docs/package.json | 1 + docs/static/benchmarks/historical.json | 44 +- docs/static/benchmarks/latest.json | 194 +++- docs/static/benchmarks/summary.json | 6 +- docs/yarn.lock | 962 +++++++++++++++++- 9 files changed, 1328 insertions(+), 223 deletions(-) create mode 100644 .github/scripts/docs/docs/benchmarks/index.md diff --git a/.github/scripts/docs/docs/benchmarks/index.md b/.github/scripts/docs/docs/benchmarks/index.md new file mode 100644 index 0000000000..8bfca449e7 --- /dev/null +++ b/.github/scripts/docs/docs/benchmarks/index.md @@ -0,0 +1,69 @@ +--- +title: Performance Benchmarks +description: Real-world performance comparisons between TUnit and other .NET testing frameworks +sidebar_position: 1 +--- + +# Performance Benchmarks + +:::info Last Updated +These benchmarks were automatically generated on **2025-11-11** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET 10 +::: + +## šŸš€ Runtime Performance + + +--- + +## šŸ“Š Methodology + +These benchmarks compare TUnit against the most popular .NET testing frameworks: + +| Framework | Version Tested | +|-----------|----------------| +| **TUnit** | latest | +| **xUnit v3** | latest | +| **NUnit** | latest | +| **MSTest** | latest | + +### Test Scenarios + +The benchmarks measure real-world testing patterns: + +- **DataDrivenTests**: Parameterized tests with multiple data sources +- **AsyncTests**: Realistic async/await patterns with I/O simulation +- **ScaleTests**: Large test suites (150+ tests) measuring scalability +- **MatrixTests**: Combinatorial test generation and execution +- **MassiveParallelTests**: Parallel execution stress tests +- **SetupTeardownTests**: Expensive test fixtures with setup/teardown overhead + +### Environment + +- **OS**: Ubuntu Latest (GitHub Actions) +- **Runtime**: .NET 10 +- **SDK**: .NET 10 SDK +- **Hardware**: GitHub Actions Standard Runner (Ubuntu) +- **Tool**: BenchmarkDotNet + +### Why These Numbers Matter + +- **No Mocking**: All tests use realistic patterns, not artificial micro-benchmarks +- **Equivalent Logic**: Each framework implements identical test scenarios +- **Warm-Up Excluded**: Measurements exclude JIT warm-up overhead +- **Statistical Rigor**: Multiple iterations with outlier detection + +### Source Code + +All benchmark source code is available in the [`tools/speed-comparison`](https://github.com/thomhurst/TUnit/tree/main/tools/speed-comparison) directory. + +--- + +:::note Continuous Benchmarking +These benchmarks run automatically daily via [GitHub Actions](https://github.com/thomhurst/TUnit/actions/workflows/speed-comparison.yml). + +Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. +::: + +*Last generated: 2025-11-11T23:48:04.871Z* diff --git a/.github/scripts/process-benchmarks.js b/.github/scripts/process-benchmarks.js index f46ff58c51..a0d1109e64 100644 --- a/.github/scripts/process-benchmarks.js +++ b/.github/scripts/process-benchmarks.js @@ -79,8 +79,10 @@ function extractEnvironmentInfo(content) { } function parseMeanValue(meanStr) { - // Parse "352.5 ms" -> 352.5 - const match = meanStr.match(/[\d.]+/); + // Parse "352.5 ms" or "1,211.6 ms" -> 352.5 or 1211.6 + // Remove commas, then extract number + const cleaned = meanStr.replace(/,/g, ''); + const match = cleaned.match(/[\d.]+/); return match ? parseFloat(match[0]) : 0; } @@ -136,62 +138,7 @@ const stats = { lastUpdated: new Date().toISOString() }; -console.log('\nšŸ“ˆ Calculating performance comparisons...'); - -function calculateComparisons() { - const comparisons = {}; - - Object.entries(categories.runtime).forEach(([category, data]) => { - const tunit = data.find(d => d.Method === 'TUnit'); - const tunitAOT = data.find(d => d.Method === 'TUnit_AOT'); - const xunit = data.find(d => d.Method === 'xUnit3'); - const nunit = data.find(d => d.Method === 'NUnit'); - const mstest = data.find(d => d.Method === 'MSTest'); - - if (tunit) { - const tunitMean = parseMeanValue(tunit.Mean); - comparisons[category] = { - tunitMean, - tunitAOTMean: tunitAOT ? parseMeanValue(tunitAOT.Mean) : null, - vsXUnit: xunit ? (parseMeanValue(xunit.Mean) / tunitMean).toFixed(2) : null, - vsNUnit: nunit ? (parseMeanValue(nunit.Mean) / tunitMean).toFixed(2) : null, - vsMSTest: mstest ? (parseMeanValue(mstest.Mean) / tunitMean).toFixed(2) : null, - aotSpeedup: tunitAOT ? (tunitMean / parseMeanValue(tunitAOT.Mean)).toFixed(2) : null - }; - } - }); - - return comparisons; -} - -const comparisons = calculateComparisons(); - -// Calculate average speedups -const avgSpeedups = { - vsXUnit: 0, - vsNUnit: 0, - vsMSTest: 0, - count: 0 -}; - -Object.values(comparisons).forEach(comp => { - if (comp.vsXUnit) { - avgSpeedups.vsXUnit += parseFloat(comp.vsXUnit); - avgSpeedups.count++; - } - if (comp.vsNUnit) avgSpeedups.vsNUnit += parseFloat(comp.vsNUnit); - if (comp.vsMSTest) avgSpeedups.vsMSTest += parseFloat(comp.vsMSTest); -}); - -if (avgSpeedups.count > 0) { - avgSpeedups.vsXUnit = (avgSpeedups.vsXUnit / avgSpeedups.count).toFixed(1); - avgSpeedups.vsNUnit = (avgSpeedups.vsNUnit / avgSpeedups.count).toFixed(1); - avgSpeedups.vsMSTest = (avgSpeedups.vsMSTest / avgSpeedups.count).toFixed(1); -} - -console.log(` Average speedup vs xUnit: ${avgSpeedups.vsXUnit}x`); -console.log(` Average speedup vs NUnit: ${avgSpeedups.vsNUnit}x`); -console.log(` Average speedup vs MSTest: ${avgSpeedups.vsMSTest}x`); +console.log('\nšŸ“Š Preparing benchmark data...'); // Generate main benchmarks page console.log('\nšŸ“ Generating documentation...'); @@ -225,40 +172,30 @@ Object.entries(categories.runtime).forEach(([testClass, data]) => { mainPage += `|-----------|---------|------|--------|--------|\n`; data.forEach(row => { - const emoji = row.Method.includes('TUnit') ? 'šŸ† ' : ''; const name = row.Method.includes('TUnit_AOT') ? '**TUnit (AOT)**' : row.Method.includes('TUnit') ? '**TUnit**' : row.Method; - mainPage += `| ${emoji}${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |\n`; + mainPage += `| ${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |\n`; }); mainPage += '\n'; - // Add Mermaid bar chart - mainPage += `
\nšŸ“Š Visual Comparison\n\n`; - mainPage += '```mermaid\n%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%%\nxychart-beta\n'; - mainPage += ` title "${testClass} - Mean Execution Time (Lower is Better)"\n`; - mainPage += ' x-axis ['; - - // Add framework names for x-axis - const chartData = data.map(row => { - const name = row.Method.includes('TUnit_AOT') ? 'TUnit (AOT)' : row.Method; - const meanValue = parseMeanValue(row.Mean); - return { name, value: meanValue }; - }); + // Add Mermaid chart + mainPage += `\`\`\`mermaid\n`; + mainPage += `%%{init: {'theme':'base'}}%%\n`; + mainPage += `xychart-beta\n`; + mainPage += ` title "${testClass} Performance Comparison"\n`; - mainPage += chartData.map(d => `"${d.name}"`).join(', '); - mainPage += ']\n'; - mainPage += ' y-axis "Time (ms)" 0 --> '; + // Detect time unit from the data + const sampleMean = data[0]?.Mean || ''; + const timeUnit = sampleMean.includes(' s') ? 's' : 'ms'; - // Set y-axis max to 120% of the highest value for better visualization - const maxValue = Math.max(...chartData.map(d => d.value)); - mainPage += Math.ceil(maxValue * 1.2); - mainPage += '\n'; + // Find max value for y-axis scaling + const maxValue = Math.max(...data.map(d => parseMeanValue(d.Mean))); + const yMax = Math.ceil(maxValue * 1.2); // 20% padding - mainPage += ' bar ['; - mainPage += chartData.map(d => d.value.toFixed(2)).join(', '); - mainPage += ']\n'; - mainPage += '```\n\n'; - mainPage += `
\n\n`; + mainPage += ` x-axis [${data.map(d => `"${d.Method}"`).join(', ')}]\n`; + mainPage += ` y-axis "Time (${timeUnit})" 0 --> ${yMax}\n`; + mainPage += ` bar [${data.map(d => parseMeanValue(d.Mean)).join(', ')}]\n`; + mainPage += `\`\`\`\n\n`; }); // Add build time results @@ -271,40 +208,30 @@ if (Object.keys(categories.build).length > 0) { mainPage += `|-----------|---------|------|--------|--------|\n`; data.forEach(row => { - const emoji = row.Method.includes('TUnit') ? 'šŸ† ' : ''; const name = row.Method.includes('TUnit') ? '**TUnit**' : row.Method; - mainPage += `| ${emoji}${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |\n`; + mainPage += `| ${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |\n`; }); mainPage += '\n'; - // Add Mermaid bar chart for build performance - mainPage += `
\nšŸ“Š Visual Comparison\n\n`; - mainPage += '```mermaid\n%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%%\nxychart-beta\n'; - mainPage += ` title "Build Time Comparison - Mean Compilation Time (Lower is Better)"\n`; - mainPage += ' x-axis ['; - - // Add framework names for x-axis - const chartData = data.map(row => { - const name = row.Method; - const meanValue = parseMeanValue(row.Mean); - return { name, value: meanValue }; - }); + // Add Mermaid chart for build performance + mainPage += `\`\`\`mermaid\n`; + mainPage += `%%{init: {'theme':'base'}}%%\n`; + mainPage += `xychart-beta\n`; + mainPage += ` title "Build Time Comparison"\n`; - mainPage += chartData.map(d => `"${d.name}"`).join(', '); - mainPage += ']\n'; - mainPage += ' y-axis "Time (ms)" 0 --> '; + // Detect time unit from the data + const sampleMean = data[0]?.Mean || ''; + const timeUnit = sampleMean.includes(' s') ? 's' : 'ms'; - // Set y-axis max to 120% of the highest value for better visualization - const maxValue = Math.max(...chartData.map(d => d.value)); - mainPage += Math.ceil(maxValue * 1.2); - mainPage += '\n'; + // Find max value for y-axis scaling + const maxValue = Math.max(...data.map(d => parseMeanValue(d.Mean))); + const yMax = Math.ceil(maxValue * 1.2); // 20% padding - mainPage += ' bar ['; - mainPage += chartData.map(d => d.value.toFixed(2)).join(', '); - mainPage += ']\n'; - mainPage += '```\n\n'; - mainPage += `
\n\n`; + mainPage += ` x-axis [${data.map(d => `"${d.Method}"`).join(', ')}]\n`; + mainPage += ` y-axis "Time (${timeUnit})" 0 --> ${yMax}\n`; + mainPage += ` bar [${data.map(d => parseMeanValue(d.Mean)).join(', ')}]\n`; + mainPage += `\`\`\`\n\n`; }); } @@ -337,9 +264,10 @@ The benchmarks measure real-world testing patterns: - **DataDrivenTests**: Parameterized tests with multiple data sources - **AsyncTests**: Realistic async/await patterns with I/O simulation -- **ScaleTests**: Large test suites (1000+ tests) measuring scalability +- **ScaleTests**: Large test suites (150+ tests) measuring scalability - **MatrixTests**: Combinatorial test generation and execution - **MassiveParallelTests**: Parallel execution stress tests +- **SetupTeardownTests**: Expensive test fixtures with setup/teardown overhead ### Environment @@ -380,8 +308,6 @@ const benchmarkData = { environment: environmentInfo, categories: categories.runtime, build: categories.build, - comparisons, - averageSpeedups: avgSpeedups, stats }; @@ -407,7 +333,6 @@ if (fs.existsSync(historicalFile)) { // Add new data point historical.push({ date: new Date().toISOString().split('T')[0], - averageSpeedups: avgSpeedups, environment: environmentInfo.os || 'Ubuntu' }); diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index b0bb83b7cc..26b2a27508 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -15,29 +15,104 @@ These benchmarks were automatically generated on **2025-11-11** from the latest ## šŸš€ Runtime Performance -### results +### AsyncTests | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| šŸ† **TUnit** | 1.0.78 | 580.4 ms | 578.3 ms | 7.38 ms | +| **TUnit** | 1.0.78 | 515.2 ms | 514.4 ms | 5.97 ms | +| NUnit | 4.4.0 | 653.0 ms | 651.9 ms | 9.14 ms | +| MSTest | 4.0.2 | 625.0 ms | 626.1 ms | 5.44 ms | +| xUnit3 | 3.2.0 | 705.5 ms | 703.8 ms | 8.57 ms | +| **TUnit (AOT)** | 1.0.78 | 123.0 ms | 123.0 ms | 0.27 ms | + +```mermaid +%%{init: {'theme':'base'}}%% +xychart-beta + title "AsyncTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 847 + bar [515.2, 653, 625, 705.5, 123] +``` + + +### DataDrivenTests + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.0.78 | 470.12 ms | 468.90 ms | 6.656 ms | +| NUnit | 4.4.0 | 517.39 ms | 515.90 ms | 5.243 ms | +| MSTest | 4.0.2 | 469.53 ms | 468.35 ms | 8.490 ms | +| xUnit3 | 3.2.0 | 559.23 ms | 561.96 ms | 6.806 ms | +| **TUnit (AOT)** | 1.0.78 | 23.21 ms | 23.24 ms | 0.216 ms | + +```mermaid +%%{init: {'theme':'base'}}%% +xychart-beta + title "DataDrivenTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 672 + bar [470.12, 517.39, 469.53, 559.23, 23.21] +``` + + +### MassiveParallelTests + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.0.78 | 580.4 ms | 578.3 ms | 7.38 ms | | NUnit | 4.4.0 | 1,211.6 ms | 1,209.8 ms | 9.40 ms | | MSTest | 4.0.2 | 2,995.4 ms | 2,996.6 ms | 7.68 ms | | xUnit3 | 3.2.0 | 3,086.8 ms | 3,086.9 ms | 11.28 ms | -| šŸ† **TUnit (AOT)** | 1.0.78 | 130.8 ms | 130.8 ms | 0.47 ms | +| **TUnit (AOT)** | 1.0.78 | 130.8 ms | 130.8 ms | 0.47 ms | -
-šŸ“Š Visual Comparison +```mermaid +%%{init: {'theme':'base'}}%% +xychart-beta + title "MassiveParallelTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 3705 + bar [580.4, 1211.6, 2995.4, 3086.8, 130.8] +``` + + +### MatrixTests + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.0.78 | 556.38 ms | 555.90 ms | 7.361 ms | +| NUnit | 4.4.0 | 1,545.79 ms | 1,548.36 ms | 14.829 ms | +| MSTest | 4.0.2 | 1,510.34 ms | 1,509.61 ms | 12.203 ms | +| xUnit3 | 3.2.0 | 1,595.19 ms | 1,596.19 ms | 9.486 ms | +| **TUnit (AOT)** | 1.0.78 | 78.81 ms | 78.75 ms | 0.441 ms | ```mermaid -%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%% +%%{init: {'theme':'base'}}%% xychart-beta - title "results - Mean Execution Time (Lower is Better)" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit (AOT)"] - y-axis "Time (ms)" 0 --> 697 - bar [580.40, 1.00, 2.00, 3.00, 130.80] + title "MatrixTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 1915 + bar [556.38, 1545.79, 1510.34, 1595.19, 78.81] ``` -
+ +### ScaleTests + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.0.78 | 488.96 ms | 489.51 ms | 3.711 ms | +| NUnit | 4.4.0 | 564.21 ms | 564.16 ms | 7.073 ms | +| MSTest | 4.0.2 | 496.03 ms | 494.58 ms | 7.211 ms | +| xUnit3 | 3.2.0 | 578.53 ms | 581.03 ms | 10.227 ms | +| **TUnit (AOT)** | 1.0.78 | 45.46 ms | 45.85 ms | 4.083 ms | + +```mermaid +%%{init: {'theme':'base'}}%% +xychart-beta + title "ScaleTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 695 + bar [488.96, 564.21, 496.03, 578.53, 45.46] +``` --- @@ -48,25 +123,20 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| šŸ† **TUnit** | 1.0.78 | 1.791 s | 1.788 s | 0.0257 s | +| **TUnit** | 1.0.78 | 1.791 s | 1.788 s | 0.0257 s | | Build_NUnit | 4.4.0 | 1.560 s | 1.565 s | 0.0213 s | | Build_MSTest | 4.0.2 | 1.652 s | 1.656 s | 0.0123 s | | Build_xUnit3 | 3.2.0 | 1.546 s | 1.551 s | 0.0203 s | -
-šŸ“Š Visual Comparison - ```mermaid -%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#4CAF50", "primaryTextColor": "#fff", "primaryBorderColor": "#2E7D32", "lineColor": "#2E7D32", "secondaryColor": "#FFC107", "tertiaryColor": "#2196F3"}}}%% +%%{init: {'theme':'base'}}%% xychart-beta - title "Build Time Comparison - Mean Compilation Time (Lower is Better)" + title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] - y-axis "Time (ms)" 0 --> 3 - bar [1.79, 1.56, 1.65, 1.55] + y-axis "Time (s)" 0 --> 3 + bar [1.791, 1.56, 1.652, 1.546] ``` -
- --- @@ -87,9 +157,10 @@ The benchmarks measure real-world testing patterns: - **DataDrivenTests**: Parameterized tests with multiple data sources - **AsyncTests**: Realistic async/await patterns with I/O simulation -- **ScaleTests**: Large test suites (1000+ tests) measuring scalability +- **ScaleTests**: Large test suites (150+ tests) measuring scalability - **MatrixTests**: Combinatorial test generation and execution - **MassiveParallelTests**: Parallel execution stress tests +- **SetupTeardownTests**: Expensive test fixtures with setup/teardown overhead ### Environment @@ -118,4 +189,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-11T22:58:18.735Z* +*Last generated: 2025-11-11T23:54:26.122Z* diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 0b75b8f24b..d9b66cd3c6 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -55,6 +55,11 @@ const config: Config = { ], ], + markdown: { + mermaid: true, + }, + themes: ['@docusaurus/theme-mermaid'], + themeConfig: { // Replace with your project's social card algolia: { diff --git a/docs/package.json b/docs/package.json index 15e14f9e45..4aab3e1654 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,6 +17,7 @@ "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/preset-classic": "3.9.2", + "@docusaurus/theme-mermaid": "^3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.1.1", "prism-react-renderer": "^2.4.0", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index f224d6dfaf..463b63da63 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -1,52 +1,10 @@ [ { - "date": "2025-11-07", - "averageSpeedups": { - "vsXUnit": "1.3", - "vsNUnit": "1.2", - "vsMSTest": "1.3", - "count": 1 - }, - "environment": "Ubuntu" - }, - { - "date": "2025-11-08", - "averageSpeedups": { - "vsXUnit": "1.2", - "vsNUnit": "1.1", - "vsMSTest": "1.0", - "count": 1 - }, - "environment": "Ubuntu" - }, - { - "date": "2025-11-09", - "averageSpeedups": { - "vsXUnit": "0.0", - "vsNUnit": "0.0", - "vsMSTest": "0.0", - "count": 1 - }, - "environment": "Ubuntu" - }, - { - "date": "2025-11-10", - "averageSpeedups": { - "vsXUnit": "1.2", - "vsNUnit": "1.2", - "vsMSTest": "1.0", - "count": 1 - }, + "date": "2025-11-11", "environment": "Ubuntu" }, { "date": "2025-11-11", - "averageSpeedups": { - "vsXUnit": "0.0", - "vsNUnit": "0.0", - "vsMSTest": "0.0", - "count": 1 - }, "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 076f04121d..9012f7c5d8 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,12 +1,96 @@ { - "timestamp": "2025-11-11T22:58:18.735Z", + "timestamp": "2025-11-11T23:54:26.123Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { - "results": [ + "AsyncTests": [ + { + "Method": "TUnit", + "Version": "1.0.78", + "Mean": "515.2 ms", + "Error": "6.38 ms", + "StdDev": "5.97 ms", + "Median": "514.4 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "653.0 ms", + "Error": "10.31 ms", + "StdDev": "9.14 ms", + "Median": "651.9 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "625.0 ms", + "Error": "6.14 ms", + "StdDev": "5.44 ms", + "Median": "626.1 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "705.5 ms", + "Error": "9.67 ms", + "StdDev": "8.57 ms", + "Median": "703.8 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.0.78", + "Mean": "123.0 ms", + "Error": "0.32 ms", + "StdDev": "0.27 ms", + "Median": "123.0 ms" + } + ], + "DataDrivenTests": [ + { + "Method": "TUnit", + "Version": "1.0.78", + "Mean": "470.12 ms", + "Error": "7.116 ms", + "StdDev": "6.656 ms", + "Median": "468.90 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "517.39 ms", + "Error": "5.915 ms", + "StdDev": "5.243 ms", + "Median": "515.90 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "469.53 ms", + "Error": "9.076 ms", + "StdDev": "8.490 ms", + "Median": "468.35 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "559.23 ms", + "Error": "7.276 ms", + "StdDev": "6.806 ms", + "Median": "561.96 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.0.78", + "Mean": "23.21 ms", + "Error": "0.231 ms", + "StdDev": "0.216 ms", + "Median": "23.24 ms" + } + ], + "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.0.78", @@ -47,6 +131,90 @@ "StdDev": "0.47 ms", "Median": "130.8 ms" } + ], + "MatrixTests": [ + { + "Method": "TUnit", + "Version": "1.0.78", + "Mean": "556.38 ms", + "Error": "7.869 ms", + "StdDev": "7.361 ms", + "Median": "555.90 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,545.79 ms", + "Error": "15.854 ms", + "StdDev": "14.829 ms", + "Median": "1,548.36 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "1,510.34 ms", + "Error": "13.046 ms", + "StdDev": "12.203 ms", + "Median": "1,509.61 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "1,595.19 ms", + "Error": "10.701 ms", + "StdDev": "9.486 ms", + "Median": "1,596.19 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.0.78", + "Mean": "78.81 ms", + "Error": "0.471 ms", + "StdDev": "0.441 ms", + "Median": "78.75 ms" + } + ], + "ScaleTests": [ + { + "Method": "TUnit", + "Version": "1.0.78", + "Mean": "488.96 ms", + "Error": "4.187 ms", + "StdDev": "3.711 ms", + "Median": "489.51 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "564.21 ms", + "Error": "7.978 ms", + "StdDev": "7.073 ms", + "Median": "564.16 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "496.03 ms", + "Error": "8.635 ms", + "StdDev": "7.211 ms", + "Median": "494.58 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "578.53 ms", + "Error": "11.537 ms", + "StdDev": "10.227 ms", + "Median": "581.03 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.0.78", + "Mean": "45.46 ms", + "Error": "1.385 ms", + "StdDev": "4.083 ms", + "Median": "45.85 ms" + } ] }, "build": { @@ -85,26 +253,10 @@ } ] }, - "comparisons": { - "results": { - "tunitMean": 580.4, - "tunitAOTMean": 130.8, - "vsXUnit": "0.01", - "vsNUnit": "0.00", - "vsMSTest": "0.00", - "aotSpeedup": "4.44" - } - }, - "averageSpeedups": { - "vsXUnit": "0.0", - "vsNUnit": "0.0", - "vsMSTest": "0.0", - "count": 1 - }, "stats": { - "runtimeCategories": 1, + "runtimeCategories": 5, "buildCategories": 1, - "totalBenchmarks": 2, - "lastUpdated": "2025-11-11T22:58:18.734Z" + "totalBenchmarks": 6, + "lastUpdated": "2025-11-11T23:54:26.121Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index d91d4c1bd0..13ed3fdef0 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -1,6 +1,10 @@ { "runtime": [ - "results" + "AsyncTests", + "DataDrivenTests", + "MassiveParallelTests", + "MatrixTests", + "ScaleTests" ], "build": [ "BuildTime" diff --git a/docs/yarn.lock b/docs/yarn.lock index e7b9f20ebd..884c7aca68 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -231,6 +231,19 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@antfu/install-pkg@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz" + integrity sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ== + dependencies: + package-manager-detector "^1.3.0" + tinyexec "^1.0.1" + +"@antfu/utils@^9.2.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@antfu/utils/-/utils-9.3.0.tgz" + integrity sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" @@ -1137,6 +1150,43 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@braintree/sanitize-url@^7.1.1": + version "7.1.1" + resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz" + integrity sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw== + +"@chevrotain/cst-dts-gen@11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz" + integrity sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ== + dependencies: + "@chevrotain/gast" "11.0.3" + "@chevrotain/types" "11.0.3" + lodash-es "4.17.21" + +"@chevrotain/gast@11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz" + integrity sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q== + dependencies: + "@chevrotain/types" "11.0.3" + lodash-es "4.17.21" + +"@chevrotain/regexp-to-ast@11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz" + integrity sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA== + +"@chevrotain/types@11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz" + integrity sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ== + +"@chevrotain/utils@11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz" + integrity sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" @@ -1873,6 +1923,19 @@ tslib "^2.6.0" utility-types "^3.10.0" +"@docusaurus/theme-mermaid@^3.9.2": + version "3.9.2" + resolved "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.2.tgz" + integrity sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw== + dependencies: + "@docusaurus/core" "3.9.2" + "@docusaurus/module-type-aliases" "3.9.2" + "@docusaurus/theme-common" "3.9.2" + "@docusaurus/types" "3.9.2" + "@docusaurus/utils-validation" "3.9.2" + mermaid ">=11.6.0" + tslib "^2.6.0" + "@docusaurus/theme-search-algolia@3.9.2": version "3.9.2" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz" @@ -1985,6 +2048,25 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@iconify/utils@^3.0.1": + version "3.0.2" + resolved "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.2.tgz" + integrity sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ== + dependencies: + "@antfu/install-pkg" "^1.1.0" + "@antfu/utils" "^9.2.0" + "@iconify/types" "^2.0.0" + debug "^4.4.1" + globals "^15.15.0" + kolorist "^1.8.0" + local-pkg "^1.1.1" + mlly "^1.7.4" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" @@ -2129,6 +2211,13 @@ dependencies: "@types/mdx" "^2.0.0" +"@mermaid-js/parser@^0.6.3": + version "0.6.3" + resolved "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz" + integrity sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA== + dependencies: + langium "3.3.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -2382,6 +2471,216 @@ dependencies: "@types/node" "*" +"@types/d3-array@*": + version "3.2.2" + resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz" + integrity sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw== + +"@types/d3-axis@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-contour@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.4" + resolved "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== + +"@types/d3-dispatch@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz" + integrity sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA== + +"@types/d3-drag@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.10" + resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@*": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-geo@*": + version "3.1.0" + resolved "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.1.7" + resolved "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== + +"@types/d3-interpolate@*": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.1" + resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== + +"@types/d3-polygon@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== + +"@types/d3-quadtree@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz" + integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== + +"@types/d3-scale-chromatic@*": + version "3.1.0" + resolved "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== + +"@types/d3-scale@*": + version "4.0.9" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== + dependencies: + "@types/d3-time" "*" + +"@types/d3-selection@*": + version "3.0.11" + resolved "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + +"@types/d3-shape@*": + version "3.1.7" + resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz" + integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@*": + version "4.0.3" + resolved "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== + +"@types/d3-time@*": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== + +"@types/d3-timer@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + +"@types/d3-transition@*": + version "3.0.9" + resolved "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.8" + resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.4.3": + version "7.4.3" + resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + "@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" @@ -2437,6 +2736,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/geojson@*": + version "7946.0.16" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== + "@types/gtag.js@^0.0.12": version "0.0.12" resolved "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz" @@ -2632,6 +2936,11 @@ dependencies: "@types/node" "*" +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz" @@ -2815,10 +3124,10 @@ acorn-walk@^8.0.0: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.0.4, acorn@^8.14.0, acorn@^8.8.2: - version "8.14.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.0.4, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.8.2: + version "8.15.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== address@^1.0.1: version "1.2.2" @@ -3307,6 +3616,25 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" +chevrotain-allstar@~0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz" + integrity sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw== + dependencies: + lodash-es "^4.17.21" + +chevrotain@^11.0.0, chevrotain@~11.0.3: + version "11.0.3" + resolved "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz" + integrity sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw== + dependencies: + "@chevrotain/cst-dts-gen" "11.0.3" + "@chevrotain/gast" "11.0.3" + "@chevrotain/regexp-to-ast" "11.0.3" + "@chevrotain/types" "11.0.3" + "@chevrotain/utils" "11.0.3" + lodash-es "4.17.21" + chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" @@ -3434,6 +3762,11 @@ commander@^8.3.0: resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@7: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" @@ -3464,6 +3797,16 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +confbox@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz" + integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" @@ -3559,6 +3902,20 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: version "8.3.6" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" @@ -3764,17 +4121,320 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape-fcose@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.2.0, cytoscape@^3.29.3: + version "3.33.1" + resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz" + integrity sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ== + +d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: + version "3.2.4" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-path@1: + version "1.0.9" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@3: + version "3.2.0" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.9.0: + version "7.9.0" + resolved "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.13: + version "7.0.13" + resolved "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz" + integrity sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q== + dependencies: + d3 "^7.9.0" + lodash-es "^4.17.21" + +dayjs@^1.11.18: + version "1.11.19" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz" + integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.4.1, debug@4: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@2.6.9: version "2.6.9" @@ -3853,6 +4513,13 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delaunator@5: + version "5.0.1" + resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" + depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" @@ -3951,6 +4618,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.2.5: + version "3.3.0" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz" + integrity sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" @@ -4284,6 +4958,11 @@ express@^4.21.2: utils-merge "1.0.1" vary "~1.1.2" +exsolve@^1.0.7: + version "1.0.8" + resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz" + integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" @@ -4512,6 +5191,11 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^15.15.0: + version "15.15.0" + resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== + globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" @@ -4586,6 +5270,11 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +hachure-fill@^0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz" + integrity sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" @@ -4926,6 +5615,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -5004,6 +5700,16 @@ inline-style-parser@0.2.2: resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz" integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" @@ -5336,6 +6042,13 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +katex@^0.16.22: + version "0.16.25" + resolved "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz" + integrity sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q== + dependencies: + commander "^8.3.0" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" @@ -5343,6 +6056,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +khroma@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== + kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" @@ -5353,6 +6071,22 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +langium@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz" + integrity sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w== + dependencies: + chevrotain "~11.0.3" + chevrotain-allstar "~0.3.0" + vscode-languageserver "~9.0.1" + vscode-languageserver-textdocument "~1.0.11" + vscode-uri "~3.0.8" + latest-version@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz" @@ -5368,6 +6102,16 @@ launch-editor@^2.6.1: picocolors "^1.1.1" shell-quote "^1.8.3" +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" @@ -5397,6 +6141,15 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +local-pkg@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz" + integrity sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A== + dependencies: + mlly "^1.7.4" + pkg-types "^2.3.0" + quansync "^0.2.11" + locate-path@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" @@ -5404,6 +6157,11 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" +lodash-es@^4.17.21, lodash-es@4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" @@ -5479,7 +6237,7 @@ markdown-table@^3.0.0: resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== -marked@^16.3.0: +marked@^16.2.1, marked@^16.3.0: version "16.3.0" resolved "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz" integrity sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w== @@ -5743,6 +6501,32 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +mermaid@>=11.6.0: + version "11.12.1" + resolved "https://registry.npmjs.org/mermaid/-/mermaid-11.12.1.tgz" + integrity sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g== + dependencies: + "@braintree/sanitize-url" "^7.1.1" + "@iconify/utils" "^3.0.1" + "@mermaid-js/parser" "^0.6.3" + "@types/d3" "^7.4.3" + cytoscape "^3.29.3" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.2.0" + d3 "^7.9.0" + d3-sankey "^0.12.3" + dagre-d3-es "7.0.13" + dayjs "^1.11.18" + dompurify "^3.2.5" + katex "^0.16.22" + khroma "^2.1.0" + lodash-es "^4.17.21" + marked "^16.2.1" + roughjs "^4.6.6" + stylis "^4.3.6" + ts-dedent "^2.2.0" + uuid "^11.1.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" @@ -6272,26 +7056,31 @@ minimist@^1.2.0: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mlly@^1.7.4: + version "1.8.0" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz" + integrity sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g== + dependencies: + acorn "^8.15.0" + pathe "^2.0.3" + pkg-types "^1.3.1" + ufo "^1.6.1" + mrmime@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== +ms@^2.1.3, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" @@ -6523,6 +7312,11 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" +package-manager-detector@^1.3.0: + version "1.5.0" + resolved "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.5.0.tgz" + integrity sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" @@ -6595,6 +7389,11 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-data-parser@^0.1.0, path-data-parser@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz" + integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w== + path-exists@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" @@ -6637,6 +7436,11 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^2.0.1, pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + periscopic@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz" @@ -6663,6 +7467,37 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" +pkg-types@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + +pkg-types@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz" + integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== + dependencies: + confbox "^0.2.2" + exsolve "^1.0.7" + pathe "^2.0.3" + +points-on-curve@^0.2.0, points-on-curve@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz" + integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A== + +points-on-path@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz" + integrity sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g== + dependencies: + path-data-parser "0.1.0" + points-on-curve "0.2.0" + postcss-attribute-case-insensitive@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz" @@ -7305,6 +8140,11 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" +quansync@^0.2.11: + version "0.2.11" + resolved "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz" + integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -7702,6 +8542,21 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + +roughjs@^4.6.6: + version "4.6.6" + resolved "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz" + integrity sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ== + dependencies: + hachure-fill "^0.5.2" + path-data-parser "^0.1.0" + points-on-curve "^0.2.0" + points-on-path "^0.2.1" + rtlcss@^4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz" @@ -7724,6 +8579,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@1: + version "1.3.3" + resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" @@ -7739,7 +8599,7 @@ safe-buffer@5.1.2: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -8227,6 +9087,11 @@ stylehacks@^6.1.1: browserslist "^4.23.0" postcss-selector-parser "^6.0.16" +stylis@^4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -8323,6 +9188,11 @@ tiny-warning@^1.0.0: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyexec@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz" + integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== + tinypool@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz" @@ -8360,6 +9230,11 @@ trough@^2.0.0: resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + tslib@^2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.6.0, tslib@2: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" @@ -8400,6 +9275,11 @@ typescript@>=4.9.5, typescript@~5.9.0: resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== +ufo@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz" + integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" @@ -8585,6 +9465,11 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" @@ -8625,6 +9510,41 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +vscode-jsonrpc@8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz" + integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== + +vscode-languageserver-protocol@3.17.5: + version "3.17.5" + resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz" + integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== + dependencies: + vscode-jsonrpc "8.2.0" + vscode-languageserver-types "3.17.5" + +vscode-languageserver-textdocument@~1.0.11: + version "1.0.12" + resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== + +vscode-languageserver-types@3.17.5: + version "3.17.5" + resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== + +vscode-languageserver@~9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz" + integrity sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g== + dependencies: + vscode-languageserver-protocol "3.17.5" + +vscode-uri@~3.0.8: + version "3.0.8" + resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + watchpack@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" From c265d8c74053fcfa4d1245cb826f8695e597552c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:03:47 +0000 Subject: [PATCH 008/192] chore(deps): update dependency polyfill to v9 (#3791) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index 6dd52bbb6b..f822718364 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>8.9.1 + <_TUnitPolyfillVersion>9.0.0 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From f9451b5d6be4b14eb029a35886fa6beb7b981d29 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:04:12 +0000 Subject: [PATCH 009/192] chore: update benchmark results (#3793) --- docs/docs/benchmarks/index.md | 112 ++--------- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 250 ++++--------------------- docs/static/benchmarks/summary.json | 8 +- 4 files changed, 63 insertions(+), 311 deletions(-) diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 26b2a27508..b10c0e9d1f 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-11** from the latest CI run. +These benchmarks were automatically generated on **2025-11-12** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -15,103 +15,23 @@ These benchmarks were automatically generated on **2025-11-11** from the latest ## šŸš€ Runtime Performance -### AsyncTests +### results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 515.2 ms | 514.4 ms | 5.97 ms | -| NUnit | 4.4.0 | 653.0 ms | 651.9 ms | 9.14 ms | -| MSTest | 4.0.2 | 625.0 ms | 626.1 ms | 5.44 ms | -| xUnit3 | 3.2.0 | 705.5 ms | 703.8 ms | 8.57 ms | -| **TUnit (AOT)** | 1.0.78 | 123.0 ms | 123.0 ms | 0.27 ms | +| **TUnit** | 1.0.78 | 495.66 ms | 496.75 ms | 3.288 ms | +| NUnit | 4.4.0 | 533.59 ms | 534.97 ms | 10.858 ms | +| MSTest | 4.0.2 | 505.82 ms | 502.05 ms | 13.674 ms | +| xUnit3 | 3.2.0 | 583.29 ms | 580.92 ms | 10.011 ms | +| **TUnit (AOT)** | 1.0.78 | 25.84 ms | 25.90 ms | 0.241 ms | ```mermaid %%{init: {'theme':'base'}}%% xychart-beta - title "AsyncTests Performance Comparison" + title "results Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 847 - bar [515.2, 653, 625, 705.5, 123] -``` - - -### DataDrivenTests - -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 470.12 ms | 468.90 ms | 6.656 ms | -| NUnit | 4.4.0 | 517.39 ms | 515.90 ms | 5.243 ms | -| MSTest | 4.0.2 | 469.53 ms | 468.35 ms | 8.490 ms | -| xUnit3 | 3.2.0 | 559.23 ms | 561.96 ms | 6.806 ms | -| **TUnit (AOT)** | 1.0.78 | 23.21 ms | 23.24 ms | 0.216 ms | - -```mermaid -%%{init: {'theme':'base'}}%% -xychart-beta - title "DataDrivenTests Performance Comparison" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 672 - bar [470.12, 517.39, 469.53, 559.23, 23.21] -``` - - -### MassiveParallelTests - -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 580.4 ms | 578.3 ms | 7.38 ms | -| NUnit | 4.4.0 | 1,211.6 ms | 1,209.8 ms | 9.40 ms | -| MSTest | 4.0.2 | 2,995.4 ms | 2,996.6 ms | 7.68 ms | -| xUnit3 | 3.2.0 | 3,086.8 ms | 3,086.9 ms | 11.28 ms | -| **TUnit (AOT)** | 1.0.78 | 130.8 ms | 130.8 ms | 0.47 ms | - -```mermaid -%%{init: {'theme':'base'}}%% -xychart-beta - title "MassiveParallelTests Performance Comparison" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3705 - bar [580.4, 1211.6, 2995.4, 3086.8, 130.8] -``` - - -### MatrixTests - -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 556.38 ms | 555.90 ms | 7.361 ms | -| NUnit | 4.4.0 | 1,545.79 ms | 1,548.36 ms | 14.829 ms | -| MSTest | 4.0.2 | 1,510.34 ms | 1,509.61 ms | 12.203 ms | -| xUnit3 | 3.2.0 | 1,595.19 ms | 1,596.19 ms | 9.486 ms | -| **TUnit (AOT)** | 1.0.78 | 78.81 ms | 78.75 ms | 0.441 ms | - -```mermaid -%%{init: {'theme':'base'}}%% -xychart-beta - title "MatrixTests Performance Comparison" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1915 - bar [556.38, 1545.79, 1510.34, 1595.19, 78.81] -``` - - -### ScaleTests - -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 488.96 ms | 489.51 ms | 3.711 ms | -| NUnit | 4.4.0 | 564.21 ms | 564.16 ms | 7.073 ms | -| MSTest | 4.0.2 | 496.03 ms | 494.58 ms | 7.211 ms | -| xUnit3 | 3.2.0 | 578.53 ms | 581.03 ms | 10.227 ms | -| **TUnit (AOT)** | 1.0.78 | 45.46 ms | 45.85 ms | 4.083 ms | - -```mermaid -%%{init: {'theme':'base'}}%% -xychart-beta - title "ScaleTests Performance Comparison" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 695 - bar [488.96, 564.21, 496.03, 578.53, 45.46] + y-axis "Time (ms)" 0 --> 700 + bar [495.66, 533.59, 505.82, 583.29, 25.84] ``` @@ -123,10 +43,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 1.791 s | 1.788 s | 0.0257 s | -| Build_NUnit | 4.4.0 | 1.560 s | 1.565 s | 0.0213 s | -| Build_MSTest | 4.0.2 | 1.652 s | 1.656 s | 0.0123 s | -| Build_xUnit3 | 3.2.0 | 1.546 s | 1.551 s | 0.0203 s | +| **TUnit** | 1.0.78 | 2.025 s | 2.022 s | 0.0200 s | +| Build_NUnit | 4.4.0 | 1.630 s | 1.634 s | 0.0153 s | +| Build_MSTest | 4.0.2 | 1.712 s | 1.714 s | 0.0165 s | +| Build_xUnit3 | 3.2.0 | 1.600 s | 1.600 s | 0.0100 s | ```mermaid %%{init: {'theme':'base'}}%% @@ -134,7 +54,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [1.791, 1.56, 1.652, 1.546] + bar [2.025, 1.63, 1.712, 1.6] ``` @@ -189,4 +109,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-11T23:54:26.122Z* +*Last generated: 2025-11-12T00:04:00.609Z* diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 463b63da63..eb5613d754 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -6,5 +6,9 @@ { "date": "2025-11-11", "environment": "Ubuntu" + }, + { + "date": "2025-11-12", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 9012f7c5d8..5c50198c2b 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,219 +1,51 @@ { - "timestamp": "2025-11-11T23:54:26.123Z", + "timestamp": "2025-11-12T00:04:00.609Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { - "AsyncTests": [ + "results": [ { "Method": "TUnit", "Version": "1.0.78", - "Mean": "515.2 ms", - "Error": "6.38 ms", - "StdDev": "5.97 ms", - "Median": "514.4 ms" + "Mean": "495.66 ms", + "Error": "3.515 ms", + "StdDev": "3.288 ms", + "Median": "496.75 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "653.0 ms", - "Error": "10.31 ms", - "StdDev": "9.14 ms", - "Median": "651.9 ms" + "Mean": "533.59 ms", + "Error": "10.573 ms", + "StdDev": "10.858 ms", + "Median": "534.97 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "625.0 ms", - "Error": "6.14 ms", - "StdDev": "5.44 ms", - "Median": "626.1 ms" + "Mean": "505.82 ms", + "Error": "9.990 ms", + "StdDev": "13.674 ms", + "Median": "502.05 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "705.5 ms", - "Error": "9.67 ms", - "StdDev": "8.57 ms", - "Median": "703.8 ms" + "Mean": "583.29 ms", + "Error": "10.193 ms", + "StdDev": "10.011 ms", + "Median": "580.92 ms" }, { "Method": "TUnit_AOT", "Version": "1.0.78", - "Mean": "123.0 ms", - "Error": "0.32 ms", - "StdDev": "0.27 ms", - "Median": "123.0 ms" - } - ], - "DataDrivenTests": [ - { - "Method": "TUnit", - "Version": "1.0.78", - "Mean": "470.12 ms", - "Error": "7.116 ms", - "StdDev": "6.656 ms", - "Median": "468.90 ms" - }, - { - "Method": "NUnit", - "Version": "4.4.0", - "Mean": "517.39 ms", - "Error": "5.915 ms", - "StdDev": "5.243 ms", - "Median": "515.90 ms" - }, - { - "Method": "MSTest", - "Version": "4.0.2", - "Mean": "469.53 ms", - "Error": "9.076 ms", - "StdDev": "8.490 ms", - "Median": "468.35 ms" - }, - { - "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "559.23 ms", - "Error": "7.276 ms", - "StdDev": "6.806 ms", - "Median": "561.96 ms" - }, - { - "Method": "TUnit_AOT", - "Version": "1.0.78", - "Mean": "23.21 ms", - "Error": "0.231 ms", - "StdDev": "0.216 ms", - "Median": "23.24 ms" - } - ], - "MassiveParallelTests": [ - { - "Method": "TUnit", - "Version": "1.0.78", - "Mean": "580.4 ms", - "Error": "8.32 ms", - "StdDev": "7.38 ms", - "Median": "578.3 ms" - }, - { - "Method": "NUnit", - "Version": "4.4.0", - "Mean": "1,211.6 ms", - "Error": "10.05 ms", - "StdDev": "9.40 ms", - "Median": "1,209.8 ms" - }, - { - "Method": "MSTest", - "Version": "4.0.2", - "Mean": "2,995.4 ms", - "Error": "8.66 ms", - "StdDev": "7.68 ms", - "Median": "2,996.6 ms" - }, - { - "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "3,086.8 ms", - "Error": "12.06 ms", - "StdDev": "11.28 ms", - "Median": "3,086.9 ms" - }, - { - "Method": "TUnit_AOT", - "Version": "1.0.78", - "Mean": "130.8 ms", - "Error": "0.50 ms", - "StdDev": "0.47 ms", - "Median": "130.8 ms" - } - ], - "MatrixTests": [ - { - "Method": "TUnit", - "Version": "1.0.78", - "Mean": "556.38 ms", - "Error": "7.869 ms", - "StdDev": "7.361 ms", - "Median": "555.90 ms" - }, - { - "Method": "NUnit", - "Version": "4.4.0", - "Mean": "1,545.79 ms", - "Error": "15.854 ms", - "StdDev": "14.829 ms", - "Median": "1,548.36 ms" - }, - { - "Method": "MSTest", - "Version": "4.0.2", - "Mean": "1,510.34 ms", - "Error": "13.046 ms", - "StdDev": "12.203 ms", - "Median": "1,509.61 ms" - }, - { - "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,595.19 ms", - "Error": "10.701 ms", - "StdDev": "9.486 ms", - "Median": "1,596.19 ms" - }, - { - "Method": "TUnit_AOT", - "Version": "1.0.78", - "Mean": "78.81 ms", - "Error": "0.471 ms", - "StdDev": "0.441 ms", - "Median": "78.75 ms" - } - ], - "ScaleTests": [ - { - "Method": "TUnit", - "Version": "1.0.78", - "Mean": "488.96 ms", - "Error": "4.187 ms", - "StdDev": "3.711 ms", - "Median": "489.51 ms" - }, - { - "Method": "NUnit", - "Version": "4.4.0", - "Mean": "564.21 ms", - "Error": "7.978 ms", - "StdDev": "7.073 ms", - "Median": "564.16 ms" - }, - { - "Method": "MSTest", - "Version": "4.0.2", - "Mean": "496.03 ms", - "Error": "8.635 ms", - "StdDev": "7.211 ms", - "Median": "494.58 ms" - }, - { - "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "578.53 ms", - "Error": "11.537 ms", - "StdDev": "10.227 ms", - "Median": "581.03 ms" - }, - { - "Method": "TUnit_AOT", - "Version": "1.0.78", - "Mean": "45.46 ms", - "Error": "1.385 ms", - "StdDev": "4.083 ms", - "Median": "45.85 ms" + "Mean": "25.84 ms", + "Error": "0.272 ms", + "StdDev": "0.241 ms", + "Median": "25.90 ms" } ] }, @@ -222,41 +54,41 @@ { "Method": "Build_TUnit", "Version": "1.0.78", - "Mean": "1.791 s", - "Error": "0.0290 s", - "StdDev": "0.0257 s", - "Median": "1.788 s" + "Mean": "2.025 s", + "Error": "0.0225 s", + "StdDev": "0.0200 s", + "Median": "2.022 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.560 s", - "Error": "0.0240 s", - "StdDev": "0.0213 s", - "Median": "1.565 s" + "Mean": "1.630 s", + "Error": "0.0183 s", + "StdDev": "0.0153 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.652 s", - "Error": "0.0132 s", - "StdDev": "0.0123 s", - "Median": "1.656 s" + "Mean": "1.712 s", + "Error": "0.0177 s", + "StdDev": "0.0165 s", + "Median": "1.714 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.546 s", - "Error": "0.0217 s", - "StdDev": "0.0203 s", - "Median": "1.551 s" + "Mean": "1.600 s", + "Error": "0.0120 s", + "StdDev": "0.0100 s", + "Median": "1.600 s" } ] }, "stats": { - "runtimeCategories": 5, + "runtimeCategories": 1, "buildCategories": 1, - "totalBenchmarks": 6, - "lastUpdated": "2025-11-11T23:54:26.121Z" + "totalBenchmarks": 2, + "lastUpdated": "2025-11-12T00:04:00.608Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 13ed3fdef0..f3ba5050a2 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -1,14 +1,10 @@ { "runtime": [ - "AsyncTests", - "DataDrivenTests", - "MassiveParallelTests", - "MatrixTests", - "ScaleTests" + "results" ], "build": [ "BuildTime" ], - "timestamp": "2025-11-11", + "timestamp": "2025-11-12", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 05f248967e30517ab75877f7fb23a970c2b3702c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:30:13 +0000 Subject: [PATCH 010/192] chore: update benchmark results (#3795) --- docs/docs/benchmarks/index.md | 26 ++++----- docs/static/benchmarks/historical.json | 4 ++ docs/static/benchmarks/latest.json | 76 +++++++++++++------------- 3 files changed, 55 insertions(+), 51 deletions(-) diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index b10c0e9d1f..1ee894a3c2 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -19,19 +19,19 @@ These benchmarks were automatically generated on **2025-11-12** from the latest | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 495.66 ms | 496.75 ms | 3.288 ms | -| NUnit | 4.4.0 | 533.59 ms | 534.97 ms | 10.858 ms | -| MSTest | 4.0.2 | 505.82 ms | 502.05 ms | 13.674 ms | -| xUnit3 | 3.2.0 | 583.29 ms | 580.92 ms | 10.011 ms | -| **TUnit (AOT)** | 1.0.78 | 25.84 ms | 25.90 ms | 0.241 ms | +| **TUnit** | 1.0.78 | 559.5 ms | 559.1 ms | 4.23 ms | +| NUnit | 4.4.0 | 673.9 ms | 674.9 ms | 14.13 ms | +| MSTest | 4.0.2 | 637.8 ms | 634.8 ms | 7.82 ms | +| xUnit3 | 3.2.0 | 723.7 ms | 721.6 ms | 13.31 ms | +| **TUnit (AOT)** | 1.0.78 | 123.2 ms | 122.9 ms | 0.66 ms | ```mermaid %%{init: {'theme':'base'}}%% xychart-beta title "results Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 700 - bar [495.66, 533.59, 505.82, 583.29, 25.84] + y-axis "Time (ms)" 0 --> 869 + bar [559.5, 673.9, 637.8, 723.7, 123.2] ``` @@ -43,10 +43,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 2.025 s | 2.022 s | 0.0200 s | -| Build_NUnit | 4.4.0 | 1.630 s | 1.634 s | 0.0153 s | -| Build_MSTest | 4.0.2 | 1.712 s | 1.714 s | 0.0165 s | -| Build_xUnit3 | 3.2.0 | 1.600 s | 1.600 s | 0.0100 s | +| **TUnit** | 1.0.78 | 1.993 s | 1.991 s | 0.0148 s | +| Build_NUnit | 4.4.0 | 1.602 s | 1.602 s | 0.0126 s | +| Build_MSTest | 4.0.2 | 1.677 s | 1.678 s | 0.0063 s | +| Build_xUnit3 | 3.2.0 | 1.586 s | 1.590 s | 0.0126 s | ```mermaid %%{init: {'theme':'base'}}%% @@ -54,7 +54,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.025, 1.63, 1.712, 1.6] + bar [1.993, 1.602, 1.677, 1.586] ``` @@ -109,4 +109,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T00:04:00.609Z* +*Last generated: 2025-11-12T00:30:03.764Z* diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index eb5613d754..1cd8258e39 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -7,6 +7,10 @@ "date": "2025-11-11", "environment": "Ubuntu" }, + { + "date": "2025-11-12", + "environment": "Ubuntu" + }, { "date": "2025-11-12", "environment": "Ubuntu" diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 5c50198c2b..52755f0611 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-12T00:04:00.609Z", + "timestamp": "2025-11-12T00:30:03.765Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.0.78", - "Mean": "495.66 ms", - "Error": "3.515 ms", - "StdDev": "3.288 ms", - "Median": "496.75 ms" + "Mean": "559.5 ms", + "Error": "4.77 ms", + "StdDev": "4.23 ms", + "Median": "559.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "533.59 ms", - "Error": "10.573 ms", - "StdDev": "10.858 ms", - "Median": "534.97 ms" + "Mean": "673.9 ms", + "Error": "12.71 ms", + "StdDev": "14.13 ms", + "Median": "674.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "505.82 ms", - "Error": "9.990 ms", - "StdDev": "13.674 ms", - "Median": "502.05 ms" + "Mean": "637.8 ms", + "Error": "9.37 ms", + "StdDev": "7.82 ms", + "Median": "634.8 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "583.29 ms", - "Error": "10.193 ms", - "StdDev": "10.011 ms", - "Median": "580.92 ms" + "Mean": "723.7 ms", + "Error": "14.23 ms", + "StdDev": "13.31 ms", + "Median": "721.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.0.78", - "Mean": "25.84 ms", - "Error": "0.272 ms", - "StdDev": "0.241 ms", - "Median": "25.90 ms" + "Mean": "123.2 ms", + "Error": "0.71 ms", + "StdDev": "0.66 ms", + "Median": "122.9 ms" } ] }, @@ -54,34 +54,34 @@ { "Method": "Build_TUnit", "Version": "1.0.78", - "Mean": "2.025 s", - "Error": "0.0225 s", - "StdDev": "0.0200 s", - "Median": "2.022 s" + "Mean": "1.993 s", + "Error": "0.0167 s", + "StdDev": "0.0148 s", + "Median": "1.991 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.630 s", - "Error": "0.0183 s", - "StdDev": "0.0153 s", - "Median": "1.634 s" + "Mean": "1.602 s", + "Error": "0.0135 s", + "StdDev": "0.0126 s", + "Median": "1.602 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.712 s", - "Error": "0.0177 s", - "StdDev": "0.0165 s", - "Median": "1.714 s" + "Mean": "1.677 s", + "Error": "0.0081 s", + "StdDev": "0.0063 s", + "Median": "1.678 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.600 s", - "Error": "0.0120 s", - "StdDev": "0.0100 s", - "Median": "1.600 s" + "Mean": "1.586 s", + "Error": "0.0135 s", + "StdDev": "0.0126 s", + "Median": "1.590 s" } ] }, @@ -89,6 +89,6 @@ "runtimeCategories": 1, "buildCategories": 1, "totalBenchmarks": 2, - "lastUpdated": "2025-11-12T00:04:00.608Z" + "lastUpdated": "2025-11-12T00:30:03.764Z" } } \ No newline at end of file From 0d0fcdec8319e2135cc36d666a934f1e93b70b63 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:30:39 +0000 Subject: [PATCH 011/192] feat: enhance benchmark documentation generation and styling --- .github/scripts/process-benchmarks.js | 279 ++++++++++++++++++-------- docs/sidebars.ts | 5 +- docs/src/css/benchmark-charts.css | 69 +++++++ docs/src/css/custom.css | 3 + 4 files changed, 276 insertions(+), 80 deletions(-) create mode 100644 docs/src/css/benchmark-charts.css diff --git a/.github/scripts/process-benchmarks.js b/.github/scripts/process-benchmarks.js index a0d1109e64..ecfda6f301 100644 --- a/.github/scripts/process-benchmarks.js +++ b/.github/scripts/process-benchmarks.js @@ -139,112 +139,233 @@ const stats = { }; console.log('\nšŸ“Š Preparing benchmark data...'); - -// Generate main benchmarks page console.log('\nšŸ“ Generating documentation...'); const timestamp = new Date().toISOString().split('T')[0]; +const sampleData = Object.values(categories.runtime)[0] || []; +const frameworks = { + tunit: sampleData.find(d => d.Method === 'TUnit')?.Version || 'latest', + xunit: sampleData.find(d => d.Method === 'xUnit3')?.Version || 'latest', + nunit: sampleData.find(d => d.Method === 'NUnit')?.Version || 'latest', + mstest: sampleData.find(d => d.Method === 'MSTest')?.Version || 'latest' +}; -let mainPage = `--- -title: Performance Benchmarks -description: Real-world performance comparisons between TUnit and other .NET testing frameworks -sidebar_position: 1 +// Generate individual benchmark pages for each runtime category +Object.entries(categories.runtime).forEach(([testClass, data]) => { + const benchmarkPage = `--- +title: ${testClass} +description: Performance benchmark results for ${testClass} +sidebar_position: ${Object.keys(categories.runtime).indexOf(testClass) + 2} --- -# Performance Benchmarks +# ${testClass} Benchmark :::info Last Updated -These benchmarks were automatically generated on **${timestamp}** from the latest CI run. +This benchmark was automatically generated on **${timestamp}** from the latest CI run. **Environment:** ${environmentInfo.os || 'Ubuntu Latest'} • ${environmentInfo.sdk || '.NET 10'} ::: -## šŸš€ Runtime Performance +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +${data.map(row => { + const name = row.Method.includes('TUnit_AOT') ? '**TUnit (AOT)**' : row.Method.includes('TUnit') ? '**TUnit**' : row.Method; + return `| ${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |`; +}).join('\n')} + +## šŸ“ˆ Visual Comparison + +\`\`\`mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#10b981', + 'primaryTextColor': '#fff', + 'primaryBorderColor': '#059669', + 'lineColor': '#d1d5db', + 'secondaryColor': '#3b82f6', + 'tertiaryColor': '#f59e0b', + 'background': '#ffffff', + 'mainBkg': '#10b981', + 'secondBkg': '#ef4444', + 'tertiaryBkg': '#f59e0b' + } +}}%% +xychart-beta + title "${testClass} Performance Comparison" + x-axis [${data.map(d => `"${d.Method}"`).join(', ')}] + y-axis "Time (${data[0]?.Mean.includes(' s') ? 's' : 'ms'})" 0 --> ${Math.ceil(Math.max(...data.map(d => parseMeanValue(d.Mean))) * 1.2)} + bar [${data.map(d => parseMeanValue(d.Mean)).join(', ')}] +\`\`\` + +## šŸŽÆ Key Insights + +${(() => { + const tunitResult = data.find(d => d.Method === 'TUnit'); + const tunitAotResult = data.find(d => d.Method === 'TUnit_AOT'); + const otherResults = data.filter(d => !d.Method.includes('TUnit')); + + if (!tunitResult) return '- TUnit data not available'; + + const tunitMean = parseMeanValue(tunitResult.Mean); + const insights = []; + + otherResults.forEach(other => { + const otherMean = parseMeanValue(other.Mean); + const speedup = (otherMean / tunitMean).toFixed(2); + if (speedup > 1) { + insights.push(`- **${speedup}x faster** than ${other.Method} (${other.Version})`); + } + }); + if (tunitAotResult) { + const aotMean = parseMeanValue(tunitAotResult.Mean); + const aotSpeedup = (tunitMean / aotMean).toFixed(2); + insights.push(`- **${aotSpeedup}x faster** with Native AOT compilation`); + } + + return insights.join('\n'); +})()} + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: ${new Date().toISOString()}* `; -// Add runtime results -Object.entries(categories.runtime).forEach(([testClass, data]) => { - mainPage += `\n### ${testClass}\n\n`; + fs.writeFileSync(path.join(OUTPUT_DIR, `${testClass}.md`), benchmarkPage); + console.log(` āœ“ Created ${OUTPUT_DIR}/${testClass}.md`); + + // Generate individual JSON file for each benchmark + const benchmarkJson = { + timestamp: new Date().toISOString(), + category: testClass, + environment: environmentInfo, + results: data + }; + + fs.writeFileSync( + path.join(STATIC_DIR, `${testClass}.json`), + JSON.stringify(benchmarkJson, null, 2) + ); + console.log(` āœ“ Created ${STATIC_DIR}/${testClass}.json`); +}); - // Add table - mainPage += `| Framework | Version | Mean | Median | StdDev |\n`; - mainPage += `|-----------|---------|------|--------|--------|\n`; +// Generate build benchmark page if available +if (Object.keys(categories.build).length > 0) { + Object.entries(categories.build).forEach(([testClass, data]) => { + const benchmarkPage = `--- +title: Build Performance +description: Compilation time benchmark results +sidebar_position: ${Object.keys(categories.runtime).length + 2} +--- - data.forEach(row => { - const name = row.Method.includes('TUnit_AOT') ? '**TUnit (AOT)**' : row.Method.includes('TUnit') ? '**TUnit**' : row.Method; - mainPage += `| ${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |\n`; - }); +# Build Performance Benchmark - mainPage += '\n'; +:::info Last Updated +This benchmark was automatically generated on **${timestamp}** from the latest CI run. - // Add Mermaid chart - mainPage += `\`\`\`mermaid\n`; - mainPage += `%%{init: {'theme':'base'}}%%\n`; - mainPage += `xychart-beta\n`; - mainPage += ` title "${testClass} Performance Comparison"\n`; +**Environment:** ${environmentInfo.os || 'Ubuntu Latest'} • ${environmentInfo.sdk || '.NET 10'} +::: - // Detect time unit from the data - const sampleMean = data[0]?.Mean || ''; - const timeUnit = sampleMean.includes(' s') ? 's' : 'ms'; +## šŸ“Š Results + +Compilation time comparison across frameworks: + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +${data.map(row => { + const name = row.Method.includes('TUnit') ? '**TUnit**' : row.Method; + return `| ${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |`; +}).join('\n')} + +## šŸ“ˆ Visual Comparison + +\`\`\`mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#10b981', + 'primaryTextColor': '#fff', + 'primaryBorderColor': '#059669', + 'lineColor': '#d1d5db', + 'secondaryColor': '#3b82f6', + 'tertiaryColor': '#f59e0b', + 'background': '#ffffff', + 'mainBkg': '#10b981', + 'secondBkg': '#ef4444', + 'tertiaryBkg': '#f59e0b' + } +}}%% +xychart-beta + title "Build Time Comparison" + x-axis [${data.map(d => `"${d.Method}"`).join(', ')}] + y-axis "Time (${data[0]?.Mean.includes(' s') ? 's' : 'ms'})" 0 --> ${Math.ceil(Math.max(...data.map(d => parseMeanValue(d.Mean))) * 1.2)} + bar [${data.map(d => parseMeanValue(d.Mean)).join(', ')}] +\`\`\` - // Find max value for y-axis scaling - const maxValue = Math.max(...data.map(d => parseMeanValue(d.Mean))); - const yMax = Math.ceil(maxValue * 1.2); // 20% padding +--- - mainPage += ` x-axis [${data.map(d => `"${d.Method}"`).join(', ')}]\n`; - mainPage += ` y-axis "Time (${timeUnit})" 0 --> ${yMax}\n`; - mainPage += ` bar [${data.map(d => parseMeanValue(d.Mean)).join(', ')}]\n`; - mainPage += `\`\`\`\n\n`; -}); +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: -// Add build time results -if (Object.keys(categories.build).length > 0) { - mainPage += `\n---\n\n## šŸ”Ø Build Performance\n\n`; - mainPage += `Compilation time comparison across frameworks:\n\n`; +*Last generated: ${new Date().toISOString()}* +`; - Object.entries(categories.build).forEach(([testClass, data]) => { - mainPage += `| Framework | Version | Mean | Median | StdDev |\n`; - mainPage += `|-----------|---------|------|--------|--------|\n`; - - data.forEach(row => { - const name = row.Method.includes('TUnit') ? '**TUnit**' : row.Method; - mainPage += `| ${name} | ${row.Version || 'N/A'} | ${row.Mean} | ${row.Median || 'N/A'} | ${row.StdDev || 'N/A'} |\n`; - }); - - mainPage += '\n'; - - // Add Mermaid chart for build performance - mainPage += `\`\`\`mermaid\n`; - mainPage += `%%{init: {'theme':'base'}}%%\n`; - mainPage += `xychart-beta\n`; - mainPage += ` title "Build Time Comparison"\n`; - - // Detect time unit from the data - const sampleMean = data[0]?.Mean || ''; - const timeUnit = sampleMean.includes(' s') ? 's' : 'ms'; - - // Find max value for y-axis scaling - const maxValue = Math.max(...data.map(d => parseMeanValue(d.Mean))); - const yMax = Math.ceil(maxValue * 1.2); // 20% padding - - mainPage += ` x-axis [${data.map(d => `"${d.Method}"`).join(', ')}]\n`; - mainPage += ` y-axis "Time (${timeUnit})" 0 --> ${yMax}\n`; - mainPage += ` bar [${data.map(d => parseMeanValue(d.Mean)).join(', ')}]\n`; - mainPage += `\`\`\`\n\n`; + fs.writeFileSync(path.join(OUTPUT_DIR, 'BuildTime.md'), benchmarkPage); + console.log(` āœ“ Created ${OUTPUT_DIR}/BuildTime.md`); + + // Generate build benchmark JSON + const buildJson = { + timestamp: new Date().toISOString(), + category: 'BuildTime', + environment: environmentInfo, + results: data + }; + + fs.writeFileSync( + path.join(STATIC_DIR, 'BuildTime.json'), + JSON.stringify(buildJson, null, 2) + ); + console.log(` āœ“ Created ${STATIC_DIR}/BuildTime.json`); }); } -// Add methodology section -const sampleData = Object.values(categories.runtime)[0] || []; -const frameworks = { - tunit: sampleData.find(d => d.Method === 'TUnit')?.Version || 'latest', - xunit: sampleData.find(d => d.Method === 'xUnit3')?.Version || 'latest', - nunit: sampleData.find(d => d.Method === 'NUnit')?.Version || 'latest', - mstest: sampleData.find(d => d.Method === 'MSTest')?.Version || 'latest' -}; +// Generate index/overview page +const indexPage = `--- +title: Performance Benchmarks +description: Real-world performance comparisons between TUnit and other .NET testing frameworks +sidebar_position: 1 +--- + +# Performance Benchmarks + +:::info Last Updated +These benchmarks were automatically generated on **${timestamp}** from the latest CI run. + +**Environment:** ${environmentInfo.os || 'Ubuntu Latest'} • ${environmentInfo.sdk || '.NET 10'} +::: + +## šŸš€ Runtime Benchmarks + +Click on any benchmark to view detailed results: + +${Object.keys(categories.runtime).map(testClass => + `- [${testClass}](${testClass}) - Detailed performance analysis` +).join('\n')} + +${Object.keys(categories.build).length > 0 ? ` +## šŸ”Ø Build Benchmarks + +- [Build Performance](BuildTime) - Compilation time comparison +` : ''} -mainPage += ` --- ## šŸ“Š Methodology @@ -299,7 +420,7 @@ Each benchmark runs multiple iterations with statistical analysis to ensure accu *Last generated: ${new Date().toISOString()}* `; -fs.writeFileSync(path.join(OUTPUT_DIR, 'index.md'), mainPage); +fs.writeFileSync(path.join(OUTPUT_DIR, 'index.md'), indexPage); console.log(` āœ“ Created ${OUTPUT_DIR}/index.md`); // Generate JSON for interactive components diff --git a/docs/sidebars.ts b/docs/sidebars.ts index fd63fab784..b53b165699 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -291,7 +291,10 @@ const sidebars: SidebarsConfig = { collapsed: false, items: [ 'benchmarks/index', - 'benchmarks/methodology', + { + type: 'autogenerated', + dirName: 'benchmarks', + }, ], }, ], diff --git a/docs/src/css/benchmark-charts.css b/docs/src/css/benchmark-charts.css new file mode 100644 index 0000000000..cf992fae08 --- /dev/null +++ b/docs/src/css/benchmark-charts.css @@ -0,0 +1,69 @@ +/* Enhanced styling for Mermaid benchmark charts */ + +/* Override Mermaid xychart bar colors for better visibility */ +.markdown article .mermaid .xychart .plot > g > g > rect:nth-child(1) { + fill: #10b981 !important; /* TUnit - Emerald Green */ + opacity: 0.9; +} + +.markdown article .mermaid .xychart .plot > g > g > rect:nth-child(2) { + fill: #ef4444 !important; /* NUnit - Red */ + opacity: 0.85; +} + +.markdown article .mermaid .xychart .plot > g > g > rect:nth-child(3) { + fill: #f59e0b !important; /* MSTest - Amber */ + opacity: 0.85; +} + +.markdown article .mermaid .xychart .plot > g > g > rect:nth-child(4) { + fill: #8b5cf6 !important; /* xUnit - Purple */ + opacity: 0.85; +} + +.markdown article .mermaid .xychart .plot > g > g > rect:nth-child(5) { + fill: #06b6d4 !important; /* TUnit AOT - Cyan */ + opacity: 0.9; +} + +/* Enhance chart readability */ +.markdown article .mermaid .xychart text { + fill: var(--ifm-font-color-base) !important; + font-family: var(--ifm-font-family-base); +} + +.markdown article .mermaid .xychart .title { + font-size: 16px; + font-weight: 600; +} + +/* Grid lines for better readability */ +.markdown article .mermaid .xychart line { + stroke: var(--ifm-color-emphasis-300); + stroke-opacity: 0.5; +} + +/* Axis styling */ +.markdown article .mermaid .xychart .xAxis line, +.markdown article .mermaid .xychart .yAxis line { + stroke: var(--ifm-color-emphasis-500); +} + +/* Dark mode adjustments */ +[data-theme='dark'] .markdown article .mermaid .xychart text { + fill: var(--ifm-font-color-base) !important; +} + +[data-theme='dark'] .markdown article .mermaid .xychart line { + stroke: var(--ifm-color-emphasis-500); +} + +/* Add subtle hover effects */ +.markdown article .mermaid .xychart .plot > g > g > rect { + transition: opacity 0.2s ease; +} + +.markdown article .mermaid .xychart .plot > g > g > rect:hover { + opacity: 1 !important; + filter: brightness(1.1); +} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 7d4220ef57..912280f65d 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -4,6 +4,9 @@ * work well for content-centric websites. */ +/* Import benchmark chart styling */ +@import url('./benchmark-charts.css'); + /* You can override the default Infima variables here. */ :root { --ifm-color-primary: #14b8a6; From ec75f2f93f02d8fe83596ea54679c0912f1a0776 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:34:20 +0000 Subject: [PATCH 012/192] Update templates to use .NET 10 (#3792) * Update templates to use .NET 10 * chore: update target frameworks to .NET 10 only --- TUnit.Engine.Tests/TUnit.Engine.Tests.csproj | 2 +- .../TUnit.Example.Asp.Net.TestProject.csproj | 2 +- TUnit.Example.Asp.Net/TUnit.Example.Asp.Net.csproj | 2 +- .../TUnit.AspNet/TUnit.AspNet/TUnit.AspNet.csproj | 2 +- .../TUnit.AspNet/WebApp/WebApp.csproj | 2 +- .../TUnit.Aspire.Starter.ApiService.csproj | 2 +- .../TUnit.Aspire.Starter.AppHost.csproj | 2 +- .../TUnit.Aspire.Starter.ServiceDefaults.csproj | 2 +- .../TUnit.Aspire.Starter.TestProject.csproj | 2 +- .../TUnit.Aspire.Starter.WebApp.csproj | 2 +- .../TUnit.Aspire.Test/TUnit.Aspire.Test.csproj | 2 +- .../TUnit.AspNet.FSharp/TUnit.AspNet.FSharp.fsproj | 2 +- .../TUnit.AspNet.FSharp/WebApp/WebApp.fsproj | 2 +- TUnit.Templates.Tests/TUnit.Templates.Tests.csproj | 2 +- TUnit.Templates/TUnit.Templates.csproj | 2 +- .../content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 2 +- .../content/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj | 2 +- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj | 2 +- .../ExampleNamespace.ApiService.csproj | 2 +- .../ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj | 2 +- .../ExampleNamespace.ServiceDefaults.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- docs/docs/execution/engine-modes.md | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/TUnit.Engine.Tests/TUnit.Engine.Tests.csproj b/TUnit.Engine.Tests/TUnit.Engine.Tests.csproj index 4349b07740..99a1694787 100644 --- a/TUnit.Engine.Tests/TUnit.Engine.Tests.csproj +++ b/TUnit.Engine.Tests/TUnit.Engine.Tests.csproj @@ -3,7 +3,7 @@ - net9.0 + net10.0 diff --git a/TUnit.Example.Asp.Net.TestProject/TUnit.Example.Asp.Net.TestProject.csproj b/TUnit.Example.Asp.Net.TestProject/TUnit.Example.Asp.Net.TestProject.csproj index 4106a2cedb..abc7a1390f 100644 --- a/TUnit.Example.Asp.Net.TestProject/TUnit.Example.Asp.Net.TestProject.csproj +++ b/TUnit.Example.Asp.Net.TestProject/TUnit.Example.Asp.Net.TestProject.csproj @@ -3,7 +3,7 @@ - net9.0;net10.0 + net10.0 diff --git a/TUnit.Example.Asp.Net/TUnit.Example.Asp.Net.csproj b/TUnit.Example.Asp.Net/TUnit.Example.Asp.Net.csproj index 69d9f6d009..549f17e876 100644 --- a/TUnit.Example.Asp.Net/TUnit.Example.Asp.Net.csproj +++ b/TUnit.Example.Asp.Net/TUnit.Example.Asp.Net.csproj @@ -1,7 +1,7 @@ - net9.0;net10.0 + net10.0 enable enable false diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/TUnit.AspNet/TUnit.AspNet.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/TUnit.AspNet/TUnit.AspNet.csproj index 8967721da8..eb10888b9e 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/TUnit.AspNet/TUnit.AspNet.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/TUnit.AspNet/TUnit.AspNet.csproj @@ -4,7 +4,7 @@ enable enable Exe - net9.0 + net10.0 diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/WebApp/WebApp.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/WebApp/WebApp.csproj index 0fb72c4b20..a6a96dcf18 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/WebApp/WebApp.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.AspNet._.verified/TUnit.AspNet/WebApp/WebApp.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ApiService/TUnit.Aspire.Starter.ApiService.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ApiService/TUnit.Aspire.Starter.ApiService.csproj index 0cdcf8be70..1ad71b0e28 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ApiService/TUnit.Aspire.Starter.ApiService.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ApiService/TUnit.Aspire.Starter.ApiService.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.AppHost/TUnit.Aspire.Starter.AppHost.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.AppHost/TUnit.Aspire.Starter.AppHost.csproj index 18012ac870..3cbe117a5a 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.AppHost/TUnit.Aspire.Starter.AppHost.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.AppHost/TUnit.Aspire.Starter.AppHost.csproj @@ -4,7 +4,7 @@ Exe - net9.0 + net10.0 enable enable true diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ServiceDefaults/TUnit.Aspire.Starter.ServiceDefaults.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ServiceDefaults/TUnit.Aspire.Starter.ServiceDefaults.csproj index 6b09c19d12..f0593381b8 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ServiceDefaults/TUnit.Aspire.Starter.ServiceDefaults.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.ServiceDefaults/TUnit.Aspire.Starter.ServiceDefaults.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable true diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.TestProject/TUnit.Aspire.Starter.TestProject.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.TestProject/TUnit.Aspire.Starter.TestProject.csproj index 2356fbfa25..241b9eb367 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.TestProject/TUnit.Aspire.Starter.TestProject.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.TestProject/TUnit.Aspire.Starter.TestProject.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable false diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.WebApp/TUnit.Aspire.Starter.WebApp.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.WebApp/TUnit.Aspire.Starter.WebApp.csproj index ddb4c3bf05..d871db6526 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.WebApp/TUnit.Aspire.Starter.WebApp.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Starter._.verified/TUnit.Aspire.Starter/TUnit.Aspire.Starter.WebApp/TUnit.Aspire.Starter.WebApp.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Test._.verified/TUnit.Aspire.Test/TUnit.Aspire.Test.csproj b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Test._.verified/TUnit.Aspire.Test/TUnit.Aspire.Test.csproj index 3606790ad9..3646299f7b 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Test._.verified/TUnit.Aspire.Test/TUnit.Aspire.Test.csproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTest.TUnit.Aspire.Test._.verified/TUnit.Aspire.Test/TUnit.Aspire.Test.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable false diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp.fsproj b/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp.fsproj index be7d8a2c0d..30cbfc590b 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp.fsproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp/TUnit.AspNet.FSharp.fsproj @@ -5,7 +5,7 @@ enable enable Exe - net9.0 + net10.0 diff --git a/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj b/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj index 4018f042a6..5393f5177d 100644 --- a/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj +++ b/TUnit.Templates.Tests/Snapshots/InstantiationTestWithFSharp.TUnit.AspNet.FSharp._.verified/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 diff --git a/TUnit.Templates.Tests/TUnit.Templates.Tests.csproj b/TUnit.Templates.Tests/TUnit.Templates.Tests.csproj index bfa9211dda..2868a34ab1 100644 --- a/TUnit.Templates.Tests/TUnit.Templates.Tests.csproj +++ b/TUnit.Templates.Tests/TUnit.Templates.Tests.csproj @@ -3,7 +3,7 @@ - net9.0;net10.0 + net10.0 diff --git a/TUnit.Templates/TUnit.Templates.csproj b/TUnit.Templates/TUnit.Templates.csproj index f5fea84539..97c688cbf6 100644 --- a/TUnit.Templates/TUnit.Templates.csproj +++ b/TUnit.Templates/TUnit.Templates.csproj @@ -10,7 +10,7 @@ https://www.github.com/thomhurst/TUnit Template - net9.0 + net10.0 true false content diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 0bb4259733..5bced25117 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -5,7 +5,7 @@ enable enable Exe - net9.0 + net10.0 diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj index b42e1e3d59..e010c79135 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/WebApp/WebApp.fsproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 45f7c0723a..2a0c73c2bf 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -4,7 +4,7 @@ enable enable Exe - net9.0 + net10.0 diff --git a/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj b/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj index d77de3aded..687096f753 100644 --- a/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj index b48bfef63c..e3c1bc99c1 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj index a712d7c89c..44bd877374 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj @@ -4,7 +4,7 @@ Exe - net9.0 + net10.0 enable enable true diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj index 8fd483346a..0eaff9455a 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable true diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 29ac371ea2..a92efa13aa 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable false diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj index 55567ede91..3d403305bb 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 6acb29b07d..c73e63b202 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable false diff --git a/docs/docs/execution/engine-modes.md b/docs/docs/execution/engine-modes.md index 4a6eefbc0b..aa45293abd 100644 --- a/docs/docs/execution/engine-modes.md +++ b/docs/docs/execution/engine-modes.md @@ -107,7 +107,7 @@ Add this MSBuild property to your test project file (`.csproj`): ```xml - net9.0 + net10.0 false From 3fadbda29ab088c0af8323de6827bac4e26511cd Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:36:27 +0000 Subject: [PATCH 013/192] chore(deps): update dependency polyfill to 9.0.1 (#3794) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index f822718364..f27fabe053 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.0.0 + <_TUnitPolyfillVersion>9.0.1 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From 6895443489bb2d324c2f661ca1c65e63f37ae1ec Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:44:22 +0000 Subject: [PATCH 014/192] chore: update benchmark results (#3796) --- docs/docs/benchmarks/BuildTime.md | 57 +++++++++++++++++++ docs/docs/benchmarks/index.md | 46 ++-------------- docs/docs/benchmarks/results.md | 63 +++++++++++++++++++++ docs/static/benchmarks/BuildTime.json | 43 +++++++++++++++ docs/static/benchmarks/historical.json | 4 ++ docs/static/benchmarks/latest.json | 76 +++++++++++++------------- docs/static/benchmarks/results.json | 51 +++++++++++++++++ 7 files changed, 262 insertions(+), 78 deletions(-) create mode 100644 docs/docs/benchmarks/BuildTime.md create mode 100644 docs/docs/benchmarks/results.md create mode 100644 docs/static/benchmarks/BuildTime.json create mode 100644 docs/static/benchmarks/results.json diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md new file mode 100644 index 0000000000..4a20e0cb3f --- /dev/null +++ b/docs/docs/benchmarks/BuildTime.md @@ -0,0 +1,57 @@ +--- +title: Build Performance +description: Compilation time benchmark results +sidebar_position: 3 +--- + +# Build Performance Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +Compilation time comparison across frameworks: + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.0.78 | 2.061 s | 2.060 s | 0.0202 s | +| Build_NUnit | 4.4.0 | 1.645 s | 1.645 s | 0.0147 s | +| Build_MSTest | 4.0.2 | 1.712 s | 1.710 s | 0.0132 s | +| Build_xUnit3 | 3.2.0 | 1.615 s | 1.619 s | 0.0149 s | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#10b981', + 'primaryTextColor': '#fff', + 'primaryBorderColor': '#059669', + 'lineColor': '#d1d5db', + 'secondaryColor': '#3b82f6', + 'tertiaryColor': '#f59e0b', + 'background': '#ffffff', + 'mainBkg': '#10b981', + 'secondBkg': '#ef4444', + 'tertiaryBkg': '#f59e0b' + } +}}%% +xychart-beta + title "Build Time Comparison" + x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] + y-axis "Time (s)" 0 --> 3 + bar [2.061, 1.645, 1.712, 1.615] +``` + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T00:44:12.201Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 1ee894a3c2..4795f4d795 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -12,50 +12,16 @@ These benchmarks were automatically generated on **2025-11-12** from the latest **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: -## šŸš€ Runtime Performance +## šŸš€ Runtime Benchmarks +Click on any benchmark to view detailed results: -### results +- [results](results) - Detailed performance analysis -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 559.5 ms | 559.1 ms | 4.23 ms | -| NUnit | 4.4.0 | 673.9 ms | 674.9 ms | 14.13 ms | -| MSTest | 4.0.2 | 637.8 ms | 634.8 ms | 7.82 ms | -| xUnit3 | 3.2.0 | 723.7 ms | 721.6 ms | 13.31 ms | -| **TUnit (AOT)** | 1.0.78 | 123.2 ms | 122.9 ms | 0.66 ms | -```mermaid -%%{init: {'theme':'base'}}%% -xychart-beta - title "results Performance Comparison" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 869 - bar [559.5, 673.9, 637.8, 723.7, 123.2] -``` +## šŸ”Ø Build Benchmarks - ---- - -## šŸ”Ø Build Performance - -Compilation time comparison across frameworks: - -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 1.993 s | 1.991 s | 0.0148 s | -| Build_NUnit | 4.4.0 | 1.602 s | 1.602 s | 0.0126 s | -| Build_MSTest | 4.0.2 | 1.677 s | 1.678 s | 0.0063 s | -| Build_xUnit3 | 3.2.0 | 1.586 s | 1.590 s | 0.0126 s | - -```mermaid -%%{init: {'theme':'base'}}%% -xychart-beta - title "Build Time Comparison" - x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] - y-axis "Time (s)" 0 --> 3 - bar [1.993, 1.602, 1.677, 1.586] -``` +- [Build Performance](BuildTime) - Compilation time comparison --- @@ -109,4 +75,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T00:30:03.764Z* +*Last generated: 2025-11-12T00:44:12.201Z* diff --git a/docs/docs/benchmarks/results.md b/docs/docs/benchmarks/results.md new file mode 100644 index 0000000000..7fa319d416 --- /dev/null +++ b/docs/docs/benchmarks/results.md @@ -0,0 +1,63 @@ +--- +title: results +description: Performance benchmark results for results +sidebar_position: 2 +--- + +# results Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.0.78 | 569.0 ms | 568.5 ms | 3.62 ms | +| NUnit | 4.4.0 | 691.2 ms | 691.0 ms | 5.19 ms | +| MSTest | 4.0.2 | 658.5 ms | 655.6 ms | 5.84 ms | +| xUnit3 | 3.2.0 | 738.2 ms | 735.9 ms | 7.49 ms | +| **TUnit (AOT)** | 1.0.78 | 124.2 ms | 124.4 ms | 0.42 ms | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#10b981', + 'primaryTextColor': '#fff', + 'primaryBorderColor': '#059669', + 'lineColor': '#d1d5db', + 'secondaryColor': '#3b82f6', + 'tertiaryColor': '#f59e0b', + 'background': '#ffffff', + 'mainBkg': '#10b981', + 'secondBkg': '#ef4444', + 'tertiaryBkg': '#f59e0b' + } +}}%% +xychart-beta + title "results Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 886 + bar [569, 691.2, 658.5, 738.2, 124.2] +``` + +## šŸŽÆ Key Insights + +- **1.21x faster** than NUnit (4.4.0) +- **1.16x faster** than MSTest (4.0.2) +- **1.30x faster** than xUnit3 (3.2.0) +- **4.58x faster** with Native AOT compilation + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T00:44:12.201Z* diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json new file mode 100644 index 0000000000..2f4f507e3d --- /dev/null +++ b/docs/static/benchmarks/BuildTime.json @@ -0,0 +1,43 @@ +{ + "timestamp": "2025-11-12T00:44:12.201Z", + "category": "BuildTime", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "Build_TUnit", + "Version": "1.0.78", + "Mean": "2.061 s", + "Error": "0.0216 s", + "StdDev": "0.0202 s", + "Median": "2.060 s" + }, + { + "Method": "Build_NUnit", + "Version": "4.4.0", + "Mean": "1.645 s", + "Error": "0.0165 s", + "StdDev": "0.0147 s", + "Median": "1.645 s" + }, + { + "Method": "Build_MSTest", + "Version": "4.0.2", + "Mean": "1.712 s", + "Error": "0.0149 s", + "StdDev": "0.0132 s", + "Median": "1.710 s" + }, + { + "Method": "Build_xUnit3", + "Version": "3.2.0", + "Mean": "1.615 s", + "Error": "0.0160 s", + "StdDev": "0.0149 s", + "Median": "1.619 s" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 1cd8258e39..f0a01a895b 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -11,6 +11,10 @@ "date": "2025-11-12", "environment": "Ubuntu" }, + { + "date": "2025-11-12", + "environment": "Ubuntu" + }, { "date": "2025-11-12", "environment": "Ubuntu" diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 52755f0611..0599437f16 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-12T00:30:03.765Z", + "timestamp": "2025-11-12T00:44:12.201Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.0.78", - "Mean": "559.5 ms", - "Error": "4.77 ms", - "StdDev": "4.23 ms", - "Median": "559.1 ms" + "Mean": "569.0 ms", + "Error": "3.87 ms", + "StdDev": "3.62 ms", + "Median": "568.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "673.9 ms", - "Error": "12.71 ms", - "StdDev": "14.13 ms", - "Median": "674.9 ms" + "Mean": "691.2 ms", + "Error": "5.85 ms", + "StdDev": "5.19 ms", + "Median": "691.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "637.8 ms", - "Error": "9.37 ms", - "StdDev": "7.82 ms", - "Median": "634.8 ms" + "Mean": "658.5 ms", + "Error": "6.59 ms", + "StdDev": "5.84 ms", + "Median": "655.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "723.7 ms", - "Error": "14.23 ms", - "StdDev": "13.31 ms", - "Median": "721.6 ms" + "Mean": "738.2 ms", + "Error": "8.45 ms", + "StdDev": "7.49 ms", + "Median": "735.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.0.78", - "Mean": "123.2 ms", - "Error": "0.71 ms", - "StdDev": "0.66 ms", - "Median": "122.9 ms" + "Mean": "124.2 ms", + "Error": "0.45 ms", + "StdDev": "0.42 ms", + "Median": "124.4 ms" } ] }, @@ -54,34 +54,34 @@ { "Method": "Build_TUnit", "Version": "1.0.78", - "Mean": "1.993 s", - "Error": "0.0167 s", - "StdDev": "0.0148 s", - "Median": "1.991 s" + "Mean": "2.061 s", + "Error": "0.0216 s", + "StdDev": "0.0202 s", + "Median": "2.060 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.602 s", - "Error": "0.0135 s", - "StdDev": "0.0126 s", - "Median": "1.602 s" + "Mean": "1.645 s", + "Error": "0.0165 s", + "StdDev": "0.0147 s", + "Median": "1.645 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.677 s", - "Error": "0.0081 s", - "StdDev": "0.0063 s", - "Median": "1.678 s" + "Mean": "1.712 s", + "Error": "0.0149 s", + "StdDev": "0.0132 s", + "Median": "1.710 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.586 s", - "Error": "0.0135 s", - "StdDev": "0.0126 s", - "Median": "1.590 s" + "Mean": "1.615 s", + "Error": "0.0160 s", + "StdDev": "0.0149 s", + "Median": "1.619 s" } ] }, @@ -89,6 +89,6 @@ "runtimeCategories": 1, "buildCategories": 1, "totalBenchmarks": 2, - "lastUpdated": "2025-11-12T00:30:03.764Z" + "lastUpdated": "2025-11-12T00:44:12.200Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/results.json b/docs/static/benchmarks/results.json new file mode 100644 index 0000000000..5c66be3364 --- /dev/null +++ b/docs/static/benchmarks/results.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T00:44:12.201Z", + "category": "results", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.0.78", + "Mean": "569.0 ms", + "Error": "3.87 ms", + "StdDev": "3.62 ms", + "Median": "568.5 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "691.2 ms", + "Error": "5.85 ms", + "StdDev": "5.19 ms", + "Median": "691.0 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "658.5 ms", + "Error": "6.59 ms", + "StdDev": "5.84 ms", + "Median": "655.6 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "738.2 ms", + "Error": "8.45 ms", + "StdDev": "7.49 ms", + "Median": "735.9 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.0.78", + "Mean": "124.2 ms", + "Error": "0.45 ms", + "StdDev": "0.42 ms", + "Median": "124.4 ms" + } + ] +} \ No newline at end of file From f04908138d8328fe887f856af41ee25b840c494c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:49:24 +0000 Subject: [PATCH 015/192] chore(deps): update microsoft.aspnetcore to v10 (#3784) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 2 +- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 3f2141dd84..418b178cf2 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -16,9 +16,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 5bced25117..04588b29e1 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 2a0c73c2bf..f47a1018ad 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj b/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj index 687096f753..d1fadfb3ce 100644 --- a/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj @@ -7,7 +7,7 @@ - + From 5fff6ab9e736e0c06686b1acce17950d9f8025bf Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:50:00 +0000 Subject: [PATCH 016/192] chore(deps): update dependency microsoft.entityframeworkcore to v10 (#3781) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 418b178cf2..60ebed43a2 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -32,7 +32,7 @@ - + From a2cff693e19b3ad19867d687567d841c71d95f69 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:47:00 +0000 Subject: [PATCH 017/192] Optimize polyfill with embedded options (#3805) * chore(deps): update dependency polyfill to v9 * chore: enable embedded polyfill option for specific target frameworks * chore: replace FilePolyfill usage with direct File methods and clean up polyfill references * chore: update .NET version from net9.0 to net10.0 across multiple modules --------- Co-authored-by: Renovate Bot --- .github/actions/execute-pipeline/action.yml | 2 +- Directory.Build.props | 14 +++++++++++++- Directory.Packages.props | 2 +- Polyfill.targets | 12 ++---------- Roslyn.props | 9 +-------- .../TestsBase.cs | 8 ++++---- .../GenericTypeResolverTests.cs | 2 +- TUnit.Core.SourceGenerator.Tests/TestsBase.cs | 8 ++++---- .../UnifiedReflectionFreeTests.cs | 2 +- TUnit.Core.SourceGenerator.Tests/Verify.cs | 6 +++--- .../Attributes/SkipNetFrameworkAttribute.cs | 2 +- TUnit.Engine.Tests/InvokableTestBase.cs | 2 +- TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs | 2 +- .../Modules/PublishNugetTesterAOTModule.cs | 4 ++-- TUnit.Pipeline/Modules/RunAspNetTestsModule.cs | 2 +- TUnit.Pipeline/Modules/RunEngineTestsModule.cs | 2 +- TUnit.Pipeline/Modules/RunTemplateTestsModule.cs | 2 +- TUnit.Pipeline/Modules/TestNugetPackageModule.cs | 2 +- TUnit.PublicAPI/Tests.cs | 4 ++-- TUnit.PublicAPI/Verify.cs | 6 +++--- .../Polyfills/ModuleInitializerAttribute.cs | 5 ----- TUnit.TestProject/AfterTestAttributeTests.cs | 2 +- .../AfterTests/TestDiscoveryAfterTests.cs | 2 +- .../AfterTests/TestSessionAfterTests.cs | 2 +- .../BeforeTests/TestDiscoveryBeforeTests.cs | 2 +- .../BeforeTests/TestSessionBeforeTests.cs | 2 +- 26 files changed, 50 insertions(+), 58 deletions(-) delete mode 100644 TUnit.TestProject.Library/Polyfills/ModuleInitializerAttribute.cs diff --git a/.github/actions/execute-pipeline/action.yml b/.github/actions/execute-pipeline/action.yml index 55e4893bc4..50c32f7793 100644 --- a/.github/actions/execute-pipeline/action.yml +++ b/.github/actions/execute-pipeline/action.yml @@ -23,7 +23,7 @@ inputs: netversion: description: 'Net version' required: false - default: 'net9.0' + default: 'net10.0' runs: using: "composite" diff --git a/Directory.Build.props b/Directory.Build.props index a351596691..3a10242347 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -69,4 +69,16 @@ - + + true + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props index 60ebed43a2..f771af1524 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + diff --git a/Polyfill.targets b/Polyfill.targets index 27f0006759..ca88149295 100644 --- a/Polyfill.targets +++ b/Polyfill.targets @@ -1,14 +1,6 @@ - - true - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/Roslyn.props b/Roslyn.props index 24cdff7c9e..9a3940c423 100644 --- a/Roslyn.props +++ b/Roslyn.props @@ -1,16 +1,9 @@ - - - true - + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/TUnit.Assertions.SourceGenerator.Tests/TestsBase.cs b/TUnit.Assertions.SourceGenerator.Tests/TestsBase.cs index eddc6c2fda..10df29a364 100644 --- a/TUnit.Assertions.SourceGenerator.Tests/TestsBase.cs +++ b/TUnit.Assertions.SourceGenerator.Tests/TestsBase.cs @@ -37,7 +37,7 @@ public Task RunTest(string inputFile, Func assertions) public async Task RunTest(string inputFile, RunTestOptions runTestOptions, Func assertions) { #if NET - var source = await FilePolyfill.ReadAllTextAsync(inputFile); + var source = await File.ReadAllTextAsync(inputFile); #else var source = File.ReadAllText(inputFile); #endif @@ -80,7 +80,7 @@ namespace System.Diagnostics.CodeAnalysis; public class UnconditionalSuppressMessageAttribute : Attribute; """, #if NET - ..await Task.WhenAll(runTestOptions.AdditionalFiles.Select(x => FilePolyfill.ReadAllTextAsync(x))), + ..await Task.WhenAll(runTestOptions.AdditionalFiles.Select(x => File.ReadAllTextAsync(x))), #else ..runTestOptions.AdditionalFiles.Select(x => File.ReadAllText(x)), #endif @@ -160,8 +160,8 @@ Have you added required references and additional files? verifyTask = verifyTask.OnVerifyMismatch(async (pair, message, verify) => { - var received = await FilePolyfill.ReadAllTextAsync(pair.ReceivedPath); - var verified = await FilePolyfill.ReadAllTextAsync(pair.VerifiedPath); + var received = await File.ReadAllTextAsync(pair.ReceivedPath); + var verified = await File.ReadAllTextAsync(pair.VerifiedPath); // Better diff message since original one is too large await Assert.That(Scrub(received)).IsEqualTo(Scrub(verified)); diff --git a/TUnit.Core.SourceGenerator.Tests/GenericTypeResolverTests.cs b/TUnit.Core.SourceGenerator.Tests/GenericTypeResolverTests.cs index c074eb0d5f..40b105d8fe 100644 --- a/TUnit.Core.SourceGenerator.Tests/GenericTypeResolverTests.cs +++ b/TUnit.Core.SourceGenerator.Tests/GenericTypeResolverTests.cs @@ -148,7 +148,7 @@ public void TestMethod() private async Task RunTestWithInlineSource(string source) { var tempFile = Path.GetTempFileName() + ".cs"; - await FilePolyfill.WriteAllTextAsync(tempFile, source); + await File.WriteAllTextAsync(tempFile, source); try { diff --git a/TUnit.Core.SourceGenerator.Tests/TestsBase.cs b/TUnit.Core.SourceGenerator.Tests/TestsBase.cs index 161a01beed..98e003ad13 100644 --- a/TUnit.Core.SourceGenerator.Tests/TestsBase.cs +++ b/TUnit.Core.SourceGenerator.Tests/TestsBase.cs @@ -43,7 +43,7 @@ public Task RunTest(string inputFile, Func assertions) public async Task RunTest(string inputFile, RunTestOptions runTestOptions, Func assertions) { #if NET - var source = await FilePolyfill.ReadAllTextAsync(inputFile); + var source = await File.ReadAllTextAsync(inputFile); #else var source = File.ReadAllText(inputFile); #endif @@ -86,7 +86,7 @@ namespace System.Diagnostics.CodeAnalysis; public class UnconditionalSuppressMessageAttribute : Attribute; """, #if NET - ..await Task.WhenAll(runTestOptions.AdditionalFiles.Select(x => FilePolyfill.ReadAllTextAsync(x))), + ..await Task.WhenAll(runTestOptions.AdditionalFiles.Select(x => File.ReadAllTextAsync(x))), #else ..runTestOptions.AdditionalFiles.Select(x => File.ReadAllText(x)), #endif @@ -172,8 +172,8 @@ Have you added required references and additional files? { verifyTask = verifyTask.OnVerifyMismatch(async (pair, message, verify) => { - var received = await FilePolyfill.ReadAllTextAsync(pair.ReceivedPath); - var verified = await FilePolyfill.ReadAllTextAsync(pair.VerifiedPath); + var received = await File.ReadAllTextAsync(pair.ReceivedPath); + var verified = await File.ReadAllTextAsync(pair.VerifiedPath); // Better diff message since original one is too large await Assert.That(Scrub(received)).IsEqualTo(Scrub(verified)); diff --git a/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.cs b/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.cs index 3a039c557d..6182181767 100644 --- a/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.cs +++ b/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.cs @@ -95,7 +95,7 @@ public void TestWithConfiguration() private async Task RunTestWithInlineSource(string source) { var tempFile = Path.GetTempFileName() + ".cs"; - await FilePolyfill.WriteAllTextAsync(tempFile, source); + await File.WriteAllTextAsync(tempFile, source); try { diff --git a/TUnit.Core.SourceGenerator.Tests/Verify.cs b/TUnit.Core.SourceGenerator.Tests/Verify.cs index d1db167879..d15b2ac87a 100644 --- a/TUnit.Core.SourceGenerator.Tests/Verify.cs +++ b/TUnit.Core.SourceGenerator.Tests/Verify.cs @@ -157,15 +157,15 @@ public async Task ToTask() if (!File.Exists(_verifiedPath)) { - await FilePolyfill.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); + await File.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); throw new InvalidOperationException($"No verified file found for '{name}'."); } - var approved = await FilePolyfill.ReadAllTextAsync(_verifiedPath); + var approved = await File.ReadAllTextAsync(_verifiedPath); if (!string.Equals(NormalizeNewline(final), NormalizeNewline(approved), StringComparison.Ordinal)) { - await FilePolyfill.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); + await File.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); if (_onVerifyMismatch != null) { diff --git a/TUnit.Engine.Tests/Attributes/SkipNetFrameworkAttribute.cs b/TUnit.Engine.Tests/Attributes/SkipNetFrameworkAttribute.cs index 8ad1fb4e2b..b8205c3ad6 100644 --- a/TUnit.Engine.Tests/Attributes/SkipNetFrameworkAttribute.cs +++ b/TUnit.Engine.Tests/Attributes/SkipNetFrameworkAttribute.cs @@ -2,7 +2,7 @@ public class SkipNetFrameworkAttribute(string reason) : SkipAttribute(reason) { - private static readonly string NetVersion = Environment.GetEnvironmentVariable("NET_VERSION") ?? "net9.0"; + private static readonly string NetVersion = Environment.GetEnvironmentVariable("NET_VERSION") ?? "net10.0"; public override Task ShouldSkip(TestRegisteredContext testRegisteredContext) { diff --git a/TUnit.Engine.Tests/InvokableTestBase.cs b/TUnit.Engine.Tests/InvokableTestBase.cs index bc20a0e4a1..1e264449bc 100644 --- a/TUnit.Engine.Tests/InvokableTestBase.cs +++ b/TUnit.Engine.Tests/InvokableTestBase.cs @@ -22,7 +22,7 @@ public static IEnumerable GetTestModes() } } - private static readonly string GetEnvironmentVariable = Environment.GetEnvironmentVariable("NET_VERSION") ?? "net9.0"; + private static readonly string GetEnvironmentVariable = Environment.GetEnvironmentVariable("NET_VERSION") ?? "net10.0"; public static bool IsNetFramework => GetEnvironmentVariable.StartsWith("net4"); diff --git a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs index 0943197e35..481e4167a3 100644 --- a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs +++ b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs @@ -14,7 +14,7 @@ protected virtual IEnumerable TestableFrameworks { get { - yield return "net9.0"; + yield return "net10.0"; yield return "net8.0"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) diff --git a/TUnit.Pipeline/Modules/PublishNugetTesterAOTModule.cs b/TUnit.Pipeline/Modules/PublishNugetTesterAOTModule.cs index 5bbb404429..b15f0e8a03 100644 --- a/TUnit.Pipeline/Modules/PublishNugetTesterAOTModule.cs +++ b/TUnit.Pipeline/Modules/PublishNugetTesterAOTModule.cs @@ -32,8 +32,8 @@ protected override Task ShouldSkip(IPipelineContext context) .FindFile(x => x.Name == "TUnit.NugetTester.csproj") .AssertExists(); - // Test AOT publishing for net8.0 and net9.0 - foreach (var framework in new[] { "net8.0", "net9.0" }) + // Test AOT publishing + foreach (var framework in new[] { "net8.0", "net9.0", "net10.0" }) { var result = await SubModule($"AOT-{framework}", async () => { diff --git a/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs b/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs index ad5ed5103e..e6c974434a 100644 --- a/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs @@ -22,7 +22,7 @@ public class RunAspNetTestsModule : Module Project = project.Name, NoBuild = true, Configuration = Configuration.Release, - Framework = "net9.0", + Framework = "net10.0", WorkingDirectory = project.Folder!, Arguments = ["--ignore-exit-code", "8", "--hangdump", "--hangdump-filename", "hangdump.aspnet-tests.dmp", "--hangdump-timeout", "5m"], EnvironmentVariables = new Dictionary diff --git a/TUnit.Pipeline/Modules/RunEngineTestsModule.cs b/TUnit.Pipeline/Modules/RunEngineTestsModule.cs index 162ccaf06e..49a70177aa 100644 --- a/TUnit.Pipeline/Modules/RunEngineTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunEngineTestsModule.cs @@ -33,7 +33,7 @@ public class RunEngineTestsModule : Module Project = project.Name, NoBuild = true, Configuration = Configuration.Release, - Framework = "net9.0", + Framework = "net10.0", WorkingDirectory = project.Folder!, Arguments = [ "--hangdump", "--hangdump-filename", $"hangdump.{Environment.OSVersion.Platform}.engine-tests.dmp", "--hangdump-timeout", "30m", diff --git a/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs b/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs index ad6f2384bd..6199c64f72 100644 --- a/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs @@ -22,7 +22,7 @@ public class RunTemplateTestsModule : Module WorkingDirectory = project.Folder!, NoBuild = true, Configuration = Configuration.Release, - Framework = "net9.0", + Framework = "net10.0", Arguments = ["--", "--hangdump", "--hangdump-filename", "hangdump.template-tests.dmp", "--hangdump-timeout", "5m"], EnvironmentVariables = new Dictionary { diff --git a/TUnit.Pipeline/Modules/TestNugetPackageModule.cs b/TUnit.Pipeline/Modules/TestNugetPackageModule.cs index 6ace295308..e9045d5c6e 100644 --- a/TUnit.Pipeline/Modules/TestNugetPackageModule.cs +++ b/TUnit.Pipeline/Modules/TestNugetPackageModule.cs @@ -37,7 +37,7 @@ protected override IEnumerable TestableFrameworks { get { - yield return "net9.0"; + yield return "net10.0"; yield return "net8.0"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) diff --git a/TUnit.PublicAPI/Tests.cs b/TUnit.PublicAPI/Tests.cs index 0aa7f2dff9..67830f80f0 100644 --- a/TUnit.PublicAPI/Tests.cs +++ b/TUnit.PublicAPI/Tests.cs @@ -51,8 +51,8 @@ await VerifyTUnit.Verify(publicApi) .ScrubFilePaths() .OnVerifyMismatch(async (pair, message, verify) => { - var received = await FilePolyfill.ReadAllTextAsync(pair.ReceivedPath); - var verified = await FilePolyfill.ReadAllTextAsync(pair.VerifiedPath); + var received = await File.ReadAllTextAsync(pair.ReceivedPath); + var verified = await File.ReadAllTextAsync(pair.VerifiedPath); // Better diff message since original one is too large await Assert.That(Scrub(received)).IsEqualTo(Scrub(verified)); diff --git a/TUnit.PublicAPI/Verify.cs b/TUnit.PublicAPI/Verify.cs index d057db9a0b..5059fc603c 100644 --- a/TUnit.PublicAPI/Verify.cs +++ b/TUnit.PublicAPI/Verify.cs @@ -129,15 +129,15 @@ public async Task ToTask() if (!File.Exists(_verifiedPath)) { - await FilePolyfill.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); + await File.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); throw new InvalidOperationException($"No verified file found for '{name}'."); } - var approved = await FilePolyfill.ReadAllTextAsync(_verifiedPath); + var approved = await File.ReadAllTextAsync(_verifiedPath); if (!string.Equals(NormalizeNewline(final), NormalizeNewline(approved), StringComparison.Ordinal)) { - await FilePolyfill.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); + await File.WriteAllTextAsync(_receivedPath, NormalizeNewline(final)); if (_onVerifyMismatch != null) { diff --git a/TUnit.TestProject.Library/Polyfills/ModuleInitializerAttribute.cs b/TUnit.TestProject.Library/Polyfills/ModuleInitializerAttribute.cs deleted file mode 100644 index 49cce8f4f0..0000000000 --- a/TUnit.TestProject.Library/Polyfills/ModuleInitializerAttribute.cs +++ /dev/null @@ -1,5 +0,0 @@ -// ReSharper disable once CheckNamespace -namespace System.Runtime.CompilerServices; - -// ReSharper disable once RedundantExtendsListEntry -sealed class ModuleInitializerAttribute : Attribute; diff --git a/TUnit.TestProject/AfterTestAttributeTests.cs b/TUnit.TestProject/AfterTestAttributeTests.cs index 47e9022801..4aba172d1d 100644 --- a/TUnit.TestProject/AfterTestAttributeTests.cs +++ b/TUnit.TestProject/AfterTestAttributeTests.cs @@ -19,7 +19,7 @@ public async ValueTask OnTestEnd(TestContext testContext) { Console.WriteLine(@"Writing file inside WriteFileAfterTestAttribute!"); - await FilePolyfill.WriteAllTextAsync(Filename, "Foo!"); + await File.WriteAllTextAsync(Filename, "Foo!"); } public int Order => 0; diff --git a/TUnit.TestProject/AfterTests/TestDiscoveryAfterTests.cs b/TUnit.TestProject/AfterTests/TestDiscoveryAfterTests.cs index 9a7b82e62a..1adac76180 100644 --- a/TUnit.TestProject/AfterTests/TestDiscoveryAfterTests.cs +++ b/TUnit.TestProject/AfterTests/TestDiscoveryAfterTests.cs @@ -11,7 +11,7 @@ public static async Task AfterTestDiscovery(TestDiscoveryContext context) [AfterEvery(TestDiscovery)] public static async Task AfterEveryTestDiscovery(TestDiscoveryContext context) { - await FilePolyfill.WriteAllTextAsync($"TestDiscoveryAfterTests{Guid.NewGuid():N}.txt", $"{context.AllTests.Count()} tests found"); + await File.WriteAllTextAsync($"TestDiscoveryAfterTests{Guid.NewGuid():N}.txt", $"{context.AllTests.Count()} tests found"); var test = context.AllTests.FirstOrDefault(x => x.Metadata.TestDetails.TestName == nameof(TestDiscoveryAfterTests.EnsureAfterEveryTestDiscoveryHit)); diff --git a/TUnit.TestProject/AfterTests/TestSessionAfterTests.cs b/TUnit.TestProject/AfterTests/TestSessionAfterTests.cs index 384c5f3ba2..34dc0788fb 100644 --- a/TUnit.TestProject/AfterTests/TestSessionAfterTests.cs +++ b/TUnit.TestProject/AfterTests/TestSessionAfterTests.cs @@ -11,7 +11,7 @@ public static async Task AfterTestSession(TestSessionContext context) [AfterEvery(TestSession)] public static async Task AfterEveryTestSession(TestSessionContext context) { - await FilePolyfill.WriteAllTextAsync($"TestSessionAfterTests{Guid.NewGuid():N}.txt", $"{context.AllTests.Count()} tests in session"); + await File.WriteAllTextAsync($"TestSessionAfterTests{Guid.NewGuid():N}.txt", $"{context.AllTests.Count()} tests in session"); var test = context.AllTests.FirstOrDefault(x => x.Metadata.TestDetails.TestName == nameof(TestSessionAfterTests.PepareForAfterSession)); diff --git a/TUnit.TestProject/BeforeTests/TestDiscoveryBeforeTests.cs b/TUnit.TestProject/BeforeTests/TestDiscoveryBeforeTests.cs index da3412f221..73b5060e00 100644 --- a/TUnit.TestProject/BeforeTests/TestDiscoveryBeforeTests.cs +++ b/TUnit.TestProject/BeforeTests/TestDiscoveryBeforeTests.cs @@ -11,7 +11,7 @@ public static async Task BeforeTestDiscovery(BeforeTestDiscoveryContext context) [BeforeEvery(TestDiscovery)] public static async Task BeforeEveryTestDiscovery(BeforeTestDiscoveryContext context) { - await FilePolyfill.WriteAllTextAsync($"TestDiscoveryBeforeTests{Guid.NewGuid():N}.txt", $"Blah!"); + await File.WriteAllTextAsync($"TestDiscoveryBeforeTests{Guid.NewGuid():N}.txt", $"Blah!"); } } diff --git a/TUnit.TestProject/BeforeTests/TestSessionBeforeTests.cs b/TUnit.TestProject/BeforeTests/TestSessionBeforeTests.cs index 8c443ef421..8baf92eadd 100644 --- a/TUnit.TestProject/BeforeTests/TestSessionBeforeTests.cs +++ b/TUnit.TestProject/BeforeTests/TestSessionBeforeTests.cs @@ -11,7 +11,7 @@ public static async Task BeforeTestSession(TestSessionContext context) [BeforeEvery(TestSession)] public static async Task BeforeEveryTestSession(TestSessionContext context) { - await FilePolyfill.WriteAllTextAsync($"TestSessionBeforeTests{Guid.NewGuid():N}.txt", $"{context.AllTests.Count()} tests in session"); + await File.WriteAllTextAsync($"TestSessionBeforeTests{Guid.NewGuid():N}.txt", $"{context.AllTests.Count()} tests in session"); var test = context.AllTests.FirstOrDefault(x => x.Metadata.TestDetails.TestName == nameof(TestSessionBeforeTests.EnsureBeforeEveryTestSessionHit)); From ca3f17ac6e1b48a4216e44d4bda74d17d0d01b9b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:15:59 +0000 Subject: [PATCH 018/192] docs: fix DI attribute example (#3802) --- docs/docs/test-lifecycle/property-injection.md | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/docs/docs/test-lifecycle/property-injection.md b/docs/docs/test-lifecycle/property-injection.md index 58470f0fa9..022af12955 100644 --- a/docs/docs/test-lifecycle/property-injection.md +++ b/docs/docs/test-lifecycle/property-injection.md @@ -8,11 +8,11 @@ The required keyword keeps your code clean and correct. If a property isn't pass ## AOT-Compatible Property Attributes Supported attributes for properties in AOT mode: -- **Argument** - Compile-time constant values -- **MethodDataSource** - Static method data sources -- **ClassDataSource** - Static class-based data sources +- **MethodDataSource** - Data sources via calling a method +- **ClassDataSource** - A data source that injects in T - **DataSourceGeneratorAttribute** - Source-generated data (first item only) -- **ClassDataSource** - Dependency injection with service provider + +For dependency injection with service providers, inherit from `DependencyInjectionDataSourceAttribute` to create custom attributes. See [Dependency Injection](./dependency-injection.md) documentation for details. The AOT system generates strongly-typed property setters at compile time, eliminating reflection overhead and ensuring Native AOT compatibility. @@ -55,10 +55,6 @@ namespace MyTestProject; public class PropertySetterTests { - // Compile-time constant injection - [Arguments("1")] - public required string Property1 { get; init; } - // Static method data source injection [MethodDataSource(nameof(GetMethodData))] public required string Property2 { get; init; } @@ -83,7 +79,7 @@ public class PropertySetterTests [DataSourceGeneratorTests.AutoFixtureGenerator] public required string Property7 { get; init; } - // Service provider dependency injection + // Async initialization example (IAsyncInitializer) [ClassDataSource] public required AsyncPropertyExample AsyncService { get; init; } @@ -91,7 +87,6 @@ public class PropertySetterTests public async Task Test() { // All properties are automatically initialized before this test runs - await Assert.That(Property1).IsEqualTo("1"); await Assert.That(Property2).IsNotNull(); await Assert.That(Property3).IsNotNull(); await Assert.That(AsyncService.IsInitialized).IsTrue(); From 0f8dacc53a391b1910bd8c2d96df49f93f0a19cb Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:21:30 +0000 Subject: [PATCH 019/192] docs: fix formatting error causing build failure (#3807) --- docs/docs/test-lifecycle/property-injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/test-lifecycle/property-injection.md b/docs/docs/test-lifecycle/property-injection.md index 022af12955..e770ab1fc1 100644 --- a/docs/docs/test-lifecycle/property-injection.md +++ b/docs/docs/test-lifecycle/property-injection.md @@ -9,7 +9,7 @@ The required keyword keeps your code clean and correct. If a property isn't pass Supported attributes for properties in AOT mode: - **MethodDataSource** - Data sources via calling a method -- **ClassDataSource** - A data source that injects in T +- **`ClassDataSource`** - A data source that injects in T - **DataSourceGeneratorAttribute** - Source-generated data (first item only) For dependency injection with service providers, inherit from `DependencyInjectionDataSourceAttribute` to create custom attributes. See [Dependency Injection](./dependency-injection.md) documentation for details. From f81f092429c7fc9fd3572719a1ef88ef649e7397 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:58:38 +0000 Subject: [PATCH 020/192] chore(deps): update verify to 31.6.0 (#3808) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f771af1524..d4a959ae77 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From 6c23dc34f3577834374e7597407f81a282d302bf Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:58:56 +0000 Subject: [PATCH 021/192] chore(deps): update opentelemetry to 1.14.0 (#3806) Co-authored-by: Renovate Bot --- .../ExampleNamespace.ServiceDefaults.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj index 0eaff9455a..6e350de0e8 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj @@ -12,8 +12,8 @@ - - + + From 2cd5b0b557ab2dfbefe1d965272076a99fa5d5d8 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:06:20 +0000 Subject: [PATCH 022/192] +semver:minor - Fix ClassDataSource nested property injection not respecting shared types (#3809) * Add test containers and tests for bug #3803: ensure single instance per test session * Fix ClassDataSource nested property injection not respecting shared types --- .../Attributes/TestData/ClassDataSources.cs | 25 +--- .../Bugs/3803/TestRabbitContainer.cs | 51 +++++++ .../Bugs/3803/TestSqlContainer.cs | 51 +++++++ TUnit.TestProject/Bugs/3803/Tests.cs | 135 ++++++++++++++++++ .../Bugs/3803/WebApplicationFactory.cs | 61 ++++++++ 5 files changed, 301 insertions(+), 22 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3803/TestRabbitContainer.cs create mode 100644 TUnit.TestProject/Bugs/3803/TestSqlContainer.cs create mode 100644 TUnit.TestProject/Bugs/3803/Tests.cs create mode 100644 TUnit.TestProject/Bugs/3803/WebApplicationFactory.cs diff --git a/TUnit.Core/Attributes/TestData/ClassDataSources.cs b/TUnit.Core/Attributes/TestData/ClassDataSources.cs index a933e860b4..efad3790cd 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSources.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSources.cs @@ -73,24 +73,21 @@ private string GetKey(int index, SharedType[] sharedTypes, string[] keys) private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, DataGeneratorMetadata dataGeneratorMetadata) { - return CreateWithNestedDependencies(type, dataGeneratorMetadata, recursionDepth: 0); + return Create(type, dataGeneratorMetadata, recursionDepth: 0); } private const int MaxRecursionDepth = 10; - [UnconditionalSuppressMessage("Trimming", "IL2072:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' requirements", - Justification = "PropertyType from PropertyInjectionMetadata has the required DynamicallyAccessedMembers annotations")] - private static object CreateWithNestedDependencies([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, DataGeneratorMetadata dataGeneratorMetadata, int recursionDepth) + private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, DataGeneratorMetadata dataGeneratorMetadata, int recursionDepth) { if (recursionDepth >= MaxRecursionDepth) { throw new InvalidOperationException($"Maximum recursion depth ({MaxRecursionDepth}) exceeded when creating nested ClassDataSource dependencies. This may indicate a circular dependency."); } - object instance; try { - instance = Activator.CreateInstance(type)!; + return Activator.CreateInstance(type)!; } catch (TargetInvocationException targetInvocationException) { @@ -101,21 +98,5 @@ private static object CreateWithNestedDependencies([DynamicallyAccessedMembers(D throw; } - - // Populate nested ClassDataSource properties recursively - var propertySource = PropertySourceRegistry.GetSource(type); - if (propertySource?.ShouldInitialize == true) - { - var propertyMetadata = propertySource.GetPropertyMetadata(); - foreach (var metadata in propertyMetadata) - { - // Recursively create the property value using CreateWithNestedDependencies - // This will handle nested ClassDataSource properties - var propertyValue = CreateWithNestedDependencies(metadata.PropertyType, dataGeneratorMetadata, recursionDepth + 1); - metadata.SetProperty(instance, propertyValue); - } - } - - return instance; } } diff --git a/TUnit.TestProject/Bugs/3803/TestRabbitContainer.cs b/TUnit.TestProject/Bugs/3803/TestRabbitContainer.cs new file mode 100644 index 0000000000..58c1a14622 --- /dev/null +++ b/TUnit.TestProject/Bugs/3803/TestRabbitContainer.cs @@ -0,0 +1,51 @@ +using TUnit.Core.Interfaces; + +namespace TUnit.TestProject.Bugs._3803; + +/// +/// Simulates a RabbitMQ test container. +/// This class should be instantiated only once per test session when marked as SharedType.PerTestSession. +/// +public class TestRabbitContainer : IAsyncInitializer, IAsyncDisposable +{ + private static int _instanceCount = 0; + private static int _initializeCount = 0; + private static int _disposeCount = 0; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + public static int DisposeCount => _disposeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public bool IsDisposed { get; private set; } + + public TestRabbitContainer() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + Console.WriteLine($"[TestRabbitContainer] Constructor called - Instance #{InstanceId}"); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + IsInitialized = true; + Console.WriteLine($"[TestRabbitContainer] InitializeAsync called - Instance #{InstanceId}"); + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() + { + Interlocked.Increment(ref _disposeCount); + IsDisposed = true; + Console.WriteLine($"[TestRabbitContainer] DisposeAsync called - Instance #{InstanceId}"); + return default; + } + + public static void ResetCounters() + { + _instanceCount = 0; + _initializeCount = 0; + _disposeCount = 0; + } +} diff --git a/TUnit.TestProject/Bugs/3803/TestSqlContainer.cs b/TUnit.TestProject/Bugs/3803/TestSqlContainer.cs new file mode 100644 index 0000000000..57c6f317db --- /dev/null +++ b/TUnit.TestProject/Bugs/3803/TestSqlContainer.cs @@ -0,0 +1,51 @@ +using TUnit.Core.Interfaces; + +namespace TUnit.TestProject.Bugs._3803; + +/// +/// Simulates a SQL test container. +/// This class should be instantiated only once per test session when marked as SharedType.PerTestSession. +/// +public class TestSqlContainer : IAsyncInitializer, IAsyncDisposable +{ + private static int _instanceCount = 0; + private static int _initializeCount = 0; + private static int _disposeCount = 0; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + public static int DisposeCount => _disposeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public bool IsDisposed { get; private set; } + + public TestSqlContainer() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + Console.WriteLine($"[TestSqlContainer] Constructor called - Instance #{InstanceId}"); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + IsInitialized = true; + Console.WriteLine($"[TestSqlContainer] InitializeAsync called - Instance #{InstanceId}"); + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() + { + Interlocked.Increment(ref _disposeCount); + IsDisposed = true; + Console.WriteLine($"[TestSqlContainer] DisposeAsync called - Instance #{InstanceId}"); + return default; + } + + public static void ResetCounters() + { + _instanceCount = 0; + _initializeCount = 0; + _disposeCount = 0; + } +} diff --git a/TUnit.TestProject/Bugs/3803/Tests.cs b/TUnit.TestProject/Bugs/3803/Tests.cs new file mode 100644 index 0000000000..556c173d52 --- /dev/null +++ b/TUnit.TestProject/Bugs/3803/Tests.cs @@ -0,0 +1,135 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3803; + +/// +/// Bug #3803: Nested dependencies with SharedType.PerTestSession are instantiated multiple times +/// +/// Expected behavior: +/// - TestRabbitContainer should be instantiated ONCE per test session (InstanceCount == 1) +/// - TestSqlContainer should be instantiated ONCE per test session (InstanceCount == 1) +/// - All WebApplicationFactory instances should receive the SAME container instances +/// +/// Actual behavior (BUG): +/// - Containers are instantiated multiple times (once per test or once per factory) +/// - Each WebApplicationFactory receives DIFFERENT container instances +/// + +[NotInParallel] +[EngineTest(ExpectedResult.Pass)] +public class Bug3803_TestClass1 +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required WebApplicationFactory Factory { get; init; } + + [Test] + public async Task Test1_VerifyContainersAreShared() + { + Console.WriteLine($"[Bug3803_TestClass1.Test1] Factory Instance: #{Factory.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass1.Test1] RabbitContainer Instance: #{Factory.RabbitContainer.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass1.Test1] SqlContainer Instance: #{Factory.SqlContainer.InstanceId}"); + + // Verify containers are initialized + await Assert.That(Factory.RabbitContainer.IsInitialized).IsTrue(); + await Assert.That(Factory.SqlContainer.IsInitialized).IsTrue(); + + // BUG VERIFICATION: These should ALWAYS be 1 if SharedType.PerTestSession works correctly + await Assert.That(TestRabbitContainer.InstanceCount).IsEqualTo(1); + await Assert.That(TestSqlContainer.InstanceCount).IsEqualTo(1); + + // All instances should have ID = 1 (first and only instance) + await Assert.That(Factory.RabbitContainer.InstanceId).IsEqualTo(1); + await Assert.That(Factory.SqlContainer.InstanceId).IsEqualTo(1); + } + + [Test] + public async Task Test2_VerifyContainersAreStillShared() + { + Console.WriteLine($"[Bug3803_TestClass1.Test2] Factory Instance: #{Factory.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass1.Test2] RabbitContainer Instance: #{Factory.RabbitContainer.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass1.Test2] SqlContainer Instance: #{Factory.SqlContainer.InstanceId}"); + + // Same assertions as Test1 - containers should still be the same instances + await Assert.That(TestRabbitContainer.InstanceCount).IsEqualTo(1); + await Assert.That(TestSqlContainer.InstanceCount).IsEqualTo(1); + await Assert.That(Factory.RabbitContainer.InstanceId).IsEqualTo(1); + await Assert.That(Factory.SqlContainer.InstanceId).IsEqualTo(1); + } + + [Test] + public async Task Test3_VerifyInitializationCalledOnce() + { + Console.WriteLine($"[Bug3803_TestClass1.Test3] RabbitContainer InitializeCount: {TestRabbitContainer.InitializeCount}"); + Console.WriteLine($"[Bug3803_TestClass1.Test3] SqlContainer InitializeCount: {TestSqlContainer.InitializeCount}"); + + // Initialize should be called only once per container + await Assert.That(TestRabbitContainer.InitializeCount).IsEqualTo(1); + await Assert.That(TestSqlContainer.InitializeCount).IsEqualTo(1); + } +} + +[NotInParallel] +[EngineTest(ExpectedResult.Pass)] +public class Bug3803_TestClass2 +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required WebApplicationFactory Factory { get; init; } + + [Test] + public async Task Test1_DifferentClassShouldGetSameContainers() + { + Console.WriteLine($"[Bug3803_TestClass2.Test1] Factory Instance: #{Factory.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass2.Test1] RabbitContainer Instance: #{Factory.RabbitContainer.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass2.Test1] SqlContainer Instance: #{Factory.SqlContainer.InstanceId}"); + + // Even in a different test class, we should get the SAME container instances + await Assert.That(TestRabbitContainer.InstanceCount).IsEqualTo(1); + await Assert.That(TestSqlContainer.InstanceCount).IsEqualTo(1); + + // Should be the same instance (ID = 1) + await Assert.That(Factory.RabbitContainer.InstanceId).IsEqualTo(1); + await Assert.That(Factory.SqlContainer.InstanceId).IsEqualTo(1); + } + + [Test] + public async Task Test2_VerifyContainersAreInitialized() + { + await Assert.That(Factory.RabbitContainer.IsInitialized).IsTrue(); + await Assert.That(Factory.SqlContainer.IsInitialized).IsTrue(); + } +} + +[NotInParallel] +[EngineTest(ExpectedResult.Pass)] +public class Bug3803_TestClass3 +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required WebApplicationFactory Factory { get; init; } + + [Test] + public async Task Test1_ThirdClassAlsoGetsSameContainers() + { + Console.WriteLine($"[Bug3803_TestClass3.Test1] Factory Instance: #{Factory.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass3.Test1] RabbitContainer Instance: #{Factory.RabbitContainer.InstanceId}"); + Console.WriteLine($"[Bug3803_TestClass3.Test1] SqlContainer Instance: #{Factory.SqlContainer.InstanceId}"); + + // Still the same instances + await Assert.That(TestRabbitContainer.InstanceCount).IsEqualTo(1); + await Assert.That(TestSqlContainer.InstanceCount).IsEqualTo(1); + await Assert.That(Factory.RabbitContainer.InstanceId).IsEqualTo(1); + await Assert.That(Factory.SqlContainer.InstanceId).IsEqualTo(1); + } + + [Test] + public async Task Test2_FinalVerification() + { + Console.WriteLine($"[Bug3803_TestClass3.Test2] Final verification"); + Console.WriteLine($" Total RabbitContainer instances: {TestRabbitContainer.InstanceCount}"); + Console.WriteLine($" Total SqlContainer instances: {TestSqlContainer.InstanceCount}"); + Console.WriteLine($" Total WebApplicationFactory instances: {WebApplicationFactory.InstanceCount}"); + + // Final assertion: containers should have been instantiated exactly once + await Assert.That(TestRabbitContainer.InstanceCount).IsEqualTo(1); + await Assert.That(TestSqlContainer.InstanceCount).IsEqualTo(1); + } +} diff --git a/TUnit.TestProject/Bugs/3803/WebApplicationFactory.cs b/TUnit.TestProject/Bugs/3803/WebApplicationFactory.cs new file mode 100644 index 0000000000..3172f4d792 --- /dev/null +++ b/TUnit.TestProject/Bugs/3803/WebApplicationFactory.cs @@ -0,0 +1,61 @@ +using TUnit.Core.Interfaces; + +namespace TUnit.TestProject.Bugs._3803; + +/// +/// Simulates a WebApplicationFactory that depends on test containers. +/// The containers should be shared (SharedType.PerTestSession), meaning: +/// - Each container should be instantiated only ONCE per test session +/// - All instances of WebApplicationFactory should receive the SAME container instances +/// +public class WebApplicationFactory : IAsyncInitializer, IAsyncDisposable +{ + private static int _instanceCount = 0; + private static int _initializeCount = 0; + private static int _disposeCount = 0; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + public static int DisposeCount => _disposeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public bool IsDisposed { get; private set; } + + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required TestRabbitContainer RabbitContainer { get; init; } + + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required TestSqlContainer SqlContainer { get; init; } + + public WebApplicationFactory() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + Console.WriteLine($"[WebApplicationFactory] Constructor called - Instance #{InstanceId}"); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + IsInitialized = true; + Console.WriteLine($"[WebApplicationFactory] InitializeAsync called - Instance #{InstanceId}"); + Console.WriteLine($" -> RabbitContainer Instance: #{RabbitContainer.InstanceId}"); + Console.WriteLine($" -> SqlContainer Instance: #{SqlContainer.InstanceId}"); + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() + { + Interlocked.Increment(ref _disposeCount); + IsDisposed = true; + Console.WriteLine($"[WebApplicationFactory] DisposeAsync called - Instance #{InstanceId}"); + return default; + } + + public static void ResetCounters() + { + _instanceCount = 0; + _initializeCount = 0; + _disposeCount = 0; + } +} From 6f5720e91cd764604827401225809000eee7667a Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:05:40 +0000 Subject: [PATCH 023/192] chore(deps): update tunit to 1.1.0 (#3799) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d4a959ae77..7fd5f5e6e3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 04588b29e1..466f212a0f 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index f47a1018ad..3b4dea1e34 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index a92efa13aa..2d85bf717d 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index c73e63b202..87faa21d22 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index d1f6d6dfed..adafbe6af9 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 5f8bef5d2a..662edbd9f1 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 142edd7810..6242ab0689 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index 948ae0ad1f..f0173684fd 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 05ea4b74a0262c0c70dd686b19da79d03ee78f79 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:28:43 +0000 Subject: [PATCH 024/192] chore: update benchmark results (#3810) --- docs/docs/benchmarks/BuildTime.md | 12 ++-- docs/docs/benchmarks/index.md | 6 +- docs/docs/benchmarks/results.md | 24 ++++---- docs/static/benchmarks/BuildTime.json | 36 +++++------ docs/static/benchmarks/historical.json | 4 ++ docs/static/benchmarks/latest.json | 82 +++++++++++++------------- docs/static/benchmarks/results.json | 48 +++++++-------- 7 files changed, 108 insertions(+), 104 deletions(-) diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 4a20e0cb3f..ee37330fc4 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 2.061 s | 2.060 s | 0.0202 s | -| Build_NUnit | 4.4.0 | 1.645 s | 1.645 s | 0.0147 s | -| Build_MSTest | 4.0.2 | 1.712 s | 1.710 s | 0.0132 s | -| Build_xUnit3 | 3.2.0 | 1.615 s | 1.619 s | 0.0149 s | +| **TUnit** | 1.1.0 | 2.033 s | 2.032 s | 0.0274 s | +| Build_NUnit | 4.4.0 | 1.626 s | 1.628 s | 0.0146 s | +| Build_MSTest | 4.0.2 | 1.700 s | 1.694 s | 0.0153 s | +| Build_xUnit3 | 3.2.0 | 1.607 s | 1.602 s | 0.0149 s | ## šŸ“ˆ Visual Comparison @@ -45,7 +45,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.061, 1.645, 1.712, 1.615] + bar [2.033, 1.626, 1.7, 1.607] ``` --- @@ -54,4 +54,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T00:44:12.201Z* +*Last generated: 2025-11-12T20:28:34.075Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 4795f4d795..338ba92eec 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -32,7 +32,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.0.78 | +| **TUnit** | 1.1.0 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -51,7 +51,7 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -75,4 +75,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T00:44:12.201Z* +*Last generated: 2025-11-12T20:28:34.076Z* diff --git a/docs/docs/benchmarks/results.md b/docs/docs/benchmarks/results.md index 7fa319d416..e2bf8fe4ba 100644 --- a/docs/docs/benchmarks/results.md +++ b/docs/docs/benchmarks/results.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.0.78 | 569.0 ms | 568.5 ms | 3.62 ms | -| NUnit | 4.4.0 | 691.2 ms | 691.0 ms | 5.19 ms | -| MSTest | 4.0.2 | 658.5 ms | 655.6 ms | 5.84 ms | -| xUnit3 | 3.2.0 | 738.2 ms | 735.9 ms | 7.49 ms | -| **TUnit (AOT)** | 1.0.78 | 124.2 ms | 124.4 ms | 0.42 ms | +| **TUnit** | 1.1.0 | 536.11 ms | 532.73 ms | 6.770 ms | +| NUnit | 4.4.0 | 1,556.59 ms | 1,554.77 ms | 10.335 ms | +| MSTest | 4.0.2 | 1,526.36 ms | 1,525.39 ms | 3.795 ms | +| xUnit3 | 3.2.0 | 1,603.59 ms | 1,604.07 ms | 8.271 ms | +| **TUnit (AOT)** | 1.1.0 | 77.73 ms | 77.78 ms | 0.214 ms | ## šŸ“ˆ Visual Comparison @@ -43,16 +43,16 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "results Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 886 - bar [569, 691.2, 658.5, 738.2, 124.2] + y-axis "Time (ms)" 0 --> 1925 + bar [536.11, 1556.59, 1526.36, 1603.59, 77.73] ``` ## šŸŽÆ Key Insights -- **1.21x faster** than NUnit (4.4.0) -- **1.16x faster** than MSTest (4.0.2) -- **1.30x faster** than xUnit3 (3.2.0) -- **4.58x faster** with Native AOT compilation +- **2.90x faster** than NUnit (4.4.0) +- **2.85x faster** than MSTest (4.0.2) +- **2.99x faster** than xUnit3 (3.2.0) +- **6.90x faster** with Native AOT compilation --- @@ -60,4 +60,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T00:44:12.201Z* +*Last generated: 2025-11-12T20:28:34.075Z* diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 2f4f507e3d..edfd5b22ed 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-12T00:44:12.201Z", + "timestamp": "2025-11-12T20:28:34.075Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "Build_TUnit", - "Version": "1.0.78", - "Mean": "2.061 s", - "Error": "0.0216 s", - "StdDev": "0.0202 s", - "Median": "2.060 s" + "Version": "1.1.0", + "Mean": "2.033 s", + "Error": "0.0293 s", + "StdDev": "0.0274 s", + "Median": "2.032 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.645 s", - "Error": "0.0165 s", - "StdDev": "0.0147 s", - "Median": "1.645 s" + "Mean": "1.626 s", + "Error": "0.0156 s", + "StdDev": "0.0146 s", + "Median": "1.628 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.712 s", - "Error": "0.0149 s", - "StdDev": "0.0132 s", - "Median": "1.710 s" + "Mean": "1.700 s", + "Error": "0.0183 s", + "StdDev": "0.0153 s", + "Median": "1.694 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.615 s", - "Error": "0.0160 s", + "Mean": "1.607 s", + "Error": "0.0159 s", "StdDev": "0.0149 s", - "Median": "1.619 s" + "Median": "1.602 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index f0a01a895b..487d1aabe8 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -15,6 +15,10 @@ "date": "2025-11-12", "environment": "Ubuntu" }, + { + "date": "2025-11-12", + "environment": "Ubuntu" + }, { "date": "2025-11-12", "environment": "Ubuntu" diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 0599437f16..aa530b7849 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T00:44:12.201Z", + "timestamp": "2025-11-12T20:28:34.076Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "categories": { "results": [ { "Method": "TUnit", - "Version": "1.0.78", - "Mean": "569.0 ms", - "Error": "3.87 ms", - "StdDev": "3.62 ms", - "Median": "568.5 ms" + "Version": "1.1.0", + "Mean": "536.11 ms", + "Error": "7.237 ms", + "StdDev": "6.770 ms", + "Median": "532.73 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "691.2 ms", - "Error": "5.85 ms", - "StdDev": "5.19 ms", - "Median": "691.0 ms" + "Mean": "1,556.59 ms", + "Error": "11.049 ms", + "StdDev": "10.335 ms", + "Median": "1,554.77 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "658.5 ms", - "Error": "6.59 ms", - "StdDev": "5.84 ms", - "Median": "655.6 ms" + "Mean": "1,526.36 ms", + "Error": "4.282 ms", + "StdDev": "3.795 ms", + "Median": "1,525.39 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "738.2 ms", - "Error": "8.45 ms", - "StdDev": "7.49 ms", - "Median": "735.9 ms" + "Mean": "1,603.59 ms", + "Error": "9.330 ms", + "StdDev": "8.271 ms", + "Median": "1,604.07 ms" }, { "Method": "TUnit_AOT", - "Version": "1.0.78", - "Mean": "124.2 ms", - "Error": "0.45 ms", - "StdDev": "0.42 ms", - "Median": "124.4 ms" + "Version": "1.1.0", + "Mean": "77.73 ms", + "Error": "0.242 ms", + "StdDev": "0.214 ms", + "Median": "77.78 ms" } ] }, @@ -53,35 +53,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.0.78", - "Mean": "2.061 s", - "Error": "0.0216 s", - "StdDev": "0.0202 s", - "Median": "2.060 s" + "Version": "1.1.0", + "Mean": "2.033 s", + "Error": "0.0293 s", + "StdDev": "0.0274 s", + "Median": "2.032 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.645 s", - "Error": "0.0165 s", - "StdDev": "0.0147 s", - "Median": "1.645 s" + "Mean": "1.626 s", + "Error": "0.0156 s", + "StdDev": "0.0146 s", + "Median": "1.628 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.712 s", - "Error": "0.0149 s", - "StdDev": "0.0132 s", - "Median": "1.710 s" + "Mean": "1.700 s", + "Error": "0.0183 s", + "StdDev": "0.0153 s", + "Median": "1.694 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.615 s", - "Error": "0.0160 s", + "Mean": "1.607 s", + "Error": "0.0159 s", "StdDev": "0.0149 s", - "Median": "1.619 s" + "Median": "1.602 s" } ] }, @@ -89,6 +89,6 @@ "runtimeCategories": 1, "buildCategories": 1, "totalBenchmarks": 2, - "lastUpdated": "2025-11-12T00:44:12.200Z" + "lastUpdated": "2025-11-12T20:28:34.074Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/results.json b/docs/static/benchmarks/results.json index 5c66be3364..2d973e76cc 100644 --- a/docs/static/benchmarks/results.json +++ b/docs/static/benchmarks/results.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T00:44:12.201Z", + "timestamp": "2025-11-12T20:28:34.075Z", "category": "results", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.0.78", - "Mean": "569.0 ms", - "Error": "3.87 ms", - "StdDev": "3.62 ms", - "Median": "568.5 ms" + "Version": "1.1.0", + "Mean": "536.11 ms", + "Error": "7.237 ms", + "StdDev": "6.770 ms", + "Median": "532.73 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "691.2 ms", - "Error": "5.85 ms", - "StdDev": "5.19 ms", - "Median": "691.0 ms" + "Mean": "1,556.59 ms", + "Error": "11.049 ms", + "StdDev": "10.335 ms", + "Median": "1,554.77 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "658.5 ms", - "Error": "6.59 ms", - "StdDev": "5.84 ms", - "Median": "655.6 ms" + "Mean": "1,526.36 ms", + "Error": "4.282 ms", + "StdDev": "3.795 ms", + "Median": "1,525.39 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "738.2 ms", - "Error": "8.45 ms", - "StdDev": "7.49 ms", - "Median": "735.9 ms" + "Mean": "1,603.59 ms", + "Error": "9.330 ms", + "StdDev": "8.271 ms", + "Median": "1,604.07 ms" }, { "Method": "TUnit_AOT", - "Version": "1.0.78", - "Mean": "124.2 ms", - "Error": "0.45 ms", - "StdDev": "0.42 ms", - "Median": "124.4 ms" + "Version": "1.1.0", + "Mean": "77.73 ms", + "Error": "0.242 ms", + "StdDev": "0.214 ms", + "Median": "77.78 ms" } ] } \ No newline at end of file From b133921f4d5fa6caec75c4a87d932b8bc3a0e2a2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:47:37 +0000 Subject: [PATCH 025/192] chore: update benchmark theme colors and enhance artifact uploads --- .github/scripts/process-benchmarks.js | 66 +++++++++++++----- .github/workflows/speed-comparison.yml | 94 +++++++++++++++++++++++++- 2 files changed, 141 insertions(+), 19 deletions(-) diff --git a/.github/scripts/process-benchmarks.js b/.github/scripts/process-benchmarks.js index ecfda6f301..94d908de42 100644 --- a/.github/scripts/process-benchmarks.js +++ b/.github/scripts/process-benchmarks.js @@ -181,16 +181,31 @@ ${data.map(row => { %%{init: { 'theme':'base', 'themeVariables': { - 'primaryColor': '#10b981', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#059669', - 'lineColor': '#d1d5db', - 'secondaryColor': '#3b82f6', - 'tertiaryColor': '#f59e0b', + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', 'background': '#ffffff', - 'mainBkg': '#10b981', - 'secondBkg': '#ef4444', - 'tertiaryBkg': '#f59e0b' + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' } }}%% xychart-beta @@ -290,16 +305,31 @@ ${data.map(row => { %%{init: { 'theme':'base', 'themeVariables': { - 'primaryColor': '#10b981', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#059669', - 'lineColor': '#d1d5db', - 'secondaryColor': '#3b82f6', - 'tertiaryColor': '#f59e0b', + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', 'background': '#ffffff', - 'mainBkg': '#10b981', - 'secondBkg': '#ef4444', - 'tertiaryBkg': '#f59e0b' + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' } }}%% xychart-beta diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 510e5d4f3e..0573d3292e 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -123,7 +123,7 @@ jobs: path: | **/BenchmarkDotNet.Artifacts/** - aggregate-and-commit-results: + process-and-upload-benchmarks: needs: [run-time-benchmarks, build-time-benchmarks] runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' @@ -160,6 +160,88 @@ jobs: run: | node .github/scripts/process-benchmarks.js + - name: Upload Individual Runtime Benchmarks + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-DataDrivenTests + path: | + docs/docs/benchmarks/DataDrivenTests.md + docs/static/benchmarks/DataDrivenTests.json + retention-days: 90 + + - name: Upload Individual Runtime Benchmarks + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-AsyncTests + path: | + docs/docs/benchmarks/AsyncTests.md + docs/static/benchmarks/AsyncTests.json + retention-days: 90 + + - name: Upload Individual Runtime Benchmarks + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-ScaleTests + path: | + docs/docs/benchmarks/ScaleTests.md + docs/static/benchmarks/ScaleTests.json + retention-days: 90 + + - name: Upload Individual Runtime Benchmarks + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-MatrixTests + path: | + docs/docs/benchmarks/MatrixTests.md + docs/static/benchmarks/MatrixTests.json + retention-days: 90 + + - name: Upload Individual Runtime Benchmarks + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-MassiveParallelTests + path: | + docs/docs/benchmarks/MassiveParallelTests.md + docs/static/benchmarks/MassiveParallelTests.json + retention-days: 90 + + - name: Upload Individual Runtime Benchmarks + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-SetupTeardownTests + path: | + docs/docs/benchmarks/SetupTeardownTests.md + docs/static/benchmarks/SetupTeardownTests.json + retention-days: 90 + + - name: Upload Build Benchmark + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-BuildTime + path: | + docs/docs/benchmarks/BuildTime.md + docs/static/benchmarks/BuildTime.json + retention-days: 90 + + - name: Upload Summary Files + uses: actions/upload-artifact@v5 + if: always() + with: + name: benchmark-summary + path: | + docs/docs/benchmarks/index.md + docs/static/benchmarks/latest.json + docs/static/benchmarks/summary.json + docs/static/benchmarks/historical.json + retention-days: 90 + - name: Generate Benchmark List id: benchmark_list run: | @@ -210,6 +292,16 @@ jobs: ### Benchmarks Produced + Individual benchmark artifacts are available for download: + - `benchmark-DataDrivenTests` + - `benchmark-AsyncTests` + - `benchmark-ScaleTests` + - `benchmark-MatrixTests` + - `benchmark-MassiveParallelTests` + - `benchmark-SetupTeardownTests` + - `benchmark-BuildTime` + - `benchmark-summary` (aggregated overview) + #### Runtime Benchmarks ${{ steps.benchmark_list.outputs.runtime_benchmarks }} From 6a996ab3e5e29b297497364d224a750bdc26694d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:56:08 +0000 Subject: [PATCH 026/192] chore: update benchmark results (#3811) --- docs/docs/benchmarks/BuildTime.md | 45 ++++++++++----- docs/docs/benchmarks/index.md | 4 +- docs/docs/benchmarks/results.md | 57 ++++++++++++------- docs/static/benchmarks/BuildTime.json | 36 ++++++------ docs/static/benchmarks/historical.json | 4 ++ docs/static/benchmarks/latest.json | 78 +++++++++++++------------- docs/static/benchmarks/results.json | 44 +++++++-------- 7 files changed, 151 insertions(+), 117 deletions(-) diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index ee37330fc4..e09a32c0ba 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 2.033 s | 2.032 s | 0.0274 s | -| Build_NUnit | 4.4.0 | 1.626 s | 1.628 s | 0.0146 s | -| Build_MSTest | 4.0.2 | 1.700 s | 1.694 s | 0.0153 s | -| Build_xUnit3 | 3.2.0 | 1.607 s | 1.602 s | 0.0149 s | +| **TUnit** | 1.1.0 | 2.009 s | 2.007 s | 0.0253 s | +| Build_NUnit | 4.4.0 | 1.606 s | 1.603 s | 0.0159 s | +| Build_MSTest | 4.0.2 | 1.683 s | 1.679 s | 0.0145 s | +| Build_xUnit3 | 3.2.0 | 1.589 s | 1.593 s | 0.0206 s | ## šŸ“ˆ Visual Comparison @@ -29,23 +29,38 @@ Compilation time comparison across frameworks: %%{init: { 'theme':'base', 'themeVariables': { - 'primaryColor': '#10b981', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#059669', - 'lineColor': '#d1d5db', - 'secondaryColor': '#3b82f6', - 'tertiaryColor': '#f59e0b', + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', 'background': '#ffffff', - 'mainBkg': '#10b981', - 'secondBkg': '#ef4444', - 'tertiaryBkg': '#f59e0b' + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' } }}%% xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.033, 1.626, 1.7, 1.607] + bar [2.009, 1.606, 1.683, 1.589] ``` --- @@ -54,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T20:28:34.075Z* +*Last generated: 2025-11-12T20:55:56.395Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 338ba92eec..7e6443468d 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -51,7 +51,7 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -75,4 +75,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T20:28:34.076Z* +*Last generated: 2025-11-12T20:55:56.396Z* diff --git a/docs/docs/benchmarks/results.md b/docs/docs/benchmarks/results.md index e2bf8fe4ba..cee00e4417 100644 --- a/docs/docs/benchmarks/results.md +++ b/docs/docs/benchmarks/results.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 536.11 ms | 532.73 ms | 6.770 ms | -| NUnit | 4.4.0 | 1,556.59 ms | 1,554.77 ms | 10.335 ms | -| MSTest | 4.0.2 | 1,526.36 ms | 1,525.39 ms | 3.795 ms | -| xUnit3 | 3.2.0 | 1,603.59 ms | 1,604.07 ms | 8.271 ms | -| **TUnit (AOT)** | 1.1.0 | 77.73 ms | 77.78 ms | 0.214 ms | +| **TUnit** | 1.1.0 | 564.8 ms | 564.8 ms | 5.34 ms | +| NUnit | 4.4.0 | 1,156.4 ms | 1,156.4 ms | 5.00 ms | +| MSTest | 4.0.2 | 1,132.6 ms | 1,130.6 ms | 9.92 ms | +| xUnit3 | 3.2.0 | 1,200.7 ms | 1,200.4 ms | 5.74 ms | +| **TUnit (AOT)** | 1.1.0 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -28,31 +28,46 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI %%{init: { 'theme':'base', 'themeVariables': { - 'primaryColor': '#10b981', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#059669', - 'lineColor': '#d1d5db', - 'secondaryColor': '#3b82f6', - 'tertiaryColor': '#f59e0b', + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', 'background': '#ffffff', - 'mainBkg': '#10b981', - 'secondBkg': '#ef4444', - 'tertiaryBkg': '#f59e0b' + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' } }}%% xychart-beta title "results Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1925 - bar [536.11, 1556.59, 1526.36, 1603.59, 77.73] + y-axis "Time (ms)" 0 --> 1441 + bar [564.8, 1156.4, 1132.6, 1200.7, 0] ``` ## šŸŽÆ Key Insights -- **2.90x faster** than NUnit (4.4.0) -- **2.85x faster** than MSTest (4.0.2) -- **2.99x faster** than xUnit3 (3.2.0) -- **6.90x faster** with Native AOT compilation +- **2.05x faster** than NUnit (4.4.0) +- **2.01x faster** than MSTest (4.0.2) +- **2.13x faster** than xUnit3 (3.2.0) +- **Infinityx faster** with Native AOT compilation --- @@ -60,4 +75,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T20:28:34.075Z* +*Last generated: 2025-11-12T20:55:56.395Z* diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index edfd5b22ed..71633e333c 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-12T20:28:34.075Z", + "timestamp": "2025-11-12T20:55:56.396Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "Build_TUnit", "Version": "1.1.0", - "Mean": "2.033 s", - "Error": "0.0293 s", - "StdDev": "0.0274 s", - "Median": "2.032 s" + "Mean": "2.009 s", + "Error": "0.0285 s", + "StdDev": "0.0253 s", + "Median": "2.007 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.626 s", - "Error": "0.0156 s", - "StdDev": "0.0146 s", - "Median": "1.628 s" + "Mean": "1.606 s", + "Error": "0.0170 s", + "StdDev": "0.0159 s", + "Median": "1.603 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.700 s", - "Error": "0.0183 s", - "StdDev": "0.0153 s", - "Median": "1.694 s" + "Mean": "1.683 s", + "Error": "0.0155 s", + "StdDev": "0.0145 s", + "Median": "1.679 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.607 s", - "Error": "0.0159 s", - "StdDev": "0.0149 s", - "Median": "1.602 s" + "Mean": "1.589 s", + "Error": "0.0220 s", + "StdDev": "0.0206 s", + "Median": "1.593 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 487d1aabe8..0f9034eea2 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -19,6 +19,10 @@ "date": "2025-11-12", "environment": "Ubuntu" }, + { + "date": "2025-11-12", + "environment": "Ubuntu" + }, { "date": "2025-11-12", "environment": "Ubuntu" diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index aa530b7849..bf1bb9c64a 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T20:28:34.076Z", + "timestamp": "2025-11-12T20:55:56.396Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { "results": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "536.11 ms", - "Error": "7.237 ms", - "StdDev": "6.770 ms", - "Median": "532.73 ms" + "Mean": "564.8 ms", + "Error": "5.71 ms", + "StdDev": "5.34 ms", + "Median": "564.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,556.59 ms", - "Error": "11.049 ms", - "StdDev": "10.335 ms", - "Median": "1,554.77 ms" + "Mean": "1,156.4 ms", + "Error": "5.99 ms", + "StdDev": "5.00 ms", + "Median": "1,156.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,526.36 ms", - "Error": "4.282 ms", - "StdDev": "3.795 ms", - "Median": "1,525.39 ms" + "Mean": "1,132.6 ms", + "Error": "10.60 ms", + "StdDev": "9.92 ms", + "Median": "1,130.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,603.59 ms", - "Error": "9.330 ms", - "StdDev": "8.271 ms", - "Median": "1,604.07 ms" + "Mean": "1,200.7 ms", + "Error": "6.87 ms", + "StdDev": "5.74 ms", + "Median": "1,200.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "77.73 ms", - "Error": "0.242 ms", - "StdDev": "0.214 ms", - "Median": "77.78 ms" + "Mean": "NA", + "Error": "NA", + "StdDev": "NA", + "Median": "NA" } ] }, @@ -54,34 +54,34 @@ { "Method": "Build_TUnit", "Version": "1.1.0", - "Mean": "2.033 s", - "Error": "0.0293 s", - "StdDev": "0.0274 s", - "Median": "2.032 s" + "Mean": "2.009 s", + "Error": "0.0285 s", + "StdDev": "0.0253 s", + "Median": "2.007 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.626 s", - "Error": "0.0156 s", - "StdDev": "0.0146 s", - "Median": "1.628 s" + "Mean": "1.606 s", + "Error": "0.0170 s", + "StdDev": "0.0159 s", + "Median": "1.603 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.700 s", - "Error": "0.0183 s", - "StdDev": "0.0153 s", - "Median": "1.694 s" + "Mean": "1.683 s", + "Error": "0.0155 s", + "StdDev": "0.0145 s", + "Median": "1.679 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.607 s", - "Error": "0.0159 s", - "StdDev": "0.0149 s", - "Median": "1.602 s" + "Mean": "1.589 s", + "Error": "0.0220 s", + "StdDev": "0.0206 s", + "Median": "1.593 s" } ] }, @@ -89,6 +89,6 @@ "runtimeCategories": 1, "buildCategories": 1, "totalBenchmarks": 2, - "lastUpdated": "2025-11-12T20:28:34.074Z" + "lastUpdated": "2025-11-12T20:55:56.394Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/results.json b/docs/static/benchmarks/results.json index 2d973e76cc..f371056295 100644 --- a/docs/static/benchmarks/results.json +++ b/docs/static/benchmarks/results.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T20:28:34.075Z", + "timestamp": "2025-11-12T20:55:56.395Z", "category": "results", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "536.11 ms", - "Error": "7.237 ms", - "StdDev": "6.770 ms", - "Median": "532.73 ms" + "Mean": "564.8 ms", + "Error": "5.71 ms", + "StdDev": "5.34 ms", + "Median": "564.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,556.59 ms", - "Error": "11.049 ms", - "StdDev": "10.335 ms", - "Median": "1,554.77 ms" + "Mean": "1,156.4 ms", + "Error": "5.99 ms", + "StdDev": "5.00 ms", + "Median": "1,156.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,526.36 ms", - "Error": "4.282 ms", - "StdDev": "3.795 ms", - "Median": "1,525.39 ms" + "Mean": "1,132.6 ms", + "Error": "10.60 ms", + "StdDev": "9.92 ms", + "Median": "1,130.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,603.59 ms", - "Error": "9.330 ms", - "StdDev": "8.271 ms", - "Median": "1,604.07 ms" + "Mean": "1,200.7 ms", + "Error": "6.87 ms", + "StdDev": "5.74 ms", + "Median": "1,200.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "77.73 ms", - "Error": "0.242 ms", - "StdDev": "0.214 ms", - "Median": "77.78 ms" + "Mean": "NA", + "Error": "NA", + "StdDev": "NA", + "Median": "NA" } ] } \ No newline at end of file From ad89be1dee61d8927764aeea816801f19a39ff0d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:06:39 +0000 Subject: [PATCH 027/192] chore: enhance benchmark processing with improved category extraction and validation --- .github/scripts/process-benchmarks.js | 62 +++++++++++--------------- .github/workflows/speed-comparison.yml | 4 +- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/.github/scripts/process-benchmarks.js b/.github/scripts/process-benchmarks.js index 94d908de42..44ebc84537 100644 --- a/.github/scripts/process-benchmarks.js +++ b/.github/scripts/process-benchmarks.js @@ -97,6 +97,10 @@ let environmentInfo = {}; console.log('šŸ“Š Processing runtime benchmarks...'); const runtimeFiles = findMarkdownFiles(RUNTIME_DIR); console.log(` Found ${runtimeFiles.length} runtime benchmark files`); +if (runtimeFiles.length > 0) { + console.log(' Sample paths:'); + runtimeFiles.slice(0, 2).forEach(f => console.log(` ${f}`)); +} runtimeFiles.forEach(file => { const content = fs.readFileSync(file, 'utf8'); @@ -107,12 +111,17 @@ runtimeFiles.forEach(file => { } if (data) { - // Extract test category from path - const match = file.match(/run_time_([A-Za-z]+Tests)/); - const category = match ? match[1] : path.basename(path.dirname(file)); - - categories.runtime[category] = data; - console.log(` āœ“ Processed ${category}: ${data.length} frameworks`); + // Extract test category from artifact directory path + // Path structure: benchmark-results/runtime/ubuntu_markdown_run_time_/.../*.md + const match = file.match(/ubuntu_markdown_run_time_([A-Za-z]+Tests)/); + const category = match ? match[1] : null; + + if (category) { + categories.runtime[category] = data; + console.log(` āœ“ Processed ${category}: ${data.length} frameworks`); + } else { + console.warn(` āš ļø Could not extract category from file path: ${file}`); + } } }); @@ -217,32 +226,7 @@ xychart-beta ## šŸŽÆ Key Insights -${(() => { - const tunitResult = data.find(d => d.Method === 'TUnit'); - const tunitAotResult = data.find(d => d.Method === 'TUnit_AOT'); - const otherResults = data.filter(d => !d.Method.includes('TUnit')); - - if (!tunitResult) return '- TUnit data not available'; - - const tunitMean = parseMeanValue(tunitResult.Mean); - const insights = []; - - otherResults.forEach(other => { - const otherMean = parseMeanValue(other.Mean); - const speedup = (otherMean / tunitMean).toFixed(2); - if (speedup > 1) { - insights.push(`- **${speedup}x faster** than ${other.Method} (${other.Version})`); - } - }); - - if (tunitAotResult) { - const aotMean = parseMeanValue(tunitAotResult.Mean); - const aotSpeedup = (tunitMean / aotMean).toFixed(2); - insights.push(`- **${aotSpeedup}x faster** with Native AOT compilation`); - } - - return insights.join('\n'); -})()} +This benchmark compares TUnit's performance against ${data.filter(d => !d.Method.includes('TUnit')).map(d => d.Method).join(', ')} using identical test scenarios. --- @@ -515,11 +499,19 @@ console.log(`Summary:`); console.log(` - Runtime categories: ${stats.runtimeCategories}`); console.log(` - Build categories: ${stats.buildCategories}`); console.log(` - Total benchmarks: ${stats.totalBenchmarks}`); -console.log(` - Output files: 4 (markdown + 3 JSON files)`); +console.log(` - Markdown pages generated: ${stats.runtimeCategories + stats.buildCategories + 1}`); +console.log(` - JSON files generated: ${stats.runtimeCategories + stats.buildCategories + 3}`); console.log(`\nšŸ“Š Benchmarks produced:`); -console.log(`\nRuntime Benchmarks:`); +console.log(`\nRuntime Benchmarks (${Object.keys(categories.runtime).length}):`); Object.keys(categories.runtime).forEach(cat => console.log(` - ${cat}`)); if (Object.keys(categories.build).length > 0) { - console.log(`\nBuild Benchmarks:`); + console.log(`\nBuild Benchmarks (${Object.keys(categories.build).length}):`); Object.keys(categories.build).forEach(cat => console.log(` - ${cat}`)); } + +// Validation warning +if (Object.keys(categories.runtime).length === 0) { + console.warn('\nāš ļø WARNING: No runtime benchmark categories were found!'); + console.warn('This likely means the artifact directory structure is not as expected.'); + console.warn('Expected structure: benchmark-results/runtime/ubuntu_markdown_run_time_/'); +} diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 0573d3292e..7a551189bb 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -142,14 +142,14 @@ jobs: with: path: benchmark-results/runtime/ pattern: ubuntu_markdown_run_time_* - merge-multiple: true + merge-multiple: false - name: Download Build Time Benchmark Artifacts uses: actions/download-artifact@v6 with: path: benchmark-results/build/ pattern: ubuntu_markdown_build_time - merge-multiple: true + merge-multiple: false - name: Setup Node.js uses: actions/setup-node@v6 From cf054f0ff2850ed5c9968a57f35f72cf0db0177d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:13:34 +0000 Subject: [PATCH 028/192] chore: update benchmark results (#3812) --- docs/docs/benchmarks/AsyncTests.md | 75 +++++ docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 75 +++++ docs/docs/benchmarks/MassiveParallelTests.md | 75 +++++ docs/docs/benchmarks/MatrixTests.md | 75 +++++ docs/docs/benchmarks/ScaleTests.md | 75 +++++ docs/docs/benchmarks/SetupTeardownTests.md | 75 +++++ docs/docs/benchmarks/index.md | 9 +- docs/static/benchmarks/AsyncTests.json | 51 ++++ docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 51 ++++ .../benchmarks/MassiveParallelTests.json | 51 ++++ docs/static/benchmarks/MatrixTests.json | 51 ++++ docs/static/benchmarks/ScaleTests.json | 51 ++++ .../static/benchmarks/SetupTeardownTests.json | 51 ++++ docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 284 +++++++++++++++--- docs/static/benchmarks/summary.json | 7 +- 18 files changed, 1044 insertions(+), 64 deletions(-) create mode 100644 docs/docs/benchmarks/AsyncTests.md create mode 100644 docs/docs/benchmarks/DataDrivenTests.md create mode 100644 docs/docs/benchmarks/MassiveParallelTests.md create mode 100644 docs/docs/benchmarks/MatrixTests.md create mode 100644 docs/docs/benchmarks/ScaleTests.md create mode 100644 docs/docs/benchmarks/SetupTeardownTests.md create mode 100644 docs/static/benchmarks/AsyncTests.json create mode 100644 docs/static/benchmarks/DataDrivenTests.json create mode 100644 docs/static/benchmarks/MassiveParallelTests.json create mode 100644 docs/static/benchmarks/MatrixTests.json create mode 100644 docs/static/benchmarks/ScaleTests.json create mode 100644 docs/static/benchmarks/SetupTeardownTests.json diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md new file mode 100644 index 0000000000..311679bb5a --- /dev/null +++ b/docs/docs/benchmarks/AsyncTests.md @@ -0,0 +1,75 @@ +--- +title: AsyncTests +description: Performance benchmark results for AsyncTests +sidebar_position: 2 +--- + +# AsyncTests Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.1.0 | 558.9 ms | 557.2 ms | 4.11 ms | +| NUnit | 4.4.0 | 650.2 ms | 649.0 ms | 9.00 ms | +| MSTest | 4.0.2 | 615.0 ms | 614.8 ms | 5.89 ms | +| xUnit3 | 3.2.0 | 702.4 ms | 702.4 ms | 7.09 ms | +| **TUnit (AOT)** | 1.1.0 | 123.8 ms | 123.9 ms | 0.46 ms | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', + 'background': '#ffffff', + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' + } +}}%% +xychart-beta + title "AsyncTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 843 + bar [558.9, 650.2, 615, 702.4, 123.8] +``` + +## šŸŽÆ Key Insights + +This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using identical test scenarios. + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T21:13:20.516Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index e09a32c0ba..bb58397fad 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -1,7 +1,7 @@ --- title: Build Performance description: Compilation time benchmark results -sidebar_position: 3 +sidebar_position: 8 --- # Build Performance Benchmark @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 2.009 s | 2.007 s | 0.0253 s | -| Build_NUnit | 4.4.0 | 1.606 s | 1.603 s | 0.0159 s | -| Build_MSTest | 4.0.2 | 1.683 s | 1.679 s | 0.0145 s | -| Build_xUnit3 | 3.2.0 | 1.589 s | 1.593 s | 0.0206 s | +| **TUnit** | 1.1.0 | 2.033 s | 2.032 s | 0.0296 s | +| Build_NUnit | 4.4.0 | 1.622 s | 1.615 s | 0.0216 s | +| Build_MSTest | 4.0.2 | 1.705 s | 1.701 s | 0.0231 s | +| Build_xUnit3 | 3.2.0 | 1.611 s | 1.613 s | 0.0248 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.009, 1.606, 1.683, 1.589] + bar [2.033, 1.622, 1.705, 1.611] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T20:55:56.395Z* +*Last generated: 2025-11-12T21:13:20.518Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md new file mode 100644 index 0000000000..539d7eaa2f --- /dev/null +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -0,0 +1,75 @@ +--- +title: DataDrivenTests +description: Performance benchmark results for DataDrivenTests +sidebar_position: 3 +--- + +# DataDrivenTests Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.1.0 | 510.37 ms | 511.05 ms | 7.125 ms | +| NUnit | 4.4.0 | 583.06 ms | 583.47 ms | 17.581 ms | +| MSTest | 4.0.2 | 594.23 ms | 591.72 ms | 18.226 ms | +| xUnit3 | 3.2.0 | 604.34 ms | 605.85 ms | 7.447 ms | +| **TUnit (AOT)** | 1.1.0 | 25.55 ms | 25.62 ms | 0.241 ms | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', + 'background': '#ffffff', + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' + } +}}%% +xychart-beta + title "DataDrivenTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 726 + bar [510.37, 583.06, 594.23, 604.34, 25.55] +``` + +## šŸŽÆ Key Insights + +This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using identical test scenarios. + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T21:13:20.516Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md new file mode 100644 index 0000000000..6f2c8a816f --- /dev/null +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -0,0 +1,75 @@ +--- +title: MassiveParallelTests +description: Performance benchmark results for MassiveParallelTests +sidebar_position: 4 +--- + +# MassiveParallelTests Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.1.0 | 625.5 ms | 626.8 ms | 7.61 ms | +| NUnit | 4.4.0 | 1,213.0 ms | 1,211.9 ms | 12.39 ms | +| MSTest | 4.0.2 | 3,010.8 ms | 3,010.4 ms | 12.63 ms | +| xUnit3 | 3.2.0 | 3,099.6 ms | 3,101.6 ms | 15.59 ms | +| **TUnit (AOT)** | 1.1.0 | 132.3 ms | 132.3 ms | 0.36 ms | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', + 'background': '#ffffff', + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' + } +}}%% +xychart-beta + title "MassiveParallelTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 3720 + bar [625.5, 1213, 3010.8, 3099.6, 132.3] +``` + +## šŸŽÆ Key Insights + +This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using identical test scenarios. + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T21:13:20.517Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md new file mode 100644 index 0000000000..d683a99d99 --- /dev/null +++ b/docs/docs/benchmarks/MatrixTests.md @@ -0,0 +1,75 @@ +--- +title: MatrixTests +description: Performance benchmark results for MatrixTests +sidebar_position: 5 +--- + +# MatrixTests Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.1.0 | 557.69 ms | 556.60 ms | 4.221 ms | +| NUnit | 4.4.0 | 1,539.35 ms | 1,541.87 ms | 11.514 ms | +| MSTest | 4.0.2 | 1,496.25 ms | 1,496.55 ms | 5.576 ms | +| xUnit3 | 3.2.0 | 1,586.79 ms | 1,586.67 ms | 7.339 ms | +| **TUnit (AOT)** | 1.1.0 | 79.15 ms | 79.11 ms | 0.381 ms | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', + 'background': '#ffffff', + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' + } +}}%% +xychart-beta + title "MatrixTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 1905 + bar [557.69, 1539.35, 1496.25, 1586.79, 79.15] +``` + +## šŸŽÆ Key Insights + +This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using identical test scenarios. + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T21:13:20.517Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md new file mode 100644 index 0000000000..3de683a15b --- /dev/null +++ b/docs/docs/benchmarks/ScaleTests.md @@ -0,0 +1,75 @@ +--- +title: ScaleTests +description: Performance benchmark results for ScaleTests +sidebar_position: 6 +--- + +# ScaleTests Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.1.0 | 514.19 ms | 512.52 ms | 6.486 ms | +| NUnit | 4.4.0 | 552.95 ms | 553.62 ms | 7.860 ms | +| MSTest | 4.0.2 | 474.67 ms | 475.13 ms | 8.594 ms | +| xUnit3 | 3.2.0 | 562.71 ms | 561.53 ms | 6.028 ms | +| **TUnit (AOT)** | 1.1.0 | 44.36 ms | 45.13 ms | 3.857 ms | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', + 'background': '#ffffff', + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' + } +}}%% +xychart-beta + title "ScaleTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 676 + bar [514.19, 552.95, 474.67, 562.71, 44.36] +``` + +## šŸŽÆ Key Insights + +This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using identical test scenarios. + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T21:13:20.517Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md new file mode 100644 index 0000000000..4452a73eb9 --- /dev/null +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -0,0 +1,75 @@ +--- +title: SetupTeardownTests +description: Performance benchmark results for SetupTeardownTests +sidebar_position: 7 +--- + +# SetupTeardownTests Benchmark + +:::info Last Updated +This benchmark was automatically generated on **2025-11-12** from the latest CI run. + +**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +::: + +## šŸ“Š Results + +| Framework | Version | Mean | Median | StdDev | +|-----------|---------|------|--------|--------| +| **TUnit** | 1.1.0 | 583.4 ms | 583.7 ms | 5.16 ms | +| NUnit | 4.4.0 | 1,198.4 ms | 1,195.0 ms | 15.35 ms | +| MSTest | 4.0.2 | 1,162.5 ms | 1,161.5 ms | 9.11 ms | +| xUnit3 | 3.2.0 | 1,243.3 ms | 1,241.9 ms | 9.80 ms | +| **TUnit (AOT)** | 1.1.0 | NA | NA | NA | + +## šŸ“ˆ Visual Comparison + +```mermaid +%%{init: { + 'theme':'base', + 'themeVariables': { + 'primaryColor': '#2563eb', + 'primaryTextColor': '#ffffff', + 'primaryBorderColor': '#1e40af', + 'lineColor': '#6b7280', + 'secondaryColor': '#7c3aed', + 'tertiaryColor': '#dc2626', + 'background': '#ffffff', + 'mainBkg': '#2563eb', + 'secondBkg': '#7c3aed', + 'tertiaryBkg': '#dc2626', + 'clusterBkg': '#f3f4f6', + 'edgeLabelBackground': '#ffffff', + 'tertiaryTextColor': '#1f2937', + 'pie1': '#2563eb', + 'pie2': '#7c3aed', + 'pie3': '#dc2626', + 'pie4': '#f59e0b', + 'pie5': '#10b981', + 'pie6': '#06b6d4', + 'pie7': '#ec4899', + 'pie8': '#6366f1', + 'pie9': '#84cc16', + 'pie10': '#f97316', + 'pie11': '#14b8a6', + 'pie12': '#a855f7' + } +}}%% +xychart-beta + title "SetupTeardownTests Performance Comparison" + x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] + y-axis "Time (ms)" 0 --> 1492 + bar [583.4, 1198.4, 1162.5, 1243.3, 0] +``` + +## šŸŽÆ Key Insights + +This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using identical test scenarios. + +--- + +:::note Methodology +View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. +::: + +*Last generated: 2025-11-12T21:13:20.517Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 7e6443468d..c320ea6144 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -16,7 +16,12 @@ These benchmarks were automatically generated on **2025-11-12** from the latest Click on any benchmark to view detailed results: -- [results](results) - Detailed performance analysis +- [AsyncTests](AsyncTests) - Detailed performance analysis +- [DataDrivenTests](DataDrivenTests) - Detailed performance analysis +- [MassiveParallelTests](MassiveParallelTests) - Detailed performance analysis +- [MatrixTests](MatrixTests) - Detailed performance analysis +- [ScaleTests](ScaleTests) - Detailed performance analysis +- [SetupTeardownTests](SetupTeardownTests) - Detailed performance analysis ## šŸ”Ø Build Benchmarks @@ -75,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T20:55:56.396Z* +*Last generated: 2025-11-12T21:13:20.518Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json new file mode 100644 index 0000000000..f0c2840116 --- /dev/null +++ b/docs/static/benchmarks/AsyncTests.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T21:13:20.516Z", + "category": "AsyncTests", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "558.9 ms", + "Error": "4.39 ms", + "StdDev": "4.11 ms", + "Median": "557.2 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "650.2 ms", + "Error": "10.15 ms", + "StdDev": "9.00 ms", + "Median": "649.0 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "615.0 ms", + "Error": "6.64 ms", + "StdDev": "5.89 ms", + "Median": "614.8 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "702.4 ms", + "Error": "8.00 ms", + "StdDev": "7.09 ms", + "Median": "702.4 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "123.8 ms", + "Error": "0.49 ms", + "StdDev": "0.46 ms", + "Median": "123.9 ms" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 71633e333c..f64bd7f717 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-12T20:55:56.396Z", + "timestamp": "2025-11-12T21:13:20.518Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.1.0", - "Mean": "2.009 s", - "Error": "0.0285 s", - "StdDev": "0.0253 s", - "Median": "2.007 s" + "Mean": "2.033 s", + "Error": "0.0333 s", + "StdDev": "0.0296 s", + "Median": "2.032 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.606 s", - "Error": "0.0170 s", - "StdDev": "0.0159 s", - "Median": "1.603 s" + "Mean": "1.622 s", + "Error": "0.0231 s", + "StdDev": "0.0216 s", + "Median": "1.615 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.683 s", - "Error": "0.0155 s", - "StdDev": "0.0145 s", - "Median": "1.679 s" + "Mean": "1.705 s", + "Error": "0.0247 s", + "StdDev": "0.0231 s", + "Median": "1.701 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.589 s", - "Error": "0.0220 s", - "StdDev": "0.0206 s", - "Median": "1.593 s" + "Mean": "1.611 s", + "Error": "0.0265 s", + "StdDev": "0.0248 s", + "Median": "1.613 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json new file mode 100644 index 0000000000..03fc62272a --- /dev/null +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T21:13:20.517Z", + "category": "DataDrivenTests", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "510.37 ms", + "Error": "7.617 ms", + "StdDev": "7.125 ms", + "Median": "511.05 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "583.06 ms", + "Error": "11.292 ms", + "StdDev": "17.581 ms", + "Median": "583.47 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "594.23 ms", + "Error": "11.707 ms", + "StdDev": "18.226 ms", + "Median": "591.72 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "604.34 ms", + "Error": "8.401 ms", + "StdDev": "7.447 ms", + "Median": "605.85 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "25.55 ms", + "Error": "0.258 ms", + "StdDev": "0.241 ms", + "Median": "25.62 ms" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json new file mode 100644 index 0000000000..c60cb4d2d9 --- /dev/null +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T21:13:20.517Z", + "category": "MassiveParallelTests", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "625.5 ms", + "Error": "8.58 ms", + "StdDev": "7.61 ms", + "Median": "626.8 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,213.0 ms", + "Error": "13.24 ms", + "StdDev": "12.39 ms", + "Median": "1,211.9 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "3,010.8 ms", + "Error": "13.51 ms", + "StdDev": "12.63 ms", + "Median": "3,010.4 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "3,099.6 ms", + "Error": "17.58 ms", + "StdDev": "15.59 ms", + "Median": "3,101.6 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "132.3 ms", + "Error": "0.47 ms", + "StdDev": "0.36 ms", + "Median": "132.3 ms" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json new file mode 100644 index 0000000000..fd462c3e66 --- /dev/null +++ b/docs/static/benchmarks/MatrixTests.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T21:13:20.517Z", + "category": "MatrixTests", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "557.69 ms", + "Error": "4.512 ms", + "StdDev": "4.221 ms", + "Median": "556.60 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,539.35 ms", + "Error": "12.309 ms", + "StdDev": "11.514 ms", + "Median": "1,541.87 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "1,496.25 ms", + "Error": "7.142 ms", + "StdDev": "5.576 ms", + "Median": "1,496.55 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "1,586.79 ms", + "Error": "7.846 ms", + "StdDev": "7.339 ms", + "Median": "1,586.67 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "79.15 ms", + "Error": "0.408 ms", + "StdDev": "0.381 ms", + "Median": "79.11 ms" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json new file mode 100644 index 0000000000..47799a37bb --- /dev/null +++ b/docs/static/benchmarks/ScaleTests.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T21:13:20.517Z", + "category": "ScaleTests", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "514.19 ms", + "Error": "6.934 ms", + "StdDev": "6.486 ms", + "Median": "512.52 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "552.95 ms", + "Error": "8.867 ms", + "StdDev": "7.860 ms", + "Median": "553.62 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "474.67 ms", + "Error": "9.187 ms", + "StdDev": "8.594 ms", + "Median": "475.13 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "562.71 ms", + "Error": "6.445 ms", + "StdDev": "6.028 ms", + "Median": "561.53 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "44.36 ms", + "Error": "1.308 ms", + "StdDev": "3.857 ms", + "Median": "45.13 ms" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json new file mode 100644 index 0000000000..b432996a90 --- /dev/null +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2025-11-12T21:13:20.518Z", + "category": "SetupTeardownTests", + "environment": { + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "sdk": ".NET SDK 10.0.100", + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + }, + "results": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "583.4 ms", + "Error": "6.18 ms", + "StdDev": "5.16 ms", + "Median": "583.7 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,198.4 ms", + "Error": "16.41 ms", + "StdDev": "15.35 ms", + "Median": "1,195.0 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "1,162.5 ms", + "Error": "10.28 ms", + "StdDev": "9.11 ms", + "Median": "1,161.5 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "1,243.3 ms", + "Error": "10.48 ms", + "StdDev": "9.80 ms", + "Median": "1,241.9 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "NA", + "Error": "NA", + "StdDev": "NA", + "Median": "NA" + } + ] +} \ No newline at end of file diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 0f9034eea2..10ef4375d6 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -23,6 +23,10 @@ "date": "2025-11-12", "environment": "Ubuntu" }, + { + "date": "2025-11-12", + "environment": "Ubuntu" + }, { "date": "2025-11-12", "environment": "Ubuntu" diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index bf1bb9c64a..8b4f513b5e 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,43 +1,253 @@ { - "timestamp": "2025-11-12T20:55:56.396Z", + "timestamp": "2025-11-12T21:13:20.518Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { - "results": [ + "AsyncTests": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "564.8 ms", - "Error": "5.71 ms", - "StdDev": "5.34 ms", - "Median": "564.8 ms" + "Mean": "558.9 ms", + "Error": "4.39 ms", + "StdDev": "4.11 ms", + "Median": "557.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,156.4 ms", - "Error": "5.99 ms", - "StdDev": "5.00 ms", - "Median": "1,156.4 ms" + "Mean": "650.2 ms", + "Error": "10.15 ms", + "StdDev": "9.00 ms", + "Median": "649.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,132.6 ms", - "Error": "10.60 ms", - "StdDev": "9.92 ms", - "Median": "1,130.6 ms" + "Mean": "615.0 ms", + "Error": "6.64 ms", + "StdDev": "5.89 ms", + "Median": "614.8 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,200.7 ms", - "Error": "6.87 ms", - "StdDev": "5.74 ms", - "Median": "1,200.4 ms" + "Mean": "702.4 ms", + "Error": "8.00 ms", + "StdDev": "7.09 ms", + "Median": "702.4 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "123.8 ms", + "Error": "0.49 ms", + "StdDev": "0.46 ms", + "Median": "123.9 ms" + } + ], + "DataDrivenTests": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "510.37 ms", + "Error": "7.617 ms", + "StdDev": "7.125 ms", + "Median": "511.05 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "583.06 ms", + "Error": "11.292 ms", + "StdDev": "17.581 ms", + "Median": "583.47 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "594.23 ms", + "Error": "11.707 ms", + "StdDev": "18.226 ms", + "Median": "591.72 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "604.34 ms", + "Error": "8.401 ms", + "StdDev": "7.447 ms", + "Median": "605.85 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "25.55 ms", + "Error": "0.258 ms", + "StdDev": "0.241 ms", + "Median": "25.62 ms" + } + ], + "MassiveParallelTests": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "625.5 ms", + "Error": "8.58 ms", + "StdDev": "7.61 ms", + "Median": "626.8 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,213.0 ms", + "Error": "13.24 ms", + "StdDev": "12.39 ms", + "Median": "1,211.9 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "3,010.8 ms", + "Error": "13.51 ms", + "StdDev": "12.63 ms", + "Median": "3,010.4 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "3,099.6 ms", + "Error": "17.58 ms", + "StdDev": "15.59 ms", + "Median": "3,101.6 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "132.3 ms", + "Error": "0.47 ms", + "StdDev": "0.36 ms", + "Median": "132.3 ms" + } + ], + "MatrixTests": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "557.69 ms", + "Error": "4.512 ms", + "StdDev": "4.221 ms", + "Median": "556.60 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,539.35 ms", + "Error": "12.309 ms", + "StdDev": "11.514 ms", + "Median": "1,541.87 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "1,496.25 ms", + "Error": "7.142 ms", + "StdDev": "5.576 ms", + "Median": "1,496.55 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "1,586.79 ms", + "Error": "7.846 ms", + "StdDev": "7.339 ms", + "Median": "1,586.67 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "79.15 ms", + "Error": "0.408 ms", + "StdDev": "0.381 ms", + "Median": "79.11 ms" + } + ], + "ScaleTests": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "514.19 ms", + "Error": "6.934 ms", + "StdDev": "6.486 ms", + "Median": "512.52 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "552.95 ms", + "Error": "8.867 ms", + "StdDev": "7.860 ms", + "Median": "553.62 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "474.67 ms", + "Error": "9.187 ms", + "StdDev": "8.594 ms", + "Median": "475.13 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "562.71 ms", + "Error": "6.445 ms", + "StdDev": "6.028 ms", + "Median": "561.53 ms" + }, + { + "Method": "TUnit_AOT", + "Version": "1.1.0", + "Mean": "44.36 ms", + "Error": "1.308 ms", + "StdDev": "3.857 ms", + "Median": "45.13 ms" + } + ], + "SetupTeardownTests": [ + { + "Method": "TUnit", + "Version": "1.1.0", + "Mean": "583.4 ms", + "Error": "6.18 ms", + "StdDev": "5.16 ms", + "Median": "583.7 ms" + }, + { + "Method": "NUnit", + "Version": "4.4.0", + "Mean": "1,198.4 ms", + "Error": "16.41 ms", + "StdDev": "15.35 ms", + "Median": "1,195.0 ms" + }, + { + "Method": "MSTest", + "Version": "4.0.2", + "Mean": "1,162.5 ms", + "Error": "10.28 ms", + "StdDev": "9.11 ms", + "Median": "1,161.5 ms" + }, + { + "Method": "xUnit3", + "Version": "3.2.0", + "Mean": "1,243.3 ms", + "Error": "10.48 ms", + "StdDev": "9.80 ms", + "Median": "1,241.9 ms" }, { "Method": "TUnit_AOT", @@ -54,41 +264,41 @@ { "Method": "Build_TUnit", "Version": "1.1.0", - "Mean": "2.009 s", - "Error": "0.0285 s", - "StdDev": "0.0253 s", - "Median": "2.007 s" + "Mean": "2.033 s", + "Error": "0.0333 s", + "StdDev": "0.0296 s", + "Median": "2.032 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.606 s", - "Error": "0.0170 s", - "StdDev": "0.0159 s", - "Median": "1.603 s" + "Mean": "1.622 s", + "Error": "0.0231 s", + "StdDev": "0.0216 s", + "Median": "1.615 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.683 s", - "Error": "0.0155 s", - "StdDev": "0.0145 s", - "Median": "1.679 s" + "Mean": "1.705 s", + "Error": "0.0247 s", + "StdDev": "0.0231 s", + "Median": "1.701 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.589 s", - "Error": "0.0220 s", - "StdDev": "0.0206 s", - "Median": "1.593 s" + "Mean": "1.611 s", + "Error": "0.0265 s", + "StdDev": "0.0248 s", + "Median": "1.613 s" } ] }, "stats": { - "runtimeCategories": 1, + "runtimeCategories": 6, "buildCategories": 1, - "totalBenchmarks": 2, - "lastUpdated": "2025-11-12T20:55:56.394Z" + "totalBenchmarks": 7, + "lastUpdated": "2025-11-12T21:13:20.516Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index f3ba5050a2..dbf147f580 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -1,6 +1,11 @@ { "runtime": [ - "results" + "AsyncTests", + "DataDrivenTests", + "MassiveParallelTests", + "MatrixTests", + "ScaleTests", + "SetupTeardownTests" ], "build": [ "BuildTime" From f7a684c5fa1f497c486f4a4237c2bb25c735d01f Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:20:12 +0000 Subject: [PATCH 029/192] Delete docs/docs/benchmarks/results.md --- docs/docs/benchmarks/results.md | 78 --------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 docs/docs/benchmarks/results.md diff --git a/docs/docs/benchmarks/results.md b/docs/docs/benchmarks/results.md deleted file mode 100644 index cee00e4417..0000000000 --- a/docs/docs/benchmarks/results.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: results -description: Performance benchmark results for results -sidebar_position: 2 ---- - -# results Benchmark - -:::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. - -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 -::: - -## šŸ“Š Results - -| Framework | Version | Mean | Median | StdDev | -|-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 564.8 ms | 564.8 ms | 5.34 ms | -| NUnit | 4.4.0 | 1,156.4 ms | 1,156.4 ms | 5.00 ms | -| MSTest | 4.0.2 | 1,132.6 ms | 1,130.6 ms | 9.92 ms | -| xUnit3 | 3.2.0 | 1,200.7 ms | 1,200.4 ms | 5.74 ms | -| **TUnit (AOT)** | 1.1.0 | NA | NA | NA | - -## šŸ“ˆ Visual Comparison - -```mermaid -%%{init: { - 'theme':'base', - 'themeVariables': { - 'primaryColor': '#2563eb', - 'primaryTextColor': '#ffffff', - 'primaryBorderColor': '#1e40af', - 'lineColor': '#6b7280', - 'secondaryColor': '#7c3aed', - 'tertiaryColor': '#dc2626', - 'background': '#ffffff', - 'mainBkg': '#2563eb', - 'secondBkg': '#7c3aed', - 'tertiaryBkg': '#dc2626', - 'clusterBkg': '#f3f4f6', - 'edgeLabelBackground': '#ffffff', - 'tertiaryTextColor': '#1f2937', - 'pie1': '#2563eb', - 'pie2': '#7c3aed', - 'pie3': '#dc2626', - 'pie4': '#f59e0b', - 'pie5': '#10b981', - 'pie6': '#06b6d4', - 'pie7': '#ec4899', - 'pie8': '#6366f1', - 'pie9': '#84cc16', - 'pie10': '#f97316', - 'pie11': '#14b8a6', - 'pie12': '#a855f7' - } -}}%% -xychart-beta - title "results Performance Comparison" - x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1441 - bar [564.8, 1156.4, 1132.6, 1200.7, 0] -``` - -## šŸŽÆ Key Insights - -- **2.05x faster** than NUnit (4.4.0) -- **2.01x faster** than MSTest (4.0.2) -- **2.13x faster** than xUnit3 (3.2.0) -- **Infinityx faster** with Native AOT compilation - ---- - -:::note Methodology -View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. -::: - -*Last generated: 2025-11-12T20:55:56.395Z* From 52370ef00827da13b33eabb9521e8d29f81c4d59 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:22:17 +0000 Subject: [PATCH 030/192] Remove benchmarks index from sidebar Removed benchmarks index from Performance & Benchmarks category. --- docs/sidebars.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/sidebars.ts b/docs/sidebars.ts index b53b165699..5e446d9f36 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -290,7 +290,6 @@ const sidebars: SidebarsConfig = { label: 'Performance & Benchmarks', collapsed: false, items: [ - 'benchmarks/index', { type: 'autogenerated', dirName: 'benchmarks', From 4728a0f7bbe6fc278672302d157a4ed87282ab8a Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:32:43 +0000 Subject: [PATCH 031/192] chore(deps): update verify to 31.6.1 (#3815) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7fd5f5e6e3..acd52ae7d7 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From 0d9047113a97fb125a80c62a819b6fd300cabf30 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:49:54 +0000 Subject: [PATCH 032/192] feat: override tests via new keyword in derived classes (#3816) --- .../Generators/TestMetadataGenerator.cs | 74 ++++++++++++++++++- .../Bugs/3813/BaseServiceTests.cs | 16 ++++ .../Bugs/3813/ImplementationATests.cs | 12 +++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 TUnit.TestProject/Bugs/3813/BaseServiceTests.cs create mode 100644 TUnit.TestProject/Bugs/3813/ImplementationATests.cs diff --git a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs index 5826707b2d..0f232f71d3 100644 --- a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs +++ b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs @@ -2341,11 +2341,83 @@ private static string GetDefaultValueString(IParameterSymbol parameter) } + private static bool IsMethodHiding(IMethodSymbol derivedMethod, IMethodSymbol baseMethod) + { + // Must have same name + if (derivedMethod.Name != baseMethod.Name) + { + return false; + } + + // Must NOT be an override (overrides are different from hiding) + if (derivedMethod.IsOverride) + { + return false; + } + + // Must have matching parameters + if (!ParametersMatch(derivedMethod.Parameters, baseMethod.Parameters)) + { + return false; + } + + // Derived method's containing type must be derived from base method's containing type + var derivedType = derivedMethod.ContainingType; + var baseType = baseMethod.ContainingType; + + // Can't hide yourself + if (SymbolEqualityComparer.Default.Equals(derivedType.OriginalDefinition, baseType.OriginalDefinition)) + { + return false; + } + + // Check if derived type inherits from base type + var current = derivedType.BaseType; + while (current is not null && current.SpecialType != SpecialType.System_Object) + { + if (SymbolEqualityComparer.Default.Equals(current.OriginalDefinition, baseType.OriginalDefinition)) + { + return true; + } + current = current.BaseType; + } + + return false; + } + private static List CollectInheritedTestMethods(INamedTypeSymbol derivedClass) { - return derivedClass.GetMembersIncludingBase().OfType() + var allTestMethods = derivedClass.GetMembersIncludingBase() + .OfType() .Where(m => m.GetAttributes().Any(attr => attr.IsTestAttribute())) .ToList(); + + // Find methods declared directly on the derived class + var derivedClassMethods = allTestMethods + .Where(m => SymbolEqualityComparer.Default.Equals(m.ContainingType.OriginalDefinition, derivedClass.OriginalDefinition)) + .ToList(); + + // Filter out base methods that are hidden by derived class methods or declared directly on derived class + var result = new List(); + foreach (var method in allTestMethods) + { + // Skip methods declared directly on derived class + // (they're handled by regular test registration) + if (SymbolEqualityComparer.Default.Equals(method.ContainingType.OriginalDefinition, derivedClass.OriginalDefinition)) + { + continue; + } + + // Check if this base method is hidden by any derived class method + var isHidden = derivedClassMethods.Any(derived => IsMethodHiding(derived, method)); + + if (!isHidden) + { + result.Add(method); + } + } + + return result; } private static IMethodSymbol? FindConcreteMethodImplementation(INamedTypeSymbol derivedClass, IMethodSymbol baseMethod) diff --git a/TUnit.TestProject/Bugs/3813/BaseServiceTests.cs b/TUnit.TestProject/Bugs/3813/BaseServiceTests.cs new file mode 100644 index 0000000000..f435689105 --- /dev/null +++ b/TUnit.TestProject/Bugs/3813/BaseServiceTests.cs @@ -0,0 +1,16 @@ +namespace TUnit.TestProject.Bugs._3813; + +public abstract class BaseServiceTests +{ + [Test] + public async Task BasicFeature() + { + await Task.CompletedTask; + } + + [Test] + public async Task AdvancedFeature() + { + await Task.CompletedTask; + } +} diff --git a/TUnit.TestProject/Bugs/3813/ImplementationATests.cs b/TUnit.TestProject/Bugs/3813/ImplementationATests.cs new file mode 100644 index 0000000000..75f2c52d8d --- /dev/null +++ b/TUnit.TestProject/Bugs/3813/ImplementationATests.cs @@ -0,0 +1,12 @@ +namespace TUnit.TestProject.Bugs._3813; + +[InheritsTests] +public class ImplementationATests : BaseServiceTests +{ + [Test] + [Skip("Implementation A does not support advanced feature")] + public new Task AdvancedFeature() + { + return Task.CompletedTask; + } +} From eba34733a540f8384493cfa3a0a99ad2cccde247 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 23:08:10 +0000 Subject: [PATCH 033/192] chore(deps): update dependency microsoft.build.utilities.core to v18 (#3817) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index acd52ae7d7..b554cb962f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -20,7 +20,7 @@ - + From 78676fa2b57072df8f3073133863b18400e05fad Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 23:26:25 +0000 Subject: [PATCH 034/192] chore: add 'ignore-for-release' label to speed-comparison.yml (#3820) --- .github/workflows/speed-comparison.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 7a551189bb..27c762a3e4 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -326,6 +326,7 @@ jobs: automated benchmarks documentation + ignore-for-release draft: false - name: Merge PR Immediately From c958b786bf330ddb63a6ef7a26ef7b949514c727 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 12 Nov 2025 23:29:15 +0000 Subject: [PATCH 035/192] chore(deps): update dependency benchmarkdotnet to 0.15.7 (#3818) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index b554cb962f..a12962d148 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,7 +7,7 @@ - + From d27cf3b26b7fe97b0aecbdbe7e43deccc4ae2ab1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 00:03:30 +0000 Subject: [PATCH 036/192] chore(deps): update dependency benchmarkdotnet.annotations to 0.15.7 (#3819) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index a12962d148..2f726aef4a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -8,7 +8,7 @@ - + From f8663e012265d923bd9356d60d69820d3c0f5171 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 00:28:52 +0000 Subject: [PATCH 037/192] chore: update benchmark results (#3822) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 44 +-- .../benchmarks/MassiveParallelTests.json | 44 +-- docs/static/benchmarks/MatrixTests.json | 44 +-- docs/static/benchmarks/ScaleTests.json | 44 +-- .../static/benchmarks/SetupTeardownTests.json | 36 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 270 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 349 insertions(+), 345 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 311679bb5a..2657a3eaac 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 558.9 ms | 557.2 ms | 4.11 ms | -| NUnit | 4.4.0 | 650.2 ms | 649.0 ms | 9.00 ms | -| MSTest | 4.0.2 | 615.0 ms | 614.8 ms | 5.89 ms | -| xUnit3 | 3.2.0 | 702.4 ms | 702.4 ms | 7.09 ms | -| **TUnit (AOT)** | 1.1.0 | 123.8 ms | 123.9 ms | 0.46 ms | +| **TUnit** | 1.1.0 | 551.3 ms | 551.1 ms | 1.86 ms | +| NUnit | 4.4.0 | 639.4 ms | 634.6 ms | 10.77 ms | +| MSTest | 4.0.2 | 612.9 ms | 611.2 ms | 9.13 ms | +| xUnit3 | 3.2.0 | 692.8 ms | 692.6 ms | 5.81 ms | +| **TUnit (AOT)** | 1.1.0 | 122.7 ms | 122.8 ms | 0.41 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 843 - bar [558.9, 650.2, 615, 702.4, 123.8] + y-axis "Time (ms)" 0 --> 832 + bar [551.3, 639.4, 612.9, 692.8, 122.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.516Z* +*Last generated: 2025-11-13T00:28:35.380Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index bb58397fad..fde44e0ac3 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 2.033 s | 2.032 s | 0.0296 s | -| Build_NUnit | 4.4.0 | 1.622 s | 1.615 s | 0.0216 s | -| Build_MSTest | 4.0.2 | 1.705 s | 1.701 s | 0.0231 s | -| Build_xUnit3 | 3.2.0 | 1.611 s | 1.613 s | 0.0248 s | +| **TUnit** | 1.1.0 | 2.100 s | 2.101 s | 0.0207 s | +| Build_NUnit | 4.4.0 | 1.688 s | 1.689 s | 0.0214 s | +| Build_MSTest | 4.0.2 | 1.731 s | 1.733 s | 0.0235 s | +| Build_xUnit3 | 3.2.0 | 1.648 s | 1.639 s | 0.0283 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.033, 1.622, 1.705, 1.611] + bar [2.1, 1.688, 1.731, 1.648] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.518Z* +*Last generated: 2025-11-13T00:28:35.383Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 539d7eaa2f..f09041fc89 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 510.37 ms | 511.05 ms | 7.125 ms | -| NUnit | 4.4.0 | 583.06 ms | 583.47 ms | 17.581 ms | -| MSTest | 4.0.2 | 594.23 ms | 591.72 ms | 18.226 ms | -| xUnit3 | 3.2.0 | 604.34 ms | 605.85 ms | 7.447 ms | -| **TUnit (AOT)** | 1.1.0 | 25.55 ms | 25.62 ms | 0.241 ms | +| **TUnit** | 1.1.0 | 486.77 ms | 486.53 ms | 3.791 ms | +| NUnit | 4.4.0 | 589.92 ms | 591.78 ms | 12.153 ms | +| MSTest | 4.0.2 | 605.63 ms | 602.89 ms | 14.207 ms | +| xUnit3 | 3.2.0 | 600.41 ms | 597.06 ms | 10.504 ms | +| **TUnit (AOT)** | 1.1.0 | 24.05 ms | 24.05 ms | 0.239 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 726 - bar [510.37, 583.06, 594.23, 604.34, 25.55] + y-axis "Time (ms)" 0 --> 727 + bar [486.77, 589.92, 605.63, 600.41, 24.05] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.516Z* +*Last generated: 2025-11-13T00:28:35.381Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 6f2c8a816f..3d5370e19a 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 625.5 ms | 626.8 ms | 7.61 ms | -| NUnit | 4.4.0 | 1,213.0 ms | 1,211.9 ms | 12.39 ms | -| MSTest | 4.0.2 | 3,010.8 ms | 3,010.4 ms | 12.63 ms | -| xUnit3 | 3.2.0 | 3,099.6 ms | 3,101.6 ms | 15.59 ms | -| **TUnit (AOT)** | 1.1.0 | 132.3 ms | 132.3 ms | 0.36 ms | +| **TUnit** | 1.1.0 | 601.9 ms | 602.5 ms | 2.97 ms | +| NUnit | 4.4.0 | 1,181.6 ms | 1,177.9 ms | 13.31 ms | +| MSTest | 4.0.2 | 2,965.3 ms | 2,966.7 ms | 6.96 ms | +| xUnit3 | 3.2.0 | 3,066.6 ms | 3,066.7 ms | 6.78 ms | +| **TUnit (AOT)** | 1.1.0 | 131.6 ms | 131.7 ms | 0.37 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3720 - bar [625.5, 1213, 3010.8, 3099.6, 132.3] + y-axis "Time (ms)" 0 --> 3680 + bar [601.9, 1181.6, 2965.3, 3066.6, 131.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-13T00:28:35.381Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index d683a99d99..27168e700e 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 557.69 ms | 556.60 ms | 4.221 ms | -| NUnit | 4.4.0 | 1,539.35 ms | 1,541.87 ms | 11.514 ms | -| MSTest | 4.0.2 | 1,496.25 ms | 1,496.55 ms | 5.576 ms | -| xUnit3 | 3.2.0 | 1,586.79 ms | 1,586.67 ms | 7.339 ms | -| **TUnit (AOT)** | 1.1.0 | 79.15 ms | 79.11 ms | 0.381 ms | +| **TUnit** | 1.1.0 | 570.36 ms | 570.43 ms | 4.980 ms | +| NUnit | 4.4.0 | 1,565.27 ms | 1,565.69 ms | 5.876 ms | +| MSTest | 4.0.2 | 1,523.48 ms | 1,521.53 ms | 8.270 ms | +| xUnit3 | 3.2.0 | 1,605.46 ms | 1,605.92 ms | 7.776 ms | +| **TUnit (AOT)** | 1.1.0 | 79.85 ms | 79.80 ms | 0.324 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1905 - bar [557.69, 1539.35, 1496.25, 1586.79, 79.15] + y-axis "Time (ms)" 0 --> 1927 + bar [570.36, 1565.27, 1523.48, 1605.46, 79.85] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-13T00:28:35.381Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 3de683a15b..ad47b9ed23 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 514.19 ms | 512.52 ms | 6.486 ms | -| NUnit | 4.4.0 | 552.95 ms | 553.62 ms | 7.860 ms | -| MSTest | 4.0.2 | 474.67 ms | 475.13 ms | 8.594 ms | -| xUnit3 | 3.2.0 | 562.71 ms | 561.53 ms | 6.028 ms | -| **TUnit (AOT)** | 1.1.0 | 44.36 ms | 45.13 ms | 3.857 ms | +| **TUnit** | 1.1.0 | 516.15 ms | 515.58 ms | 7.373 ms | +| NUnit | 4.4.0 | 582.62 ms | 580.89 ms | 8.879 ms | +| MSTest | 4.0.2 | 564.54 ms | 562.45 ms | 7.780 ms | +| xUnit3 | 3.2.0 | 578.98 ms | 576.98 ms | 9.057 ms | +| **TUnit (AOT)** | 1.1.0 | 44.37 ms | 44.24 ms | 3.944 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 676 - bar [514.19, 552.95, 474.67, 562.71, 44.36] + y-axis "Time (ms)" 0 --> 700 + bar [516.15, 582.62, 564.54, 578.98, 44.37] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-13T00:28:35.382Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 4452a73eb9..cbea02129f 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 583.4 ms | 583.7 ms | 5.16 ms | -| NUnit | 4.4.0 | 1,198.4 ms | 1,195.0 ms | 15.35 ms | -| MSTest | 4.0.2 | 1,162.5 ms | 1,161.5 ms | 9.11 ms | -| xUnit3 | 3.2.0 | 1,243.3 ms | 1,241.9 ms | 9.80 ms | +| **TUnit** | 1.1.0 | 562.2 ms | 561.5 ms | 4.24 ms | +| NUnit | 4.4.0 | 1,173.5 ms | 1,173.5 ms | 9.02 ms | +| MSTest | 4.0.2 | 1,146.7 ms | 1,145.3 ms | 16.63 ms | +| xUnit3 | 3.2.0 | 1,216.8 ms | 1,217.2 ms | 5.86 ms | | **TUnit (AOT)** | 1.1.0 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1492 - bar [583.4, 1198.4, 1162.5, 1243.3, 0] + y-axis "Time (ms)" 0 --> 1461 + bar [562.2, 1173.5, 1146.7, 1216.8, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-13T00:28:35.382Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index c320ea6144..712902a439 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-12** from the latest CI run. +These benchmarks were automatically generated on **2025-11-13** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -59,7 +59,7 @@ The benchmarks measure real-world testing patterns: - **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) -- **Tool**: BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat) +- **Tool**: BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat) ### Why These Numbers Matter @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T21:13:20.518Z* +*Last generated: 2025-11-13T00:28:35.383Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index f0c2840116..a80f44cd3c 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.516Z", + "timestamp": "2025-11-13T00:28:35.381Z", "category": "AsyncTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "558.9 ms", - "Error": "4.39 ms", - "StdDev": "4.11 ms", - "Median": "557.2 ms" + "Mean": "551.3 ms", + "Error": "2.23 ms", + "StdDev": "1.86 ms", + "Median": "551.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "650.2 ms", - "Error": "10.15 ms", - "StdDev": "9.00 ms", - "Median": "649.0 ms" + "Mean": "639.4 ms", + "Error": "11.51 ms", + "StdDev": "10.77 ms", + "Median": "634.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.0 ms", - "Error": "6.64 ms", - "StdDev": "5.89 ms", - "Median": "614.8 ms" + "Mean": "612.9 ms", + "Error": "10.30 ms", + "StdDev": "9.13 ms", + "Median": "611.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "702.4 ms", - "Error": "8.00 ms", - "StdDev": "7.09 ms", - "Median": "702.4 ms" + "Mean": "692.8 ms", + "Error": "6.56 ms", + "StdDev": "5.81 ms", + "Median": "692.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "123.8 ms", - "Error": "0.49 ms", - "StdDev": "0.46 ms", - "Median": "123.9 ms" + "Mean": "122.7 ms", + "Error": "0.47 ms", + "StdDev": "0.41 ms", + "Median": "122.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index f64bd7f717..1560b2e2ae 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.518Z", + "timestamp": "2025-11-13T00:28:35.383Z", "category": "BuildTime", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.1.0", - "Mean": "2.033 s", - "Error": "0.0333 s", - "StdDev": "0.0296 s", - "Median": "2.032 s" + "Mean": "2.100 s", + "Error": "0.0234 s", + "StdDev": "0.0207 s", + "Median": "2.101 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.622 s", - "Error": "0.0231 s", - "StdDev": "0.0216 s", - "Median": "1.615 s" + "Mean": "1.688 s", + "Error": "0.0229 s", + "StdDev": "0.0214 s", + "Median": "1.689 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.705 s", - "Error": "0.0247 s", - "StdDev": "0.0231 s", - "Median": "1.701 s" + "Mean": "1.731 s", + "Error": "0.0265 s", + "StdDev": "0.0235 s", + "Median": "1.733 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.611 s", - "Error": "0.0265 s", - "StdDev": "0.0248 s", - "Median": "1.613 s" + "Mean": "1.648 s", + "Error": "0.0303 s", + "StdDev": "0.0283 s", + "Median": "1.639 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 03fc62272a..8d566f7430 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-13T00:28:35.381Z", "category": "DataDrivenTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "510.37 ms", - "Error": "7.617 ms", - "StdDev": "7.125 ms", - "Median": "511.05 ms" + "Mean": "486.77 ms", + "Error": "4.539 ms", + "StdDev": "3.791 ms", + "Median": "486.53 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "583.06 ms", - "Error": "11.292 ms", - "StdDev": "17.581 ms", - "Median": "583.47 ms" + "Mean": "589.92 ms", + "Error": "11.358 ms", + "StdDev": "12.153 ms", + "Median": "591.78 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "594.23 ms", - "Error": "11.707 ms", - "StdDev": "18.226 ms", - "Median": "591.72 ms" + "Mean": "605.63 ms", + "Error": "11.934 ms", + "StdDev": "14.207 ms", + "Median": "602.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "604.34 ms", - "Error": "8.401 ms", - "StdDev": "7.447 ms", - "Median": "605.85 ms" + "Mean": "600.41 ms", + "Error": "11.230 ms", + "StdDev": "10.504 ms", + "Median": "597.06 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "25.55 ms", - "Error": "0.258 ms", - "StdDev": "0.241 ms", - "Median": "25.62 ms" + "Mean": "24.05 ms", + "Error": "0.255 ms", + "StdDev": "0.239 ms", + "Median": "24.05 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index c60cb4d2d9..6a32ec791c 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-13T00:28:35.381Z", "category": "MassiveParallelTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "625.5 ms", - "Error": "8.58 ms", - "StdDev": "7.61 ms", - "Median": "626.8 ms" + "Mean": "601.9 ms", + "Error": "3.35 ms", + "StdDev": "2.97 ms", + "Median": "602.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,213.0 ms", - "Error": "13.24 ms", - "StdDev": "12.39 ms", - "Median": "1,211.9 ms" + "Mean": "1,181.6 ms", + "Error": "15.01 ms", + "StdDev": "13.31 ms", + "Median": "1,177.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,010.8 ms", - "Error": "13.51 ms", - "StdDev": "12.63 ms", - "Median": "3,010.4 ms" + "Mean": "2,965.3 ms", + "Error": "7.85 ms", + "StdDev": "6.96 ms", + "Median": "2,966.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,099.6 ms", - "Error": "17.58 ms", - "StdDev": "15.59 ms", - "Median": "3,101.6 ms" + "Mean": "3,066.6 ms", + "Error": "7.64 ms", + "StdDev": "6.78 ms", + "Median": "3,066.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "132.3 ms", - "Error": "0.47 ms", - "StdDev": "0.36 ms", - "Median": "132.3 ms" + "Mean": "131.6 ms", + "Error": "0.39 ms", + "StdDev": "0.37 ms", + "Median": "131.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index fd462c3e66..228fc05585 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-13T00:28:35.382Z", "category": "MatrixTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "557.69 ms", - "Error": "4.512 ms", - "StdDev": "4.221 ms", - "Median": "556.60 ms" + "Mean": "570.36 ms", + "Error": "5.617 ms", + "StdDev": "4.980 ms", + "Median": "570.43 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,539.35 ms", - "Error": "12.309 ms", - "StdDev": "11.514 ms", - "Median": "1,541.87 ms" + "Mean": "1,565.27 ms", + "Error": "6.629 ms", + "StdDev": "5.876 ms", + "Median": "1,565.69 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,496.25 ms", - "Error": "7.142 ms", - "StdDev": "5.576 ms", - "Median": "1,496.55 ms" + "Mean": "1,523.48 ms", + "Error": "9.329 ms", + "StdDev": "8.270 ms", + "Median": "1,521.53 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,586.79 ms", - "Error": "7.846 ms", - "StdDev": "7.339 ms", - "Median": "1,586.67 ms" + "Mean": "1,605.46 ms", + "Error": "8.313 ms", + "StdDev": "7.776 ms", + "Median": "1,605.92 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "79.15 ms", - "Error": "0.408 ms", - "StdDev": "0.381 ms", - "Median": "79.11 ms" + "Mean": "79.85 ms", + "Error": "0.366 ms", + "StdDev": "0.324 ms", + "Median": "79.80 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 47799a37bb..e6b0bd67da 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-13T00:28:35.382Z", "category": "ScaleTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "514.19 ms", - "Error": "6.934 ms", - "StdDev": "6.486 ms", - "Median": "512.52 ms" + "Mean": "516.15 ms", + "Error": "7.882 ms", + "StdDev": "7.373 ms", + "Median": "515.58 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "552.95 ms", - "Error": "8.867 ms", - "StdDev": "7.860 ms", - "Median": "553.62 ms" + "Mean": "582.62 ms", + "Error": "10.017 ms", + "StdDev": "8.879 ms", + "Median": "580.89 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "474.67 ms", - "Error": "9.187 ms", - "StdDev": "8.594 ms", - "Median": "475.13 ms" + "Mean": "564.54 ms", + "Error": "8.777 ms", + "StdDev": "7.780 ms", + "Median": "562.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "562.71 ms", - "Error": "6.445 ms", - "StdDev": "6.028 ms", - "Median": "561.53 ms" + "Mean": "578.98 ms", + "Error": "10.217 ms", + "StdDev": "9.057 ms", + "Median": "576.98 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "44.36 ms", - "Error": "1.308 ms", - "StdDev": "3.857 ms", - "Median": "45.13 ms" + "Mean": "44.37 ms", + "Error": "1.338 ms", + "StdDev": "3.944 ms", + "Median": "44.24 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index b432996a90..0f70c9e758 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,8 +1,8 @@ { - "timestamp": "2025-11-12T21:13:20.518Z", + "timestamp": "2025-11-13T00:28:35.382Z", "category": "SetupTeardownTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "583.4 ms", - "Error": "6.18 ms", - "StdDev": "5.16 ms", - "Median": "583.7 ms" + "Mean": "562.2 ms", + "Error": "4.53 ms", + "StdDev": "4.24 ms", + "Median": "561.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,198.4 ms", - "Error": "16.41 ms", - "StdDev": "15.35 ms", - "Median": "1,195.0 ms" + "Mean": "1,173.5 ms", + "Error": "9.64 ms", + "StdDev": "9.02 ms", + "Median": "1,173.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,162.5 ms", - "Error": "10.28 ms", - "StdDev": "9.11 ms", - "Median": "1,161.5 ms" + "Mean": "1,146.7 ms", + "Error": "18.76 ms", + "StdDev": "16.63 ms", + "Median": "1,145.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,243.3 ms", - "Error": "10.48 ms", - "StdDev": "9.80 ms", - "Median": "1,241.9 ms" + "Mean": "1,216.8 ms", + "Error": "6.27 ms", + "StdDev": "5.86 ms", + "Median": "1,217.2 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 10ef4375d6..ce726f2385 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -30,5 +30,9 @@ { "date": "2025-11-12", "environment": "Ubuntu" + }, + { + "date": "2025-11-13", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 8b4f513b5e..0a206bd729 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,7 +1,7 @@ { - "timestamp": "2025-11-12T21:13:20.518Z", + "timestamp": "2025-11-13T00:28:35.383Z", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "558.9 ms", - "Error": "4.39 ms", - "StdDev": "4.11 ms", - "Median": "557.2 ms" + "Mean": "551.3 ms", + "Error": "2.23 ms", + "StdDev": "1.86 ms", + "Median": "551.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "650.2 ms", - "Error": "10.15 ms", - "StdDev": "9.00 ms", - "Median": "649.0 ms" + "Mean": "639.4 ms", + "Error": "11.51 ms", + "StdDev": "10.77 ms", + "Median": "634.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.0 ms", - "Error": "6.64 ms", - "StdDev": "5.89 ms", - "Median": "614.8 ms" + "Mean": "612.9 ms", + "Error": "10.30 ms", + "StdDev": "9.13 ms", + "Median": "611.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "702.4 ms", - "Error": "8.00 ms", - "StdDev": "7.09 ms", - "Median": "702.4 ms" + "Mean": "692.8 ms", + "Error": "6.56 ms", + "StdDev": "5.81 ms", + "Median": "692.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "123.8 ms", - "Error": "0.49 ms", - "StdDev": "0.46 ms", - "Median": "123.9 ms" + "Mean": "122.7 ms", + "Error": "0.47 ms", + "StdDev": "0.41 ms", + "Median": "122.8 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "510.37 ms", - "Error": "7.617 ms", - "StdDev": "7.125 ms", - "Median": "511.05 ms" + "Mean": "486.77 ms", + "Error": "4.539 ms", + "StdDev": "3.791 ms", + "Median": "486.53 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "583.06 ms", - "Error": "11.292 ms", - "StdDev": "17.581 ms", - "Median": "583.47 ms" + "Mean": "589.92 ms", + "Error": "11.358 ms", + "StdDev": "12.153 ms", + "Median": "591.78 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "594.23 ms", - "Error": "11.707 ms", - "StdDev": "18.226 ms", - "Median": "591.72 ms" + "Mean": "605.63 ms", + "Error": "11.934 ms", + "StdDev": "14.207 ms", + "Median": "602.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "604.34 ms", - "Error": "8.401 ms", - "StdDev": "7.447 ms", - "Median": "605.85 ms" + "Mean": "600.41 ms", + "Error": "11.230 ms", + "StdDev": "10.504 ms", + "Median": "597.06 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "25.55 ms", - "Error": "0.258 ms", - "StdDev": "0.241 ms", - "Median": "25.62 ms" + "Mean": "24.05 ms", + "Error": "0.255 ms", + "StdDev": "0.239 ms", + "Median": "24.05 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "625.5 ms", - "Error": "8.58 ms", - "StdDev": "7.61 ms", - "Median": "626.8 ms" + "Mean": "601.9 ms", + "Error": "3.35 ms", + "StdDev": "2.97 ms", + "Median": "602.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,213.0 ms", - "Error": "13.24 ms", - "StdDev": "12.39 ms", - "Median": "1,211.9 ms" + "Mean": "1,181.6 ms", + "Error": "15.01 ms", + "StdDev": "13.31 ms", + "Median": "1,177.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,010.8 ms", - "Error": "13.51 ms", - "StdDev": "12.63 ms", - "Median": "3,010.4 ms" + "Mean": "2,965.3 ms", + "Error": "7.85 ms", + "StdDev": "6.96 ms", + "Median": "2,966.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,099.6 ms", - "Error": "17.58 ms", - "StdDev": "15.59 ms", - "Median": "3,101.6 ms" + "Mean": "3,066.6 ms", + "Error": "7.64 ms", + "StdDev": "6.78 ms", + "Median": "3,066.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "132.3 ms", - "Error": "0.47 ms", - "StdDev": "0.36 ms", - "Median": "132.3 ms" + "Mean": "131.6 ms", + "Error": "0.39 ms", + "StdDev": "0.37 ms", + "Median": "131.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "557.69 ms", - "Error": "4.512 ms", - "StdDev": "4.221 ms", - "Median": "556.60 ms" + "Mean": "570.36 ms", + "Error": "5.617 ms", + "StdDev": "4.980 ms", + "Median": "570.43 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,539.35 ms", - "Error": "12.309 ms", - "StdDev": "11.514 ms", - "Median": "1,541.87 ms" + "Mean": "1,565.27 ms", + "Error": "6.629 ms", + "StdDev": "5.876 ms", + "Median": "1,565.69 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,496.25 ms", - "Error": "7.142 ms", - "StdDev": "5.576 ms", - "Median": "1,496.55 ms" + "Mean": "1,523.48 ms", + "Error": "9.329 ms", + "StdDev": "8.270 ms", + "Median": "1,521.53 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,586.79 ms", - "Error": "7.846 ms", - "StdDev": "7.339 ms", - "Median": "1,586.67 ms" + "Mean": "1,605.46 ms", + "Error": "8.313 ms", + "StdDev": "7.776 ms", + "Median": "1,605.92 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "79.15 ms", - "Error": "0.408 ms", - "StdDev": "0.381 ms", - "Median": "79.11 ms" + "Mean": "79.85 ms", + "Error": "0.366 ms", + "StdDev": "0.324 ms", + "Median": "79.80 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "514.19 ms", - "Error": "6.934 ms", - "StdDev": "6.486 ms", - "Median": "512.52 ms" + "Mean": "516.15 ms", + "Error": "7.882 ms", + "StdDev": "7.373 ms", + "Median": "515.58 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "552.95 ms", - "Error": "8.867 ms", - "StdDev": "7.860 ms", - "Median": "553.62 ms" + "Mean": "582.62 ms", + "Error": "10.017 ms", + "StdDev": "8.879 ms", + "Median": "580.89 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "474.67 ms", - "Error": "9.187 ms", - "StdDev": "8.594 ms", - "Median": "475.13 ms" + "Mean": "564.54 ms", + "Error": "8.777 ms", + "StdDev": "7.780 ms", + "Median": "562.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "562.71 ms", - "Error": "6.445 ms", - "StdDev": "6.028 ms", - "Median": "561.53 ms" + "Mean": "578.98 ms", + "Error": "10.217 ms", + "StdDev": "9.057 ms", + "Median": "576.98 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.0", - "Mean": "44.36 ms", - "Error": "1.308 ms", - "StdDev": "3.857 ms", - "Median": "45.13 ms" + "Mean": "44.37 ms", + "Error": "1.338 ms", + "StdDev": "3.944 ms", + "Median": "44.24 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.1.0", - "Mean": "583.4 ms", - "Error": "6.18 ms", - "StdDev": "5.16 ms", - "Median": "583.7 ms" + "Mean": "562.2 ms", + "Error": "4.53 ms", + "StdDev": "4.24 ms", + "Median": "561.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,198.4 ms", - "Error": "16.41 ms", - "StdDev": "15.35 ms", - "Median": "1,195.0 ms" + "Mean": "1,173.5 ms", + "Error": "9.64 ms", + "StdDev": "9.02 ms", + "Median": "1,173.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,162.5 ms", - "Error": "10.28 ms", - "StdDev": "9.11 ms", - "Median": "1,161.5 ms" + "Mean": "1,146.7 ms", + "Error": "18.76 ms", + "StdDev": "16.63 ms", + "Median": "1,145.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,243.3 ms", - "Error": "10.48 ms", - "StdDev": "9.80 ms", - "Median": "1,241.9 ms" + "Mean": "1,216.8 ms", + "Error": "6.27 ms", + "StdDev": "5.86 ms", + "Median": "1,217.2 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.1.0", - "Mean": "2.033 s", - "Error": "0.0333 s", - "StdDev": "0.0296 s", - "Median": "2.032 s" + "Mean": "2.100 s", + "Error": "0.0234 s", + "StdDev": "0.0207 s", + "Median": "2.101 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.622 s", - "Error": "0.0231 s", - "StdDev": "0.0216 s", - "Median": "1.615 s" + "Mean": "1.688 s", + "Error": "0.0229 s", + "StdDev": "0.0214 s", + "Median": "1.689 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.705 s", - "Error": "0.0247 s", - "StdDev": "0.0231 s", - "Median": "1.701 s" + "Mean": "1.731 s", + "Error": "0.0265 s", + "StdDev": "0.0235 s", + "Median": "1.733 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.611 s", - "Error": "0.0265 s", - "StdDev": "0.0248 s", - "Median": "1.613 s" + "Mean": "1.648 s", + "Error": "0.0303 s", + "StdDev": "0.0283 s", + "Median": "1.639 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-12T21:13:20.516Z" + "lastUpdated": "2025-11-13T00:28:35.380Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index dbf147f580..31d8bad9d5 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-12", + "timestamp": "2025-11-13", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 6a5721f59438c32dea59049ea3bc97259db756d5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 01:21:50 +0000 Subject: [PATCH 038/192] chore(deps): update tunit to 1.1.10 (#3821) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 2f726aef4a..62fbe75b4e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 466f212a0f..698f64e438 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 3b4dea1e34..6ba222eecf 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 2d85bf717d..8acb6f52e2 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 87faa21d22..87383344ce 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index adafbe6af9..68aace76d7 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 662edbd9f1..8416c07b8c 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 6242ab0689..6fab6c832c 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index f0173684fd..6390ab9ec7 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From a3f2af8b229e048ef12c5b84721e550406490125 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 02:04:03 +0000 Subject: [PATCH 039/192] chore(deps): update dependency polyfill to 9.0.2 (#3823) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index f27fabe053..def0278a4b 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.0.1 + <_TUnitPolyfillVersion>9.0.2 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From 508120b6da93d89b0939bc8aa2862d7804ce5896 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 03:08:05 +0000 Subject: [PATCH 040/192] chore(deps): update dependency polyfill to 9.0.2 (#3790) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 62fbe75b4e..7e70725500 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + From 8bd4ceb43c87b257d7bca1b7bf1a823f6cd2f6ff Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 06:01:05 +0000 Subject: [PATCH 041/192] chore(deps): update verify to 31.7.1 (#3825) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7e70725500..94f7f5ef94 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From 63288127c7e8557200f3194a2d24fe9ae5c27c7d Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Nov 2025 19:30:35 +0000 Subject: [PATCH 042/192] Fix documentation: Update TestContext API from context.Result to context.Execution.Result (#3837) * Initial plan * Fix documentation: Update TestContext API references from context.Result to context.Execution.Result Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- docs/docs/advanced/extension-points.md | 8 ++++---- docs/docs/advanced/performance-best-practices.md | 6 +++--- docs/docs/advanced/test-variants.md | 2 +- docs/docs/test-lifecycle/cleanup.md | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/docs/advanced/extension-points.md b/docs/docs/advanced/extension-points.md index 8ad86faf7d..b4c9e0a1d3 100644 --- a/docs/docs/advanced/extension-points.md +++ b/docs/docs/advanced/extension-points.md @@ -262,9 +262,9 @@ public class TestReporterAttribute : Attribute, ITestStartEventReceiver, ITestEn { await ReportingService.ReportTestCompleted( context.GetDisplayName(), - context.Result?.State, - context.Result?.Duration, - context.Result?.Exception?.Message + context.Execution.Result?.State, + context.Execution.Result?.Duration, + context.Execution.Result?.Exception?.Message ); } } @@ -289,7 +289,7 @@ public class CustomEventReceiverAttribute : Attribute, ITestStartEventReceiver, public ValueTask OnTestEnd(TestContext context) { - Console.WriteLine($"Test ended: {context.GetDisplayName()} - {context.Result?.State}"); + Console.WriteLine($"Test ended: {context.GetDisplayName()} - {context.Execution.Result?.State}"); return default; } } diff --git a/docs/docs/advanced/performance-best-practices.md b/docs/docs/advanced/performance-best-practices.md index ff4645ae88..65587e29db 100644 --- a/docs/docs/advanced/performance-best-practices.md +++ b/docs/docs/advanced/performance-best-practices.md @@ -533,16 +533,16 @@ public class PerformanceAwareExecutor : ITestExecutor public static void RecordTestMetrics() { var context = TestContext.Current; - if (context?.Result != null) + if (context?.Execution.Result != null) { TelemetryClient.TrackMetric( "TestDuration", - context.Result.Duration.TotalMilliseconds, + context.Execution.Result.Duration.TotalMilliseconds, new Dictionary { ["TestName"] = context.Metadata.TestName, ["TestClass"] = context.Metadata.TestDetails.TestClass, - ["Result"] = context.Result.State.ToString() + ["Result"] = context.Execution.Result.State.ToString() }); } } diff --git a/docs/docs/advanced/test-variants.md b/docs/docs/advanced/test-variants.md index 6e5d662808..9bb698c504 100644 --- a/docs/docs/advanced/test-variants.md +++ b/docs/docs/advanced/test-variants.md @@ -87,7 +87,7 @@ public class ShrinkOnFailureAttribute : Attribute, ITestEndEventReceiver public async ValueTask OnTestEnd(TestContext testContext) { // Only shrink if test failed and it's not already a shrink attempt - if (testContext.Result?.Status != TestStatus.Failed) + if (testContext.Execution.Result?.State != TestState.Failed) return; if (testContext.Relationship == TestRelationship.Derived) diff --git a/docs/docs/test-lifecycle/cleanup.md b/docs/docs/test-lifecycle/cleanup.md index cb6366826f..6c66d55408 100644 --- a/docs/docs/test-lifecycle/cleanup.md +++ b/docs/docs/test-lifecycle/cleanup.md @@ -37,7 +37,7 @@ Hooks can optionally accept parameters for accessing context information and can public async Task Cleanup(TestContext context, CancellationToken cancellationToken) { // Access test results via context - if (context.Result?.Status == TestStatus.Failed) + if (context.Execution.Result?.State == TestState.Failed) { await CaptureScreenshot(cancellationToken); } From b146080e95c64894116f1ad2787d5cba2341c0ad Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 23:30:18 +0000 Subject: [PATCH 043/192] chore(deps): update dependency polyfill to 9.0.3 (#3840) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index def0278a4b..ae21f778a1 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.0.2 + <_TUnitPolyfillVersion>9.0.3 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From f98f9030aa373a6a6f6969cbb0024bc36edd6cef Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 13 Nov 2025 23:36:15 +0000 Subject: [PATCH 044/192] chore(deps): update dependency polyfill to 9.0.3 (#3839) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 94f7f5ef94..97b2ad0442 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + From dbe74b017ae52dac0483686e1d24d0b833d87d02 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 14 Nov 2025 00:29:09 +0000 Subject: [PATCH 045/192] chore: update benchmark results (#3841) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 46 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 46 +-- .../benchmarks/MassiveParallelTests.json | 46 +-- docs/static/benchmarks/MatrixTests.json | 46 +-- docs/static/benchmarks/ScaleTests.json | 46 +-- .../static/benchmarks/SetupTeardownTests.json | 38 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 294 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 368 insertions(+), 364 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 2657a3eaac..569ebebef9 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 551.3 ms | 551.1 ms | 1.86 ms | -| NUnit | 4.4.0 | 639.4 ms | 634.6 ms | 10.77 ms | -| MSTest | 4.0.2 | 612.9 ms | 611.2 ms | 9.13 ms | -| xUnit3 | 3.2.0 | 692.8 ms | 692.6 ms | 5.81 ms | -| **TUnit (AOT)** | 1.1.0 | 122.7 ms | 122.8 ms | 0.41 ms | +| **TUnit** | 1.1.10 | 565.6 ms | 564.2 ms | 3.94 ms | +| NUnit | 4.4.0 | 681.8 ms | 682.0 ms | 4.42 ms | +| MSTest | 4.0.2 | 654.5 ms | 653.4 ms | 6.20 ms | +| xUnit3 | 3.2.0 | 734.5 ms | 736.6 ms | 8.35 ms | +| **TUnit (AOT)** | 1.1.10 | 124.2 ms | 124.2 ms | 0.29 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 832 - bar [551.3, 639.4, 612.9, 692.8, 122.7] + y-axis "Time (ms)" 0 --> 882 + bar [565.6, 681.8, 654.5, 734.5, 124.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.380Z* +*Last generated: 2025-11-14T00:28:50.466Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index fde44e0ac3..222d322fbb 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 2.100 s | 2.101 s | 0.0207 s | -| Build_NUnit | 4.4.0 | 1.688 s | 1.689 s | 0.0214 s | -| Build_MSTest | 4.0.2 | 1.731 s | 1.733 s | 0.0235 s | -| Build_xUnit3 | 3.2.0 | 1.648 s | 1.639 s | 0.0283 s | +| **TUnit** | 1.1.10 | 2.051 s | 2.047 s | 0.0286 s | +| Build_NUnit | 4.4.0 | 1.637 s | 1.634 s | 0.0138 s | +| Build_MSTest | 4.0.2 | 1.709 s | 1.706 s | 0.0086 s | +| Build_xUnit3 | 3.2.0 | 1.618 s | 1.615 s | 0.0180 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.1, 1.688, 1.731, 1.648] + bar [2.051, 1.637, 1.709, 1.618] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.383Z* +*Last generated: 2025-11-14T00:28:50.468Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index f09041fc89..30159bff85 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 486.77 ms | 486.53 ms | 3.791 ms | -| NUnit | 4.4.0 | 589.92 ms | 591.78 ms | 12.153 ms | -| MSTest | 4.0.2 | 605.63 ms | 602.89 ms | 14.207 ms | -| xUnit3 | 3.2.0 | 600.41 ms | 597.06 ms | 10.504 ms | -| **TUnit (AOT)** | 1.1.0 | 24.05 ms | 24.05 ms | 0.239 ms | +| **TUnit** | 1.1.10 | 486.00 ms | 486.93 ms | 2.911 ms | +| NUnit | 4.4.0 | 587.97 ms | 586.01 ms | 10.141 ms | +| MSTest | 4.0.2 | 606.98 ms | 607.45 ms | 10.647 ms | +| xUnit3 | 3.2.0 | 599.37 ms | 599.31 ms | 9.447 ms | +| **TUnit (AOT)** | 1.1.10 | 23.70 ms | 23.74 ms | 0.136 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 727 - bar [486.77, 589.92, 605.63, 600.41, 24.05] + y-axis "Time (ms)" 0 --> 729 + bar [486, 587.97, 606.98, 599.37, 23.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.381Z* +*Last generated: 2025-11-14T00:28:50.466Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 3d5370e19a..04a312e769 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 601.9 ms | 602.5 ms | 2.97 ms | -| NUnit | 4.4.0 | 1,181.6 ms | 1,177.9 ms | 13.31 ms | -| MSTest | 4.0.2 | 2,965.3 ms | 2,966.7 ms | 6.96 ms | -| xUnit3 | 3.2.0 | 3,066.6 ms | 3,066.7 ms | 6.78 ms | -| **TUnit (AOT)** | 1.1.0 | 131.6 ms | 131.7 ms | 0.37 ms | +| **TUnit** | 1.1.10 | 613.8 ms | 613.2 ms | 4.83 ms | +| NUnit | 4.4.0 | 1,216.8 ms | 1,214.5 ms | 9.48 ms | +| MSTest | 4.0.2 | 2,992.2 ms | 2,990.5 ms | 13.72 ms | +| xUnit3 | 3.2.0 | 3,088.0 ms | 3,087.1 ms | 9.69 ms | +| **TUnit (AOT)** | 1.1.10 | 131.8 ms | 131.9 ms | 0.45 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3680 - bar [601.9, 1181.6, 2965.3, 3066.6, 131.6] + y-axis "Time (ms)" 0 --> 3706 + bar [613.8, 1216.8, 2992.2, 3088, 131.8] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.381Z* +*Last generated: 2025-11-14T00:28:50.466Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 27168e700e..7c5ccf8bb6 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 570.36 ms | 570.43 ms | 4.980 ms | -| NUnit | 4.4.0 | 1,565.27 ms | 1,565.69 ms | 5.876 ms | -| MSTest | 4.0.2 | 1,523.48 ms | 1,521.53 ms | 8.270 ms | -| xUnit3 | 3.2.0 | 1,605.46 ms | 1,605.92 ms | 7.776 ms | -| **TUnit (AOT)** | 1.1.0 | 79.85 ms | 79.80 ms | 0.324 ms | +| **TUnit** | 1.1.10 | 554.66 ms | 554.27 ms | 3.979 ms | +| NUnit | 4.4.0 | 1,521.00 ms | 1,519.64 ms | 8.186 ms | +| MSTest | 4.0.2 | 1,480.94 ms | 1,479.41 ms | 8.867 ms | +| xUnit3 | 3.2.0 | 1,568.45 ms | 1,568.35 ms | 6.902 ms | +| **TUnit (AOT)** | 1.1.10 | 77.76 ms | 77.77 ms | 0.199 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1927 - bar [570.36, 1565.27, 1523.48, 1605.46, 79.85] + y-axis "Time (ms)" 0 --> 1883 + bar [554.66, 1521, 1480.94, 1568.45, 77.76] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.381Z* +*Last generated: 2025-11-14T00:28:50.467Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index ad47b9ed23..d5ecc51c97 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 516.15 ms | 515.58 ms | 7.373 ms | -| NUnit | 4.4.0 | 582.62 ms | 580.89 ms | 8.879 ms | -| MSTest | 4.0.2 | 564.54 ms | 562.45 ms | 7.780 ms | -| xUnit3 | 3.2.0 | 578.98 ms | 576.98 ms | 9.057 ms | -| **TUnit (AOT)** | 1.1.0 | 44.37 ms | 44.24 ms | 3.944 ms | +| **TUnit** | 1.1.10 | 505.85 ms | 505.28 ms | 2.469 ms | +| NUnit | 4.4.0 | 684.72 ms | 681.86 ms | 16.921 ms | +| MSTest | 4.0.2 | 669.43 ms | 669.54 ms | 13.552 ms | +| xUnit3 | 3.2.0 | 684.21 ms | 676.60 ms | 15.666 ms | +| **TUnit (AOT)** | 1.1.10 | 44.88 ms | 44.70 ms | 3.904 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 700 - bar [516.15, 582.62, 564.54, 578.98, 44.37] + y-axis "Time (ms)" 0 --> 822 + bar [505.85, 684.72, 669.43, 684.21, 44.88] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.382Z* +*Last generated: 2025-11-14T00:28:50.467Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index cbea02129f..929d854248 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-13** from the latest CI run. +This benchmark was automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 562.2 ms | 561.5 ms | 4.24 ms | -| NUnit | 4.4.0 | 1,173.5 ms | 1,173.5 ms | 9.02 ms | -| MSTest | 4.0.2 | 1,146.7 ms | 1,145.3 ms | 16.63 ms | -| xUnit3 | 3.2.0 | 1,216.8 ms | 1,217.2 ms | 5.86 ms | -| **TUnit (AOT)** | 1.1.0 | NA | NA | NA | +| **TUnit** | 1.1.10 | 559.8 ms | 560.2 ms | 3.75 ms | +| NUnit | 4.4.0 | 1,135.0 ms | 1,132.6 ms | 11.31 ms | +| MSTest | 4.0.2 | 1,108.5 ms | 1,107.1 ms | 8.11 ms | +| xUnit3 | 3.2.0 | 1,186.2 ms | 1,186.3 ms | 6.25 ms | +| **TUnit (AOT)** | 1.1.10 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-13** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1461 - bar [562.2, 1173.5, 1146.7, 1216.8, 0] + y-axis "Time (ms)" 0 --> 1424 + bar [559.8, 1135, 1108.5, 1186.2, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-13T00:28:35.382Z* +*Last generated: 2025-11-14T00:28:50.467Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 712902a439..0d6d91c7e0 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-13** from the latest CI run. +These benchmarks were automatically generated on **2025-11-14** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.1.0 | +| **TUnit** | 1.1.10 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-13T00:28:35.383Z* +*Last generated: 2025-11-14T00:28:50.468Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index a80f44cd3c..a3e04863e0 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.381Z", + "timestamp": "2025-11-14T00:28:50.466Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "551.3 ms", - "Error": "2.23 ms", - "StdDev": "1.86 ms", - "Median": "551.1 ms" + "Version": "1.1.10", + "Mean": "565.6 ms", + "Error": "4.72 ms", + "StdDev": "3.94 ms", + "Median": "564.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "639.4 ms", - "Error": "11.51 ms", - "StdDev": "10.77 ms", - "Median": "634.6 ms" + "Mean": "681.8 ms", + "Error": "5.30 ms", + "StdDev": "4.42 ms", + "Median": "682.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "612.9 ms", - "Error": "10.30 ms", - "StdDev": "9.13 ms", - "Median": "611.2 ms" + "Mean": "654.5 ms", + "Error": "7.43 ms", + "StdDev": "6.20 ms", + "Median": "653.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "692.8 ms", - "Error": "6.56 ms", - "StdDev": "5.81 ms", - "Median": "692.6 ms" + "Mean": "734.5 ms", + "Error": "9.42 ms", + "StdDev": "8.35 ms", + "Median": "736.6 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "122.7 ms", - "Error": "0.47 ms", - "StdDev": "0.41 ms", - "Median": "122.8 ms" + "Version": "1.1.10", + "Mean": "124.2 ms", + "Error": "0.31 ms", + "StdDev": "0.29 ms", + "Median": "124.2 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 1560b2e2ae..9c8b3c60c3 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.383Z", + "timestamp": "2025-11-14T00:28:50.468Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,35 +9,35 @@ "results": [ { "Method": "Build_TUnit", - "Version": "1.1.0", - "Mean": "2.100 s", - "Error": "0.0234 s", - "StdDev": "0.0207 s", - "Median": "2.101 s" + "Version": "1.1.10", + "Mean": "2.051 s", + "Error": "0.0306 s", + "StdDev": "0.0286 s", + "Median": "2.047 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.688 s", - "Error": "0.0229 s", - "StdDev": "0.0214 s", - "Median": "1.689 s" + "Mean": "1.637 s", + "Error": "0.0156 s", + "StdDev": "0.0138 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.731 s", - "Error": "0.0265 s", - "StdDev": "0.0235 s", - "Median": "1.733 s" + "Mean": "1.709 s", + "Error": "0.0103 s", + "StdDev": "0.0086 s", + "Median": "1.706 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.648 s", - "Error": "0.0303 s", - "StdDev": "0.0283 s", - "Median": "1.639 s" + "Mean": "1.618 s", + "Error": "0.0193 s", + "StdDev": "0.0180 s", + "Median": "1.615 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 8d566f7430..195c5c1627 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.381Z", + "timestamp": "2025-11-14T00:28:50.466Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "486.77 ms", - "Error": "4.539 ms", - "StdDev": "3.791 ms", - "Median": "486.53 ms" + "Version": "1.1.10", + "Mean": "486.00 ms", + "Error": "3.113 ms", + "StdDev": "2.911 ms", + "Median": "486.93 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "589.92 ms", - "Error": "11.358 ms", - "StdDev": "12.153 ms", - "Median": "591.78 ms" + "Mean": "587.97 ms", + "Error": "11.440 ms", + "StdDev": "10.141 ms", + "Median": "586.01 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "605.63 ms", - "Error": "11.934 ms", - "StdDev": "14.207 ms", - "Median": "602.89 ms" + "Mean": "606.98 ms", + "Error": "11.382 ms", + "StdDev": "10.647 ms", + "Median": "607.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "600.41 ms", - "Error": "11.230 ms", - "StdDev": "10.504 ms", - "Median": "597.06 ms" + "Mean": "599.37 ms", + "Error": "10.657 ms", + "StdDev": "9.447 ms", + "Median": "599.31 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "24.05 ms", - "Error": "0.255 ms", - "StdDev": "0.239 ms", - "Median": "24.05 ms" + "Version": "1.1.10", + "Mean": "23.70 ms", + "Error": "0.153 ms", + "StdDev": "0.136 ms", + "Median": "23.74 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 6a32ec791c..786ff6fee6 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.381Z", + "timestamp": "2025-11-14T00:28:50.466Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "601.9 ms", - "Error": "3.35 ms", - "StdDev": "2.97 ms", - "Median": "602.5 ms" + "Version": "1.1.10", + "Mean": "613.8 ms", + "Error": "5.44 ms", + "StdDev": "4.83 ms", + "Median": "613.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,181.6 ms", - "Error": "15.01 ms", - "StdDev": "13.31 ms", - "Median": "1,177.9 ms" + "Mean": "1,216.8 ms", + "Error": "10.69 ms", + "StdDev": "9.48 ms", + "Median": "1,214.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,965.3 ms", - "Error": "7.85 ms", - "StdDev": "6.96 ms", - "Median": "2,966.7 ms" + "Mean": "2,992.2 ms", + "Error": "14.67 ms", + "StdDev": "13.72 ms", + "Median": "2,990.5 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,066.6 ms", - "Error": "7.64 ms", - "StdDev": "6.78 ms", - "Median": "3,066.7 ms" + "Mean": "3,088.0 ms", + "Error": "10.93 ms", + "StdDev": "9.69 ms", + "Median": "3,087.1 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "131.6 ms", - "Error": "0.39 ms", - "StdDev": "0.37 ms", - "Median": "131.7 ms" + "Version": "1.1.10", + "Mean": "131.8 ms", + "Error": "0.51 ms", + "StdDev": "0.45 ms", + "Median": "131.9 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 228fc05585..2589e12bd2 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.382Z", + "timestamp": "2025-11-14T00:28:50.467Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "570.36 ms", - "Error": "5.617 ms", - "StdDev": "4.980 ms", - "Median": "570.43 ms" + "Version": "1.1.10", + "Mean": "554.66 ms", + "Error": "4.254 ms", + "StdDev": "3.979 ms", + "Median": "554.27 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,565.27 ms", - "Error": "6.629 ms", - "StdDev": "5.876 ms", - "Median": "1,565.69 ms" + "Mean": "1,521.00 ms", + "Error": "9.234 ms", + "StdDev": "8.186 ms", + "Median": "1,519.64 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,523.48 ms", - "Error": "9.329 ms", - "StdDev": "8.270 ms", - "Median": "1,521.53 ms" + "Mean": "1,480.94 ms", + "Error": "10.002 ms", + "StdDev": "8.867 ms", + "Median": "1,479.41 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,605.46 ms", - "Error": "8.313 ms", - "StdDev": "7.776 ms", - "Median": "1,605.92 ms" + "Mean": "1,568.45 ms", + "Error": "7.786 ms", + "StdDev": "6.902 ms", + "Median": "1,568.35 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "79.85 ms", - "Error": "0.366 ms", - "StdDev": "0.324 ms", - "Median": "79.80 ms" + "Version": "1.1.10", + "Mean": "77.76 ms", + "Error": "0.225 ms", + "StdDev": "0.199 ms", + "Median": "77.77 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index e6b0bd67da..07eb91f7ba 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.382Z", + "timestamp": "2025-11-14T00:28:50.467Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "516.15 ms", - "Error": "7.882 ms", - "StdDev": "7.373 ms", - "Median": "515.58 ms" + "Version": "1.1.10", + "Mean": "505.85 ms", + "Error": "2.785 ms", + "StdDev": "2.469 ms", + "Median": "505.28 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "582.62 ms", - "Error": "10.017 ms", - "StdDev": "8.879 ms", - "Median": "580.89 ms" + "Mean": "684.72 ms", + "Error": "13.380 ms", + "StdDev": "16.921 ms", + "Median": "681.86 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "564.54 ms", - "Error": "8.777 ms", - "StdDev": "7.780 ms", - "Median": "562.45 ms" + "Mean": "669.43 ms", + "Error": "13.197 ms", + "StdDev": "13.552 ms", + "Median": "669.54 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "578.98 ms", - "Error": "10.217 ms", - "StdDev": "9.057 ms", - "Median": "576.98 ms" + "Mean": "684.21 ms", + "Error": "13.160 ms", + "StdDev": "15.666 ms", + "Median": "676.60 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "44.37 ms", - "Error": "1.338 ms", - "StdDev": "3.944 ms", - "Median": "44.24 ms" + "Version": "1.1.10", + "Mean": "44.88 ms", + "Error": "1.324 ms", + "StdDev": "3.904 ms", + "Median": "44.70 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 0f70c9e758..9859581e8a 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.382Z", + "timestamp": "2025-11-14T00:28:50.467Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,39 +9,39 @@ "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "562.2 ms", - "Error": "4.53 ms", - "StdDev": "4.24 ms", - "Median": "561.5 ms" + "Version": "1.1.10", + "Mean": "559.8 ms", + "Error": "4.23 ms", + "StdDev": "3.75 ms", + "Median": "560.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,173.5 ms", - "Error": "9.64 ms", - "StdDev": "9.02 ms", - "Median": "1,173.5 ms" + "Mean": "1,135.0 ms", + "Error": "12.10 ms", + "StdDev": "11.31 ms", + "Median": "1,132.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,146.7 ms", - "Error": "18.76 ms", - "StdDev": "16.63 ms", - "Median": "1,145.3 ms" + "Mean": "1,108.5 ms", + "Error": "8.67 ms", + "StdDev": "8.11 ms", + "Median": "1,107.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,216.8 ms", - "Error": "6.27 ms", - "StdDev": "5.86 ms", - "Median": "1,217.2 ms" + "Mean": "1,186.2 ms", + "Error": "7.48 ms", + "StdDev": "6.25 ms", + "Median": "1,186.3 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", + "Version": "1.1.10", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index ce726f2385..6aa3f22f96 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -34,5 +34,9 @@ { "date": "2025-11-13", "environment": "Ubuntu" + }, + { + "date": "2025-11-14", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 0a206bd729..c4ce7506d2 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T00:28:35.383Z", + "timestamp": "2025-11-14T00:28:50.468Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "551.3 ms", - "Error": "2.23 ms", - "StdDev": "1.86 ms", - "Median": "551.1 ms" + "Version": "1.1.10", + "Mean": "565.6 ms", + "Error": "4.72 ms", + "StdDev": "3.94 ms", + "Median": "564.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "639.4 ms", - "Error": "11.51 ms", - "StdDev": "10.77 ms", - "Median": "634.6 ms" + "Mean": "681.8 ms", + "Error": "5.30 ms", + "StdDev": "4.42 ms", + "Median": "682.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "612.9 ms", - "Error": "10.30 ms", - "StdDev": "9.13 ms", - "Median": "611.2 ms" + "Mean": "654.5 ms", + "Error": "7.43 ms", + "StdDev": "6.20 ms", + "Median": "653.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "692.8 ms", - "Error": "6.56 ms", - "StdDev": "5.81 ms", - "Median": "692.6 ms" + "Mean": "734.5 ms", + "Error": "9.42 ms", + "StdDev": "8.35 ms", + "Median": "736.6 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "122.7 ms", - "Error": "0.47 ms", - "StdDev": "0.41 ms", - "Median": "122.8 ms" + "Version": "1.1.10", + "Mean": "124.2 ms", + "Error": "0.31 ms", + "StdDev": "0.29 ms", + "Median": "124.2 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "486.77 ms", - "Error": "4.539 ms", - "StdDev": "3.791 ms", - "Median": "486.53 ms" + "Version": "1.1.10", + "Mean": "486.00 ms", + "Error": "3.113 ms", + "StdDev": "2.911 ms", + "Median": "486.93 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "589.92 ms", - "Error": "11.358 ms", - "StdDev": "12.153 ms", - "Median": "591.78 ms" + "Mean": "587.97 ms", + "Error": "11.440 ms", + "StdDev": "10.141 ms", + "Median": "586.01 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "605.63 ms", - "Error": "11.934 ms", - "StdDev": "14.207 ms", - "Median": "602.89 ms" + "Mean": "606.98 ms", + "Error": "11.382 ms", + "StdDev": "10.647 ms", + "Median": "607.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "600.41 ms", - "Error": "11.230 ms", - "StdDev": "10.504 ms", - "Median": "597.06 ms" + "Mean": "599.37 ms", + "Error": "10.657 ms", + "StdDev": "9.447 ms", + "Median": "599.31 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "24.05 ms", - "Error": "0.255 ms", - "StdDev": "0.239 ms", - "Median": "24.05 ms" + "Version": "1.1.10", + "Mean": "23.70 ms", + "Error": "0.153 ms", + "StdDev": "0.136 ms", + "Median": "23.74 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "601.9 ms", - "Error": "3.35 ms", - "StdDev": "2.97 ms", - "Median": "602.5 ms" + "Version": "1.1.10", + "Mean": "613.8 ms", + "Error": "5.44 ms", + "StdDev": "4.83 ms", + "Median": "613.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,181.6 ms", - "Error": "15.01 ms", - "StdDev": "13.31 ms", - "Median": "1,177.9 ms" + "Mean": "1,216.8 ms", + "Error": "10.69 ms", + "StdDev": "9.48 ms", + "Median": "1,214.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,965.3 ms", - "Error": "7.85 ms", - "StdDev": "6.96 ms", - "Median": "2,966.7 ms" + "Mean": "2,992.2 ms", + "Error": "14.67 ms", + "StdDev": "13.72 ms", + "Median": "2,990.5 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,066.6 ms", - "Error": "7.64 ms", - "StdDev": "6.78 ms", - "Median": "3,066.7 ms" + "Mean": "3,088.0 ms", + "Error": "10.93 ms", + "StdDev": "9.69 ms", + "Median": "3,087.1 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "131.6 ms", - "Error": "0.39 ms", - "StdDev": "0.37 ms", - "Median": "131.7 ms" + "Version": "1.1.10", + "Mean": "131.8 ms", + "Error": "0.51 ms", + "StdDev": "0.45 ms", + "Median": "131.9 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "570.36 ms", - "Error": "5.617 ms", - "StdDev": "4.980 ms", - "Median": "570.43 ms" + "Version": "1.1.10", + "Mean": "554.66 ms", + "Error": "4.254 ms", + "StdDev": "3.979 ms", + "Median": "554.27 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,565.27 ms", - "Error": "6.629 ms", - "StdDev": "5.876 ms", - "Median": "1,565.69 ms" + "Mean": "1,521.00 ms", + "Error": "9.234 ms", + "StdDev": "8.186 ms", + "Median": "1,519.64 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,523.48 ms", - "Error": "9.329 ms", - "StdDev": "8.270 ms", - "Median": "1,521.53 ms" + "Mean": "1,480.94 ms", + "Error": "10.002 ms", + "StdDev": "8.867 ms", + "Median": "1,479.41 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,605.46 ms", - "Error": "8.313 ms", - "StdDev": "7.776 ms", - "Median": "1,605.92 ms" + "Mean": "1,568.45 ms", + "Error": "7.786 ms", + "StdDev": "6.902 ms", + "Median": "1,568.35 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "79.85 ms", - "Error": "0.366 ms", - "StdDev": "0.324 ms", - "Median": "79.80 ms" + "Version": "1.1.10", + "Mean": "77.76 ms", + "Error": "0.225 ms", + "StdDev": "0.199 ms", + "Median": "77.77 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "516.15 ms", - "Error": "7.882 ms", - "StdDev": "7.373 ms", - "Median": "515.58 ms" + "Version": "1.1.10", + "Mean": "505.85 ms", + "Error": "2.785 ms", + "StdDev": "2.469 ms", + "Median": "505.28 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "582.62 ms", - "Error": "10.017 ms", - "StdDev": "8.879 ms", - "Median": "580.89 ms" + "Mean": "684.72 ms", + "Error": "13.380 ms", + "StdDev": "16.921 ms", + "Median": "681.86 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "564.54 ms", - "Error": "8.777 ms", - "StdDev": "7.780 ms", - "Median": "562.45 ms" + "Mean": "669.43 ms", + "Error": "13.197 ms", + "StdDev": "13.552 ms", + "Median": "669.54 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "578.98 ms", - "Error": "10.217 ms", - "StdDev": "9.057 ms", - "Median": "576.98 ms" + "Mean": "684.21 ms", + "Error": "13.160 ms", + "StdDev": "15.666 ms", + "Median": "676.60 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "44.37 ms", - "Error": "1.338 ms", - "StdDev": "3.944 ms", - "Median": "44.24 ms" + "Version": "1.1.10", + "Mean": "44.88 ms", + "Error": "1.324 ms", + "StdDev": "3.904 ms", + "Median": "44.70 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "562.2 ms", - "Error": "4.53 ms", - "StdDev": "4.24 ms", - "Median": "561.5 ms" + "Version": "1.1.10", + "Mean": "559.8 ms", + "Error": "4.23 ms", + "StdDev": "3.75 ms", + "Median": "560.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,173.5 ms", - "Error": "9.64 ms", - "StdDev": "9.02 ms", - "Median": "1,173.5 ms" + "Mean": "1,135.0 ms", + "Error": "12.10 ms", + "StdDev": "11.31 ms", + "Median": "1,132.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,146.7 ms", - "Error": "18.76 ms", - "StdDev": "16.63 ms", - "Median": "1,145.3 ms" + "Mean": "1,108.5 ms", + "Error": "8.67 ms", + "StdDev": "8.11 ms", + "Median": "1,107.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,216.8 ms", - "Error": "6.27 ms", - "StdDev": "5.86 ms", - "Median": "1,217.2 ms" + "Mean": "1,186.2 ms", + "Error": "7.48 ms", + "StdDev": "6.25 ms", + "Median": "1,186.3 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", + "Version": "1.1.10", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.1.0", - "Mean": "2.100 s", - "Error": "0.0234 s", - "StdDev": "0.0207 s", - "Median": "2.101 s" + "Version": "1.1.10", + "Mean": "2.051 s", + "Error": "0.0306 s", + "StdDev": "0.0286 s", + "Median": "2.047 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.688 s", - "Error": "0.0229 s", - "StdDev": "0.0214 s", - "Median": "1.689 s" + "Mean": "1.637 s", + "Error": "0.0156 s", + "StdDev": "0.0138 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.731 s", - "Error": "0.0265 s", - "StdDev": "0.0235 s", - "Median": "1.733 s" + "Mean": "1.709 s", + "Error": "0.0103 s", + "StdDev": "0.0086 s", + "Median": "1.706 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.648 s", - "Error": "0.0303 s", - "StdDev": "0.0283 s", - "Median": "1.639 s" + "Mean": "1.618 s", + "Error": "0.0193 s", + "StdDev": "0.0180 s", + "Median": "1.615 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-13T00:28:35.380Z" + "lastUpdated": "2025-11-14T00:28:50.465Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 31d8bad9d5..56b733f715 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-13", + "timestamp": "2025-11-14", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 6b07ac6377b5e5b12777f2e3e8f88f77c071a028 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:35:58 +0000 Subject: [PATCH 046/192] Clarify TUnit0046 diagnostic message for data source return types (#3843) * Initial plan * Update TUnit0046 analyzer message to be clearer Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> * Update documentation for TUnit0046 to match new message Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- TUnit.Analyzers/AnalyzerReleases.Shipped.md | 2 +- TUnit.Analyzers/Resources.resx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/TUnit.Analyzers/AnalyzerReleases.Shipped.md b/TUnit.Analyzers/AnalyzerReleases.Shipped.md index 3985959552..7438273863 100644 --- a/TUnit.Analyzers/AnalyzerReleases.Shipped.md +++ b/TUnit.Analyzers/AnalyzerReleases.Shipped.md @@ -28,7 +28,7 @@ TUnit0038 | Usage | Error | Property with data attribute must have a data source TUnit0043 | Usage | Error | Properties with data attributes must use 'required' keyword TUnit0044 | Usage | Error | Properties with data attributes must have a setter TUnit0045 | Usage | Error | Property has multiple data source attributes - use only one -TUnit0046 | Usage | Warning | Data source should return Func for lazy evaluation instead of T +TUnit0046 | Usage | Warning | Data source should return Func for reference types to ensure test isolation TUnit0049 | Usage | Error | [Matrix] parameters require [MatrixDataSource] attribute on the test method TUnit0050 | Usage | Error | Too many test arguments provided TUnit0056 | Usage | Error | Instance data source methods must use [InstanceMethodDataSource] attribute diff --git a/TUnit.Analyzers/Resources.resx b/TUnit.Analyzers/Resources.resx index b68d6eadff..4482dd6a1e 100644 --- a/TUnit.Analyzers/Resources.resx +++ b/TUnit.Analyzers/Resources.resx @@ -328,13 +328,13 @@ Too many data attributes - Return a `Func<T>` rather than a `<T>`. + When a data source method provides reference types (other than string) as test parameters, it should return Func<T> to defer object creation until the test runs. This prevents shared state between tests and ensures proper test isolation. - Return a `Func<T>` rather than a `<T>`. + Data source method should return Func<T> for reference type parameters (other than string) to ensure proper test isolation - Return a `Func<T>` rather than a `<T>` + Data source should return Func<T> for reference types For AsyncLocal values set in before hooks, you must call `context.AddAsyncLocalValues` to access them within tests. From 58b277c730a0bdfdd16932364fcac493af20d070 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 00:27:24 +0000 Subject: [PATCH 047/192] chore: update benchmark results (#3844) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 44 +-- .../benchmarks/MassiveParallelTests.json | 44 +-- docs/static/benchmarks/MatrixTests.json | 44 +-- docs/static/benchmarks/ScaleTests.json | 44 +-- .../static/benchmarks/SetupTeardownTests.json | 36 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 270 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 349 insertions(+), 345 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 569ebebef9..548e0174f2 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 565.6 ms | 564.2 ms | 3.94 ms | -| NUnit | 4.4.0 | 681.8 ms | 682.0 ms | 4.42 ms | -| MSTest | 4.0.2 | 654.5 ms | 653.4 ms | 6.20 ms | -| xUnit3 | 3.2.0 | 734.5 ms | 736.6 ms | 8.35 ms | -| **TUnit (AOT)** | 1.1.10 | 124.2 ms | 124.2 ms | 0.29 ms | +| **TUnit** | 1.1.10 | 546.4 ms | 546.3 ms | 3.82 ms | +| NUnit | 4.4.0 | 647.1 ms | 642.5 ms | 9.04 ms | +| MSTest | 4.0.2 | 616.6 ms | 617.2 ms | 7.52 ms | +| xUnit3 | 3.2.0 | 693.2 ms | 692.8 ms | 5.17 ms | +| **TUnit (AOT)** | 1.1.10 | 123.7 ms | 123.7 ms | 0.39 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 882 - bar [565.6, 681.8, 654.5, 734.5, 124.2] + y-axis "Time (ms)" 0 --> 832 + bar [546.4, 647.1, 616.6, 693.2, 123.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.466Z* +*Last generated: 2025-11-15T00:27:09.502Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 222d322fbb..8519936150 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 2.051 s | 2.047 s | 0.0286 s | -| Build_NUnit | 4.4.0 | 1.637 s | 1.634 s | 0.0138 s | -| Build_MSTest | 4.0.2 | 1.709 s | 1.706 s | 0.0086 s | -| Build_xUnit3 | 3.2.0 | 1.618 s | 1.615 s | 0.0180 s | +| **TUnit** | 1.1.10 | 2.104 s | 2.097 s | 0.0487 s | +| Build_NUnit | 4.4.0 | 1.658 s | 1.652 s | 0.0272 s | +| Build_MSTest | 4.0.2 | 1.751 s | 1.748 s | 0.0404 s | +| Build_xUnit3 | 3.2.0 | 1.643 s | 1.644 s | 0.0204 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.051, 1.637, 1.709, 1.618] + bar [2.104, 1.658, 1.751, 1.643] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.468Z* +*Last generated: 2025-11-15T00:27:09.505Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 30159bff85..6532bf2b9a 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 486.00 ms | 486.93 ms | 2.911 ms | -| NUnit | 4.4.0 | 587.97 ms | 586.01 ms | 10.141 ms | -| MSTest | 4.0.2 | 606.98 ms | 607.45 ms | 10.647 ms | -| xUnit3 | 3.2.0 | 599.37 ms | 599.31 ms | 9.447 ms | -| **TUnit (AOT)** | 1.1.10 | 23.70 ms | 23.74 ms | 0.136 ms | +| **TUnit** | 1.1.10 | 493.28 ms | 491.72 ms | 5.477 ms | +| NUnit | 4.4.0 | 527.71 ms | 528.80 ms | 6.631 ms | +| MSTest | 4.0.2 | 499.80 ms | 496.67 ms | 18.060 ms | +| xUnit3 | 3.2.0 | 571.43 ms | 570.30 ms | 9.897 ms | +| **TUnit (AOT)** | 1.1.10 | 24.09 ms | 24.07 ms | 0.146 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 729 - bar [486, 587.97, 606.98, 599.37, 23.7] + y-axis "Time (ms)" 0 --> 686 + bar [493.28, 527.71, 499.8, 571.43, 24.09] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.466Z* +*Last generated: 2025-11-15T00:27:09.503Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 04a312e769..cc36aaf4c1 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 613.8 ms | 613.2 ms | 4.83 ms | -| NUnit | 4.4.0 | 1,216.8 ms | 1,214.5 ms | 9.48 ms | -| MSTest | 4.0.2 | 2,992.2 ms | 2,990.5 ms | 13.72 ms | -| xUnit3 | 3.2.0 | 3,088.0 ms | 3,087.1 ms | 9.69 ms | -| **TUnit (AOT)** | 1.1.10 | 131.8 ms | 131.9 ms | 0.45 ms | +| **TUnit** | 1.1.10 | 605.7 ms | 603.9 ms | 6.52 ms | +| NUnit | 4.4.0 | 1,177.6 ms | 1,177.8 ms | 6.41 ms | +| MSTest | 4.0.2 | 2,951.3 ms | 2,951.9 ms | 6.75 ms | +| xUnit3 | 3.2.0 | 3,050.0 ms | 3,050.0 ms | 7.02 ms | +| **TUnit (AOT)** | 1.1.10 | 130.9 ms | 130.7 ms | 0.38 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3706 - bar [613.8, 1216.8, 2992.2, 3088, 131.8] + y-axis "Time (ms)" 0 --> 3660 + bar [605.7, 1177.6, 2951.3, 3050, 130.9] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.466Z* +*Last generated: 2025-11-15T00:27:09.503Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 7c5ccf8bb6..dd935dbdbb 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 554.66 ms | 554.27 ms | 3.979 ms | -| NUnit | 4.4.0 | 1,521.00 ms | 1,519.64 ms | 8.186 ms | -| MSTest | 4.0.2 | 1,480.94 ms | 1,479.41 ms | 8.867 ms | -| xUnit3 | 3.2.0 | 1,568.45 ms | 1,568.35 ms | 6.902 ms | -| **TUnit (AOT)** | 1.1.10 | 77.76 ms | 77.77 ms | 0.199 ms | +| **TUnit** | 1.1.10 | 563.80 ms | 562.94 ms | 7.113 ms | +| NUnit | 4.4.0 | 1,538.27 ms | 1,538.35 ms | 11.633 ms | +| MSTest | 4.0.2 | 1,497.90 ms | 1,490.67 ms | 14.759 ms | +| xUnit3 | 3.2.0 | 1,579.28 ms | 1,578.51 ms | 6.673 ms | +| **TUnit (AOT)** | 1.1.10 | 78.71 ms | 78.69 ms | 0.421 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1883 - bar [554.66, 1521, 1480.94, 1568.45, 77.76] + y-axis "Time (ms)" 0 --> 1896 + bar [563.8, 1538.27, 1497.9, 1579.28, 78.71] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.467Z* +*Last generated: 2025-11-15T00:27:09.503Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index d5ecc51c97..5fb9e7d4bb 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 505.85 ms | 505.28 ms | 2.469 ms | -| NUnit | 4.4.0 | 684.72 ms | 681.86 ms | 16.921 ms | -| MSTest | 4.0.2 | 669.43 ms | 669.54 ms | 13.552 ms | -| xUnit3 | 3.2.0 | 684.21 ms | 676.60 ms | 15.666 ms | -| **TUnit (AOT)** | 1.1.10 | 44.88 ms | 44.70 ms | 3.904 ms | +| **TUnit** | 1.1.10 | 484.97 ms | 485.22 ms | 3.999 ms | +| NUnit | 4.4.0 | 676.90 ms | 675.21 ms | 10.367 ms | +| MSTest | 4.0.2 | 659.56 ms | 659.58 ms | 4.624 ms | +| xUnit3 | 3.2.0 | 676.88 ms | 673.98 ms | 10.260 ms | +| **TUnit (AOT)** | 1.1.10 | 48.50 ms | 48.84 ms | 3.553 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 822 - bar [505.85, 684.72, 669.43, 684.21, 44.88] + y-axis "Time (ms)" 0 --> 813 + bar [484.97, 676.9, 659.56, 676.88, 48.5] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.467Z* +*Last generated: 2025-11-15T00:27:09.504Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 929d854248..b91e232393 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-14** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 559.8 ms | 560.2 ms | 3.75 ms | -| NUnit | 4.4.0 | 1,135.0 ms | 1,132.6 ms | 11.31 ms | -| MSTest | 4.0.2 | 1,108.5 ms | 1,107.1 ms | 8.11 ms | -| xUnit3 | 3.2.0 | 1,186.2 ms | 1,186.3 ms | 6.25 ms | +| **TUnit** | 1.1.10 | 540.2 ms | 540.7 ms | 5.84 ms | +| NUnit | 4.4.0 | 1,160.3 ms | 1,156.8 ms | 10.70 ms | +| MSTest | 4.0.2 | 1,133.4 ms | 1,131.4 ms | 5.85 ms | +| xUnit3 | 3.2.0 | 1,219.9 ms | 1,218.4 ms | 19.12 ms | | **TUnit (AOT)** | 1.1.10 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-14** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1424 - bar [559.8, 1135, 1108.5, 1186.2, 0] + y-axis "Time (ms)" 0 --> 1464 + bar [540.2, 1160.3, 1133.4, 1219.9, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-14T00:28:50.467Z* +*Last generated: 2025-11-15T00:27:09.504Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 0d6d91c7e0..220c099ad9 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-14** from the latest CI run. +These benchmarks were automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -56,7 +56,7 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-14T00:28:50.468Z* +*Last generated: 2025-11-15T00:27:09.505Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index a3e04863e0..e24f1a0e7e 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-14T00:28:50.466Z", + "timestamp": "2025-11-15T00:27:09.502Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "565.6 ms", - "Error": "4.72 ms", - "StdDev": "3.94 ms", - "Median": "564.2 ms" + "Mean": "546.4 ms", + "Error": "4.30 ms", + "StdDev": "3.82 ms", + "Median": "546.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "681.8 ms", - "Error": "5.30 ms", - "StdDev": "4.42 ms", - "Median": "682.0 ms" + "Mean": "647.1 ms", + "Error": "9.66 ms", + "StdDev": "9.04 ms", + "Median": "642.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "654.5 ms", - "Error": "7.43 ms", - "StdDev": "6.20 ms", - "Median": "653.4 ms" + "Mean": "616.6 ms", + "Error": "8.04 ms", + "StdDev": "7.52 ms", + "Median": "617.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "734.5 ms", - "Error": "9.42 ms", - "StdDev": "8.35 ms", - "Median": "736.6 ms" + "Mean": "693.2 ms", + "Error": "5.53 ms", + "StdDev": "5.17 ms", + "Median": "692.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "124.2 ms", - "Error": "0.31 ms", - "StdDev": "0.29 ms", - "Median": "124.2 ms" + "Mean": "123.7 ms", + "Error": "0.41 ms", + "StdDev": "0.39 ms", + "Median": "123.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 9c8b3c60c3..078351a707 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-14T00:28:50.468Z", + "timestamp": "2025-11-15T00:27:09.505Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "Build_TUnit", "Version": "1.1.10", - "Mean": "2.051 s", - "Error": "0.0306 s", - "StdDev": "0.0286 s", - "Median": "2.047 s" + "Mean": "2.104 s", + "Error": "0.0409 s", + "StdDev": "0.0487 s", + "Median": "2.097 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.637 s", - "Error": "0.0156 s", - "StdDev": "0.0138 s", - "Median": "1.634 s" + "Mean": "1.658 s", + "Error": "0.0277 s", + "StdDev": "0.0272 s", + "Median": "1.652 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.709 s", - "Error": "0.0103 s", - "StdDev": "0.0086 s", - "Median": "1.706 s" + "Mean": "1.751 s", + "Error": "0.0339 s", + "StdDev": "0.0404 s", + "Median": "1.748 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.618 s", - "Error": "0.0193 s", - "StdDev": "0.0180 s", - "Median": "1.615 s" + "Mean": "1.643 s", + "Error": "0.0230 s", + "StdDev": "0.0204 s", + "Median": "1.644 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 195c5c1627..0bcbeb8851 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-14T00:28:50.466Z", + "timestamp": "2025-11-15T00:27:09.503Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "486.00 ms", - "Error": "3.113 ms", - "StdDev": "2.911 ms", - "Median": "486.93 ms" + "Mean": "493.28 ms", + "Error": "5.855 ms", + "StdDev": "5.477 ms", + "Median": "491.72 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "587.97 ms", - "Error": "11.440 ms", - "StdDev": "10.141 ms", - "Median": "586.01 ms" + "Mean": "527.71 ms", + "Error": "7.480 ms", + "StdDev": "6.631 ms", + "Median": "528.80 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "606.98 ms", - "Error": "11.382 ms", - "StdDev": "10.647 ms", - "Median": "607.45 ms" + "Mean": "499.80 ms", + "Error": "9.877 ms", + "StdDev": "18.060 ms", + "Median": "496.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "599.37 ms", - "Error": "10.657 ms", - "StdDev": "9.447 ms", - "Median": "599.31 ms" + "Mean": "571.43 ms", + "Error": "11.164 ms", + "StdDev": "9.897 ms", + "Median": "570.30 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "23.70 ms", - "Error": "0.153 ms", - "StdDev": "0.136 ms", - "Median": "23.74 ms" + "Mean": "24.09 ms", + "Error": "0.165 ms", + "StdDev": "0.146 ms", + "Median": "24.07 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 786ff6fee6..3bcf02d672 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-14T00:28:50.466Z", + "timestamp": "2025-11-15T00:27:09.503Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "613.8 ms", - "Error": "5.44 ms", - "StdDev": "4.83 ms", - "Median": "613.2 ms" + "Mean": "605.7 ms", + "Error": "6.97 ms", + "StdDev": "6.52 ms", + "Median": "603.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,216.8 ms", - "Error": "10.69 ms", - "StdDev": "9.48 ms", - "Median": "1,214.5 ms" + "Mean": "1,177.6 ms", + "Error": "6.85 ms", + "StdDev": "6.41 ms", + "Median": "1,177.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,992.2 ms", - "Error": "14.67 ms", - "StdDev": "13.72 ms", - "Median": "2,990.5 ms" + "Mean": "2,951.3 ms", + "Error": "8.08 ms", + "StdDev": "6.75 ms", + "Median": "2,951.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,088.0 ms", - "Error": "10.93 ms", - "StdDev": "9.69 ms", - "Median": "3,087.1 ms" + "Mean": "3,050.0 ms", + "Error": "7.92 ms", + "StdDev": "7.02 ms", + "Median": "3,050.0 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "131.8 ms", - "Error": "0.51 ms", - "StdDev": "0.45 ms", - "Median": "131.9 ms" + "Mean": "130.9 ms", + "Error": "0.43 ms", + "StdDev": "0.38 ms", + "Median": "130.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 2589e12bd2..6e19609d0e 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-14T00:28:50.467Z", + "timestamp": "2025-11-15T00:27:09.504Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "554.66 ms", - "Error": "4.254 ms", - "StdDev": "3.979 ms", - "Median": "554.27 ms" + "Mean": "563.80 ms", + "Error": "8.024 ms", + "StdDev": "7.113 ms", + "Median": "562.94 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,521.00 ms", - "Error": "9.234 ms", - "StdDev": "8.186 ms", - "Median": "1,519.64 ms" + "Mean": "1,538.27 ms", + "Error": "12.437 ms", + "StdDev": "11.633 ms", + "Median": "1,538.35 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,480.94 ms", - "Error": "10.002 ms", - "StdDev": "8.867 ms", - "Median": "1,479.41 ms" + "Mean": "1,497.90 ms", + "Error": "15.778 ms", + "StdDev": "14.759 ms", + "Median": "1,490.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,568.45 ms", - "Error": "7.786 ms", - "StdDev": "6.902 ms", - "Median": "1,568.35 ms" + "Mean": "1,579.28 ms", + "Error": "7.991 ms", + "StdDev": "6.673 ms", + "Median": "1,578.51 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "77.76 ms", - "Error": "0.225 ms", - "StdDev": "0.199 ms", - "Median": "77.77 ms" + "Mean": "78.71 ms", + "Error": "0.450 ms", + "StdDev": "0.421 ms", + "Median": "78.69 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 07eb91f7ba..a9d04333a3 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-14T00:28:50.467Z", + "timestamp": "2025-11-15T00:27:09.504Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "505.85 ms", - "Error": "2.785 ms", - "StdDev": "2.469 ms", - "Median": "505.28 ms" + "Mean": "484.97 ms", + "Error": "4.275 ms", + "StdDev": "3.999 ms", + "Median": "485.22 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "684.72 ms", - "Error": "13.380 ms", - "StdDev": "16.921 ms", - "Median": "681.86 ms" + "Mean": "676.90 ms", + "Error": "11.083 ms", + "StdDev": "10.367 ms", + "Median": "675.21 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "669.43 ms", - "Error": "13.197 ms", - "StdDev": "13.552 ms", - "Median": "669.54 ms" + "Mean": "659.56 ms", + "Error": "5.537 ms", + "StdDev": "4.624 ms", + "Median": "659.58 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "684.21 ms", - "Error": "13.160 ms", - "StdDev": "15.666 ms", - "Median": "676.60 ms" + "Mean": "676.88 ms", + "Error": "10.968 ms", + "StdDev": "10.260 ms", + "Median": "673.98 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "44.88 ms", - "Error": "1.324 ms", - "StdDev": "3.904 ms", - "Median": "44.70 ms" + "Mean": "48.50 ms", + "Error": "1.211 ms", + "StdDev": "3.553 ms", + "Median": "48.84 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 9859581e8a..51c9a4f9cb 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-14T00:28:50.467Z", + "timestamp": "2025-11-15T00:27:09.504Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "559.8 ms", - "Error": "4.23 ms", - "StdDev": "3.75 ms", - "Median": "560.2 ms" + "Mean": "540.2 ms", + "Error": "6.24 ms", + "StdDev": "5.84 ms", + "Median": "540.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,135.0 ms", - "Error": "12.10 ms", - "StdDev": "11.31 ms", - "Median": "1,132.6 ms" + "Mean": "1,160.3 ms", + "Error": "12.08 ms", + "StdDev": "10.70 ms", + "Median": "1,156.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,108.5 ms", - "Error": "8.67 ms", - "StdDev": "8.11 ms", - "Median": "1,107.1 ms" + "Mean": "1,133.4 ms", + "Error": "7.01 ms", + "StdDev": "5.85 ms", + "Median": "1,131.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,186.2 ms", - "Error": "7.48 ms", - "StdDev": "6.25 ms", - "Median": "1,186.3 ms" + "Mean": "1,219.9 ms", + "Error": "20.44 ms", + "StdDev": "19.12 ms", + "Median": "1,218.4 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 6aa3f22f96..736dfcee0b 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -38,5 +38,9 @@ { "date": "2025-11-14", "environment": "Ubuntu" + }, + { + "date": "2025-11-15", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index c4ce7506d2..a7bd0c8dea 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,253 +1,253 @@ { - "timestamp": "2025-11-14T00:28:50.468Z", + "timestamp": "2025-11-15T00:27:09.505Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "categories": { "AsyncTests": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "565.6 ms", - "Error": "4.72 ms", - "StdDev": "3.94 ms", - "Median": "564.2 ms" + "Mean": "546.4 ms", + "Error": "4.30 ms", + "StdDev": "3.82 ms", + "Median": "546.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "681.8 ms", - "Error": "5.30 ms", - "StdDev": "4.42 ms", - "Median": "682.0 ms" + "Mean": "647.1 ms", + "Error": "9.66 ms", + "StdDev": "9.04 ms", + "Median": "642.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "654.5 ms", - "Error": "7.43 ms", - "StdDev": "6.20 ms", - "Median": "653.4 ms" + "Mean": "616.6 ms", + "Error": "8.04 ms", + "StdDev": "7.52 ms", + "Median": "617.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "734.5 ms", - "Error": "9.42 ms", - "StdDev": "8.35 ms", - "Median": "736.6 ms" + "Mean": "693.2 ms", + "Error": "5.53 ms", + "StdDev": "5.17 ms", + "Median": "692.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "124.2 ms", - "Error": "0.31 ms", - "StdDev": "0.29 ms", - "Median": "124.2 ms" + "Mean": "123.7 ms", + "Error": "0.41 ms", + "StdDev": "0.39 ms", + "Median": "123.7 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "486.00 ms", - "Error": "3.113 ms", - "StdDev": "2.911 ms", - "Median": "486.93 ms" + "Mean": "493.28 ms", + "Error": "5.855 ms", + "StdDev": "5.477 ms", + "Median": "491.72 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "587.97 ms", - "Error": "11.440 ms", - "StdDev": "10.141 ms", - "Median": "586.01 ms" + "Mean": "527.71 ms", + "Error": "7.480 ms", + "StdDev": "6.631 ms", + "Median": "528.80 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "606.98 ms", - "Error": "11.382 ms", - "StdDev": "10.647 ms", - "Median": "607.45 ms" + "Mean": "499.80 ms", + "Error": "9.877 ms", + "StdDev": "18.060 ms", + "Median": "496.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "599.37 ms", - "Error": "10.657 ms", - "StdDev": "9.447 ms", - "Median": "599.31 ms" + "Mean": "571.43 ms", + "Error": "11.164 ms", + "StdDev": "9.897 ms", + "Median": "570.30 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "23.70 ms", - "Error": "0.153 ms", - "StdDev": "0.136 ms", - "Median": "23.74 ms" + "Mean": "24.09 ms", + "Error": "0.165 ms", + "StdDev": "0.146 ms", + "Median": "24.07 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "613.8 ms", - "Error": "5.44 ms", - "StdDev": "4.83 ms", - "Median": "613.2 ms" + "Mean": "605.7 ms", + "Error": "6.97 ms", + "StdDev": "6.52 ms", + "Median": "603.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,216.8 ms", - "Error": "10.69 ms", - "StdDev": "9.48 ms", - "Median": "1,214.5 ms" + "Mean": "1,177.6 ms", + "Error": "6.85 ms", + "StdDev": "6.41 ms", + "Median": "1,177.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,992.2 ms", - "Error": "14.67 ms", - "StdDev": "13.72 ms", - "Median": "2,990.5 ms" + "Mean": "2,951.3 ms", + "Error": "8.08 ms", + "StdDev": "6.75 ms", + "Median": "2,951.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,088.0 ms", - "Error": "10.93 ms", - "StdDev": "9.69 ms", - "Median": "3,087.1 ms" + "Mean": "3,050.0 ms", + "Error": "7.92 ms", + "StdDev": "7.02 ms", + "Median": "3,050.0 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "131.8 ms", - "Error": "0.51 ms", - "StdDev": "0.45 ms", - "Median": "131.9 ms" + "Mean": "130.9 ms", + "Error": "0.43 ms", + "StdDev": "0.38 ms", + "Median": "130.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "554.66 ms", - "Error": "4.254 ms", - "StdDev": "3.979 ms", - "Median": "554.27 ms" + "Mean": "563.80 ms", + "Error": "8.024 ms", + "StdDev": "7.113 ms", + "Median": "562.94 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,521.00 ms", - "Error": "9.234 ms", - "StdDev": "8.186 ms", - "Median": "1,519.64 ms" + "Mean": "1,538.27 ms", + "Error": "12.437 ms", + "StdDev": "11.633 ms", + "Median": "1,538.35 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,480.94 ms", - "Error": "10.002 ms", - "StdDev": "8.867 ms", - "Median": "1,479.41 ms" + "Mean": "1,497.90 ms", + "Error": "15.778 ms", + "StdDev": "14.759 ms", + "Median": "1,490.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,568.45 ms", - "Error": "7.786 ms", - "StdDev": "6.902 ms", - "Median": "1,568.35 ms" + "Mean": "1,579.28 ms", + "Error": "7.991 ms", + "StdDev": "6.673 ms", + "Median": "1,578.51 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "77.76 ms", - "Error": "0.225 ms", - "StdDev": "0.199 ms", - "Median": "77.77 ms" + "Mean": "78.71 ms", + "Error": "0.450 ms", + "StdDev": "0.421 ms", + "Median": "78.69 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "505.85 ms", - "Error": "2.785 ms", - "StdDev": "2.469 ms", - "Median": "505.28 ms" + "Mean": "484.97 ms", + "Error": "4.275 ms", + "StdDev": "3.999 ms", + "Median": "485.22 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "684.72 ms", - "Error": "13.380 ms", - "StdDev": "16.921 ms", - "Median": "681.86 ms" + "Mean": "676.90 ms", + "Error": "11.083 ms", + "StdDev": "10.367 ms", + "Median": "675.21 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "669.43 ms", - "Error": "13.197 ms", - "StdDev": "13.552 ms", - "Median": "669.54 ms" + "Mean": "659.56 ms", + "Error": "5.537 ms", + "StdDev": "4.624 ms", + "Median": "659.58 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "684.21 ms", - "Error": "13.160 ms", - "StdDev": "15.666 ms", - "Median": "676.60 ms" + "Mean": "676.88 ms", + "Error": "10.968 ms", + "StdDev": "10.260 ms", + "Median": "673.98 ms" }, { "Method": "TUnit_AOT", "Version": "1.1.10", - "Mean": "44.88 ms", - "Error": "1.324 ms", - "StdDev": "3.904 ms", - "Median": "44.70 ms" + "Mean": "48.50 ms", + "Error": "1.211 ms", + "StdDev": "3.553 ms", + "Median": "48.84 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.1.10", - "Mean": "559.8 ms", - "Error": "4.23 ms", - "StdDev": "3.75 ms", - "Median": "560.2 ms" + "Mean": "540.2 ms", + "Error": "6.24 ms", + "StdDev": "5.84 ms", + "Median": "540.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,135.0 ms", - "Error": "12.10 ms", - "StdDev": "11.31 ms", - "Median": "1,132.6 ms" + "Mean": "1,160.3 ms", + "Error": "12.08 ms", + "StdDev": "10.70 ms", + "Median": "1,156.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,108.5 ms", - "Error": "8.67 ms", - "StdDev": "8.11 ms", - "Median": "1,107.1 ms" + "Mean": "1,133.4 ms", + "Error": "7.01 ms", + "StdDev": "5.85 ms", + "Median": "1,131.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,186.2 ms", - "Error": "7.48 ms", - "StdDev": "6.25 ms", - "Median": "1,186.3 ms" + "Mean": "1,219.9 ms", + "Error": "20.44 ms", + "StdDev": "19.12 ms", + "Median": "1,218.4 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.1.10", - "Mean": "2.051 s", - "Error": "0.0306 s", - "StdDev": "0.0286 s", - "Median": "2.047 s" + "Mean": "2.104 s", + "Error": "0.0409 s", + "StdDev": "0.0487 s", + "Median": "2.097 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.637 s", - "Error": "0.0156 s", - "StdDev": "0.0138 s", - "Median": "1.634 s" + "Mean": "1.658 s", + "Error": "0.0277 s", + "StdDev": "0.0272 s", + "Median": "1.652 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.709 s", - "Error": "0.0103 s", - "StdDev": "0.0086 s", - "Median": "1.706 s" + "Mean": "1.751 s", + "Error": "0.0339 s", + "StdDev": "0.0404 s", + "Median": "1.748 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.618 s", - "Error": "0.0193 s", - "StdDev": "0.0180 s", - "Median": "1.615 s" + "Mean": "1.643 s", + "Error": "0.0230 s", + "StdDev": "0.0204 s", + "Median": "1.644 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-14T00:28:50.465Z" + "lastUpdated": "2025-11-15T00:27:09.502Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 56b733f715..435c36799e 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-14", + "timestamp": "2025-11-15", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From c097f543d4d494f08a12ce385debde4193237d44 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 00:34:48 +0000 Subject: [PATCH 048/192] feat(tests): add timeout cancellation token tests and enhance test context (#3838) * feat(tests): add timeout cancellation token tests and enhance test context * feat(tests): add tests for cancellation token behavior in timeout scenarios --- ...utCancellationTokenTests.Test.verified.txt | 270 ++++++++++++++++++ TUnit.Engine/Building/TestBuilder.cs | 3 +- TUnit.Engine/TestExecutor.cs | 3 + .../TimeoutCancellationTokenTests.cs | 52 ++++ 4 files changed, 327 insertions(+), 1 deletion(-) diff --git a/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt index 5c46854523..85223a7c65 100644 --- a/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt @@ -877,3 +877,273 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests_MatrixTest global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.TimeoutCancellationTokenTests), new TUnit_TestProject_TimeoutCancellationTokenTests_MatrixTest__int_CancellationToken_TestSource()); } } + + +// ===== FILE SEPARATOR ===== + +// +#pragma warning disable + +#nullable enable +namespace TUnit.Generated; +internal sealed class TUnit_TestProject_TimeoutDoesNotFireTests_QuickTestDoesNotTimeout__CancellationToken_TestSource : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + public async global::System.Collections.Generic.IAsyncEnumerable GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default) + { + var metadata = new global::TUnit.Core.TestMetadata + { + TestName = "QuickTestDoesNotTimeout", + TestClassType = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), + TestMethodName = "QuickTestDoesNotTimeout", + Dependencies = global::System.Array.Empty(), + AttributeFactory = static () => + [ + new global::TUnit.Core.TestAttribute(), + new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), + new global::TUnit.Core.TimeoutAttribute(30_000), + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), + new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") + ], + DataSources = global::System.Array.Empty(), + ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[] + { + new global::TUnit.Core.MethodDataSourceAttribute("DataSource") + { + Factory = (dataGeneratorMetadata) => + { + async global::System.Collections.Generic.IAsyncEnumerable>> Factory() + { + var result = global::TUnit.TestProject.TimeoutDoesNotFireTests.DataSource(); + if (result is global::System.Collections.IEnumerable enumerable && !(result is string)) + { + foreach (var item in enumerable) + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(item)); + } + } + else + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(result)); + } + } + return Factory(); + } + }, + }, + PropertyDataSources = global::System.Array.Empty(), + PropertyInjections = global::System.Array.Empty(), + InheritanceDepth = 0, + FilePath = @"", + LineNumber = 86, + MethodMetadata = new global::TUnit.Core.MethodMetadata + { + Type = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests)), + Name = "QuickTestDoesNotTimeout", + GenericTypeCount = 0, + ReturnType = typeof(global::System.Threading.Tasks.Task), + ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(global::System.Threading.CancellationToken)) + { + Name = "cancellationToken", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.CancellationToken)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests).GetMethod("QuickTestDoesNotTimeout", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[0] + } + }, + Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.TimeoutDoesNotFireTests", static () => + { + var classMetadata = new global::TUnit.Core.ClassMetadata + { + Type = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests)), + Name = "TimeoutDoesNotFireTests", + Namespace = "TUnit.TestProject", + Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(int)) + { + Name = "value", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(int)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests).GetConstructor(new global::System.Type[] { typeof(int) })!.GetParameters()[0] + } + }, + Properties = global::System.Array.Empty(), + Parent = null + }; + foreach (var prop in classMetadata.Properties) + { + prop.ClassMetadata = classMetadata; + prop.ContainingTypeMetadata = classMetadata; + } + return classMetadata; + }) + }, + InstanceFactory = (typeArgs, args) => + { + return new global::TUnit.TestProject.TimeoutDoesNotFireTests(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + }, + InvokeTypedTest = static (instance, args, cancellationToken) => + { + try + { + return new global::System.Threading.Tasks.ValueTask(instance.QuickTestDoesNotTimeout(cancellationToken)); + } + catch (global::System.Exception ex) + { + return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex)); + } + }, + }; + metadata.UseRuntimeDataGeneration(testSessionId); + yield return metadata; + yield break; + } +} +internal static class TUnit_TestProject_TimeoutDoesNotFireTests_QuickTestDoesNotTimeout__CancellationToken_ModuleInitializer +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialize() + { + global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), new TUnit_TestProject_TimeoutDoesNotFireTests_QuickTestDoesNotTimeout__CancellationToken_TestSource()); + } +} + + +// ===== FILE SEPARATOR ===== + +// +#pragma warning disable + +#nullable enable +namespace TUnit.Generated; +internal sealed class TUnit_TestProject_CancellationTokenTriggeredTests_CancellationTokenIsTriggered__CancellationToken_TestSource : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + public async global::System.Collections.Generic.IAsyncEnumerable GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default) + { + var metadata = new global::TUnit.Core.TestMetadata + { + TestName = "CancellationTokenIsTriggered", + TestClassType = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), + TestMethodName = "CancellationTokenIsTriggered", + Dependencies = global::System.Array.Empty(), + AttributeFactory = static () => + [ + new global::TUnit.Core.TestAttribute(), + new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), + new global::TUnit.Core.TimeoutAttribute(5_000), + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), + new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") + ], + DataSources = global::System.Array.Empty(), + ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[] + { + new global::TUnit.Core.MethodDataSourceAttribute("DataSource") + { + Factory = (dataGeneratorMetadata) => + { + async global::System.Collections.Generic.IAsyncEnumerable>> Factory() + { + var result = global::TUnit.TestProject.CancellationTokenTriggeredTests.DataSource(); + if (result is global::System.Collections.IEnumerable enumerable && !(result is string)) + { + foreach (var item in enumerable) + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(item)); + } + } + else + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(result)); + } + } + return Factory(); + } + }, + }, + PropertyDataSources = global::System.Array.Empty(), + PropertyInjections = global::System.Array.Empty(), + InheritanceDepth = 0, + FilePath = @"", + LineNumber = 106, + MethodMetadata = new global::TUnit.Core.MethodMetadata + { + Type = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests)), + Name = "CancellationTokenIsTriggered", + GenericTypeCount = 0, + ReturnType = typeof(global::System.Threading.Tasks.Task), + ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(global::System.Threading.CancellationToken)) + { + Name = "cancellationToken", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.CancellationToken)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests).GetMethod("CancellationTokenIsTriggered", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[0] + } + }, + Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.CancellationTokenTriggeredTests", static () => + { + var classMetadata = new global::TUnit.Core.ClassMetadata + { + Type = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests)), + Name = "CancellationTokenTriggeredTests", + Namespace = "TUnit.TestProject", + Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(int)) + { + Name = "value", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(int)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests).GetConstructor(new global::System.Type[] { typeof(int) })!.GetParameters()[0] + } + }, + Properties = global::System.Array.Empty(), + Parent = null + }; + foreach (var prop in classMetadata.Properties) + { + prop.ClassMetadata = classMetadata; + prop.ContainingTypeMetadata = classMetadata; + } + return classMetadata; + }) + }, + InstanceFactory = (typeArgs, args) => + { + return new global::TUnit.TestProject.CancellationTokenTriggeredTests(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + }, + InvokeTypedTest = static (instance, args, cancellationToken) => + { + try + { + return new global::System.Threading.Tasks.ValueTask(instance.CancellationTokenIsTriggered(cancellationToken)); + } + catch (global::System.Exception ex) + { + return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex)); + } + }, + }; + metadata.UseRuntimeDataGeneration(testSessionId); + yield return metadata; + yield break; + } +} +internal static class TUnit_TestProject_CancellationTokenTriggeredTests_CancellationTokenIsTriggered__CancellationToken_ModuleInitializer +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialize() + { + global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), new TUnit_TestProject_CancellationTokenTriggeredTests_CancellationTokenIsTriggered__CancellationToken_TestSource()); + } +} diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index c6c3cb787a..fe88863cc4 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -284,7 +284,8 @@ public async Task> BuildTestsFromMetadataAsy TestMetadata = metadata.MethodMetadata, Events = new TestContextEvents(), StateBag = new ConcurrentDictionary(), - DataSourceAttribute = methodDataSource + DataSourceAttribute = methodDataSource, + InitializedAttributes = testBuilderContext.InitializedAttributes // Preserve attributes from parent context }; classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); diff --git a/TUnit.Engine/TestExecutor.cs b/TUnit.Engine/TestExecutor.cs index bc1ab31272..dee49a9d75 100644 --- a/TUnit.Engine/TestExecutor.cs +++ b/TUnit.Engine/TestExecutor.cs @@ -160,6 +160,9 @@ private static async ValueTask ExecuteTestAsync(AbstractExecutableTest executabl // Set the test start time when we actually begin executing the test executableTest.Context.TestStart = DateTimeOffset.UtcNow; + // Set the cancellation token on the context so source-generated tests can access it + executableTest.Context.CancellationToken = cancellationToken; + if (executableTest.Context.InternalDiscoveredTest?.TestExecutor is { } testExecutor) { await testExecutor.ExecuteTest(executableTest.Context, diff --git a/TUnit.TestProject/TimeoutCancellationTokenTests.cs b/TUnit.TestProject/TimeoutCancellationTokenTests.cs index 3ed528ca58..d98717f7b8 100644 --- a/TUnit.TestProject/TimeoutCancellationTokenTests.cs +++ b/TUnit.TestProject/TimeoutCancellationTokenTests.cs @@ -75,3 +75,55 @@ public static IEnumerable DataSource() public class FiveSecondTimeout() : TimeoutAttribute(5_000); } + +// Positive test: Timeout does NOT fire for quick tests with data sources +[MethodDataSource(nameof(DataSource))] +[Timeout(30_000)] // Long timeout (30 seconds) +[EngineTest(ExpectedResult.Pass)] +[Category("Timeout Cancellation Token Tests")] +public class TimeoutDoesNotFireTests(int value) +{ + [Test] + public async Task QuickTestDoesNotTimeout(CancellationToken cancellationToken) + { + await Assert.That(value).IsEqualTo(1); + await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken); // Short delay + } + + public static IEnumerable DataSource() + { + yield return 1; + } +} + +// Test to verify cancellation token is actually triggered when timeout fires +[MethodDataSource(nameof(DataSource))] +[Timeout(5_000)] +[EngineTest(ExpectedResult.Failure)] +[Category("Timeout Cancellation Token Tests")] +public class CancellationTokenTriggeredTests(int value) +{ + [Test] + public async Task CancellationTokenIsTriggered(CancellationToken cancellationToken) + { + var fired = false; + cancellationToken.Register(() => fired = true); + + try + { + await Task.Delay(TimeSpan.FromMinutes(1), cancellationToken); + } + catch (OperationCanceledException) + { + // Expected - timeout should trigger cancellation + } + + // Verify token was cancelled + await Assert.That(fired).IsTrue(); + } + + public static IEnumerable DataSource() + { + yield return 1; + } +} From b4f9f6f00bf5c06292ca7a9714ce72a2b51d8443 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 01:06:22 +0000 Subject: [PATCH 049/192] Optimize GetOrAdd method in ThreadSafeDictionary for improved concurrency handling (#3845) --- TUnit.Core/Data/ThreadSafeDictionary.cs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/TUnit.Core/Data/ThreadSafeDictionary.cs b/TUnit.Core/Data/ThreadSafeDictionary.cs index 6744f5f638..c9e5665c48 100644 --- a/TUnit.Core/Data/ThreadSafeDictionary.cs +++ b/TUnit.Core/Data/ThreadSafeDictionary.cs @@ -69,12 +69,30 @@ public class ThreadSafeDictionary /// This method is thread-safe. If multiple threads call this method simultaneously with the same key, /// the factory function will be executed only once, and all threads will receive the same instance. + /// This implementation uses a two-phase approach: TryGetValue for the fast path (when key exists), + /// and GetOrAdd with a pre-created Lazy for the slow path (new key). This prevents the factory + /// from being invoked multiple times during concurrent access. /// public TValue GetOrAdd(TKey key, Func func) { - var lazy = _innerDictionary.GetOrAdd(key, - k => new Lazy(() => func(k), LazyThreadSafetyMode.ExecutionAndPublication)); - return lazy.Value; + // Fast path: Check if key already exists (lock-free read) + if (_innerDictionary.TryGetValue(key, out var existingLazy)) + { + return existingLazy.Value; + } + + // Slow path: Key not found, need to create + // Create Lazy instance OUTSIDE of GetOrAdd to prevent factory from running during race + var newLazy = new Lazy(() => func(key), LazyThreadSafetyMode.ExecutionAndPublication); + + // Use GetOrAdd with VALUE (not factory) - atomic operation that either: + // 1. Adds our newLazy if key still doesn't exist + // 2. Returns existing Lazy if another thread just added one + var winningLazy = _innerDictionary.GetOrAdd(key, newLazy); + + // CRITICAL: Always return value from the Lazy that's actually in the dictionary + // This ensures only ONE factory execution even if multiple Lazy instances were created + return winningLazy.Value; } /// From 3af0305240c4a89bfd499b246b368b9bd02813f1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 02:56:36 +0000 Subject: [PATCH 050/192] chore(deps): update tunit to 1.1.27 (#3846) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 97b2ad0442..e0ae99691e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 698f64e438..0ba948504e 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 6ba222eecf..4619b3b043 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 8acb6f52e2..7d283a64ae 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 87383344ce..0a116e103a 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 68aace76d7..14bd5b4072 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 8416c07b8c..4f9530718e 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 6fab6c832c..3fda27defd 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index 6390ab9ec7..5dae3fa047 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From c2e67cb335b938f71061e2594681695bb0207c39 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 14:03:05 +0000 Subject: [PATCH 051/192] feat: implement TestBuildContext for capturing build-time output (#3849) * feat: implement TestBuildContext for capturing build-time output and enhance output retrieval in TestContext * feat: enhance TestBuildContext with new methods and override output retrieval in TestContext * feat(tests): add attributes to TestBuildContextOutputCaptureTests for parallel execution and expected state * fix(tests): correct attribute usage in TestBuildContextOutputCaptureTests --- TUnit.Core/Context.cs | 7 +- TUnit.Core/Models/TestBuildContext.cs | 45 +++++ TUnit.Core/TestContext.Output.cs | 46 ++++- TUnit.Core/TestContext.cs | 13 +- TUnit.Engine/Building/TestBuilder.cs | 16 ++ ...Has_No_API_Changes.DotNet10_0.verified.txt | 14 +- ..._Has_No_API_Changes.DotNet8_0.verified.txt | 14 +- ..._Has_No_API_Changes.DotNet9_0.verified.txt | 14 +- ...ary_Has_No_API_Changes.Net4_7.verified.txt | 14 +- .../TestBuildContextOutputCaptureTests.cs | 187 ++++++++++++++++++ 10 files changed, 355 insertions(+), 15 deletions(-) create mode 100644 TUnit.Core/Models/TestBuildContext.cs create mode 100644 TUnit.TestProject/TestBuildContextOutputCaptureTests.cs diff --git a/TUnit.Core/Context.cs b/TUnit.Core/Context.cs index caf28bec33..9c1346e0a8 100644 --- a/TUnit.Core/Context.cs +++ b/TUnit.Core/Context.cs @@ -14,6 +14,7 @@ protected Context? Parent public static Context Current => TestContext.Current as Context + ?? TestBuildContext.Current as Context ?? ClassHookContext.Current as Context ?? AssemblyHookContext.Current as Context ?? TestSessionContext.Current as Context @@ -67,13 +68,13 @@ public void AddAsyncLocalValues() #endif } - public string GetStandardOutput() + public virtual string GetStandardOutput() { if (_outputBuilder.Length == 0) { return string.Empty; } - + _outputLock.EnterReadLock(); try @@ -86,7 +87,7 @@ public string GetStandardOutput() } } - public string GetErrorOutput() + public virtual string GetErrorOutput() { if (_errorOutputBuilder.Length == 0) { diff --git a/TUnit.Core/Models/TestBuildContext.cs b/TUnit.Core/Models/TestBuildContext.cs new file mode 100644 index 0000000000..df706ce0c4 --- /dev/null +++ b/TUnit.Core/Models/TestBuildContext.cs @@ -0,0 +1,45 @@ +namespace TUnit.Core; + +/// +/// Context for capturing output during test building and data source initialization. +/// This context is active during the test building phase, before TestContext is created. +/// Output captured here is transferred to the TestContext when it's created. +/// +public sealed class TestBuildContext : Context, IDisposable +{ + private static readonly AsyncLocal _current = new(); + + public static new TestBuildContext? Current + { + get => _current.Value; + internal set => _current.Value = value; + } + + public TestBuildContext() : base(null) + { + } + + /// + /// Gets the captured standard output during test building. + /// + public string GetCapturedOutput() => GetStandardOutput(); + + /// + /// Gets the captured error output during test building. + /// + public string GetCapturedErrorOutput() => GetErrorOutput(); + + internal override void SetAsyncLocalContext() + { + Current = this; + } + + /// + /// Clears the current TestBuildContext. + /// + public new void Dispose() + { + Current = null; + base.Dispose(); + } +} diff --git a/TUnit.Core/TestContext.Output.cs b/TUnit.Core/TestContext.Output.cs index 6d41e43787..8f2223eacc 100644 --- a/TUnit.Core/TestContext.Output.cs +++ b/TUnit.Core/TestContext.Output.cs @@ -32,7 +32,7 @@ void ITestOutput.AttachArtifact(Artifact artifact) } string ITestOutput.GetStandardOutput() => GetOutput(); - string ITestOutput.GetErrorOutput() => GetErrorOutput(); + string ITestOutput.GetErrorOutput() => GetOutputError(); void ITestOutput.WriteLine(string message) { @@ -46,7 +46,47 @@ void ITestOutput.WriteError(string message) _errorWriter.WriteLine(message); } - internal string GetOutput() => _outputWriter?.ToString() ?? string.Empty; + /// + /// Gets the combined build-time and execution-time standard output. + /// + public override string GetStandardOutput() + { + return GetOutput(); + } + + /// + /// Gets the combined build-time and execution-time error output. + /// + public override string GetErrorOutput() + { + return GetOutputError(); + } + + internal string GetOutput() + { + var buildOutput = _buildTimeOutput ?? string.Empty; + var baseOutput = base.GetStandardOutput(); // Get output from base class (Context) + var writerOutput = _outputWriter?.ToString() ?? string.Empty; - internal new string GetErrorOutput() => _errorWriter?.ToString() ?? string.Empty; + // Combine all three sources: build-time, base class output, and writer output + var parts = new[] { buildOutput, baseOutput, writerOutput } + .Where(s => !string.IsNullOrEmpty(s)) + .ToArray(); + + return parts.Length == 0 ? string.Empty : string.Join(Environment.NewLine, parts); + } + + internal string GetOutputError() + { + var buildErrorOutput = _buildTimeErrorOutput ?? string.Empty; + var baseErrorOutput = base.GetErrorOutput(); // Get error output from base class (Context) + var writerErrorOutput = _errorWriter?.ToString() ?? string.Empty; + + // Combine all three sources: build-time error, base class error output, and writer error output + var parts = new[] { buildErrorOutput, baseErrorOutput, writerErrorOutput } + .Where(s => !string.IsNullOrEmpty(s)) + .ToArray(); + + return parts.Length == 0 ? string.Empty : string.Join(Environment.NewLine, parts); + } } diff --git a/TUnit.Core/TestContext.cs b/TUnit.Core/TestContext.cs index 8abb2dbb1e..61ce4b2571 100644 --- a/TUnit.Core/TestContext.cs +++ b/TUnit.Core/TestContext.cs @@ -55,6 +55,9 @@ public TestContext(string testName, IServiceProvider serviceProvider, ClassHookC private StringWriter? _errorWriter; + private string? _buildTimeOutput; + private string? _buildTimeErrorOutput; + public static new TestContext? Current { get => TestContexts.Value; @@ -152,5 +155,13 @@ internal override void SetAsyncLocalContext() internal ConcurrentDictionary> TrackedObjects => _trackedObjects ??= new(); - + /// + /// Sets the output captured during test building phase. + /// This output is prepended to the test's execution output. + /// + internal void SetBuildTimeOutput(string? output, string? errorOutput) + { + _buildTimeOutput = output; + _buildTimeErrorOutput = errorOutput; + } } diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index fe88863cc4..ada56f7737 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -136,6 +136,10 @@ public async Task> BuildTestsFromMetadataAsy try { + // Create a context for capturing output during test building + using var buildContext = new TestBuildContext(); + TestBuildContext.Current = buildContext; + // Handle GenericTestMetadata with ConcreteInstantiations if (metadata is GenericTestMetadata { ConcreteInstantiations.Count: > 0 } genericMetadata) { @@ -508,6 +512,18 @@ public async Task> BuildTestsFromMetadataAsy tests.Add(test); } } + + // Transfer captured build-time output to all test contexts + var capturedOutput = buildContext.GetCapturedOutput(); + var capturedErrorOutput = buildContext.GetCapturedErrorOutput(); + + if (!string.IsNullOrEmpty(capturedOutput) || !string.IsNullOrEmpty(capturedErrorOutput)) + { + foreach (var test in tests) + { + test.Context.SetBuildTimeOutput(capturedOutput, capturedErrorOutput); + } + } } catch (Exception ex) { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index dd8b8234d0..d00129e2e4 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -399,8 +399,8 @@ namespace public void AddAsyncLocalValues() { } public void Dispose() { } public . GetDefaultLogger() { } - public string GetErrorOutput() { } - public string GetStandardOutput() { } + public virtual string GetErrorOutput() { } + public virtual string GetStandardOutput() { } public void RestoreExecutionContext() { } } public class ContextProvider : . @@ -1241,6 +1241,14 @@ namespace { public TestAttribute([.] string file = "", [.] int line = 0) { } } + public sealed class TestBuildContext : .Context, + { + public TestBuildContext() { } + public new static .TestBuildContext? Current { get; } + public new void Dispose() { } + public string GetCapturedErrorOutput() { } + public string GetCapturedOutput() { } + } public class TestBuilderContext : <.TestBuilderContext> { public TestBuilderContext() { } @@ -1291,6 +1299,8 @@ namespace public static string? OutputDirectory { get; } public static .> Parameters { get; } public static string WorkingDirectory { get; set; } + public override string GetErrorOutput() { } + public override string GetStandardOutput() { } public static .TestContext? GetById(string id) { } } public class TestContextEvents : . diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 0f5261a9e5..527186756b 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -399,8 +399,8 @@ namespace public void AddAsyncLocalValues() { } public void Dispose() { } public . GetDefaultLogger() { } - public string GetErrorOutput() { } - public string GetStandardOutput() { } + public virtual string GetErrorOutput() { } + public virtual string GetStandardOutput() { } public void RestoreExecutionContext() { } } public class ContextProvider : . @@ -1241,6 +1241,14 @@ namespace { public TestAttribute([.] string file = "", [.] int line = 0) { } } + public sealed class TestBuildContext : .Context, + { + public TestBuildContext() { } + public new static .TestBuildContext? Current { get; } + public new void Dispose() { } + public string GetCapturedErrorOutput() { } + public string GetCapturedOutput() { } + } public class TestBuilderContext : <.TestBuilderContext> { public TestBuilderContext() { } @@ -1291,6 +1299,8 @@ namespace public static string? OutputDirectory { get; } public static .> Parameters { get; } public static string WorkingDirectory { get; set; } + public override string GetErrorOutput() { } + public override string GetStandardOutput() { } public static .TestContext? GetById(string id) { } } public class TestContextEvents : . diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 46cb1ff278..bc4e8802ef 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -399,8 +399,8 @@ namespace public void AddAsyncLocalValues() { } public void Dispose() { } public . GetDefaultLogger() { } - public string GetErrorOutput() { } - public string GetStandardOutput() { } + public virtual string GetErrorOutput() { } + public virtual string GetStandardOutput() { } public void RestoreExecutionContext() { } } public class ContextProvider : . @@ -1241,6 +1241,14 @@ namespace { public TestAttribute([.] string file = "", [.] int line = 0) { } } + public sealed class TestBuildContext : .Context, + { + public TestBuildContext() { } + public new static .TestBuildContext? Current { get; } + public new void Dispose() { } + public string GetCapturedErrorOutput() { } + public string GetCapturedOutput() { } + } public class TestBuilderContext : <.TestBuilderContext> { public TestBuilderContext() { } @@ -1291,6 +1299,8 @@ namespace public static string? OutputDirectory { get; } public static .> Parameters { get; } public static string WorkingDirectory { get; set; } + public override string GetErrorOutput() { } + public override string GetStandardOutput() { } public static .TestContext? GetById(string id) { } } public class TestContextEvents : . diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 2f4897b17a..a922ee4e9f 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -379,8 +379,8 @@ namespace public void AddAsyncLocalValues() { } public void Dispose() { } public . GetDefaultLogger() { } - public string GetErrorOutput() { } - public string GetStandardOutput() { } + public virtual string GetErrorOutput() { } + public virtual string GetStandardOutput() { } public void RestoreExecutionContext() { } } public class ContextProvider : . @@ -1196,6 +1196,14 @@ namespace { public TestAttribute([.] string file = "", [.] int line = 0) { } } + public sealed class TestBuildContext : .Context, + { + public TestBuildContext() { } + public new static .TestBuildContext? Current { get; } + public new void Dispose() { } + public string GetCapturedErrorOutput() { } + public string GetCapturedOutput() { } + } public class TestBuilderContext : <.TestBuilderContext> { public TestBuilderContext() { } @@ -1246,6 +1254,8 @@ namespace public static string? OutputDirectory { get; } public static .> Parameters { get; } public static string WorkingDirectory { get; set; } + public override string GetErrorOutput() { } + public override string GetStandardOutput() { } public static .TestContext? GetById(string id) { } } public class TestContextEvents : . diff --git a/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs b/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs new file mode 100644 index 0000000000..cb11a76453 --- /dev/null +++ b/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs @@ -0,0 +1,187 @@ +using TUnit.Core; +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject; + +/// +/// Tests to verify that console output during test building (data source construction/initialization) +/// is properly captured and included in test results. +/// Issue #3833: https://github.com/thomhurst/TUnit/issues/3833 +/// +[NotInParallel] +[EngineTest(ExpectedResult.Pass)] +public class TestBuildContextOutputCaptureTests +{ + /// + /// Data source that writes to console in constructor + /// + public class DataSourceWithConstructorOutput + { + public string Value { get; } + + public DataSourceWithConstructorOutput() + { + Console.WriteLine("DataSource constructor: Creating instance"); + Console.WriteLine("DataSource constructor: Initializing value"); + Value = "TestValue"; + Console.WriteLine("DataSource constructor: Instance created successfully"); + } + } + + /// + /// Data source that writes to console in async initializer + /// + public class DataSourceWithAsyncInitOutput : IAsyncInitializer + { + public string Value { get; private set; } = "Uninitialized"; + + public DataSourceWithAsyncInitOutput() + { + Console.WriteLine("AsyncDataSource constructor: Creating instance"); + } + + public async Task InitializeAsync() + { + Console.WriteLine("AsyncDataSource.InitializeAsync: Starting initialization"); + await Task.Delay(10); // Simulate async work + Console.WriteLine("AsyncDataSource.InitializeAsync: Setting value"); + Value = "InitializedValue"; + Console.WriteLine("AsyncDataSource.InitializeAsync: Initialization complete"); + } + } + + /// + /// Data source that writes to error output + /// + public class DataSourceWithErrorOutput + { + public string Value { get; } + + public DataSourceWithErrorOutput() + { + Console.Error.WriteLine("DataSource error: This is an error message during construction"); + Value = "ErrorTestValue"; + } + } + + [Test] + [ClassDataSource] + public async Task Test_CapturesConstructorOutput_InTestResults(DataSourceWithConstructorOutput data) + { + // The constructor output should be captured during test building + // and included in the test's output + + // Get the test output + var output = TestContext.Current!.GetStandardOutput(); + + // Verify constructor output is present + await Assert.That(output).Contains("DataSource constructor: Creating instance"); + await Assert.That(output).Contains("DataSource constructor: Initializing value"); + await Assert.That(output).Contains("DataSource constructor: Instance created successfully"); + + // Verify the data source was created correctly + await Assert.That(data.Value).IsEqualTo("TestValue"); + } + + [Test] + [ClassDataSource] + public async Task Test_CapturesAsyncInitializerOutput_InTestResults(DataSourceWithAsyncInitOutput data) + { + // The InitializeAsync output should be captured during test building + // and included in the test's output + + // Get the test output + var output = TestContext.Current!.GetStandardOutput(); + + // Verify constructor and InitializeAsync output is present + await Assert.That(output).Contains("AsyncDataSource constructor: Creating instance"); + await Assert.That(output).Contains("AsyncDataSource.InitializeAsync: Starting initialization"); + await Assert.That(output).Contains("AsyncDataSource.InitializeAsync: Setting value"); + await Assert.That(output).Contains("AsyncDataSource.InitializeAsync: Initialization complete"); + + // Verify the data source was initialized correctly + await Assert.That(data.Value).IsEqualTo("InitializedValue"); + } + + [Test] + [ClassDataSource] + public async Task Test_CapturesErrorOutput_InTestResults(DataSourceWithErrorOutput data) + { + // Error output during construction should be captured + var errorOutput = TestContext.Current!.GetErrorOutput(); + + // Verify error output is present + await Assert.That(errorOutput).Contains("DataSource error: This is an error message during construction"); + + // Verify the data source was created correctly + await Assert.That(data.Value).IsEqualTo("ErrorTestValue"); + } + + /// + /// Shared data source (PerTestSession) - output should appear in all tests that use it + /// + public class SharedDataSource + { + public string Value { get; } + + public SharedDataSource() + { + Console.WriteLine("SharedDataSource constructor: This should appear in all tests using this data source"); + Value = "SharedValue"; + } + } + + [Test] + [ClassDataSource(Shared = SharedType.PerTestSession)] + public async Task Test_SharedDataSource_FirstTest(SharedDataSource data) + { + var output = TestContext.Current!.GetStandardOutput(); + + // Should contain the shared data source construction output + await Assert.That(output).Contains("SharedDataSource constructor:"); + await Assert.That(data.Value).IsEqualTo("SharedValue"); + } + + [Test] + [ClassDataSource(Shared = SharedType.PerTestSession)] + public async Task Test_SharedDataSource_SecondTest(SharedDataSource data) + { + // NOTE: For PerTestSession shared data sources, the constructor only runs once + // when the first test triggers creation. Subsequent tests use the already-created + // instance, so they won't have the constructor output in their build context. + // This is expected behavior. + + // Just verify the data source works + await Assert.That(data.Value).IsEqualTo("SharedValue"); + } + + [Test] + public async Task Test_ExecutionOutput_StillCaptured() + { + // Verify that execution-time output is still captured correctly + Console.WriteLine("This is execution-time output"); + + var output = TestContext.Current!.GetStandardOutput(); + await Assert.That(output).Contains("This is execution-time output"); + } + + [Test] + [ClassDataSource] + public async Task Test_BothBuildAndExecutionOutput_AreCombined(DataSourceWithConstructorOutput data) + { + // Write output during execution + Console.WriteLine("This is execution-time output"); + + var output = TestContext.Current!.GetStandardOutput(); + + // Should contain both build-time and execution-time output + await Assert.That(output).Contains("DataSource constructor: Creating instance"); + await Assert.That(output).Contains("This is execution-time output"); + + // Build-time output should come before execution-time output + var buildIndex = output.IndexOf("DataSource constructor: Creating instance", StringComparison.Ordinal); + var execIndex = output.IndexOf("This is execution-time output", StringComparison.Ordinal); + await Assert.That(buildIndex).IsLessThan(execIndex); + } +} From b007a4418be089834af99246299bb5ccd11b438d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 14:05:50 +0000 Subject: [PATCH 052/192] +semver:minor - feat: introduce EventReceiverStage for controlling execution order of event receivers (#3850) --- TUnit.Core/Enums/EventReceiverStage.cs | 17 + .../Interfaces/ITestEndEventReceiver.cs | 18 + .../Interfaces/ITestStartEventReceiver.cs | 18 + .../Services/EventReceiverOrchestrator.cs | 27 +- TUnit.Engine/TestExecutor.cs | 21 +- ...Has_No_API_Changes.DotNet10_0.verified.txt | 7 + ..._Has_No_API_Changes.DotNet8_0.verified.txt | 7 + ..._Has_No_API_Changes.DotNet9_0.verified.txt | 7 + ...ary_Has_No_API_Changes.Net4_7.verified.txt | 5 + TUnit.TestProject/EventReceiverStageTests.cs | 311 ++++++++++++++++++ docs/docs/test-lifecycle/event-subscribing.md | 92 ++++++ 11 files changed, 522 insertions(+), 8 deletions(-) create mode 100644 TUnit.Core/Enums/EventReceiverStage.cs create mode 100644 TUnit.TestProject/EventReceiverStageTests.cs diff --git a/TUnit.Core/Enums/EventReceiverStage.cs b/TUnit.Core/Enums/EventReceiverStage.cs new file mode 100644 index 0000000000..2cb6e90286 --- /dev/null +++ b/TUnit.Core/Enums/EventReceiverStage.cs @@ -0,0 +1,17 @@ +namespace TUnit.Core.Enums; + +/// +/// Defines the execution stage for event receivers relative to instance-level hooks +/// +public enum EventReceiverStage +{ + /// + /// Execute before instance-level hooks ([Before(Test)], [After(Test)]) + /// + Early = 0, + + /// + /// Execute after instance-level hooks (default behavior for backward compatibility) + /// + Late = 1 +} diff --git a/TUnit.Core/Interfaces/ITestEndEventReceiver.cs b/TUnit.Core/Interfaces/ITestEndEventReceiver.cs index 5ee6af1b62..9693c2804b 100644 --- a/TUnit.Core/Interfaces/ITestEndEventReceiver.cs +++ b/TUnit.Core/Interfaces/ITestEndEventReceiver.cs @@ -1,5 +1,7 @@ namespace TUnit.Core.Interfaces; +using TUnit.Core.Enums; + /// /// Simplified interface for test end event receivers /// @@ -9,4 +11,20 @@ public interface ITestEndEventReceiver : IEventReceiver /// Called when a test ends /// ValueTask OnTestEnd(TestContext context); + + /// + /// Gets the execution stage of this event receiver relative to instance-level hooks. + /// + /// + /// Early stage executes before [After(Test)] hooks, Late stage executes after. + /// Default is Late for backward compatibility. + /// This property is only available on .NET 8.0+ due to default interface member requirements. + /// On older frameworks, all receivers execute at Late stage. + /// + /// + /// The execution stage. Default is . + /// +#if NET + public EventReceiverStage Stage => EventReceiverStage.Late; +#endif } diff --git a/TUnit.Core/Interfaces/ITestStartEventReceiver.cs b/TUnit.Core/Interfaces/ITestStartEventReceiver.cs index 858039d339..6fb6670f4e 100644 --- a/TUnit.Core/Interfaces/ITestStartEventReceiver.cs +++ b/TUnit.Core/Interfaces/ITestStartEventReceiver.cs @@ -1,5 +1,7 @@ namespace TUnit.Core.Interfaces; +using TUnit.Core.Enums; + /// /// Simplified interface for test start event receivers /// @@ -9,4 +11,20 @@ public interface ITestStartEventReceiver : IEventReceiver /// Called when a test starts /// ValueTask OnTestStart(TestContext context); + + /// + /// Gets the execution stage of this event receiver relative to instance-level hooks. + /// + /// + /// Early stage executes before [Before(Test)] hooks, Late stage executes after. + /// Default is Late for backward compatibility. + /// This property is only available on .NET 8.0+ due to default interface member requirements. + /// On older frameworks, all receivers execute at Late stage. + /// + /// + /// The execution stage. Default is . + /// +#if NET + public EventReceiverStage Stage => EventReceiverStage.Late; +#endif } diff --git a/TUnit.Engine/Services/EventReceiverOrchestrator.cs b/TUnit.Engine/Services/EventReceiverOrchestrator.cs index 33b1e12871..014221efca 100644 --- a/TUnit.Engine/Services/EventReceiverOrchestrator.cs +++ b/TUnit.Engine/Services/EventReceiverOrchestrator.cs @@ -2,6 +2,7 @@ using System.Runtime.CompilerServices; using TUnit.Core; using TUnit.Core.Data; +using TUnit.Core.Enums; using TUnit.Core.Helpers; using TUnit.Core.Interfaces; using TUnit.Core.Tracking; @@ -87,7 +88,7 @@ obj is IFirstTestInAssemblyEventReceiver || // Fast-path checks with inlining [MethodImpl(MethodImplOptions.AggressiveInlining)] - public async ValueTask InvokeTestStartEventReceiversAsync(TestContext context, CancellationToken cancellationToken) + public async ValueTask InvokeTestStartEventReceiversAsync(TestContext context, CancellationToken cancellationToken, EventReceiverStage? stage = null) { // Fast path - no allocation if no receivers if (!_registry.HasTestStartReceivers()) @@ -95,10 +96,10 @@ public async ValueTask InvokeTestStartEventReceiversAsync(TestContext context, C return; } - await InvokeTestStartEventReceiversCore(context, cancellationToken); + await InvokeTestStartEventReceiversCore(context, cancellationToken, stage); } - private async ValueTask InvokeTestStartEventReceiversCore(TestContext context, CancellationToken cancellationToken) + private async ValueTask InvokeTestStartEventReceiversCore(TestContext context, CancellationToken cancellationToken, EventReceiverStage? stage) { // Manual filtering and sorting instead of LINQ to avoid allocations var eligibleObjects = context.GetEligibleEventObjects(); @@ -108,6 +109,13 @@ private async ValueTask InvokeTestStartEventReceiversCore(TestContext context, C { if (obj is ITestStartEventReceiver receiver) { +#if NET + // Filter by stage if specified (only on .NET 8.0+ where Stage property exists) + if (stage.HasValue && receiver.Stage != stage.Value) + { + continue; + } +#endif receivers ??= []; receivers.Add(receiver); } @@ -130,17 +138,17 @@ private async ValueTask InvokeTestStartEventReceiversCore(TestContext context, C } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public async ValueTask> InvokeTestEndEventReceiversAsync(TestContext context, CancellationToken cancellationToken) + public async ValueTask> InvokeTestEndEventReceiversAsync(TestContext context, CancellationToken cancellationToken, EventReceiverStage? stage = null) { if (!_registry.HasTestEndReceivers()) { return []; } - return await InvokeTestEndEventReceiversCore(context, cancellationToken); + return await InvokeTestEndEventReceiversCore(context, cancellationToken, stage); } - private async ValueTask> InvokeTestEndEventReceiversCore(TestContext context, CancellationToken cancellationToken) + private async ValueTask> InvokeTestEndEventReceiversCore(TestContext context, CancellationToken cancellationToken, EventReceiverStage? stage) { var exceptions = new List(); @@ -152,6 +160,13 @@ private async ValueTask> InvokeTestEndEventReceiversCore(TestCon { if (obj is ITestEndEventReceiver receiver) { +#if NET + // Filter by stage if specified (only on .NET 8.0+ where Stage property exists) + if (stage.HasValue && receiver.Stage != stage.Value) + { + continue; + } +#endif receivers ??= []; receivers.Add(receiver); } diff --git a/TUnit.Engine/TestExecutor.cs b/TUnit.Engine/TestExecutor.cs index dee49a9d75..18a3a21430 100644 --- a/TUnit.Engine/TestExecutor.cs +++ b/TUnit.Engine/TestExecutor.cs @@ -2,6 +2,7 @@ using System.Reflection; using System.Runtime.ExceptionServices; using TUnit.Core; +using TUnit.Core.Enums; using TUnit.Core.Exceptions; using TUnit.Core.Interfaces; using TUnit.Core.Services; @@ -91,9 +92,15 @@ await _eventReceiverOrchestrator.InvokeFirstTestInClassEventReceiversAsync( executableTest.Context.ClassContext.RestoreExecutionContext(); + // Early stage test start receivers run before instance-level hooks + await _eventReceiverOrchestrator.InvokeTestStartEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Early).ConfigureAwait(false); + + executableTest.Context.RestoreExecutionContext(); + await _hookExecutor.ExecuteBeforeTestHooksAsync(executableTest, cancellationToken).ConfigureAwait(false); - await _eventReceiverOrchestrator.InvokeTestStartEventReceiversAsync(executableTest.Context, cancellationToken).ConfigureAwait(false); + // Late stage test start receivers run after instance-level hooks (default behavior) + await _eventReceiverOrchestrator.InvokeTestStartEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Late).ConfigureAwait(false); executableTest.Context.RestoreExecutionContext(); @@ -114,8 +121,18 @@ await _eventReceiverOrchestrator.InvokeFirstTestInClassEventReceiversAsync( } finally { + // Early stage test end receivers run before instance-level hooks + var earlyStageExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Early).ConfigureAwait(false); + var hookExceptions = await _hookExecutor.ExecuteAfterTestHooksAsync(executableTest, cancellationToken).ConfigureAwait(false); - var eventReceiverExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, cancellationToken).ConfigureAwait(false); + + // Late stage test end receivers run after instance-level hooks (default behavior) + var lateStageExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Late).ConfigureAwait(false); + + // Combine all exceptions from event receivers + var eventReceiverExceptions = new List(earlyStageExceptions.Count + lateStageExceptions.Count); + eventReceiverExceptions.AddRange(earlyStageExceptions); + eventReceiverExceptions.AddRange(lateStageExceptions); if (hookExceptions.Count > 0 || eventReceiverExceptions.Count > 0) { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index d00129e2e4..556486d6e4 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1675,6 +1675,11 @@ namespace .Enums TestParameters = 1, Property = 2, } + public enum EventReceiverStage + { + Early = 0, + Late = 1, + } public enum LogLevel { None = -1, @@ -2338,6 +2343,7 @@ namespace .Interfaces } public interface ITestEndEventReceiver : . { + . Stage { get; } . OnTestEnd(.TestContext context); } public interface ITestEvents @@ -2453,6 +2459,7 @@ namespace .Interfaces } public interface ITestStartEventReceiver : . { + . Stage { get; } . OnTestStart(.TestContext context); } public interface ITestStateBag diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 527186756b..8bbca55ff3 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1675,6 +1675,11 @@ namespace .Enums TestParameters = 1, Property = 2, } + public enum EventReceiverStage + { + Early = 0, + Late = 1, + } public enum LogLevel { None = -1, @@ -2338,6 +2343,7 @@ namespace .Interfaces } public interface ITestEndEventReceiver : . { + . Stage { get; } . OnTestEnd(.TestContext context); } public interface ITestEvents @@ -2453,6 +2459,7 @@ namespace .Interfaces } public interface ITestStartEventReceiver : . { + . Stage { get; } . OnTestStart(.TestContext context); } public interface ITestStateBag diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index bc4e8802ef..e7945a9846 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1675,6 +1675,11 @@ namespace .Enums TestParameters = 1, Property = 2, } + public enum EventReceiverStage + { + Early = 0, + Late = 1, + } public enum LogLevel { None = -1, @@ -2338,6 +2343,7 @@ namespace .Interfaces } public interface ITestEndEventReceiver : . { + . Stage { get; } . OnTestEnd(.TestContext context); } public interface ITestEvents @@ -2453,6 +2459,7 @@ namespace .Interfaces } public interface ITestStartEventReceiver : . { + . Stage { get; } . OnTestStart(.TestContext context); } public interface ITestStateBag diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index a922ee4e9f..dd3923472e 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1628,6 +1628,11 @@ namespace .Enums TestParameters = 1, Property = 2, } + public enum EventReceiverStage + { + Early = 0, + Late = 1, + } public enum LogLevel { None = -1, diff --git a/TUnit.TestProject/EventReceiverStageTests.cs b/TUnit.TestProject/EventReceiverStageTests.cs new file mode 100644 index 0000000000..9b5439c7ff --- /dev/null +++ b/TUnit.TestProject/EventReceiverStageTests.cs @@ -0,0 +1,311 @@ +using TUnit.Core.Enums; +using TUnit.Core.Interfaces; + +namespace TUnit.TestProject; + +// Shared execution order tracker +public static class EventReceiverStageTracker +{ + public static readonly List ExecutionOrder = []; +} + +// Early stage test start receiver +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class EarlyTestStartReceiverAttribute : Attribute, ITestStartEventReceiver +{ + public int Order => 0; + +#if NET + public EventReceiverStage Stage => EventReceiverStage.Early; +#endif + + public ValueTask OnTestStart(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("EarlyTestStart"); + return default; + } +} + +// Late stage test start receiver (explicit) +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class LateTestStartReceiverAttribute : Attribute, ITestStartEventReceiver +{ + public int Order => 0; + +#if NET + public EventReceiverStage Stage => EventReceiverStage.Late; +#endif + + public ValueTask OnTestStart(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("LateTestStart"); + return default; + } +} + +// Default test start receiver (should behave as Late) +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class DefaultTestStartReceiverAttribute : Attribute, ITestStartEventReceiver +{ + public int Order => 0; + + // No Stage property override - uses default (Late) + + public ValueTask OnTestStart(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("DefaultTestStart"); + return default; + } +} + +// Early stage test end receiver +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class EarlyTestEndReceiverAttribute : Attribute, ITestEndEventReceiver +{ + public int Order => 0; + +#if NET + public EventReceiverStage Stage => EventReceiverStage.Early; +#endif + + public ValueTask OnTestEnd(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("EarlyTestEnd"); + return default; + } +} + +// Late stage test end receiver (explicit) +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class LateTestEndReceiverAttribute : Attribute, ITestEndEventReceiver +{ + public int Order => 0; + +#if NET + public EventReceiverStage Stage => EventReceiverStage.Late; +#endif + + public ValueTask OnTestEnd(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("LateTestEnd"); + return default; + } +} + +// Default test end receiver (should behave as Late) +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class DefaultTestEndReceiverAttribute : Attribute, ITestEndEventReceiver +{ + public int Order => 0; + + // No Stage property override - uses default (Late) + + public ValueTask OnTestEnd(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("DefaultTestEnd"); + return default; + } +} + +// Test receivers with different Order values +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class EarlyTestStartReceiver_Order1Attribute : Attribute, ITestStartEventReceiver +{ + public int Order => 1; + +#if NET + public EventReceiverStage Stage => EventReceiverStage.Early; +#endif + + public ValueTask OnTestStart(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("EarlyTestStart_Order1"); + return default; + } +} + +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] +public class EarlyTestStartReceiver_Order2Attribute : Attribute, ITestStartEventReceiver +{ + public int Order => 2; + +#if NET + public EventReceiverStage Stage => EventReceiverStage.Early; +#endif + + public ValueTask OnTestStart(TestContext context) + { + EventReceiverStageTracker.ExecutionOrder.Add("EarlyTestStart_Order2"); + return default; + } +} + +public class EventReceiverStageTests +{ + [Before(Test)] + public void SetupTest() + { + EventReceiverStageTracker.ExecutionOrder.Clear(); + EventReceiverStageTracker.ExecutionOrder.Add("BeforeTest"); + } + + [After(Test)] + public void TeardownTest() + { + EventReceiverStageTracker.ExecutionOrder.Add("AfterTest"); + } + +#if NET + [Test] + [EarlyTestStartReceiver] + public async Task EarlyTestStartReceiver_RunsBeforeBeforeTestHook() + { + // Expected order: EarlyTestStart → BeforeTest → Test + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(2); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("EarlyTestStart"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("BeforeTest"); + } + + [Test] + [LateTestStartReceiver] + public async Task LateTestStartReceiver_RunsAfterBeforeTestHook() + { + // Expected order: BeforeTest → LateTestStart → Test + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(2); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("LateTestStart"); + } + + [Test] + [DefaultTestStartReceiver] + public async Task DefaultTestStartReceiver_RunsAfterBeforeTestHook_AsLateStage() + { + // Expected order: BeforeTest → DefaultTestStart → Test + // Default should behave as Late stage + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(2); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("DefaultTestStart"); + } + + [Test] + [EarlyTestEndReceiver] + public async Task EarlyTestEndReceiver_RunsBeforeAfterTestHook() + { + // Test runs, then in finally block: EarlyTestEnd → AfterTest + // We verify in AfterEvery hook + await Task.CompletedTask; + } + + [After(Test)] + public async Task VerifyEarlyTestEndReceiverOrder(TestContext context) + { + if (context.Metadata.DisplayName.Contains("EarlyTestEndReceiver_RunsBeforeAfterTestHook")) + { + // Expected order: BeforeTest → EarlyTestEnd → AfterTest + await Task.Delay(10); // Small delay to ensure all receivers have executed + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(3); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("EarlyTestEnd"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[2]).IsEqualTo("AfterTest"); + } + } + + [Test] + [LateTestEndReceiver] + public async Task LateTestEndReceiver_RunsAfterAfterTestHook() + { + // Test runs, then in finally block: AfterTest → LateTestEnd + await Task.CompletedTask; + } + + [After(Test)] + public async Task VerifyLateTestEndReceiverOrder(TestContext context) + { + if (context.Metadata.DisplayName.Contains("LateTestEndReceiver_RunsAfterAfterTestHook")) + { + // Expected order: BeforeTest → AfterTest → LateTestEnd + await Task.Delay(10); // Small delay to ensure all receivers have executed + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(3); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("AfterTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[2]).IsEqualTo("LateTestEnd"); + } + } + + [Test] + [DefaultTestEndReceiver] + public async Task DefaultTestEndReceiver_RunsAfterAfterTestHook_AsLateStage() + { + // Test runs, then in finally block: AfterTest → DefaultTestEnd + // Default should behave as Late stage + await Task.CompletedTask; + } + + [After(Test)] + public async Task VerifyDefaultTestEndReceiverOrder(TestContext context) + { + if (context.Metadata.DisplayName.Contains("DefaultTestEndReceiver_RunsAfterAfterTestHook_AsLateStage")) + { + // Expected order: BeforeTest → AfterTest → DefaultTestEnd + await Task.Delay(10); // Small delay to ensure all receivers have executed + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(3); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("AfterTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[2]).IsEqualTo("DefaultTestEnd"); + } + } + + [Test] + [EarlyTestStartReceiver_Order1] + [EarlyTestStartReceiver_Order2] + public async Task EarlyStageReceivers_RespectOrderProperty() + { + // Expected order: EarlyTestStart_Order1 → EarlyTestStart_Order2 → BeforeTest → Test + // Order property should still be respected within the same stage + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(3); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("EarlyTestStart_Order1"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("EarlyTestStart_Order2"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[2]).IsEqualTo("BeforeTest"); + } + + [Test] + [EarlyTestStartReceiver] + [LateTestStartReceiver] + [EarlyTestEndReceiver] + [LateTestEndReceiver] + public async Task MixedStageReceivers_ExecuteInCorrectOrder() + { + // Expected order: EarlyTestStart → BeforeTest → LateTestStart → Test → EarlyTestEnd → AfterTest → LateTestEnd + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(3); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("EarlyTestStart"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[2]).IsEqualTo("LateTestStart"); + } + + [After(Test)] + public async Task VerifyMixedStageReceiversEndOrder(TestContext context) + { + if (context.Metadata.DisplayName.Contains("MixedStageReceivers_ExecuteInCorrectOrder")) + { + // Expected final order: EarlyTestStart → BeforeTest → LateTestStart → EarlyTestEnd → AfterTest → LateTestEnd + await Task.Delay(10); // Small delay to ensure all receivers have executed + await Assert.That(EventReceiverStageTracker.ExecutionOrder).HasCount().EqualTo(6); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[0]).IsEqualTo("EarlyTestStart"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[1]).IsEqualTo("BeforeTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[2]).IsEqualTo("LateTestStart"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[3]).IsEqualTo("EarlyTestEnd"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[4]).IsEqualTo("AfterTest"); + await Assert.That(EventReceiverStageTracker.ExecutionOrder[5]).IsEqualTo("LateTestEnd"); + } + } +#else + [Test] + public async Task OnNetStandard_AllReceiversBehaveLikeLateDueToNoDIM() + { + // On .NET Standard 2.0, the Stage property doesn't exist due to lack of default interface members + // All receivers should behave as Late stage (after hooks) + // This test is just a placeholder to document the behavior + await Assert.That(true).IsTrue(); + } +#endif +} diff --git a/docs/docs/test-lifecycle/event-subscribing.md b/docs/docs/test-lifecycle/event-subscribing.md index 7ba135e099..1602e1c7c1 100644 --- a/docs/docs/test-lifecycle/event-subscribing.md +++ b/docs/docs/test-lifecycle/event-subscribing.md @@ -20,6 +20,98 @@ The interfaces they can implement are: This can be useful especially when generating data that you need to track and maybe dispose later. By hooking into these events, we can do things like track and dispose our objects when we need. +## Execution Stage Control + +> **Note**: This feature is available on .NET 8.0+ only due to default interface member requirements. + +For `ITestStartEventReceiver` and `ITestEndEventReceiver`, you can control when your event receivers execute relative to instance-level hooks (`[Before(Test)]` and `[After(Test)]`) by setting the `Stage` property. + +### EventReceiverStage Options + +- **`EventReceiverStage.Early`**: Executes before instance-level hooks + - Test start receivers run before `[Before(Test)]` hooks + - Test end receivers run before `[After(Test)]` hooks + +- **`EventReceiverStage.Late`** (default): Executes after instance-level hooks + - Test start receivers run after `[Before(Test)]` hooks + - Test end receivers run after `[After(Test)]` hooks + +### When to Use Early Stage + +Use `EventReceiverStage.Early` when your event receiver needs to: +- Initialize resources that instance-level hooks depend on +- Set up test context or environment before any test-specific setup runs +- Capture test state before any modifications from hooks + +### When to Use Late Stage + +Use `EventReceiverStage.Late` (the default) when your event receiver needs to: +- Access resources initialized by instance-level hooks +- Clean up after all test-specific teardown completes +- Log or report on final test state after all hooks have run + +### Example: Early Stage Event Receiver + +```csharp +public class DatabaseConnectionAttribute : Attribute, ITestStartEventReceiver +{ + private IDbConnection? _connection; + + // Execute before [Before(Test)] hooks so the connection is available to them + public EventReceiverStage Stage => EventReceiverStage.Early; + + public async ValueTask OnTestStart(TestContext context) + { + _connection = new SqlConnection(connectionString); + await _connection.OpenAsync(); + + // Store connection in test context for use by hooks and test + context.GetOrAdd("DbConnection", () => _connection); + } +} + +public class MyTests +{ + [Test] + [DatabaseConnection] // Runs BEFORE BeforeTest hook + public async Task TestWithDatabase() + { + // Database connection is already open and available + var connection = TestContext.Current!.Get("DbConnection"); + // ... test logic + } + + [Before(Test)] + public void BeforeTest() + { + // Database connection is already available here + var connection = TestContext.Current!.Get("DbConnection"); + // ... setup that needs the database + } +} +``` + +### Example: Late Stage Event Receiver (Default) + +```csharp +public class TestMetricsAttribute : Attribute, ITestEndEventReceiver +{ + // Late stage is the default, so this property is optional + public EventReceiverStage Stage => EventReceiverStage.Late; + + public async ValueTask OnTestEnd(TestContext context) + { + // This runs AFTER all [After(Test)] hooks have completed + // So we can capture the final test metrics including cleanup time + await LogMetrics(context); + } +} +``` + +### .NET Framework / .NET Standard 2.0 Behavior + +On older frameworks that don't support default interface members (.NET Framework, .NET Standard 2.0), the `Stage` property is not available. All event receivers will execute at the `Late` stage (after instance-level hooks), which matches the historical behavior. + Each attribute will be new'd up for each test, so you are able to store state within the fields of your attribute class. The `[ClassDataSource]` uses these events to do the following: From e96f14bb146bf7320dc4bfa463b1bdd14aaa7657 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:06:05 +0000 Subject: [PATCH 053/192] chore(deps): update tunit to 1.2.0 (#3853) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index e0ae99691e..f7ebc259bd 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 0ba948504e..966217ce72 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 4619b3b043..d71fa475b1 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 7d283a64ae..29270c3a6f 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 0a116e103a..2750f80878 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 14bd5b4072..77c58677aa 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 4f9530718e..5e661fc20e 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 3fda27defd..16d50df436 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index 5dae3fa047..f7c72ad4f5 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 868013539486c6a4afe92b53da97c17e8f411ee6 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:30:20 +0000 Subject: [PATCH 054/192] chore: update benchmark results (#3856) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 8 +- docs/static/benchmarks/AsyncTests.json | 48 +-- docs/static/benchmarks/BuildTime.json | 38 +-- docs/static/benchmarks/DataDrivenTests.json | 48 +-- .../benchmarks/MassiveParallelTests.json | 48 +-- docs/static/benchmarks/MatrixTests.json | 48 +-- docs/static/benchmarks/ScaleTests.json | 48 +-- .../static/benchmarks/SetupTeardownTests.json | 40 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 296 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 377 insertions(+), 373 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 548e0174f2..152246dad5 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 546.4 ms | 546.3 ms | 3.82 ms | -| NUnit | 4.4.0 | 647.1 ms | 642.5 ms | 9.04 ms | -| MSTest | 4.0.2 | 616.6 ms | 617.2 ms | 7.52 ms | -| xUnit3 | 3.2.0 | 693.2 ms | 692.8 ms | 5.17 ms | -| **TUnit (AOT)** | 1.1.10 | 123.7 ms | 123.7 ms | 0.39 ms | +| **TUnit** | 1.2.0 | 565.8 ms | 565.3 ms | 3.67 ms | +| NUnit | 4.4.0 | 647.2 ms | 646.3 ms | 5.71 ms | +| MSTest | 4.0.2 | 620.4 ms | 618.3 ms | 8.09 ms | +| xUnit3 | 3.2.0 | 712.3 ms | 712.0 ms | 11.12 ms | +| **TUnit (AOT)** | 1.2.0 | 125.3 ms | 125.3 ms | 0.28 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 832 - bar [546.4, 647.1, 616.6, 693.2, 123.7] + y-axis "Time (ms)" 0 --> 855 + bar [565.8, 647.2, 620.4, 712.3, 125.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.502Z* +*Last generated: 2025-11-16T00:30:01.239Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 8519936150..20967452e6 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 2.104 s | 2.097 s | 0.0487 s | -| Build_NUnit | 4.4.0 | 1.658 s | 1.652 s | 0.0272 s | -| Build_MSTest | 4.0.2 | 1.751 s | 1.748 s | 0.0404 s | -| Build_xUnit3 | 3.2.0 | 1.643 s | 1.644 s | 0.0204 s | +| **TUnit** | 1.2.0 | 2.003 s | 1.999 s | 0.0153 s | +| Build_NUnit | 4.4.0 | 1.612 s | 1.610 s | 0.0296 s | +| Build_MSTest | 4.0.2 | 1.681 s | 1.680 s | 0.0164 s | +| Build_xUnit3 | 3.2.0 | 1.585 s | 1.582 s | 0.0210 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.104, 1.658, 1.751, 1.643] + bar [2.003, 1.612, 1.681, 1.585] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.505Z* +*Last generated: 2025-11-16T00:30:01.241Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 6532bf2b9a..5cc4ffb92f 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 493.28 ms | 491.72 ms | 5.477 ms | -| NUnit | 4.4.0 | 527.71 ms | 528.80 ms | 6.631 ms | -| MSTest | 4.0.2 | 499.80 ms | 496.67 ms | 18.060 ms | -| xUnit3 | 3.2.0 | 571.43 ms | 570.30 ms | 9.897 ms | -| **TUnit (AOT)** | 1.1.10 | 24.09 ms | 24.07 ms | 0.146 ms | +| **TUnit** | 1.2.0 | 472.15 ms | 472.07 ms | 5.427 ms | +| NUnit | 4.4.0 | 573.40 ms | 571.78 ms | 8.309 ms | +| MSTest | 4.0.2 | 592.88 ms | 592.10 ms | 9.922 ms | +| xUnit3 | 3.2.0 | 591.10 ms | 591.00 ms | 10.996 ms | +| **TUnit (AOT)** | 1.2.0 | 25.00 ms | 25.00 ms | 0.200 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 686 - bar [493.28, 527.71, 499.8, 571.43, 24.09] + y-axis "Time (ms)" 0 --> 712 + bar [472.15, 573.4, 592.88, 591.1, 25] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.503Z* +*Last generated: 2025-11-16T00:30:01.239Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index cc36aaf4c1..cc4af7feab 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 605.7 ms | 603.9 ms | 6.52 ms | -| NUnit | 4.4.0 | 1,177.6 ms | 1,177.8 ms | 6.41 ms | -| MSTest | 4.0.2 | 2,951.3 ms | 2,951.9 ms | 6.75 ms | -| xUnit3 | 3.2.0 | 3,050.0 ms | 3,050.0 ms | 7.02 ms | -| **TUnit (AOT)** | 1.1.10 | 130.9 ms | 130.7 ms | 0.38 ms | +| **TUnit** | 1.2.0 | 567.7 ms | 568.3 ms | 5.65 ms | +| NUnit | 4.4.0 | 1,165.6 ms | 1,165.9 ms | 5.31 ms | +| MSTest | 4.0.2 | 2,964.1 ms | 2,966.5 ms | 9.82 ms | +| xUnit3 | 3.2.0 | 3,035.9 ms | 3,036.5 ms | 6.47 ms | +| **TUnit (AOT)** | 1.2.0 | 128.8 ms | 128.8 ms | 0.37 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3660 - bar [605.7, 1177.6, 2951.3, 3050, 130.9] + y-axis "Time (ms)" 0 --> 3644 + bar [567.7, 1165.6, 2964.1, 3035.9, 128.8] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.503Z* +*Last generated: 2025-11-16T00:30:01.240Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index dd935dbdbb..4fb0d2f8a5 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 563.80 ms | 562.94 ms | 7.113 ms | -| NUnit | 4.4.0 | 1,538.27 ms | 1,538.35 ms | 11.633 ms | -| MSTest | 4.0.2 | 1,497.90 ms | 1,490.67 ms | 14.759 ms | -| xUnit3 | 3.2.0 | 1,579.28 ms | 1,578.51 ms | 6.673 ms | -| **TUnit (AOT)** | 1.1.10 | 78.71 ms | 78.69 ms | 0.421 ms | +| **TUnit** | 1.2.0 | 587.68 ms | 588.39 ms | 5.809 ms | +| NUnit | 4.4.0 | 1,560.52 ms | 1,557.34 ms | 9.306 ms | +| MSTest | 4.0.2 | 1,522.76 ms | 1,519.51 ms | 9.857 ms | +| xUnit3 | 3.2.0 | 1,618.75 ms | 1,615.45 ms | 8.652 ms | +| **TUnit (AOT)** | 1.2.0 | 80.22 ms | 80.11 ms | 0.343 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1896 - bar [563.8, 1538.27, 1497.9, 1579.28, 78.71] + y-axis "Time (ms)" 0 --> 1943 + bar [587.68, 1560.52, 1522.76, 1618.75, 80.22] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.503Z* +*Last generated: 2025-11-16T00:30:01.240Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 5fb9e7d4bb..d582c6831d 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 484.97 ms | 485.22 ms | 3.999 ms | -| NUnit | 4.4.0 | 676.90 ms | 675.21 ms | 10.367 ms | -| MSTest | 4.0.2 | 659.56 ms | 659.58 ms | 4.624 ms | -| xUnit3 | 3.2.0 | 676.88 ms | 673.98 ms | 10.260 ms | -| **TUnit (AOT)** | 1.1.10 | 48.50 ms | 48.84 ms | 3.553 ms | +| **TUnit** | 1.2.0 | 526.00 ms | 526.16 ms | 5.220 ms | +| NUnit | 4.4.0 | 619.91 ms | 616.01 ms | 28.759 ms | +| MSTest | 4.0.2 | 615.62 ms | 614.08 ms | 21.339 ms | +| xUnit3 | 3.2.0 | 614.08 ms | 614.08 ms | 16.235 ms | +| **TUnit (AOT)** | 1.2.0 | 46.63 ms | 46.83 ms | 3.501 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 813 - bar [484.97, 676.9, 659.56, 676.88, 48.5] + y-axis "Time (ms)" 0 --> 744 + bar [526, 619.91, 615.62, 614.08, 46.63] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.504Z* +*Last generated: 2025-11-16T00:30:01.240Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index b91e232393..37623791c6 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-15** from the latest CI run. +This benchmark was automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.10 | 540.2 ms | 540.7 ms | 5.84 ms | -| NUnit | 4.4.0 | 1,160.3 ms | 1,156.8 ms | 10.70 ms | -| MSTest | 4.0.2 | 1,133.4 ms | 1,131.4 ms | 5.85 ms | -| xUnit3 | 3.2.0 | 1,219.9 ms | 1,218.4 ms | 19.12 ms | -| **TUnit (AOT)** | 1.1.10 | NA | NA | NA | +| **TUnit** | 1.2.0 | 567.7 ms | 566.9 ms | 7.78 ms | +| NUnit | 4.4.0 | 1,135.4 ms | 1,134.9 ms | 10.64 ms | +| MSTest | 4.0.2 | 1,114.5 ms | 1,114.7 ms | 8.36 ms | +| xUnit3 | 3.2.0 | 1,194.5 ms | 1,193.0 ms | 8.58 ms | +| **TUnit (AOT)** | 1.2.0 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-15** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1464 - bar [540.2, 1160.3, 1133.4, 1219.9, 0] + y-axis "Time (ms)" 0 --> 1434 + bar [567.7, 1135.4, 1114.5, 1194.5, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-15T00:27:09.504Z* +*Last generated: 2025-11-16T00:30:01.241Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 220c099ad9..931f739ce4 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-15** from the latest CI run. +These benchmarks were automatically generated on **2025-11-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.1.10 | +| **TUnit** | 1.2.0 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -56,7 +56,7 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-15T00:27:09.505Z* +*Last generated: 2025-11-16T00:30:01.241Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index e24f1a0e7e..80d258bc04 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-15T00:27:09.502Z", + "timestamp": "2025-11-16T00:30:01.239Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "546.4 ms", - "Error": "4.30 ms", - "StdDev": "3.82 ms", - "Median": "546.3 ms" + "Version": "1.2.0", + "Mean": "565.8 ms", + "Error": "3.92 ms", + "StdDev": "3.67 ms", + "Median": "565.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "647.1 ms", - "Error": "9.66 ms", - "StdDev": "9.04 ms", - "Median": "642.5 ms" + "Mean": "647.2 ms", + "Error": "6.44 ms", + "StdDev": "5.71 ms", + "Median": "646.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "616.6 ms", - "Error": "8.04 ms", - "StdDev": "7.52 ms", - "Median": "617.2 ms" + "Mean": "620.4 ms", + "Error": "9.12 ms", + "StdDev": "8.09 ms", + "Median": "618.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "693.2 ms", - "Error": "5.53 ms", - "StdDev": "5.17 ms", - "Median": "692.8 ms" + "Mean": "712.3 ms", + "Error": "11.89 ms", + "StdDev": "11.12 ms", + "Median": "712.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "123.7 ms", - "Error": "0.41 ms", - "StdDev": "0.39 ms", - "Median": "123.7 ms" + "Version": "1.2.0", + "Mean": "125.3 ms", + "Error": "0.31 ms", + "StdDev": "0.28 ms", + "Median": "125.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 078351a707..5ceec4bc66 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-15T00:27:09.505Z", + "timestamp": "2025-11-16T00:30:01.241Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "Build_TUnit", - "Version": "1.1.10", - "Mean": "2.104 s", - "Error": "0.0409 s", - "StdDev": "0.0487 s", - "Median": "2.097 s" + "Version": "1.2.0", + "Mean": "2.003 s", + "Error": "0.0164 s", + "StdDev": "0.0153 s", + "Median": "1.999 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.658 s", - "Error": "0.0277 s", - "StdDev": "0.0272 s", - "Median": "1.652 s" + "Mean": "1.612 s", + "Error": "0.0302 s", + "StdDev": "0.0296 s", + "Median": "1.610 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.751 s", - "Error": "0.0339 s", - "StdDev": "0.0404 s", - "Median": "1.748 s" + "Mean": "1.681 s", + "Error": "0.0176 s", + "StdDev": "0.0164 s", + "Median": "1.680 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.643 s", - "Error": "0.0230 s", - "StdDev": "0.0204 s", - "Median": "1.644 s" + "Mean": "1.585 s", + "Error": "0.0224 s", + "StdDev": "0.0210 s", + "Median": "1.582 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 0bcbeb8851..66bb4e6cac 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-15T00:27:09.503Z", + "timestamp": "2025-11-16T00:30:01.239Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "493.28 ms", - "Error": "5.855 ms", - "StdDev": "5.477 ms", - "Median": "491.72 ms" + "Version": "1.2.0", + "Mean": "472.15 ms", + "Error": "6.122 ms", + "StdDev": "5.427 ms", + "Median": "472.07 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "527.71 ms", - "Error": "7.480 ms", - "StdDev": "6.631 ms", - "Median": "528.80 ms" + "Mean": "573.40 ms", + "Error": "9.950 ms", + "StdDev": "8.309 ms", + "Median": "571.78 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "499.80 ms", - "Error": "9.877 ms", - "StdDev": "18.060 ms", - "Median": "496.67 ms" + "Mean": "592.88 ms", + "Error": "10.607 ms", + "StdDev": "9.922 ms", + "Median": "592.10 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "571.43 ms", - "Error": "11.164 ms", - "StdDev": "9.897 ms", - "Median": "570.30 ms" + "Mean": "591.10 ms", + "Error": "11.196 ms", + "StdDev": "10.996 ms", + "Median": "591.00 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "24.09 ms", - "Error": "0.165 ms", - "StdDev": "0.146 ms", - "Median": "24.07 ms" + "Version": "1.2.0", + "Mean": "25.00 ms", + "Error": "0.213 ms", + "StdDev": "0.200 ms", + "Median": "25.00 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 3bcf02d672..d50d6f1e5f 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-15T00:27:09.503Z", + "timestamp": "2025-11-16T00:30:01.240Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "605.7 ms", - "Error": "6.97 ms", - "StdDev": "6.52 ms", - "Median": "603.9 ms" + "Version": "1.2.0", + "Mean": "567.7 ms", + "Error": "6.04 ms", + "StdDev": "5.65 ms", + "Median": "568.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,177.6 ms", - "Error": "6.85 ms", - "StdDev": "6.41 ms", - "Median": "1,177.8 ms" + "Mean": "1,165.6 ms", + "Error": "6.36 ms", + "StdDev": "5.31 ms", + "Median": "1,165.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,951.3 ms", - "Error": "8.08 ms", - "StdDev": "6.75 ms", - "Median": "2,951.9 ms" + "Mean": "2,964.1 ms", + "Error": "10.50 ms", + "StdDev": "9.82 ms", + "Median": "2,966.5 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,050.0 ms", - "Error": "7.92 ms", - "StdDev": "7.02 ms", - "Median": "3,050.0 ms" + "Mean": "3,035.9 ms", + "Error": "7.74 ms", + "StdDev": "6.47 ms", + "Median": "3,036.5 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "130.9 ms", - "Error": "0.43 ms", - "StdDev": "0.38 ms", - "Median": "130.7 ms" + "Version": "1.2.0", + "Mean": "128.8 ms", + "Error": "0.39 ms", + "StdDev": "0.37 ms", + "Median": "128.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 6e19609d0e..8108fb81dd 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-15T00:27:09.504Z", + "timestamp": "2025-11-16T00:30:01.240Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "563.80 ms", - "Error": "8.024 ms", - "StdDev": "7.113 ms", - "Median": "562.94 ms" + "Version": "1.2.0", + "Mean": "587.68 ms", + "Error": "6.553 ms", + "StdDev": "5.809 ms", + "Median": "588.39 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,538.27 ms", - "Error": "12.437 ms", - "StdDev": "11.633 ms", - "Median": "1,538.35 ms" + "Mean": "1,560.52 ms", + "Error": "10.497 ms", + "StdDev": "9.306 ms", + "Median": "1,557.34 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,497.90 ms", - "Error": "15.778 ms", - "StdDev": "14.759 ms", - "Median": "1,490.67 ms" + "Mean": "1,522.76 ms", + "Error": "11.804 ms", + "StdDev": "9.857 ms", + "Median": "1,519.51 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,579.28 ms", - "Error": "7.991 ms", - "StdDev": "6.673 ms", - "Median": "1,578.51 ms" + "Mean": "1,618.75 ms", + "Error": "10.361 ms", + "StdDev": "8.652 ms", + "Median": "1,615.45 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "78.71 ms", - "Error": "0.450 ms", - "StdDev": "0.421 ms", - "Median": "78.69 ms" + "Version": "1.2.0", + "Mean": "80.22 ms", + "Error": "0.387 ms", + "StdDev": "0.343 ms", + "Median": "80.11 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index a9d04333a3..be54358cac 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-15T00:27:09.504Z", + "timestamp": "2025-11-16T00:30:01.240Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "484.97 ms", - "Error": "4.275 ms", - "StdDev": "3.999 ms", - "Median": "485.22 ms" + "Version": "1.2.0", + "Mean": "526.00 ms", + "Error": "5.581 ms", + "StdDev": "5.220 ms", + "Median": "526.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "676.90 ms", - "Error": "11.083 ms", - "StdDev": "10.367 ms", - "Median": "675.21 ms" + "Mean": "619.91 ms", + "Error": "12.303 ms", + "StdDev": "28.759 ms", + "Median": "616.01 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "659.56 ms", - "Error": "5.537 ms", - "StdDev": "4.624 ms", - "Median": "659.58 ms" + "Mean": "615.62 ms", + "Error": "11.361 ms", + "StdDev": "21.339 ms", + "Median": "614.08 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "676.88 ms", - "Error": "10.968 ms", - "StdDev": "10.260 ms", - "Median": "673.98 ms" + "Mean": "614.08 ms", + "Error": "12.161 ms", + "StdDev": "16.235 ms", + "Median": "614.08 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "48.50 ms", - "Error": "1.211 ms", - "StdDev": "3.553 ms", - "Median": "48.84 ms" + "Version": "1.2.0", + "Mean": "46.63 ms", + "Error": "1.187 ms", + "StdDev": "3.501 ms", + "Median": "46.83 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 51c9a4f9cb..0c437005a5 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,47 +1,47 @@ { - "timestamp": "2025-11-15T00:27:09.504Z", + "timestamp": "2025-11-16T00:30:01.241Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "540.2 ms", - "Error": "6.24 ms", - "StdDev": "5.84 ms", - "Median": "540.7 ms" + "Version": "1.2.0", + "Mean": "567.7 ms", + "Error": "8.32 ms", + "StdDev": "7.78 ms", + "Median": "566.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,160.3 ms", - "Error": "12.08 ms", - "StdDev": "10.70 ms", - "Median": "1,156.8 ms" + "Mean": "1,135.4 ms", + "Error": "12.01 ms", + "StdDev": "10.64 ms", + "Median": "1,134.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,133.4 ms", - "Error": "7.01 ms", - "StdDev": "5.85 ms", - "Median": "1,131.4 ms" + "Mean": "1,114.5 ms", + "Error": "8.93 ms", + "StdDev": "8.36 ms", + "Median": "1,114.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,219.9 ms", - "Error": "20.44 ms", - "StdDev": "19.12 ms", - "Median": "1,218.4 ms" + "Mean": "1,194.5 ms", + "Error": "9.17 ms", + "StdDev": "8.58 ms", + "Median": "1,193.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", + "Version": "1.2.0", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 736dfcee0b..51c8b30c35 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -42,5 +42,9 @@ { "date": "2025-11-15", "environment": "Ubuntu" + }, + { + "date": "2025-11-16", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index a7bd0c8dea..ba84d8ce5b 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,257 +1,257 @@ { - "timestamp": "2025-11-15T00:27:09.505Z", + "timestamp": "2025-11-16T00:30:01.241Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { "AsyncTests": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "546.4 ms", - "Error": "4.30 ms", - "StdDev": "3.82 ms", - "Median": "546.3 ms" + "Version": "1.2.0", + "Mean": "565.8 ms", + "Error": "3.92 ms", + "StdDev": "3.67 ms", + "Median": "565.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "647.1 ms", - "Error": "9.66 ms", - "StdDev": "9.04 ms", - "Median": "642.5 ms" + "Mean": "647.2 ms", + "Error": "6.44 ms", + "StdDev": "5.71 ms", + "Median": "646.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "616.6 ms", - "Error": "8.04 ms", - "StdDev": "7.52 ms", - "Median": "617.2 ms" + "Mean": "620.4 ms", + "Error": "9.12 ms", + "StdDev": "8.09 ms", + "Median": "618.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "693.2 ms", - "Error": "5.53 ms", - "StdDev": "5.17 ms", - "Median": "692.8 ms" + "Mean": "712.3 ms", + "Error": "11.89 ms", + "StdDev": "11.12 ms", + "Median": "712.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "123.7 ms", - "Error": "0.41 ms", - "StdDev": "0.39 ms", - "Median": "123.7 ms" + "Version": "1.2.0", + "Mean": "125.3 ms", + "Error": "0.31 ms", + "StdDev": "0.28 ms", + "Median": "125.3 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "493.28 ms", - "Error": "5.855 ms", - "StdDev": "5.477 ms", - "Median": "491.72 ms" + "Version": "1.2.0", + "Mean": "472.15 ms", + "Error": "6.122 ms", + "StdDev": "5.427 ms", + "Median": "472.07 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "527.71 ms", - "Error": "7.480 ms", - "StdDev": "6.631 ms", - "Median": "528.80 ms" + "Mean": "573.40 ms", + "Error": "9.950 ms", + "StdDev": "8.309 ms", + "Median": "571.78 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "499.80 ms", - "Error": "9.877 ms", - "StdDev": "18.060 ms", - "Median": "496.67 ms" + "Mean": "592.88 ms", + "Error": "10.607 ms", + "StdDev": "9.922 ms", + "Median": "592.10 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "571.43 ms", - "Error": "11.164 ms", - "StdDev": "9.897 ms", - "Median": "570.30 ms" + "Mean": "591.10 ms", + "Error": "11.196 ms", + "StdDev": "10.996 ms", + "Median": "591.00 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "24.09 ms", - "Error": "0.165 ms", - "StdDev": "0.146 ms", - "Median": "24.07 ms" + "Version": "1.2.0", + "Mean": "25.00 ms", + "Error": "0.213 ms", + "StdDev": "0.200 ms", + "Median": "25.00 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "605.7 ms", - "Error": "6.97 ms", - "StdDev": "6.52 ms", - "Median": "603.9 ms" + "Version": "1.2.0", + "Mean": "567.7 ms", + "Error": "6.04 ms", + "StdDev": "5.65 ms", + "Median": "568.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,177.6 ms", - "Error": "6.85 ms", - "StdDev": "6.41 ms", - "Median": "1,177.8 ms" + "Mean": "1,165.6 ms", + "Error": "6.36 ms", + "StdDev": "5.31 ms", + "Median": "1,165.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,951.3 ms", - "Error": "8.08 ms", - "StdDev": "6.75 ms", - "Median": "2,951.9 ms" + "Mean": "2,964.1 ms", + "Error": "10.50 ms", + "StdDev": "9.82 ms", + "Median": "2,966.5 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,050.0 ms", - "Error": "7.92 ms", - "StdDev": "7.02 ms", - "Median": "3,050.0 ms" + "Mean": "3,035.9 ms", + "Error": "7.74 ms", + "StdDev": "6.47 ms", + "Median": "3,036.5 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "130.9 ms", - "Error": "0.43 ms", - "StdDev": "0.38 ms", - "Median": "130.7 ms" + "Version": "1.2.0", + "Mean": "128.8 ms", + "Error": "0.39 ms", + "StdDev": "0.37 ms", + "Median": "128.8 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "563.80 ms", - "Error": "8.024 ms", - "StdDev": "7.113 ms", - "Median": "562.94 ms" + "Version": "1.2.0", + "Mean": "587.68 ms", + "Error": "6.553 ms", + "StdDev": "5.809 ms", + "Median": "588.39 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,538.27 ms", - "Error": "12.437 ms", - "StdDev": "11.633 ms", - "Median": "1,538.35 ms" + "Mean": "1,560.52 ms", + "Error": "10.497 ms", + "StdDev": "9.306 ms", + "Median": "1,557.34 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,497.90 ms", - "Error": "15.778 ms", - "StdDev": "14.759 ms", - "Median": "1,490.67 ms" + "Mean": "1,522.76 ms", + "Error": "11.804 ms", + "StdDev": "9.857 ms", + "Median": "1,519.51 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,579.28 ms", - "Error": "7.991 ms", - "StdDev": "6.673 ms", - "Median": "1,578.51 ms" + "Mean": "1,618.75 ms", + "Error": "10.361 ms", + "StdDev": "8.652 ms", + "Median": "1,615.45 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "78.71 ms", - "Error": "0.450 ms", - "StdDev": "0.421 ms", - "Median": "78.69 ms" + "Version": "1.2.0", + "Mean": "80.22 ms", + "Error": "0.387 ms", + "StdDev": "0.343 ms", + "Median": "80.11 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "484.97 ms", - "Error": "4.275 ms", - "StdDev": "3.999 ms", - "Median": "485.22 ms" + "Version": "1.2.0", + "Mean": "526.00 ms", + "Error": "5.581 ms", + "StdDev": "5.220 ms", + "Median": "526.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "676.90 ms", - "Error": "11.083 ms", - "StdDev": "10.367 ms", - "Median": "675.21 ms" + "Mean": "619.91 ms", + "Error": "12.303 ms", + "StdDev": "28.759 ms", + "Median": "616.01 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "659.56 ms", - "Error": "5.537 ms", - "StdDev": "4.624 ms", - "Median": "659.58 ms" + "Mean": "615.62 ms", + "Error": "11.361 ms", + "StdDev": "21.339 ms", + "Median": "614.08 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "676.88 ms", - "Error": "10.968 ms", - "StdDev": "10.260 ms", - "Median": "673.98 ms" + "Mean": "614.08 ms", + "Error": "12.161 ms", + "StdDev": "16.235 ms", + "Median": "614.08 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", - "Mean": "48.50 ms", - "Error": "1.211 ms", - "StdDev": "3.553 ms", - "Median": "48.84 ms" + "Version": "1.2.0", + "Mean": "46.63 ms", + "Error": "1.187 ms", + "StdDev": "3.501 ms", + "Median": "46.83 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.1.10", - "Mean": "540.2 ms", - "Error": "6.24 ms", - "StdDev": "5.84 ms", - "Median": "540.7 ms" + "Version": "1.2.0", + "Mean": "567.7 ms", + "Error": "8.32 ms", + "StdDev": "7.78 ms", + "Median": "566.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,160.3 ms", - "Error": "12.08 ms", - "StdDev": "10.70 ms", - "Median": "1,156.8 ms" + "Mean": "1,135.4 ms", + "Error": "12.01 ms", + "StdDev": "10.64 ms", + "Median": "1,134.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,133.4 ms", - "Error": "7.01 ms", - "StdDev": "5.85 ms", - "Median": "1,131.4 ms" + "Mean": "1,114.5 ms", + "Error": "8.93 ms", + "StdDev": "8.36 ms", + "Median": "1,114.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,219.9 ms", - "Error": "20.44 ms", - "StdDev": "19.12 ms", - "Median": "1,218.4 ms" + "Mean": "1,194.5 ms", + "Error": "9.17 ms", + "StdDev": "8.58 ms", + "Median": "1,193.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.10", + "Version": "1.2.0", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.1.10", - "Mean": "2.104 s", - "Error": "0.0409 s", - "StdDev": "0.0487 s", - "Median": "2.097 s" + "Version": "1.2.0", + "Mean": "2.003 s", + "Error": "0.0164 s", + "StdDev": "0.0153 s", + "Median": "1.999 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.658 s", - "Error": "0.0277 s", - "StdDev": "0.0272 s", - "Median": "1.652 s" + "Mean": "1.612 s", + "Error": "0.0302 s", + "StdDev": "0.0296 s", + "Median": "1.610 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.751 s", - "Error": "0.0339 s", - "StdDev": "0.0404 s", - "Median": "1.748 s" + "Mean": "1.681 s", + "Error": "0.0176 s", + "StdDev": "0.0164 s", + "Median": "1.680 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.643 s", - "Error": "0.0230 s", - "StdDev": "0.0204 s", - "Median": "1.644 s" + "Mean": "1.585 s", + "Error": "0.0224 s", + "StdDev": "0.0210 s", + "Median": "1.582 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-15T00:27:09.502Z" + "lastUpdated": "2025-11-16T00:30:01.238Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 435c36799e..f51fb29b33 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-15", + "timestamp": "2025-11-16", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 7d002a2db8b1ede155de7046c43d7bfb09346952 Mon Sep 17 00:00:00 2001 From: kzrnm Date: Mon, 17 Nov 2025 02:02:53 +0900 Subject: [PATCH 055/192] feat: update GitHubReporter to use HTML tables instead of Markdown tables (#3859) --- TUnit.Engine/Reporters/GitHubReporter.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/TUnit.Engine/Reporters/GitHubReporter.cs b/TUnit.Engine/Reporters/GitHubReporter.cs index 69deaedac5..ab8a2ace43 100644 --- a/TUnit.Engine/Reporters/GitHubReporter.cs +++ b/TUnit.Engine/Reporters/GitHubReporter.cs @@ -173,8 +173,9 @@ public Task AfterRunAsync(int exitCode, CancellationToken cancellation) detailsBuilder.AppendLine(); detailsBuilder.AppendLine("### Details"); detailsBuilder.AppendLine(); - detailsBuilder.AppendLine("| Test | Status | Details | Duration |"); - detailsBuilder.AppendLine("| --- | --- | --- | --- |"); + detailsBuilder.AppendLine(""""""); + detailsBuilder.AppendLine(""); + detailsBuilder.AppendLine(""); foreach (var testNodeUpdateMessage in last.Values) { @@ -191,14 +192,20 @@ public Task AfterRunAsync(int exitCode, CancellationToken cancellation) var status = GetStatus(stateProperty); - var details = GetDetails(stateProperty, testNodeUpdateMessage.TestNode.Properties).Replace("\n", "
"); + var details = GetDetails(stateProperty, testNodeUpdateMessage.TestNode.Properties); var timingProperty = testNodeUpdateMessage.TestNode.Properties.AsEnumerable().OfType().FirstOrDefault(); var duration = timingProperty?.GlobalTiming.Duration; - detailsBuilder.AppendLine($"| {name} | {status} | {details} | {duration} |"); + detailsBuilder.AppendLine(""); + detailsBuilder.AppendLine($""); + detailsBuilder.AppendLine($""); + detailsBuilder.AppendLine($""); + detailsBuilder.AppendLine($""); + detailsBuilder.AppendLine(""); } + detailsBuilder.AppendLine("
TestStatusDetailsDuration
{name}{status}{details}{duration}
"); // Wrap in collapsible section if using collapsible style if (_reporterStyle == GitHubReporterStyle.Collapsible) From d8fa57d4ffe8b1a40b0a6dc2a8727d24464af4b6 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:28:45 +0000 Subject: [PATCH 056/192] chore(deps): update tunit to 1.2.3 (#3861) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f7ebc259bd..62e3564e91 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 966217ce72..d2e029d0c6 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index d71fa475b1..905a5dd8b7 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 29270c3a6f..107780bda0 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 2750f80878..bbe3ede435 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 77c58677aa..1751db5e8c 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 5e661fc20e..ee11fb3565 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 16d50df436..548b07f51c 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index f7c72ad4f5..b49bdc3b89 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 2461771b8016f147653f4b9f9186f8128fce79ec Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 17 Nov 2025 00:29:23 +0000 Subject: [PATCH 057/192] chore: update benchmark results (#3862) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 46 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 46 +-- .../benchmarks/MassiveParallelTests.json | 46 +-- docs/static/benchmarks/MatrixTests.json | 46 +-- docs/static/benchmarks/ScaleTests.json | 46 +-- .../static/benchmarks/SetupTeardownTests.json | 38 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 294 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 368 insertions(+), 364 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 152246dad5..65c0986e55 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 565.8 ms | 565.3 ms | 3.67 ms | -| NUnit | 4.4.0 | 647.2 ms | 646.3 ms | 5.71 ms | -| MSTest | 4.0.2 | 620.4 ms | 618.3 ms | 8.09 ms | -| xUnit3 | 3.2.0 | 712.3 ms | 712.0 ms | 11.12 ms | -| **TUnit (AOT)** | 1.2.0 | 125.3 ms | 125.3 ms | 0.28 ms | +| **TUnit** | 1.2.3 | 572.1 ms | 571.8 ms | 2.01 ms | +| NUnit | 4.4.0 | 696.5 ms | 695.9 ms | 6.14 ms | +| MSTest | 4.0.2 | 666.7 ms | 666.2 ms | 5.78 ms | +| xUnit3 | 3.2.0 | 742.0 ms | 742.6 ms | 4.27 ms | +| **TUnit (AOT)** | 1.2.3 | 124.2 ms | 124.1 ms | 0.46 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 855 - bar [565.8, 647.2, 620.4, 712.3, 125.3] + y-axis "Time (ms)" 0 --> 891 + bar [572.1, 696.5, 666.7, 742, 124.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.239Z* +*Last generated: 2025-11-17T00:29:04.102Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 20967452e6..79260c2c6a 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 2.003 s | 1.999 s | 0.0153 s | -| Build_NUnit | 4.4.0 | 1.612 s | 1.610 s | 0.0296 s | -| Build_MSTest | 4.0.2 | 1.681 s | 1.680 s | 0.0164 s | -| Build_xUnit3 | 3.2.0 | 1.585 s | 1.582 s | 0.0210 s | +| **TUnit** | 1.2.3 | 2.046 s | 2.041 s | 0.0255 s | +| Build_NUnit | 4.4.0 | 1.657 s | 1.655 s | 0.0286 s | +| Build_MSTest | 4.0.2 | 1.743 s | 1.744 s | 0.0212 s | +| Build_xUnit3 | 3.2.0 | 1.640 s | 1.638 s | 0.0151 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.003, 1.612, 1.681, 1.585] + bar [2.046, 1.657, 1.743, 1.64] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.241Z* +*Last generated: 2025-11-17T00:29:04.104Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 5cc4ffb92f..c7beba2cee 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 472.15 ms | 472.07 ms | 5.427 ms | -| NUnit | 4.4.0 | 573.40 ms | 571.78 ms | 8.309 ms | -| MSTest | 4.0.2 | 592.88 ms | 592.10 ms | 9.922 ms | -| xUnit3 | 3.2.0 | 591.10 ms | 591.00 ms | 10.996 ms | -| **TUnit (AOT)** | 1.2.0 | 25.00 ms | 25.00 ms | 0.200 ms | +| **TUnit** | 1.2.3 | 507.19 ms | 507.75 ms | 5.647 ms | +| NUnit | 4.4.0 | 537.32 ms | 536.59 ms | 8.966 ms | +| MSTest | 4.0.2 | 504.77 ms | 506.26 ms | 9.497 ms | +| xUnit3 | 3.2.0 | 586.00 ms | 585.07 ms | 9.163 ms | +| **TUnit (AOT)** | 1.2.3 | 24.73 ms | 24.76 ms | 0.142 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 712 - bar [472.15, 573.4, 592.88, 591.1, 25] + y-axis "Time (ms)" 0 --> 704 + bar [507.19, 537.32, 504.77, 586, 24.73] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.239Z* +*Last generated: 2025-11-17T00:29:04.102Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index cc4af7feab..f06a769496 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 567.7 ms | 568.3 ms | 5.65 ms | -| NUnit | 4.4.0 | 1,165.6 ms | 1,165.9 ms | 5.31 ms | -| MSTest | 4.0.2 | 2,964.1 ms | 2,966.5 ms | 9.82 ms | -| xUnit3 | 3.2.0 | 3,035.9 ms | 3,036.5 ms | 6.47 ms | -| **TUnit (AOT)** | 1.2.0 | 128.8 ms | 128.8 ms | 0.37 ms | +| **TUnit** | 1.2.3 | 580.3 ms | 579.7 ms | 3.05 ms | +| NUnit | 4.4.0 | 1,199.9 ms | 1,199.0 ms | 7.89 ms | +| MSTest | 4.0.2 | 3,002.4 ms | 3,000.7 ms | 8.30 ms | +| xUnit3 | 3.2.0 | 3,080.0 ms | 3,078.2 ms | 7.99 ms | +| **TUnit (AOT)** | 1.2.3 | 130.5 ms | 130.4 ms | 0.45 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3644 - bar [567.7, 1165.6, 2964.1, 3035.9, 128.8] + y-axis "Time (ms)" 0 --> 3696 + bar [580.3, 1199.9, 3002.4, 3080, 130.5] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.240Z* +*Last generated: 2025-11-17T00:29:04.102Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 4fb0d2f8a5..ac198f558f 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 587.68 ms | 588.39 ms | 5.809 ms | -| NUnit | 4.4.0 | 1,560.52 ms | 1,557.34 ms | 9.306 ms | -| MSTest | 4.0.2 | 1,522.76 ms | 1,519.51 ms | 9.857 ms | -| xUnit3 | 3.2.0 | 1,618.75 ms | 1,615.45 ms | 8.652 ms | -| **TUnit (AOT)** | 1.2.0 | 80.22 ms | 80.11 ms | 0.343 ms | +| **TUnit** | 1.2.3 | 567.17 ms | 565.30 ms | 5.174 ms | +| NUnit | 4.4.0 | 1,552.19 ms | 1,551.63 ms | 4.500 ms | +| MSTest | 4.0.2 | 1,523.45 ms | 1,522.39 ms | 14.764 ms | +| xUnit3 | 3.2.0 | 1,607.93 ms | 1,606.94 ms | 15.902 ms | +| **TUnit (AOT)** | 1.2.3 | 79.51 ms | 79.48 ms | 0.251 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1943 - bar [587.68, 1560.52, 1522.76, 1618.75, 80.22] + y-axis "Time (ms)" 0 --> 1930 + bar [567.17, 1552.19, 1523.45, 1607.93, 79.51] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.240Z* +*Last generated: 2025-11-17T00:29:04.103Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index d582c6831d..d229307af8 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 526.00 ms | 526.16 ms | 5.220 ms | -| NUnit | 4.4.0 | 619.91 ms | 616.01 ms | 28.759 ms | -| MSTest | 4.0.2 | 615.62 ms | 614.08 ms | 21.339 ms | -| xUnit3 | 3.2.0 | 614.08 ms | 614.08 ms | 16.235 ms | -| **TUnit (AOT)** | 1.2.0 | 46.63 ms | 46.83 ms | 3.501 ms | +| **TUnit** | 1.2.3 | 524.89 ms | 524.09 ms | 5.578 ms | +| NUnit | 4.4.0 | 577.30 ms | 578.87 ms | 6.118 ms | +| MSTest | 4.0.2 | 501.88 ms | 501.83 ms | 13.036 ms | +| xUnit3 | 3.2.0 | 576.33 ms | 573.62 ms | 9.545 ms | +| **TUnit (AOT)** | 1.2.3 | 45.60 ms | 45.71 ms | 3.635 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 744 - bar [526, 619.91, 615.62, 614.08, 46.63] + y-axis "Time (ms)" 0 --> 693 + bar [524.89, 577.3, 501.88, 576.33, 45.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.240Z* +*Last generated: 2025-11-17T00:29:04.103Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 37623791c6..fefdeeedc8 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-16** from the latest CI run. +This benchmark was automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.0 | 567.7 ms | 566.9 ms | 7.78 ms | -| NUnit | 4.4.0 | 1,135.4 ms | 1,134.9 ms | 10.64 ms | -| MSTest | 4.0.2 | 1,114.5 ms | 1,114.7 ms | 8.36 ms | -| xUnit3 | 3.2.0 | 1,194.5 ms | 1,193.0 ms | 8.58 ms | -| **TUnit (AOT)** | 1.2.0 | NA | NA | NA | +| **TUnit** | 1.2.3 | 585.9 ms | 585.4 ms | 3.06 ms | +| NUnit | 4.4.0 | 1,159.2 ms | 1,161.2 ms | 4.69 ms | +| MSTest | 4.0.2 | 1,139.4 ms | 1,140.1 ms | 9.12 ms | +| xUnit3 | 3.2.0 | 1,216.8 ms | 1,216.2 ms | 5.74 ms | +| **TUnit (AOT)** | 1.2.3 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-16** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1434 - bar [567.7, 1135.4, 1114.5, 1194.5, 0] + y-axis "Time (ms)" 0 --> 1461 + bar [585.9, 1159.2, 1139.4, 1216.8, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-16T00:30:01.241Z* +*Last generated: 2025-11-17T00:29:04.103Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 931f739ce4..575817362c 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-16** from the latest CI run. +These benchmarks were automatically generated on **2025-11-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.2.0 | +| **TUnit** | 1.2.3 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-16T00:30:01.241Z* +*Last generated: 2025-11-17T00:29:04.104Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 80d258bc04..5a0c8447db 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.239Z", + "timestamp": "2025-11-17T00:29:04.102Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "565.8 ms", - "Error": "3.92 ms", - "StdDev": "3.67 ms", - "Median": "565.3 ms" + "Version": "1.2.3", + "Mean": "572.1 ms", + "Error": "2.41 ms", + "StdDev": "2.01 ms", + "Median": "571.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "647.2 ms", - "Error": "6.44 ms", - "StdDev": "5.71 ms", - "Median": "646.3 ms" + "Mean": "696.5 ms", + "Error": "7.35 ms", + "StdDev": "6.14 ms", + "Median": "695.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "620.4 ms", - "Error": "9.12 ms", - "StdDev": "8.09 ms", - "Median": "618.3 ms" + "Mean": "666.7 ms", + "Error": "6.92 ms", + "StdDev": "5.78 ms", + "Median": "666.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "712.3 ms", - "Error": "11.89 ms", - "StdDev": "11.12 ms", - "Median": "712.0 ms" + "Mean": "742.0 ms", + "Error": "4.82 ms", + "StdDev": "4.27 ms", + "Median": "742.6 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "125.3 ms", - "Error": "0.31 ms", - "StdDev": "0.28 ms", - "Median": "125.3 ms" + "Version": "1.2.3", + "Mean": "124.2 ms", + "Error": "0.49 ms", + "StdDev": "0.46 ms", + "Median": "124.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 5ceec4bc66..f9edf1e8b3 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.241Z", + "timestamp": "2025-11-17T00:29:04.104Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,35 +9,35 @@ "results": [ { "Method": "Build_TUnit", - "Version": "1.2.0", - "Mean": "2.003 s", - "Error": "0.0164 s", - "StdDev": "0.0153 s", - "Median": "1.999 s" + "Version": "1.2.3", + "Mean": "2.046 s", + "Error": "0.0272 s", + "StdDev": "0.0255 s", + "Median": "2.041 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.612 s", - "Error": "0.0302 s", - "StdDev": "0.0296 s", - "Median": "1.610 s" + "Mean": "1.657 s", + "Error": "0.0306 s", + "StdDev": "0.0286 s", + "Median": "1.655 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.681 s", - "Error": "0.0176 s", - "StdDev": "0.0164 s", - "Median": "1.680 s" + "Mean": "1.743 s", + "Error": "0.0239 s", + "StdDev": "0.0212 s", + "Median": "1.744 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.585 s", - "Error": "0.0224 s", - "StdDev": "0.0210 s", - "Median": "1.582 s" + "Mean": "1.640 s", + "Error": "0.0162 s", + "StdDev": "0.0151 s", + "Median": "1.638 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 66bb4e6cac..55272c5497 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.239Z", + "timestamp": "2025-11-17T00:29:04.102Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "472.15 ms", - "Error": "6.122 ms", - "StdDev": "5.427 ms", - "Median": "472.07 ms" + "Version": "1.2.3", + "Mean": "507.19 ms", + "Error": "6.037 ms", + "StdDev": "5.647 ms", + "Median": "507.75 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "573.40 ms", - "Error": "9.950 ms", - "StdDev": "8.309 ms", - "Median": "571.78 ms" + "Mean": "537.32 ms", + "Error": "10.114 ms", + "StdDev": "8.966 ms", + "Median": "536.59 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "592.88 ms", - "Error": "10.607 ms", - "StdDev": "9.922 ms", - "Median": "592.10 ms" + "Mean": "504.77 ms", + "Error": "9.670 ms", + "StdDev": "9.497 ms", + "Median": "506.26 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "591.10 ms", - "Error": "11.196 ms", - "StdDev": "10.996 ms", - "Median": "591.00 ms" + "Mean": "586.00 ms", + "Error": "10.336 ms", + "StdDev": "9.163 ms", + "Median": "585.07 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "25.00 ms", - "Error": "0.213 ms", - "StdDev": "0.200 ms", - "Median": "25.00 ms" + "Version": "1.2.3", + "Mean": "24.73 ms", + "Error": "0.152 ms", + "StdDev": "0.142 ms", + "Median": "24.76 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index d50d6f1e5f..48a451c377 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.240Z", + "timestamp": "2025-11-17T00:29:04.103Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "567.7 ms", - "Error": "6.04 ms", - "StdDev": "5.65 ms", - "Median": "568.3 ms" + "Version": "1.2.3", + "Mean": "580.3 ms", + "Error": "3.44 ms", + "StdDev": "3.05 ms", + "Median": "579.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,165.6 ms", - "Error": "6.36 ms", - "StdDev": "5.31 ms", - "Median": "1,165.9 ms" + "Mean": "1,199.9 ms", + "Error": "8.90 ms", + "StdDev": "7.89 ms", + "Median": "1,199.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,964.1 ms", - "Error": "10.50 ms", - "StdDev": "9.82 ms", - "Median": "2,966.5 ms" + "Mean": "3,002.4 ms", + "Error": "9.36 ms", + "StdDev": "8.30 ms", + "Median": "3,000.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,035.9 ms", - "Error": "7.74 ms", - "StdDev": "6.47 ms", - "Median": "3,036.5 ms" + "Mean": "3,080.0 ms", + "Error": "8.54 ms", + "StdDev": "7.99 ms", + "Median": "3,078.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "128.8 ms", - "Error": "0.39 ms", - "StdDev": "0.37 ms", - "Median": "128.8 ms" + "Version": "1.2.3", + "Mean": "130.5 ms", + "Error": "0.48 ms", + "StdDev": "0.45 ms", + "Median": "130.4 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 8108fb81dd..40e8dd9c42 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.240Z", + "timestamp": "2025-11-17T00:29:04.103Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "587.68 ms", - "Error": "6.553 ms", - "StdDev": "5.809 ms", - "Median": "588.39 ms" + "Version": "1.2.3", + "Mean": "567.17 ms", + "Error": "5.532 ms", + "StdDev": "5.174 ms", + "Median": "565.30 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,560.52 ms", - "Error": "10.497 ms", - "StdDev": "9.306 ms", - "Median": "1,557.34 ms" + "Mean": "1,552.19 ms", + "Error": "5.388 ms", + "StdDev": "4.500 ms", + "Median": "1,551.63 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,522.76 ms", - "Error": "11.804 ms", - "StdDev": "9.857 ms", - "Median": "1,519.51 ms" + "Mean": "1,523.45 ms", + "Error": "17.681 ms", + "StdDev": "14.764 ms", + "Median": "1,522.39 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,618.75 ms", - "Error": "10.361 ms", - "StdDev": "8.652 ms", - "Median": "1,615.45 ms" + "Mean": "1,607.93 ms", + "Error": "17.000 ms", + "StdDev": "15.902 ms", + "Median": "1,606.94 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "80.22 ms", - "Error": "0.387 ms", - "StdDev": "0.343 ms", - "Median": "80.11 ms" + "Version": "1.2.3", + "Mean": "79.51 ms", + "Error": "0.269 ms", + "StdDev": "0.251 ms", + "Median": "79.48 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index be54358cac..8b93e3c061 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.240Z", + "timestamp": "2025-11-17T00:29:04.103Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "526.00 ms", - "Error": "5.581 ms", - "StdDev": "5.220 ms", - "Median": "526.16 ms" + "Version": "1.2.3", + "Mean": "524.89 ms", + "Error": "5.963 ms", + "StdDev": "5.578 ms", + "Median": "524.09 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "619.91 ms", - "Error": "12.303 ms", - "StdDev": "28.759 ms", - "Median": "616.01 ms" + "Mean": "577.30 ms", + "Error": "7.326 ms", + "StdDev": "6.118 ms", + "Median": "578.87 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.62 ms", - "Error": "11.361 ms", - "StdDev": "21.339 ms", - "Median": "614.08 ms" + "Mean": "501.88 ms", + "Error": "9.090 ms", + "StdDev": "13.036 ms", + "Median": "501.83 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "614.08 ms", - "Error": "12.161 ms", - "StdDev": "16.235 ms", - "Median": "614.08 ms" + "Mean": "576.33 ms", + "Error": "10.205 ms", + "StdDev": "9.545 ms", + "Median": "573.62 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "46.63 ms", - "Error": "1.187 ms", - "StdDev": "3.501 ms", - "Median": "46.83 ms" + "Version": "1.2.3", + "Mean": "45.60 ms", + "Error": "1.239 ms", + "StdDev": "3.635 ms", + "Median": "45.71 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 0c437005a5..ed69b9c0e9 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.241Z", + "timestamp": "2025-11-17T00:29:04.104Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,39 +9,39 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "567.7 ms", - "Error": "8.32 ms", - "StdDev": "7.78 ms", - "Median": "566.9 ms" + "Version": "1.2.3", + "Mean": "585.9 ms", + "Error": "3.28 ms", + "StdDev": "3.06 ms", + "Median": "585.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,135.4 ms", - "Error": "12.01 ms", - "StdDev": "10.64 ms", - "Median": "1,134.9 ms" + "Mean": "1,159.2 ms", + "Error": "5.29 ms", + "StdDev": "4.69 ms", + "Median": "1,161.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,114.5 ms", - "Error": "8.93 ms", - "StdDev": "8.36 ms", - "Median": "1,114.7 ms" + "Mean": "1,139.4 ms", + "Error": "9.75 ms", + "StdDev": "9.12 ms", + "Median": "1,140.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,194.5 ms", - "Error": "9.17 ms", - "StdDev": "8.58 ms", - "Median": "1,193.0 ms" + "Mean": "1,216.8 ms", + "Error": "6.48 ms", + "StdDev": "5.74 ms", + "Median": "1,216.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", + "Version": "1.2.3", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 51c8b30c35..d7b44bbe49 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -46,5 +46,9 @@ { "date": "2025-11-16", "environment": "Ubuntu" + }, + { + "date": "2025-11-17", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index ba84d8ce5b..51a9a35af6 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-16T00:30:01.241Z", + "timestamp": "2025-11-17T00:29:04.104Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "565.8 ms", - "Error": "3.92 ms", - "StdDev": "3.67 ms", - "Median": "565.3 ms" + "Version": "1.2.3", + "Mean": "572.1 ms", + "Error": "2.41 ms", + "StdDev": "2.01 ms", + "Median": "571.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "647.2 ms", - "Error": "6.44 ms", - "StdDev": "5.71 ms", - "Median": "646.3 ms" + "Mean": "696.5 ms", + "Error": "7.35 ms", + "StdDev": "6.14 ms", + "Median": "695.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "620.4 ms", - "Error": "9.12 ms", - "StdDev": "8.09 ms", - "Median": "618.3 ms" + "Mean": "666.7 ms", + "Error": "6.92 ms", + "StdDev": "5.78 ms", + "Median": "666.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "712.3 ms", - "Error": "11.89 ms", - "StdDev": "11.12 ms", - "Median": "712.0 ms" + "Mean": "742.0 ms", + "Error": "4.82 ms", + "StdDev": "4.27 ms", + "Median": "742.6 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "125.3 ms", - "Error": "0.31 ms", - "StdDev": "0.28 ms", - "Median": "125.3 ms" + "Version": "1.2.3", + "Mean": "124.2 ms", + "Error": "0.49 ms", + "StdDev": "0.46 ms", + "Median": "124.1 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "472.15 ms", - "Error": "6.122 ms", - "StdDev": "5.427 ms", - "Median": "472.07 ms" + "Version": "1.2.3", + "Mean": "507.19 ms", + "Error": "6.037 ms", + "StdDev": "5.647 ms", + "Median": "507.75 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "573.40 ms", - "Error": "9.950 ms", - "StdDev": "8.309 ms", - "Median": "571.78 ms" + "Mean": "537.32 ms", + "Error": "10.114 ms", + "StdDev": "8.966 ms", + "Median": "536.59 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "592.88 ms", - "Error": "10.607 ms", - "StdDev": "9.922 ms", - "Median": "592.10 ms" + "Mean": "504.77 ms", + "Error": "9.670 ms", + "StdDev": "9.497 ms", + "Median": "506.26 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "591.10 ms", - "Error": "11.196 ms", - "StdDev": "10.996 ms", - "Median": "591.00 ms" + "Mean": "586.00 ms", + "Error": "10.336 ms", + "StdDev": "9.163 ms", + "Median": "585.07 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "25.00 ms", - "Error": "0.213 ms", - "StdDev": "0.200 ms", - "Median": "25.00 ms" + "Version": "1.2.3", + "Mean": "24.73 ms", + "Error": "0.152 ms", + "StdDev": "0.142 ms", + "Median": "24.76 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "567.7 ms", - "Error": "6.04 ms", - "StdDev": "5.65 ms", - "Median": "568.3 ms" + "Version": "1.2.3", + "Mean": "580.3 ms", + "Error": "3.44 ms", + "StdDev": "3.05 ms", + "Median": "579.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,165.6 ms", - "Error": "6.36 ms", - "StdDev": "5.31 ms", - "Median": "1,165.9 ms" + "Mean": "1,199.9 ms", + "Error": "8.90 ms", + "StdDev": "7.89 ms", + "Median": "1,199.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,964.1 ms", - "Error": "10.50 ms", - "StdDev": "9.82 ms", - "Median": "2,966.5 ms" + "Mean": "3,002.4 ms", + "Error": "9.36 ms", + "StdDev": "8.30 ms", + "Median": "3,000.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,035.9 ms", - "Error": "7.74 ms", - "StdDev": "6.47 ms", - "Median": "3,036.5 ms" + "Mean": "3,080.0 ms", + "Error": "8.54 ms", + "StdDev": "7.99 ms", + "Median": "3,078.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "128.8 ms", - "Error": "0.39 ms", - "StdDev": "0.37 ms", - "Median": "128.8 ms" + "Version": "1.2.3", + "Mean": "130.5 ms", + "Error": "0.48 ms", + "StdDev": "0.45 ms", + "Median": "130.4 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "587.68 ms", - "Error": "6.553 ms", - "StdDev": "5.809 ms", - "Median": "588.39 ms" + "Version": "1.2.3", + "Mean": "567.17 ms", + "Error": "5.532 ms", + "StdDev": "5.174 ms", + "Median": "565.30 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,560.52 ms", - "Error": "10.497 ms", - "StdDev": "9.306 ms", - "Median": "1,557.34 ms" + "Mean": "1,552.19 ms", + "Error": "5.388 ms", + "StdDev": "4.500 ms", + "Median": "1,551.63 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,522.76 ms", - "Error": "11.804 ms", - "StdDev": "9.857 ms", - "Median": "1,519.51 ms" + "Mean": "1,523.45 ms", + "Error": "17.681 ms", + "StdDev": "14.764 ms", + "Median": "1,522.39 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,618.75 ms", - "Error": "10.361 ms", - "StdDev": "8.652 ms", - "Median": "1,615.45 ms" + "Mean": "1,607.93 ms", + "Error": "17.000 ms", + "StdDev": "15.902 ms", + "Median": "1,606.94 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "80.22 ms", - "Error": "0.387 ms", - "StdDev": "0.343 ms", - "Median": "80.11 ms" + "Version": "1.2.3", + "Mean": "79.51 ms", + "Error": "0.269 ms", + "StdDev": "0.251 ms", + "Median": "79.48 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "526.00 ms", - "Error": "5.581 ms", - "StdDev": "5.220 ms", - "Median": "526.16 ms" + "Version": "1.2.3", + "Mean": "524.89 ms", + "Error": "5.963 ms", + "StdDev": "5.578 ms", + "Median": "524.09 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "619.91 ms", - "Error": "12.303 ms", - "StdDev": "28.759 ms", - "Median": "616.01 ms" + "Mean": "577.30 ms", + "Error": "7.326 ms", + "StdDev": "6.118 ms", + "Median": "578.87 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.62 ms", - "Error": "11.361 ms", - "StdDev": "21.339 ms", - "Median": "614.08 ms" + "Mean": "501.88 ms", + "Error": "9.090 ms", + "StdDev": "13.036 ms", + "Median": "501.83 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "614.08 ms", - "Error": "12.161 ms", - "StdDev": "16.235 ms", - "Median": "614.08 ms" + "Mean": "576.33 ms", + "Error": "10.205 ms", + "StdDev": "9.545 ms", + "Median": "573.62 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", - "Mean": "46.63 ms", - "Error": "1.187 ms", - "StdDev": "3.501 ms", - "Median": "46.83 ms" + "Version": "1.2.3", + "Mean": "45.60 ms", + "Error": "1.239 ms", + "StdDev": "3.635 ms", + "Median": "45.71 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.2.0", - "Mean": "567.7 ms", - "Error": "8.32 ms", - "StdDev": "7.78 ms", - "Median": "566.9 ms" + "Version": "1.2.3", + "Mean": "585.9 ms", + "Error": "3.28 ms", + "StdDev": "3.06 ms", + "Median": "585.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,135.4 ms", - "Error": "12.01 ms", - "StdDev": "10.64 ms", - "Median": "1,134.9 ms" + "Mean": "1,159.2 ms", + "Error": "5.29 ms", + "StdDev": "4.69 ms", + "Median": "1,161.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,114.5 ms", - "Error": "8.93 ms", - "StdDev": "8.36 ms", - "Median": "1,114.7 ms" + "Mean": "1,139.4 ms", + "Error": "9.75 ms", + "StdDev": "9.12 ms", + "Median": "1,140.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,194.5 ms", - "Error": "9.17 ms", - "StdDev": "8.58 ms", - "Median": "1,193.0 ms" + "Mean": "1,216.8 ms", + "Error": "6.48 ms", + "StdDev": "5.74 ms", + "Median": "1,216.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.0", + "Version": "1.2.3", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.2.0", - "Mean": "2.003 s", - "Error": "0.0164 s", - "StdDev": "0.0153 s", - "Median": "1.999 s" + "Version": "1.2.3", + "Mean": "2.046 s", + "Error": "0.0272 s", + "StdDev": "0.0255 s", + "Median": "2.041 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.612 s", - "Error": "0.0302 s", - "StdDev": "0.0296 s", - "Median": "1.610 s" + "Mean": "1.657 s", + "Error": "0.0306 s", + "StdDev": "0.0286 s", + "Median": "1.655 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.681 s", - "Error": "0.0176 s", - "StdDev": "0.0164 s", - "Median": "1.680 s" + "Mean": "1.743 s", + "Error": "0.0239 s", + "StdDev": "0.0212 s", + "Median": "1.744 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.585 s", - "Error": "0.0224 s", - "StdDev": "0.0210 s", - "Median": "1.582 s" + "Mean": "1.640 s", + "Error": "0.0162 s", + "StdDev": "0.0151 s", + "Median": "1.638 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-16T00:30:01.238Z" + "lastUpdated": "2025-11-17T00:29:04.101Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index f51fb29b33..465cf055e5 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-16", + "timestamp": "2025-11-17", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From bf31b5de63ae85b830c6ed1d62455c777faae097 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:28:33 +0000 Subject: [PATCH 058/192] chore: update benchmark results (#3864) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 65c0986e55..d3f9769eb3 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 572.1 ms | 571.8 ms | 2.01 ms | -| NUnit | 4.4.0 | 696.5 ms | 695.9 ms | 6.14 ms | -| MSTest | 4.0.2 | 666.7 ms | 666.2 ms | 5.78 ms | -| xUnit3 | 3.2.0 | 742.0 ms | 742.6 ms | 4.27 ms | -| **TUnit (AOT)** | 1.2.3 | 124.2 ms | 124.1 ms | 0.46 ms | +| **TUnit** | 1.2.3 | 556.5 ms | 556.3 ms | 2.03 ms | +| NUnit | 4.4.0 | 663.3 ms | 662.2 ms | 9.02 ms | +| MSTest | 4.0.2 | 635.0 ms | 632.0 ms | 11.80 ms | +| xUnit3 | 3.2.0 | 715.8 ms | 716.7 ms | 8.28 ms | +| **TUnit (AOT)** | 1.2.3 | 124.5 ms | 124.5 ms | 0.26 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 891 - bar [572.1, 696.5, 666.7, 742, 124.2] + y-axis "Time (ms)" 0 --> 859 + bar [556.5, 663.3, 635, 715.8, 124.5] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.102Z* +*Last generated: 2025-11-18T00:28:14.218Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 79260c2c6a..d06fcc5888 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 2.046 s | 2.041 s | 0.0255 s | -| Build_NUnit | 4.4.0 | 1.657 s | 1.655 s | 0.0286 s | -| Build_MSTest | 4.0.2 | 1.743 s | 1.744 s | 0.0212 s | -| Build_xUnit3 | 3.2.0 | 1.640 s | 1.638 s | 0.0151 s | +| **TUnit** | 1.2.3 | 1.947 s | 1.953 s | 0.0381 s | +| Build_NUnit | 4.4.0 | 1.556 s | 1.557 s | 0.0171 s | +| Build_MSTest | 4.0.2 | 1.621 s | 1.624 s | 0.0156 s | +| Build_xUnit3 | 3.2.0 | 1.523 s | 1.527 s | 0.0162 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.046, 1.657, 1.743, 1.64] + bar [1.947, 1.556, 1.621, 1.523] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.104Z* +*Last generated: 2025-11-18T00:28:14.220Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index c7beba2cee..06066bfb23 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 507.19 ms | 507.75 ms | 5.647 ms | -| NUnit | 4.4.0 | 537.32 ms | 536.59 ms | 8.966 ms | -| MSTest | 4.0.2 | 504.77 ms | 506.26 ms | 9.497 ms | -| xUnit3 | 3.2.0 | 586.00 ms | 585.07 ms | 9.163 ms | -| **TUnit (AOT)** | 1.2.3 | 24.73 ms | 24.76 ms | 0.142 ms | +| **TUnit** | 1.2.3 | 493.26 ms | 492.16 ms | 3.175 ms | +| NUnit | 4.4.0 | 601.85 ms | 601.22 ms | 13.698 ms | +| MSTest | 4.0.2 | 617.89 ms | 622.69 ms | 12.013 ms | +| xUnit3 | 3.2.0 | 610.52 ms | 609.06 ms | 11.016 ms | +| **TUnit (AOT)** | 1.2.3 | 24.33 ms | 24.31 ms | 0.233 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 704 - bar [507.19, 537.32, 504.77, 586, 24.73] + y-axis "Time (ms)" 0 --> 742 + bar [493.26, 601.85, 617.89, 610.52, 24.33] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.102Z* +*Last generated: 2025-11-18T00:28:14.218Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index f06a769496..5808198b81 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 580.3 ms | 579.7 ms | 3.05 ms | -| NUnit | 4.4.0 | 1,199.9 ms | 1,199.0 ms | 7.89 ms | -| MSTest | 4.0.2 | 3,002.4 ms | 3,000.7 ms | 8.30 ms | -| xUnit3 | 3.2.0 | 3,080.0 ms | 3,078.2 ms | 7.99 ms | -| **TUnit (AOT)** | 1.2.3 | 130.5 ms | 130.4 ms | 0.45 ms | +| **TUnit** | 1.2.3 | 595.5 ms | 595.7 ms | 2.63 ms | +| NUnit | 4.4.0 | 1,164.1 ms | 1,163.4 ms | 6.01 ms | +| MSTest | 4.0.2 | 2,947.1 ms | 2,948.2 ms | 6.02 ms | +| xUnit3 | 3.2.0 | 3,048.5 ms | 3,046.6 ms | 14.96 ms | +| **TUnit (AOT)** | 1.2.3 | 130.9 ms | 130.9 ms | 0.41 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3696 - bar [580.3, 1199.9, 3002.4, 3080, 130.5] + y-axis "Time (ms)" 0 --> 3659 + bar [595.5, 1164.1, 2947.1, 3048.5, 130.9] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.102Z* +*Last generated: 2025-11-18T00:28:14.219Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index ac198f558f..7807cc0d66 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 567.17 ms | 565.30 ms | 5.174 ms | -| NUnit | 4.4.0 | 1,552.19 ms | 1,551.63 ms | 4.500 ms | -| MSTest | 4.0.2 | 1,523.45 ms | 1,522.39 ms | 14.764 ms | -| xUnit3 | 3.2.0 | 1,607.93 ms | 1,606.94 ms | 15.902 ms | -| **TUnit (AOT)** | 1.2.3 | 79.51 ms | 79.48 ms | 0.251 ms | +| **TUnit** | 1.2.3 | 561.43 ms | 562.61 ms | 4.718 ms | +| NUnit | 4.4.0 | 1,556.36 ms | 1,557.95 ms | 7.815 ms | +| MSTest | 4.0.2 | 1,517.35 ms | 1,517.64 ms | 12.824 ms | +| xUnit3 | 3.2.0 | 1,602.60 ms | 1,603.72 ms | 11.920 ms | +| **TUnit (AOT)** | 1.2.3 | 79.00 ms | 79.03 ms | 0.223 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1930 - bar [567.17, 1552.19, 1523.45, 1607.93, 79.51] + y-axis "Time (ms)" 0 --> 1924 + bar [561.43, 1556.36, 1517.35, 1602.6, 79] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.103Z* +*Last generated: 2025-11-18T00:28:14.219Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index d229307af8..368e584fb2 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 524.89 ms | 524.09 ms | 5.578 ms | -| NUnit | 4.4.0 | 577.30 ms | 578.87 ms | 6.118 ms | -| MSTest | 4.0.2 | 501.88 ms | 501.83 ms | 13.036 ms | -| xUnit3 | 3.2.0 | 576.33 ms | 573.62 ms | 9.545 ms | -| **TUnit (AOT)** | 1.2.3 | 45.60 ms | 45.71 ms | 3.635 ms | +| **TUnit** | 1.2.3 | 541.57 ms | 540.90 ms | 3.848 ms | +| NUnit | 4.4.0 | 591.49 ms | 591.89 ms | 9.280 ms | +| MSTest | 4.0.2 | 512.41 ms | 507.96 ms | 11.331 ms | +| xUnit3 | 3.2.0 | 596.95 ms | 593.96 ms | 9.270 ms | +| **TUnit (AOT)** | 1.2.3 | 43.84 ms | 43.96 ms | 3.376 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 693 - bar [524.89, 577.3, 501.88, 576.33, 45.6] + y-axis "Time (ms)" 0 --> 717 + bar [541.57, 591.49, 512.41, 596.95, 43.84] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.103Z* +*Last generated: 2025-11-18T00:28:14.219Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index fefdeeedc8..fa7067085b 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-17** from the latest CI run. +This benchmark was automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 585.9 ms | 585.4 ms | 3.06 ms | -| NUnit | 4.4.0 | 1,159.2 ms | 1,161.2 ms | 4.69 ms | -| MSTest | 4.0.2 | 1,139.4 ms | 1,140.1 ms | 9.12 ms | -| xUnit3 | 3.2.0 | 1,216.8 ms | 1,216.2 ms | 5.74 ms | +| **TUnit** | 1.2.3 | 578.7 ms | 578.1 ms | 6.18 ms | +| NUnit | 4.4.0 | 1,182.7 ms | 1,182.8 ms | 8.39 ms | +| MSTest | 4.0.2 | 1,152.5 ms | 1,151.9 ms | 6.97 ms | +| xUnit3 | 3.2.0 | 1,229.3 ms | 1,225.5 ms | 9.31 ms | | **TUnit (AOT)** | 1.2.3 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-17** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1461 - bar [585.9, 1159.2, 1139.4, 1216.8, 0] + y-axis "Time (ms)" 0 --> 1476 + bar [578.7, 1182.7, 1152.5, 1229.3, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-17T00:29:04.103Z* +*Last generated: 2025-11-18T00:28:14.220Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 575817362c..5dcade5491 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-17** from the latest CI run. +These benchmarks were automatically generated on **2025-11-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-17T00:29:04.104Z* +*Last generated: 2025-11-18T00:28:14.220Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 5a0c8447db..a7ec56b194 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.102Z", + "timestamp": "2025-11-18T00:28:14.218Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "572.1 ms", - "Error": "2.41 ms", - "StdDev": "2.01 ms", - "Median": "571.8 ms" + "Mean": "556.5 ms", + "Error": "2.29 ms", + "StdDev": "2.03 ms", + "Median": "556.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "696.5 ms", - "Error": "7.35 ms", - "StdDev": "6.14 ms", - "Median": "695.9 ms" + "Mean": "663.3 ms", + "Error": "10.81 ms", + "StdDev": "9.02 ms", + "Median": "662.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "666.7 ms", - "Error": "6.92 ms", - "StdDev": "5.78 ms", - "Median": "666.2 ms" + "Mean": "635.0 ms", + "Error": "12.02 ms", + "StdDev": "11.80 ms", + "Median": "632.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "742.0 ms", - "Error": "4.82 ms", - "StdDev": "4.27 ms", - "Median": "742.6 ms" + "Mean": "715.8 ms", + "Error": "9.34 ms", + "StdDev": "8.28 ms", + "Median": "716.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "124.2 ms", - "Error": "0.49 ms", - "StdDev": "0.46 ms", - "Median": "124.1 ms" + "Mean": "124.5 ms", + "Error": "0.31 ms", + "StdDev": "0.26 ms", + "Median": "124.5 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index f9edf1e8b3..a53dfb6c92 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.104Z", + "timestamp": "2025-11-18T00:28:14.220Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.3", - "Mean": "2.046 s", - "Error": "0.0272 s", - "StdDev": "0.0255 s", - "Median": "2.041 s" + "Mean": "1.947 s", + "Error": "0.0371 s", + "StdDev": "0.0381 s", + "Median": "1.953 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.657 s", - "Error": "0.0306 s", - "StdDev": "0.0286 s", - "Median": "1.655 s" + "Mean": "1.556 s", + "Error": "0.0183 s", + "StdDev": "0.0171 s", + "Median": "1.557 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.743 s", - "Error": "0.0239 s", - "StdDev": "0.0212 s", - "Median": "1.744 s" + "Mean": "1.621 s", + "Error": "0.0167 s", + "StdDev": "0.0156 s", + "Median": "1.624 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.640 s", - "Error": "0.0162 s", - "StdDev": "0.0151 s", - "Median": "1.638 s" + "Mean": "1.523 s", + "Error": "0.0173 s", + "StdDev": "0.0162 s", + "Median": "1.527 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 55272c5497..482e01a132 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.102Z", + "timestamp": "2025-11-18T00:28:14.219Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "507.19 ms", - "Error": "6.037 ms", - "StdDev": "5.647 ms", - "Median": "507.75 ms" + "Mean": "493.26 ms", + "Error": "3.582 ms", + "StdDev": "3.175 ms", + "Median": "492.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "537.32 ms", - "Error": "10.114 ms", - "StdDev": "8.966 ms", - "Median": "536.59 ms" + "Mean": "601.85 ms", + "Error": "11.895 ms", + "StdDev": "13.698 ms", + "Median": "601.22 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "504.77 ms", - "Error": "9.670 ms", - "StdDev": "9.497 ms", - "Median": "506.26 ms" + "Mean": "617.89 ms", + "Error": "11.698 ms", + "StdDev": "12.013 ms", + "Median": "622.69 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "586.00 ms", - "Error": "10.336 ms", - "StdDev": "9.163 ms", - "Median": "585.07 ms" + "Mean": "610.52 ms", + "Error": "11.777 ms", + "StdDev": "11.016 ms", + "Median": "609.06 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "24.73 ms", - "Error": "0.152 ms", - "StdDev": "0.142 ms", - "Median": "24.76 ms" + "Mean": "24.33 ms", + "Error": "0.263 ms", + "StdDev": "0.233 ms", + "Median": "24.31 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 48a451c377..8519b4b264 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.103Z", + "timestamp": "2025-11-18T00:28:14.219Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "580.3 ms", - "Error": "3.44 ms", - "StdDev": "3.05 ms", - "Median": "579.7 ms" + "Mean": "595.5 ms", + "Error": "2.81 ms", + "StdDev": "2.63 ms", + "Median": "595.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,199.9 ms", - "Error": "8.90 ms", - "StdDev": "7.89 ms", - "Median": "1,199.0 ms" + "Mean": "1,164.1 ms", + "Error": "6.78 ms", + "StdDev": "6.01 ms", + "Median": "1,163.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,002.4 ms", - "Error": "9.36 ms", - "StdDev": "8.30 ms", - "Median": "3,000.7 ms" + "Mean": "2,947.1 ms", + "Error": "6.79 ms", + "StdDev": "6.02 ms", + "Median": "2,948.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,080.0 ms", - "Error": "8.54 ms", - "StdDev": "7.99 ms", - "Median": "3,078.2 ms" + "Mean": "3,048.5 ms", + "Error": "15.99 ms", + "StdDev": "14.96 ms", + "Median": "3,046.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "130.5 ms", - "Error": "0.48 ms", - "StdDev": "0.45 ms", - "Median": "130.4 ms" + "Mean": "130.9 ms", + "Error": "0.44 ms", + "StdDev": "0.41 ms", + "Median": "130.9 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 40e8dd9c42..d48c2a3178 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.103Z", + "timestamp": "2025-11-18T00:28:14.219Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "567.17 ms", - "Error": "5.532 ms", - "StdDev": "5.174 ms", - "Median": "565.30 ms" + "Mean": "561.43 ms", + "Error": "5.322 ms", + "StdDev": "4.718 ms", + "Median": "562.61 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,552.19 ms", - "Error": "5.388 ms", - "StdDev": "4.500 ms", - "Median": "1,551.63 ms" + "Mean": "1,556.36 ms", + "Error": "8.816 ms", + "StdDev": "7.815 ms", + "Median": "1,557.95 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,523.45 ms", - "Error": "17.681 ms", - "StdDev": "14.764 ms", - "Median": "1,522.39 ms" + "Mean": "1,517.35 ms", + "Error": "13.710 ms", + "StdDev": "12.824 ms", + "Median": "1,517.64 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,607.93 ms", - "Error": "17.000 ms", - "StdDev": "15.902 ms", - "Median": "1,606.94 ms" + "Mean": "1,602.60 ms", + "Error": "12.743 ms", + "StdDev": "11.920 ms", + "Median": "1,603.72 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "79.51 ms", - "Error": "0.269 ms", - "StdDev": "0.251 ms", - "Median": "79.48 ms" + "Mean": "79.00 ms", + "Error": "0.238 ms", + "StdDev": "0.223 ms", + "Median": "79.03 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 8b93e3c061..a6dfe8b640 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.103Z", + "timestamp": "2025-11-18T00:28:14.219Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "524.89 ms", - "Error": "5.963 ms", - "StdDev": "5.578 ms", - "Median": "524.09 ms" + "Mean": "541.57 ms", + "Error": "4.341 ms", + "StdDev": "3.848 ms", + "Median": "540.90 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "577.30 ms", - "Error": "7.326 ms", - "StdDev": "6.118 ms", - "Median": "578.87 ms" + "Mean": "591.49 ms", + "Error": "10.469 ms", + "StdDev": "9.280 ms", + "Median": "591.89 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "501.88 ms", - "Error": "9.090 ms", - "StdDev": "13.036 ms", - "Median": "501.83 ms" + "Mean": "512.41 ms", + "Error": "10.194 ms", + "StdDev": "11.331 ms", + "Median": "507.96 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "576.33 ms", - "Error": "10.205 ms", - "StdDev": "9.545 ms", - "Median": "573.62 ms" + "Mean": "596.95 ms", + "Error": "10.457 ms", + "StdDev": "9.270 ms", + "Median": "593.96 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "45.60 ms", - "Error": "1.239 ms", - "StdDev": "3.635 ms", - "Median": "45.71 ms" + "Mean": "43.84 ms", + "Error": "1.157 ms", + "StdDev": "3.376 ms", + "Median": "43.96 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index ed69b9c0e9..650a5db7b8 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.104Z", + "timestamp": "2025-11-18T00:28:14.220Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "585.9 ms", - "Error": "3.28 ms", - "StdDev": "3.06 ms", - "Median": "585.4 ms" + "Mean": "578.7 ms", + "Error": "6.61 ms", + "StdDev": "6.18 ms", + "Median": "578.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,159.2 ms", - "Error": "5.29 ms", - "StdDev": "4.69 ms", - "Median": "1,161.2 ms" + "Mean": "1,182.7 ms", + "Error": "9.46 ms", + "StdDev": "8.39 ms", + "Median": "1,182.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,139.4 ms", - "Error": "9.75 ms", - "StdDev": "9.12 ms", - "Median": "1,140.1 ms" + "Mean": "1,152.5 ms", + "Error": "7.45 ms", + "StdDev": "6.97 ms", + "Median": "1,151.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,216.8 ms", - "Error": "6.48 ms", - "StdDev": "5.74 ms", - "Median": "1,216.2 ms" + "Mean": "1,229.3 ms", + "Error": "9.96 ms", + "StdDev": "9.31 ms", + "Median": "1,225.5 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index d7b44bbe49..26988cc598 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -50,5 +50,9 @@ { "date": "2025-11-17", "environment": "Ubuntu" + }, + { + "date": "2025-11-18", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 51a9a35af6..55ec1a5025 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-17T00:29:04.104Z", + "timestamp": "2025-11-18T00:28:14.221Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "572.1 ms", - "Error": "2.41 ms", - "StdDev": "2.01 ms", - "Median": "571.8 ms" + "Mean": "556.5 ms", + "Error": "2.29 ms", + "StdDev": "2.03 ms", + "Median": "556.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "696.5 ms", - "Error": "7.35 ms", - "StdDev": "6.14 ms", - "Median": "695.9 ms" + "Mean": "663.3 ms", + "Error": "10.81 ms", + "StdDev": "9.02 ms", + "Median": "662.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "666.7 ms", - "Error": "6.92 ms", - "StdDev": "5.78 ms", - "Median": "666.2 ms" + "Mean": "635.0 ms", + "Error": "12.02 ms", + "StdDev": "11.80 ms", + "Median": "632.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "742.0 ms", - "Error": "4.82 ms", - "StdDev": "4.27 ms", - "Median": "742.6 ms" + "Mean": "715.8 ms", + "Error": "9.34 ms", + "StdDev": "8.28 ms", + "Median": "716.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "124.2 ms", - "Error": "0.49 ms", - "StdDev": "0.46 ms", - "Median": "124.1 ms" + "Mean": "124.5 ms", + "Error": "0.31 ms", + "StdDev": "0.26 ms", + "Median": "124.5 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "507.19 ms", - "Error": "6.037 ms", - "StdDev": "5.647 ms", - "Median": "507.75 ms" + "Mean": "493.26 ms", + "Error": "3.582 ms", + "StdDev": "3.175 ms", + "Median": "492.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "537.32 ms", - "Error": "10.114 ms", - "StdDev": "8.966 ms", - "Median": "536.59 ms" + "Mean": "601.85 ms", + "Error": "11.895 ms", + "StdDev": "13.698 ms", + "Median": "601.22 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "504.77 ms", - "Error": "9.670 ms", - "StdDev": "9.497 ms", - "Median": "506.26 ms" + "Mean": "617.89 ms", + "Error": "11.698 ms", + "StdDev": "12.013 ms", + "Median": "622.69 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "586.00 ms", - "Error": "10.336 ms", - "StdDev": "9.163 ms", - "Median": "585.07 ms" + "Mean": "610.52 ms", + "Error": "11.777 ms", + "StdDev": "11.016 ms", + "Median": "609.06 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "24.73 ms", - "Error": "0.152 ms", - "StdDev": "0.142 ms", - "Median": "24.76 ms" + "Mean": "24.33 ms", + "Error": "0.263 ms", + "StdDev": "0.233 ms", + "Median": "24.31 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "580.3 ms", - "Error": "3.44 ms", - "StdDev": "3.05 ms", - "Median": "579.7 ms" + "Mean": "595.5 ms", + "Error": "2.81 ms", + "StdDev": "2.63 ms", + "Median": "595.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,199.9 ms", - "Error": "8.90 ms", - "StdDev": "7.89 ms", - "Median": "1,199.0 ms" + "Mean": "1,164.1 ms", + "Error": "6.78 ms", + "StdDev": "6.01 ms", + "Median": "1,163.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,002.4 ms", - "Error": "9.36 ms", - "StdDev": "8.30 ms", - "Median": "3,000.7 ms" + "Mean": "2,947.1 ms", + "Error": "6.79 ms", + "StdDev": "6.02 ms", + "Median": "2,948.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,080.0 ms", - "Error": "8.54 ms", - "StdDev": "7.99 ms", - "Median": "3,078.2 ms" + "Mean": "3,048.5 ms", + "Error": "15.99 ms", + "StdDev": "14.96 ms", + "Median": "3,046.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "130.5 ms", - "Error": "0.48 ms", - "StdDev": "0.45 ms", - "Median": "130.4 ms" + "Mean": "130.9 ms", + "Error": "0.44 ms", + "StdDev": "0.41 ms", + "Median": "130.9 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "567.17 ms", - "Error": "5.532 ms", - "StdDev": "5.174 ms", - "Median": "565.30 ms" + "Mean": "561.43 ms", + "Error": "5.322 ms", + "StdDev": "4.718 ms", + "Median": "562.61 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,552.19 ms", - "Error": "5.388 ms", - "StdDev": "4.500 ms", - "Median": "1,551.63 ms" + "Mean": "1,556.36 ms", + "Error": "8.816 ms", + "StdDev": "7.815 ms", + "Median": "1,557.95 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,523.45 ms", - "Error": "17.681 ms", - "StdDev": "14.764 ms", - "Median": "1,522.39 ms" + "Mean": "1,517.35 ms", + "Error": "13.710 ms", + "StdDev": "12.824 ms", + "Median": "1,517.64 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,607.93 ms", - "Error": "17.000 ms", - "StdDev": "15.902 ms", - "Median": "1,606.94 ms" + "Mean": "1,602.60 ms", + "Error": "12.743 ms", + "StdDev": "11.920 ms", + "Median": "1,603.72 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "79.51 ms", - "Error": "0.269 ms", - "StdDev": "0.251 ms", - "Median": "79.48 ms" + "Mean": "79.00 ms", + "Error": "0.238 ms", + "StdDev": "0.223 ms", + "Median": "79.03 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "524.89 ms", - "Error": "5.963 ms", - "StdDev": "5.578 ms", - "Median": "524.09 ms" + "Mean": "541.57 ms", + "Error": "4.341 ms", + "StdDev": "3.848 ms", + "Median": "540.90 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "577.30 ms", - "Error": "7.326 ms", - "StdDev": "6.118 ms", - "Median": "578.87 ms" + "Mean": "591.49 ms", + "Error": "10.469 ms", + "StdDev": "9.280 ms", + "Median": "591.89 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "501.88 ms", - "Error": "9.090 ms", - "StdDev": "13.036 ms", - "Median": "501.83 ms" + "Mean": "512.41 ms", + "Error": "10.194 ms", + "StdDev": "11.331 ms", + "Median": "507.96 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "576.33 ms", - "Error": "10.205 ms", - "StdDev": "9.545 ms", - "Median": "573.62 ms" + "Mean": "596.95 ms", + "Error": "10.457 ms", + "StdDev": "9.270 ms", + "Median": "593.96 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "45.60 ms", - "Error": "1.239 ms", - "StdDev": "3.635 ms", - "Median": "45.71 ms" + "Mean": "43.84 ms", + "Error": "1.157 ms", + "StdDev": "3.376 ms", + "Median": "43.96 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "585.9 ms", - "Error": "3.28 ms", - "StdDev": "3.06 ms", - "Median": "585.4 ms" + "Mean": "578.7 ms", + "Error": "6.61 ms", + "StdDev": "6.18 ms", + "Median": "578.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,159.2 ms", - "Error": "5.29 ms", - "StdDev": "4.69 ms", - "Median": "1,161.2 ms" + "Mean": "1,182.7 ms", + "Error": "9.46 ms", + "StdDev": "8.39 ms", + "Median": "1,182.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,139.4 ms", - "Error": "9.75 ms", - "StdDev": "9.12 ms", - "Median": "1,140.1 ms" + "Mean": "1,152.5 ms", + "Error": "7.45 ms", + "StdDev": "6.97 ms", + "Median": "1,151.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,216.8 ms", - "Error": "6.48 ms", - "StdDev": "5.74 ms", - "Median": "1,216.2 ms" + "Mean": "1,229.3 ms", + "Error": "9.96 ms", + "StdDev": "9.31 ms", + "Median": "1,225.5 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.3", - "Mean": "2.046 s", - "Error": "0.0272 s", - "StdDev": "0.0255 s", - "Median": "2.041 s" + "Mean": "1.947 s", + "Error": "0.0371 s", + "StdDev": "0.0381 s", + "Median": "1.953 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.657 s", - "Error": "0.0306 s", - "StdDev": "0.0286 s", - "Median": "1.655 s" + "Mean": "1.556 s", + "Error": "0.0183 s", + "StdDev": "0.0171 s", + "Median": "1.557 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.743 s", - "Error": "0.0239 s", - "StdDev": "0.0212 s", - "Median": "1.744 s" + "Mean": "1.621 s", + "Error": "0.0167 s", + "StdDev": "0.0156 s", + "Median": "1.624 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.640 s", - "Error": "0.0162 s", - "StdDev": "0.0151 s", - "Median": "1.638 s" + "Mean": "1.523 s", + "Error": "0.0173 s", + "StdDev": "0.0162 s", + "Median": "1.527 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-17T00:29:04.101Z" + "lastUpdated": "2025-11-18T00:28:14.217Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 465cf055e5..efa7dfbc9c 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-17", + "timestamp": "2025-11-18", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 433bd47cffe232a37f5a15c85adb7668e67811f5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 18 Nov 2025 06:01:08 +0000 Subject: [PATCH 059/192] chore(deps): update dependency polyfill to 9.1.0 (#3866) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index ae21f778a1..3e87a68017 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.0.3 + <_TUnitPolyfillVersion>9.1.0 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From f44499da90a91be2790ff55ed4ba108fd89d6c0e Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 18 Nov 2025 06:02:23 +0000 Subject: [PATCH 060/192] chore(deps): update dependency polyfill to 9.1.0 (#3865) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 62e3564e91..cc33abe666 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + From a29812b25da76920bb25423e3ea614a1ffcd8ba4 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:44:18 +0000 Subject: [PATCH 061/192] chore: update documentation for dependency injection in TestContext --- docs/docs/test-lifecycle/test-context.md | 163 +---------------------- 1 file changed, 3 insertions(+), 160 deletions(-) diff --git a/docs/docs/test-lifecycle/test-context.md b/docs/docs/test-lifecycle/test-context.md index 6884f43284..5292cce789 100644 --- a/docs/docs/test-lifecycle/test-context.md +++ b/docs/docs/test-lifecycle/test-context.md @@ -28,168 +28,11 @@ if (TestContext.Current?.Result?.State == TestState.Failed) } ``` -## Service Provider Integration +## Dependency Injection -`TestContext` provides access to dependency injection services through the `GetService()` and `GetRequiredService()` methods. This allows you to access registered services within your tests, hooks, and custom extensions. +**Note**: `TestContext` does NOT provide direct access to dependency injection services. The internal service provider in `TestContext` is exclusively for TUnit framework services and is not meant for user-provided dependencies. -### Accessing Services - -```csharp -[Test] -public async Task DatabaseTest() -{ - // Get an optional service (returns null if not registered) - var logger = TestContext.Current?.GetService>(); - logger?.LogInformation("Starting database test"); - - // Get a required service (throws if not registered) - var dbContext = TestContext.Current!.GetRequiredService(); - - // Use the service - var users = await dbContext.Users.ToListAsync(); - await Assert.That(users).IsNotEmpty(); -} -``` - -### Common Use Cases - -#### 1. Accessing Loggers - -```csharp -[Before(HookType.Test)] -public void LogTestStart() -{ - var logger = TestContext.Current?.GetService(); - logger?.LogInformation("Test {TestName} starting", - TestContext.Current?.Metadata.TestName); -} -``` - -#### 2. Working with Scoped Services - -```csharp -[Test] -public async Task ScopedServiceTest() -{ - // Each test gets its own scope, so scoped services are isolated - var service1 = TestContext.Current!.GetRequiredService(); - var service2 = TestContext.Current!.GetRequiredService(); - - // These will be the same instance within the test - await Assert.That(ReferenceEquals(service1, service2)).IsTrue(); -} -``` - -#### 3. Configuration Access - -```csharp -[Test] -public async Task ConfigurationTest() -{ - var configuration = TestContext.Current?.GetService(); - var apiKey = configuration?["ApiSettings:Key"]; - - await Assert.That(apiKey).IsNotNull(); -} -``` - -### Service Provider in Custom Extensions - -When implementing custom test executors or hook executors, you can use the service provider: - -```csharp -public class DatabaseTransactionExecutor : ITestExecutor -{ - public async Task ExecuteAsync(TestContext context, Func testBody) - { - // Get database context from DI - var dbContext = context.GetRequiredService(); - - using var transaction = await dbContext.Database.BeginTransactionAsync(); - - try - { - await testBody(); - await transaction.RollbackAsync(); // Keep tests isolated - } - catch - { - await transaction.RollbackAsync(); - throw; - } - } -} -``` - -### Integration with Test Lifecycle - -The service provider is available throughout the test lifecycle: - -```csharp -public class ServiceIntegrationTests -{ - [Before(HookType.Class)] - public static async Task ClassSetup() - { - // Services available in class-level hooks via the hook context - var context = ClassHookContext.Current; - var cache = context?.GetService(); - cache?.Set("test-data", await LoadTestData()); - } - - [Before(HookType.Test)] - public async Task TestSetup() - { - // Services available in test-level hooks - var cache = TestContext.Current?.GetService(); - var testData = cache?.Get("test-data"); - } - - [Test] - public async Task ActualTest() - { - // Services available in test methods - var service = TestContext.Current!.GetRequiredService(); - var result = await service.PerformOperation(); - await Assert.That(result).IsNotNull(); - } -} -``` - -### Best Practices - -1. **Use GetRequiredService for Essential Services** - ```csharp - // Good - Fails fast if service is missing - var critical = TestContext.Current!.GetRequiredService(); - - // Less ideal - Might hide configuration issues - var critical = TestContext.Current?.GetService() - ?? throw new InvalidOperationException("Service not found"); - ``` - -2. **Null Check When Using GetService** - ```csharp - var optional = TestContext.Current?.GetService(); - if (optional != null) - { - await optional.DoSomething(); - } - ``` - -3. **Consider Service Lifetime** - ```csharp - // Singleton services persist across tests - var singleton = TestContext.Current?.GetService(); - - // Scoped services are unique per test - var scoped = TestContext.Current?.GetService(); - - // Transient services are created each time - var transient1 = TestContext.Current?.GetService(); - var transient2 = TestContext.Current?.GetService(); - // transient1 and transient2 are different instances - ``` +If you need dependency injection in your tests, use the `DependencyInjectionDataSourceAttribute` helper class to set up your own DI container. See the [Dependency Injection guide](./dependency-injection.md) for complete details and examples. ## TestBuilderContext From f79dbfffd6f041077dd3fb8ce337b1791caae3db Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 18 Nov 2025 23:07:30 +0000 Subject: [PATCH 062/192] test: add regression tests for ClassDataSource with SharedType.None (#3868) --- TUnit.Engine/Building/TestBuilder.cs | 3 +- ...lassDataSourceSharedNoneRegressionTests.cs | 156 ++++++++++++++++++ 2 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 TUnit.TestProject/ClassDataSourceSharedNoneRegressionTests.cs diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index ada56f7737..a854f4e2df 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -206,7 +206,8 @@ public async Task> BuildTestsFromMetadataAsy hasAnyClassData = true; classDataLoopIndex++; - var classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); + var classDataResult = await classDataFactory() ?? []; + var classData = DataUnwrapper.Unwrap(classDataResult); var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData); diff --git a/TUnit.TestProject/ClassDataSourceSharedNoneRegressionTests.cs b/TUnit.TestProject/ClassDataSourceSharedNoneRegressionTests.cs new file mode 100644 index 0000000000..15df0b5c36 --- /dev/null +++ b/TUnit.TestProject/ClassDataSourceSharedNoneRegressionTests.cs @@ -0,0 +1,156 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject; + +/// +/// Regression tests for GitHub Issue #3855 +/// Verifies that ClassDataSource with SharedType.None constructs and initializes objects only once per test. +/// +[EngineTest(ExpectedResult.Pass)] +public class ClassDataSourceSharedNoneRegressionTests +{ + // Test helper class that tracks construction + public class ConstructionCounterClass + { + private static int _instanceCounter = 0; + public int InstanceNumber { get; } + + public ConstructionCounterClass() + { + InstanceNumber = Interlocked.Increment(ref _instanceCounter); + } + + public int Value { get; set; } = 42; + } + + // Test helper class that tracks initialization + public class AsyncInitializerCounterClass : IAsyncInitializer + { + private static int _initCounter = 0; + public int InitNumber { get; private set; } = -1; + + public Task InitializeAsync() + { + InitNumber = Interlocked.Increment(ref _initCounter); + return Task.CompletedTask; + } + + public int Value { get; set; } = 99; + } + + /// + /// Test that SharedType.None constructs the class data source exactly once per test. + /// Regression test for issue #3855 where it was being constructed twice. + /// Before the fix, InstanceNumber would be 2 (constructed twice). + /// After the fix, InstanceNumber should be 1 (constructed once). + /// + [Test] + [ClassDataSource(Shared = SharedType.None)] + public async Task SharedTypeNone_ConstructsOnlyOnce(ConstructionCounterClass instance) + { + // Instance should be constructed exactly once, so InstanceNumber should be 1 + // (not 2, which would indicate double construction) + await Assert.That(instance).IsNotNull(); + await Assert.That(instance.InstanceNumber).IsEqualTo(1); + await Assert.That(instance.Value).IsEqualTo(42); + } + + /// + /// Test that SharedType.None with IAsyncInitializer initializes exactly once per test. + /// Regression test for issue #3855 where InitializeAsync was being called twice. + /// Before the fix, InitNumber would be 2 (initialized twice). + /// After the fix, InitNumber should be 1 (initialized once). + /// + [Test] + [ClassDataSource(Shared = SharedType.None)] + public async Task SharedTypeNone_WithAsyncInitializer_InitializesOnlyOnce(AsyncInitializerCounterClass instance) + { + // Instance should be initialized exactly once, so InitNumber should be 1 + // (not 2, which would indicate double initialization) + await Assert.That(instance).IsNotNull(); + await Assert.That(instance.InitNumber).IsEqualTo(1); + await Assert.That(instance.Value).IsEqualTo(99); + } +} + +/// +/// Regression tests for GitHub Issue #3855 - Verify no instance leakage across tests. +/// Tests that multiple test methods in the same class each receive their own unique instance +/// with SharedType.None (no sharing or leakage across tests). +/// +public class ClassDataSourceSharedNoneNoLeakageTests +{ + // Test helper class that tracks instance IDs and mutation + public class UniqueInstanceClass + { + private static int _nextId = 0; + public int InstanceId { get; } + public int MutationValue { get; set; } + + public UniqueInstanceClass() + { + InstanceId = Interlocked.Increment(ref _nextId); + MutationValue = 0; // Initial value + } + + public static void ResetIdCounter() + { + _nextId = 0; + } + } + + [Before(TestSession)] + public static void ResetCounters() + { + UniqueInstanceClass.ResetIdCounter(); + } + + /// + /// First test - should get instance ID 1, mutate it, and not affect other tests + /// + [Test] + [ClassDataSource(Shared = SharedType.None)] + public async Task Test1_GetsUniqueInstance(UniqueInstanceClass instance) + { + // This is the first test, should have InstanceId = 1 + await Assert.That(instance.InstanceId).IsEqualTo(1); + await Assert.That(instance.MutationValue).IsEqualTo(0); + + // Mutate the instance + instance.MutationValue = 100; + } + + /// + /// Second test - should get instance ID 2, with fresh MutationValue = 0 + /// (proves no leakage from Test1) + /// + [Test] + [ClassDataSource(Shared = SharedType.None)] + public async Task Test2_GetsUniqueInstance(UniqueInstanceClass instance) + { + // This is the second test, should have InstanceId = 2 + await Assert.That(instance.InstanceId).IsEqualTo(2); + + // MutationValue should be 0 (not affected by Test1's mutation to 100) + await Assert.That(instance.MutationValue).IsEqualTo(0); + + // Mutate the instance + instance.MutationValue = 200; + } + + /// + /// Third test - should get instance ID 3, with fresh MutationValue = 0 + /// (proves no leakage from Test1 or Test2) + /// + [Test] + [ClassDataSource(Shared = SharedType.None)] + public async Task Test3_GetsUniqueInstance(UniqueInstanceClass instance) + { + // This is the third test, should have InstanceId = 3 + await Assert.That(instance.InstanceId).IsEqualTo(3); + + // MutationValue should be 0 (not affected by Test1 or Test2) + await Assert.That(instance.MutationValue).IsEqualTo(0); + } +} From aea950635b2b9a7f78e66393526ca13d13d0d469 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 18 Nov 2025 23:15:58 +0000 Subject: [PATCH 063/192] Unmark AOT safe IsEquivalentTo overload (#3854) * feat: enhance AOT compatibility by adding RequiresUnreferencedCode attribute to assertion classes and introducing tests for custom comparer scenarios * feat: update AOT compatibility messages and remove virtual modifiers from GetErrorOutput and GetStandardOutput methods * feat: update GetErrorOutput and GetStandardOutput methods to virtual and add TestBuildContext class * feat: refactor collection assertion classes to expose Comparer property and streamline comparer handling --- .../Generators/AssertionExtensionGenerator.cs | 22 ++++++++++++-- .../CollectionComparerBasedAssertion.cs | 15 ++-------- .../Conditions/IsEquivalentToAssertion.cs | 11 +++---- .../Conditions/NotEquivalentToAssertion.cs | 15 ++++++++-- ...Has_No_API_Changes.DotNet10_0.verified.txt | 17 +++++------ ..._Has_No_API_Changes.DotNet8_0.verified.txt | 17 +++++------ ..._Has_No_API_Changes.DotNet9_0.verified.txt | 17 +++++------ ...ary_Has_No_API_Changes.Net4_7.verified.txt | 5 +++- .../AotCompatibilityTests.cs | 30 +++++++++++++++++++ 9 files changed, 96 insertions(+), 53 deletions(-) diff --git a/TUnit.Assertions.SourceGenerator/Generators/AssertionExtensionGenerator.cs b/TUnit.Assertions.SourceGenerator/Generators/AssertionExtensionGenerator.cs index 8cb0b1debb..1621a2f664 100644 --- a/TUnit.Assertions.SourceGenerator/Generators/AssertionExtensionGenerator.cs +++ b/TUnit.Assertions.SourceGenerator/Generators/AssertionExtensionGenerator.cs @@ -226,6 +226,22 @@ private static void GenerateExtensionMethod( // Skip the first parameter (AssertionContext) var additionalParams = constructor.Parameters.Skip(1).ToArray(); + // Check for RequiresUnreferencedCode attribute on the constructor first, then fall back to class-level + var constructorRequiresUnreferencedCodeAttr = constructor.GetAttributes() + .FirstOrDefault(attr => attr.AttributeClass?.Name == "RequiresUnreferencedCodeAttribute"); + + string? requiresUnreferencedCodeMessage = null; + if (constructorRequiresUnreferencedCodeAttr != null && constructorRequiresUnreferencedCodeAttr.ConstructorArguments.Length > 0) + { + // Constructor-level attribute takes precedence + requiresUnreferencedCodeMessage = constructorRequiresUnreferencedCodeAttr.ConstructorArguments[0].Value?.ToString(); + } + else if (!string.IsNullOrEmpty(data.RequiresUnreferencedCodeMessage)) + { + // Fall back to class-level attribute + requiresUnreferencedCodeMessage = data.RequiresUnreferencedCodeMessage; + } + // Build generic type parameters string // Use the assertion class's own type parameters if it has them var genericParams = new List(); @@ -315,10 +331,10 @@ private static void GenerateExtensionMethod( sourceBuilder.AppendLine($" /// Extension method for {assertionType.Name}."); sourceBuilder.AppendLine(" /// "); - // Add RequiresUnreferencedCode attribute if present - if (!string.IsNullOrEmpty(data.RequiresUnreferencedCodeMessage)) + // Add RequiresUnreferencedCode attribute if present (from constructor or class level) + if (!string.IsNullOrEmpty(requiresUnreferencedCodeMessage)) { - var escapedMessage = data.RequiresUnreferencedCodeMessage!.Replace("\"", "\\\""); + var escapedMessage = requiresUnreferencedCodeMessage!.Replace("\"", "\\\""); sourceBuilder.AppendLine($" [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode(\"{escapedMessage}\")]"); } diff --git a/TUnit.Assertions/Conditions/CollectionComparerBasedAssertion.cs b/TUnit.Assertions/Conditions/CollectionComparerBasedAssertion.cs index 5a2f78fec1..cd168e5bba 100644 --- a/TUnit.Assertions/Conditions/CollectionComparerBasedAssertion.cs +++ b/TUnit.Assertions/Conditions/CollectionComparerBasedAssertion.cs @@ -1,4 +1,3 @@ -using System.Collections; using TUnit.Assertions.Core; using TUnit.Assertions.Sources; @@ -13,7 +12,7 @@ namespace TUnit.Assertions.Conditions; public abstract class CollectionComparerBasedAssertion : CollectionAssertionBase where TCollection : IEnumerable { - private IEqualityComparer? _comparer; + protected IEqualityComparer? Comparer; protected CollectionComparerBasedAssertion(AssertionContext context) : base(context) @@ -26,7 +25,7 @@ protected CollectionComparerBasedAssertion(AssertionContext context /// protected void SetComparer(IEqualityComparer comparer) { - _comparer = comparer; + Comparer = comparer; Context.ExpressionBuilder.Append($".Using({comparer.GetType().Name})"); } @@ -36,14 +35,6 @@ protected void SetComparer(IEqualityComparer comparer) /// protected IEqualityComparer GetComparer() { - return _comparer ?? EqualityComparer.Default; - } - - /// - /// Checks if a custom comparer has been specified. - /// - protected bool HasCustomComparer() - { - return _comparer != null; + return Comparer ?? EqualityComparer.Default; } } diff --git a/TUnit.Assertions/Conditions/IsEquivalentToAssertion.cs b/TUnit.Assertions/Conditions/IsEquivalentToAssertion.cs index 6eaf69bf8b..7592c54f0e 100644 --- a/TUnit.Assertions/Conditions/IsEquivalentToAssertion.cs +++ b/TUnit.Assertions/Conditions/IsEquivalentToAssertion.cs @@ -14,21 +14,19 @@ namespace TUnit.Assertions.Conditions; /// Inherits from CollectionComparerBasedAssertion to preserve collection type awareness in And/Or chains. /// [AssertionExtension("IsEquivalentTo")] -[RequiresUnreferencedCode("Collection equivalency uses structural comparison for complex objects, which requires reflection and is not compatible with AOT")] public class IsEquivalentToAssertion : CollectionComparerBasedAssertion where TCollection : IEnumerable { private readonly IEnumerable _expected; private readonly CollectionOrdering _ordering; + [RequiresUnreferencedCode("Collection equivalency uses structural comparison for complex objects, which requires reflection and is not compatible with AOT")] public IsEquivalentToAssertion( AssertionContext context, IEnumerable expected, CollectionOrdering ordering = CollectionOrdering.Any) - : base(context) + : this(context, expected, StructuralEqualityComparer.Instance, ordering) { - _expected = expected ?? throw new ArgumentNullException(nameof(expected)); - _ordering = ordering; } public IsEquivalentToAssertion( @@ -40,7 +38,7 @@ public IsEquivalentToAssertion( { _expected = expected ?? throw new ArgumentNullException(nameof(expected)); _ordering = ordering; - SetComparer(comparer); + Comparer = comparer; } public IsEquivalentToAssertion Using(IEqualityComparer comparer) @@ -49,7 +47,6 @@ public IsEquivalentToAssertion Using(IEqualityComparer CheckAsync(EvaluationMetadata metadata) { var value = metadata.Value; @@ -60,7 +57,7 @@ protected override Task CheckAsync(EvaluationMetadata.Instance; + var comparer = GetComparer(); var result = CollectionEquivalencyChecker.AreEquivalent( value, diff --git a/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs b/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs index 5fbb18d0d7..e32548337f 100644 --- a/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs +++ b/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs @@ -13,21 +13,31 @@ namespace TUnit.Assertions.Conditions; /// Inherits from CollectionComparerBasedAssertion to preserve collection type awareness in And/Or chains. /// [AssertionExtension("IsNotEquivalentTo")] -[RequiresUnreferencedCode("Collection equivalency uses structural comparison for complex objects, which requires reflection and is not compatible with AOT")] public class NotEquivalentToAssertion : CollectionComparerBasedAssertion where TCollection : IEnumerable { private readonly IEnumerable _notExpected; private readonly CollectionOrdering _ordering; + [RequiresUnreferencedCode("Collection equivalency uses structural comparison for complex objects, which requires reflection and is not compatible with AOT")] public NotEquivalentToAssertion( AssertionContext context, IEnumerable notExpected, CollectionOrdering ordering = CollectionOrdering.Any) + : this(context, notExpected, StructuralEqualityComparer.Instance, ordering) + { + } + + public NotEquivalentToAssertion( + AssertionContext context, + IEnumerable notExpected, + IEqualityComparer comparer, + CollectionOrdering ordering = CollectionOrdering.Any) : base(context) { _notExpected = notExpected ?? throw new ArgumentNullException(nameof(notExpected)); _ordering = ordering; + Comparer = comparer; } public NotEquivalentToAssertion Using(IEqualityComparer comparer) @@ -36,7 +46,6 @@ public NotEquivalentToAssertion Using(IEqualityComparer CheckAsync(EvaluationMetadata metadata) { var value = metadata.Value; @@ -47,7 +56,7 @@ protected override Task CheckAsync(EvaluationMetadata.Instance; + var comparer = GetComparer(); var result = CollectionEquivalencyChecker.AreEquivalent( value, diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 35bcf00a2e..9714184f79 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -388,9 +388,9 @@ namespace .Conditions public abstract class CollectionComparerBasedAssertion : . where TCollection : . { + protected .? Comparer; protected CollectionComparerBasedAssertion(. context) { } protected . GetComparer() { } - protected bool HasCustomComparer() { } protected void SetComparer(. comparer) { } } [.("Contains")] @@ -817,15 +817,14 @@ namespace .Conditions protected override string GetExpectation() { } public . Using(. comparer) { } } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] [.("IsEquivalentTo")] public class IsEquivalentToAssertion : . where TCollection : . { + [.("Collection equivalency uses structural comparison for complex objects, which requ" + + "ires reflection and is not compatible with AOT")] public IsEquivalentToAssertion(. context, . expected, . ordering = 0) { } public IsEquivalentToAssertion(. context, . expected, . comparer, . ordering = 0) { } - [.("AOT", "IL3050", Justification="Collection equivalency uses structural comparison which requires reflection")] protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -919,14 +918,14 @@ namespace .Conditions public . IgnoringType( type) { } public . IgnoringType() { } } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] [.("IsNotEquivalentTo")] public class NotEquivalentToAssertion : . where TCollection : . { + [.("Collection equivalency uses structural comparison for complex objects, which requ" + + "ires reflection and is not compatible with AOT")] public NotEquivalentToAssertion(. context, . notExpected, . ordering = 0) { } - [.("AOT", "IL3050", Justification="Collection equivalency uses structural comparison which requires reflection")] + public NotEquivalentToAssertion(. context, . notExpected, . comparer, . ordering = 0) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -3085,8 +3084,6 @@ namespace .Extensions "ires reflection and is not compatible with AOT")] public static . IsEquivalentTo(this . source, . expected, . ordering = 0, [.("expected")] string? expectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] public static . IsEquivalentTo(this . source, . expected, . comparer, . ordering = 0, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } } @@ -3184,6 +3181,8 @@ namespace .Extensions "ires reflection and is not compatible with AOT")] public static . IsNotEquivalentTo(this . source, . notExpected, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } + public static . IsNotEquivalentTo(this . source, . notExpected, . comparer, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) + where TCollection : . { } } public static class NotSameReferenceAssertionExtensions { diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 060668995b..665faeb994 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -385,9 +385,9 @@ namespace .Conditions public abstract class CollectionComparerBasedAssertion : . where TCollection : . { + protected .? Comparer; protected CollectionComparerBasedAssertion(. context) { } protected . GetComparer() { } - protected bool HasCustomComparer() { } protected void SetComparer(. comparer) { } } [.("Contains")] @@ -814,15 +814,14 @@ namespace .Conditions protected override string GetExpectation() { } public . Using(. comparer) { } } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] [.("IsEquivalentTo")] public class IsEquivalentToAssertion : . where TCollection : . { + [.("Collection equivalency uses structural comparison for complex objects, which requ" + + "ires reflection and is not compatible with AOT")] public IsEquivalentToAssertion(. context, . expected, . ordering = 0) { } public IsEquivalentToAssertion(. context, . expected, . comparer, . ordering = 0) { } - [.("AOT", "IL3050", Justification="Collection equivalency uses structural comparison which requires reflection")] protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -916,14 +915,14 @@ namespace .Conditions public . IgnoringType( type) { } public . IgnoringType() { } } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] [.("IsNotEquivalentTo")] public class NotEquivalentToAssertion : . where TCollection : . { + [.("Collection equivalency uses structural comparison for complex objects, which requ" + + "ires reflection and is not compatible with AOT")] public NotEquivalentToAssertion(. context, . notExpected, . ordering = 0) { } - [.("AOT", "IL3050", Justification="Collection equivalency uses structural comparison which requires reflection")] + public NotEquivalentToAssertion(. context, . notExpected, . comparer, . ordering = 0) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -3068,8 +3067,6 @@ namespace .Extensions "ires reflection and is not compatible with AOT")] public static . IsEquivalentTo(this . source, . expected, . ordering = 0, [.("expected")] string? expectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] public static . IsEquivalentTo(this . source, . expected, . comparer, . ordering = 0, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } } @@ -3166,6 +3163,8 @@ namespace .Extensions "ires reflection and is not compatible with AOT")] public static . IsNotEquivalentTo(this . source, . notExpected, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } + public static . IsNotEquivalentTo(this . source, . notExpected, . comparer, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) + where TCollection : . { } } public static class NotSameReferenceAssertionExtensions { diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 634cbf0e26..c8665a0b6a 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -388,9 +388,9 @@ namespace .Conditions public abstract class CollectionComparerBasedAssertion : . where TCollection : . { + protected .? Comparer; protected CollectionComparerBasedAssertion(. context) { } protected . GetComparer() { } - protected bool HasCustomComparer() { } protected void SetComparer(. comparer) { } } [.("Contains")] @@ -817,15 +817,14 @@ namespace .Conditions protected override string GetExpectation() { } public . Using(. comparer) { } } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] [.("IsEquivalentTo")] public class IsEquivalentToAssertion : . where TCollection : . { + [.("Collection equivalency uses structural comparison for complex objects, which requ" + + "ires reflection and is not compatible with AOT")] public IsEquivalentToAssertion(. context, . expected, . ordering = 0) { } public IsEquivalentToAssertion(. context, . expected, . comparer, . ordering = 0) { } - [.("AOT", "IL3050", Justification="Collection equivalency uses structural comparison which requires reflection")] protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -919,14 +918,14 @@ namespace .Conditions public . IgnoringType( type) { } public . IgnoringType() { } } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] [.("IsNotEquivalentTo")] public class NotEquivalentToAssertion : . where TCollection : . { + [.("Collection equivalency uses structural comparison for complex objects, which requ" + + "ires reflection and is not compatible with AOT")] public NotEquivalentToAssertion(. context, . notExpected, . ordering = 0) { } - [.("AOT", "IL3050", Justification="Collection equivalency uses structural comparison which requires reflection")] + public NotEquivalentToAssertion(. context, . notExpected, . comparer, . ordering = 0) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -3085,8 +3084,6 @@ namespace .Extensions "ires reflection and is not compatible with AOT")] public static . IsEquivalentTo(this . source, . expected, . ordering = 0, [.("expected")] string? expectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } - [.("Collection equivalency uses structural comparison for complex objects, which requ" + - "ires reflection and is not compatible with AOT")] public static . IsEquivalentTo(this . source, . expected, . comparer, . ordering = 0, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } } @@ -3184,6 +3181,8 @@ namespace .Extensions "ires reflection and is not compatible with AOT")] public static . IsNotEquivalentTo(this . source, . notExpected, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } + public static . IsNotEquivalentTo(this . source, . notExpected, . comparer, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) + where TCollection : . { } } public static class NotSameReferenceAssertionExtensions { diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index 03c58549c0..bd832a6fca 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -381,9 +381,9 @@ namespace .Conditions public abstract class CollectionComparerBasedAssertion : . where TCollection : . { + protected .? Comparer; protected CollectionComparerBasedAssertion(. context) { } protected . GetComparer() { } - protected bool HasCustomComparer() { } protected void SetComparer(. comparer) { } } [.("Contains")] @@ -893,6 +893,7 @@ namespace .Conditions where TCollection : . { public NotEquivalentToAssertion(. context, . notExpected, . ordering = 0) { } + public NotEquivalentToAssertion(. context, . notExpected, . comparer, . ordering = 0) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } public . Using(. comparer) { } @@ -2881,6 +2882,8 @@ namespace .Extensions { public static . IsNotEquivalentTo(this . source, . notExpected, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("ordering")] string? orderingExpression = null) where TCollection : . { } + public static . IsNotEquivalentTo(this . source, . notExpected, . comparer, . ordering = 0, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null, [.("ordering")] string? orderingExpression = null) + where TCollection : . { } } public static class NotSameReferenceAssertionExtensions { diff --git a/tools/tunit-nuget-tester/TUnit.NugetTester/TUnit.NugetTester/AotCompatibilityTests.cs b/tools/tunit-nuget-tester/TUnit.NugetTester/TUnit.NugetTester/AotCompatibilityTests.cs index 9702c05d5e..454de33ccf 100644 --- a/tools/tunit-nuget-tester/TUnit.NugetTester/TUnit.NugetTester/AotCompatibilityTests.cs +++ b/tools/tunit-nuget-tester/TUnit.NugetTester/TUnit.NugetTester/AotCompatibilityTests.cs @@ -1,3 +1,5 @@ +using TUnit.Assertions.Enums; + namespace TUnit.NugetTester; /// @@ -48,4 +50,32 @@ public async Task PropertyInjection_ShouldNotTriggerAotWarnings() await Assert.That(InjectedProperty).IsNotNull(); await Assert.That(InjectedProperty).IsEqualTo("test value"); } + + /// + /// Tests for issue #3851 - IsEquivalentTo with custom comparer should be AOT-compatible + /// When a custom comparer is provided, no reflection is used, so the method should not + /// have RequiresUnreferencedCode attribute and should be safe for AOT. + /// + [Test] + public async Task IsEquivalentTo_WithCustomComparer_ShouldNotTriggerAotWarnings() + { + // This test verifies that using IsEquivalentTo with a custom comparer doesn't trigger IL2026/IL3050 + // The custom comparer path doesn't use StructuralEqualityComparer which requires reflection + var list1 = new List { 1, 2, 3 }; + var list2 = new List { 3, 2, 1 }; + + // Using explicit comparer - should be AOT-safe + await Assert.That(list1).IsEquivalentTo(list2, EqualityComparer.Default); + } + + [Test] + public async Task IsEquivalentTo_WithCustomComparer_OrderMatching_ShouldNotTriggerAotWarnings() + { + // Verify that custom comparer works with both ordering modes + var list1 = new List { "a", "b", "c" }; + var list2 = new List { "a", "b", "c" }; + + // Using custom comparer with order matching - should be AOT-safe + await Assert.That(list1).IsEquivalentTo(list2, StringComparer.OrdinalIgnoreCase, CollectionOrdering.Matching); + } } From ce683dfa83ea739dac7ebe9278f90a97d5b194b5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:29:22 +0000 Subject: [PATCH 064/192] chore: update benchmark results (#3871) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 38 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 264 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 336 insertions(+), 332 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index d3f9769eb3..22b9980ccd 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 556.5 ms | 556.3 ms | 2.03 ms | -| NUnit | 4.4.0 | 663.3 ms | 662.2 ms | 9.02 ms | -| MSTest | 4.0.2 | 635.0 ms | 632.0 ms | 11.80 ms | -| xUnit3 | 3.2.0 | 715.8 ms | 716.7 ms | 8.28 ms | -| **TUnit (AOT)** | 1.2.3 | 124.5 ms | 124.5 ms | 0.26 ms | +| **TUnit** | 1.2.3 | 560.1 ms | 560.4 ms | 3.17 ms | +| NUnit | 4.4.0 | 656.0 ms | 654.9 ms | 10.34 ms | +| MSTest | 4.0.2 | 630.9 ms | 628.0 ms | 10.08 ms | +| xUnit3 | 3.2.0 | 706.4 ms | 707.0 ms | 7.34 ms | +| **TUnit (AOT)** | 1.2.3 | 123.5 ms | 123.5 ms | 0.45 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 859 - bar [556.5, 663.3, 635, 715.8, 124.5] + y-axis "Time (ms)" 0 --> 848 + bar [560.1, 656, 630.9, 706.4, 123.5] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.218Z* +*Last generated: 2025-11-19T00:29:02.438Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index d06fcc5888..02dfbac55c 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 1.947 s | 1.953 s | 0.0381 s | -| Build_NUnit | 4.4.0 | 1.556 s | 1.557 s | 0.0171 s | -| Build_MSTest | 4.0.2 | 1.621 s | 1.624 s | 0.0156 s | -| Build_xUnit3 | 3.2.0 | 1.523 s | 1.527 s | 0.0162 s | +| **TUnit** | 1.2.3 | 2.164 s | 2.167 s | 0.0253 s | +| Build_NUnit | 4.4.0 | 1.749 s | 1.741 s | 0.0215 s | +| Build_MSTest | 4.0.2 | 1.818 s | 1.817 s | 0.0188 s | +| Build_xUnit3 | 3.2.0 | 1.722 s | 1.723 s | 0.0195 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [1.947, 1.556, 1.621, 1.523] + bar [2.164, 1.749, 1.818, 1.722] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.220Z* +*Last generated: 2025-11-19T00:29:02.441Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 06066bfb23..7d2a24a2e8 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 493.26 ms | 492.16 ms | 3.175 ms | -| NUnit | 4.4.0 | 601.85 ms | 601.22 ms | 13.698 ms | -| MSTest | 4.0.2 | 617.89 ms | 622.69 ms | 12.013 ms | -| xUnit3 | 3.2.0 | 610.52 ms | 609.06 ms | 11.016 ms | -| **TUnit (AOT)** | 1.2.3 | 24.33 ms | 24.31 ms | 0.233 ms | +| **TUnit** | 1.2.3 | 503.36 ms | 495.04 ms | 16.870 ms | +| NUnit | 4.4.0 | 545.44 ms | 545.42 ms | 17.606 ms | +| MSTest | 4.0.2 | 509.42 ms | 505.56 ms | 18.704 ms | +| xUnit3 | 3.2.0 | 572.97 ms | 574.93 ms | 7.924 ms | +| **TUnit (AOT)** | 1.2.3 | 24.12 ms | 24.02 ms | 0.288 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 742 - bar [493.26, 601.85, 617.89, 610.52, 24.33] + y-axis "Time (ms)" 0 --> 688 + bar [503.36, 545.44, 509.42, 572.97, 24.12] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.218Z* +*Last generated: 2025-11-19T00:29:02.439Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 5808198b81..4fc0330cab 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 595.5 ms | 595.7 ms | 2.63 ms | -| NUnit | 4.4.0 | 1,164.1 ms | 1,163.4 ms | 6.01 ms | -| MSTest | 4.0.2 | 2,947.1 ms | 2,948.2 ms | 6.02 ms | -| xUnit3 | 3.2.0 | 3,048.5 ms | 3,046.6 ms | 14.96 ms | -| **TUnit (AOT)** | 1.2.3 | 130.9 ms | 130.9 ms | 0.41 ms | +| **TUnit** | 1.2.3 | 594.4 ms | 594.6 ms | 2.99 ms | +| NUnit | 4.4.0 | 1,171.3 ms | 1,168.3 ms | 10.73 ms | +| MSTest | 4.0.2 | 2,951.1 ms | 2,951.4 ms | 6.02 ms | +| xUnit3 | 3.2.0 | 3,050.8 ms | 3,048.8 ms | 10.07 ms | +| **TUnit (AOT)** | 1.2.3 | 130.6 ms | 130.3 ms | 0.69 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3659 - bar [595.5, 1164.1, 2947.1, 3048.5, 130.9] + y-axis "Time (ms)" 0 --> 3661 + bar [594.4, 1171.3, 2951.1, 3050.8, 130.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.219Z* +*Last generated: 2025-11-19T00:29:02.439Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 7807cc0d66..a9d838a520 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 561.43 ms | 562.61 ms | 4.718 ms | -| NUnit | 4.4.0 | 1,556.36 ms | 1,557.95 ms | 7.815 ms | -| MSTest | 4.0.2 | 1,517.35 ms | 1,517.64 ms | 12.824 ms | -| xUnit3 | 3.2.0 | 1,602.60 ms | 1,603.72 ms | 11.920 ms | -| **TUnit (AOT)** | 1.2.3 | 79.00 ms | 79.03 ms | 0.223 ms | +| **TUnit** | 1.2.3 | 561.88 ms | 561.36 ms | 2.710 ms | +| NUnit | 4.4.0 | 1,538.39 ms | 1,541.13 ms | 10.564 ms | +| MSTest | 4.0.2 | 1,496.30 ms | 1,496.64 ms | 6.921 ms | +| xUnit3 | 3.2.0 | 1,583.05 ms | 1,584.35 ms | 5.108 ms | +| **TUnit (AOT)** | 1.2.3 | 78.48 ms | 78.54 ms | 0.287 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1924 - bar [561.43, 1556.36, 1517.35, 1602.6, 79] + y-axis "Time (ms)" 0 --> 1900 + bar [561.88, 1538.39, 1496.3, 1583.05, 78.48] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.219Z* +*Last generated: 2025-11-19T00:29:02.439Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 368e584fb2..13672b12dd 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 541.57 ms | 540.90 ms | 3.848 ms | -| NUnit | 4.4.0 | 591.49 ms | 591.89 ms | 9.280 ms | -| MSTest | 4.0.2 | 512.41 ms | 507.96 ms | 11.331 ms | -| xUnit3 | 3.2.0 | 596.95 ms | 593.96 ms | 9.270 ms | -| **TUnit (AOT)** | 1.2.3 | 43.84 ms | 43.96 ms | 3.376 ms | +| **TUnit** | 1.2.3 | 513.84 ms | 512.81 ms | 5.747 ms | +| NUnit | 4.4.0 | 679.95 ms | 683.02 ms | 9.927 ms | +| MSTest | 4.0.2 | 668.53 ms | 667.63 ms | 7.963 ms | +| xUnit3 | 3.2.0 | 675.14 ms | 673.32 ms | 13.155 ms | +| **TUnit (AOT)** | 1.2.3 | 44.50 ms | 44.33 ms | 3.868 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 717 - bar [541.57, 591.49, 512.41, 596.95, 43.84] + y-axis "Time (ms)" 0 --> 816 + bar [513.84, 679.95, 668.53, 675.14, 44.5] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.219Z* +*Last generated: 2025-11-19T00:29:02.440Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index fa7067085b..cc29e8f4b6 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-18** from the latest CI run. +This benchmark was automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 578.7 ms | 578.1 ms | 6.18 ms | -| NUnit | 4.4.0 | 1,182.7 ms | 1,182.8 ms | 8.39 ms | -| MSTest | 4.0.2 | 1,152.5 ms | 1,151.9 ms | 6.97 ms | -| xUnit3 | 3.2.0 | 1,229.3 ms | 1,225.5 ms | 9.31 ms | +| **TUnit** | 1.2.3 | 557.5 ms | 555.9 ms | 6.46 ms | +| NUnit | 4.4.0 | 1,158.2 ms | 1,160.7 ms | 7.63 ms | +| MSTest | 4.0.2 | 1,133.6 ms | 1,133.1 ms | 8.07 ms | +| xUnit3 | 3.2.0 | 1,211.7 ms | 1,210.4 ms | 10.10 ms | | **TUnit (AOT)** | 1.2.3 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-18** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1476 - bar [578.7, 1182.7, 1152.5, 1229.3, 0] + y-axis "Time (ms)" 0 --> 1455 + bar [557.5, 1158.2, 1133.6, 1211.7, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-18T00:28:14.220Z* +*Last generated: 2025-11-19T00:29:02.440Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 5dcade5491..a219249df0 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-18** from the latest CI run. +These benchmarks were automatically generated on **2025-11-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-18T00:28:14.220Z* +*Last generated: 2025-11-19T00:29:02.441Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index a7ec56b194..0c4ec5bb60 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.218Z", + "timestamp": "2025-11-19T00:29:02.439Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "556.5 ms", - "Error": "2.29 ms", - "StdDev": "2.03 ms", - "Median": "556.3 ms" + "Mean": "560.1 ms", + "Error": "3.80 ms", + "StdDev": "3.17 ms", + "Median": "560.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "663.3 ms", - "Error": "10.81 ms", - "StdDev": "9.02 ms", - "Median": "662.2 ms" + "Mean": "656.0 ms", + "Error": "11.66 ms", + "StdDev": "10.34 ms", + "Median": "654.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "635.0 ms", - "Error": "12.02 ms", - "StdDev": "11.80 ms", - "Median": "632.0 ms" + "Mean": "630.9 ms", + "Error": "10.78 ms", + "StdDev": "10.08 ms", + "Median": "628.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "715.8 ms", - "Error": "9.34 ms", - "StdDev": "8.28 ms", - "Median": "716.7 ms" + "Mean": "706.4 ms", + "Error": "7.84 ms", + "StdDev": "7.34 ms", + "Median": "707.0 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "124.5 ms", - "Error": "0.31 ms", - "StdDev": "0.26 ms", - "Median": "124.5 ms" + "Mean": "123.5 ms", + "Error": "0.51 ms", + "StdDev": "0.45 ms", + "Median": "123.5 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index a53dfb6c92..ff06ac3067 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.220Z", + "timestamp": "2025-11-19T00:29:02.441Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.3", - "Mean": "1.947 s", - "Error": "0.0371 s", - "StdDev": "0.0381 s", - "Median": "1.953 s" + "Mean": "2.164 s", + "Error": "0.0271 s", + "StdDev": "0.0253 s", + "Median": "2.167 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.556 s", - "Error": "0.0183 s", - "StdDev": "0.0171 s", - "Median": "1.557 s" + "Mean": "1.749 s", + "Error": "0.0230 s", + "StdDev": "0.0215 s", + "Median": "1.741 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.621 s", - "Error": "0.0167 s", - "StdDev": "0.0156 s", - "Median": "1.624 s" + "Mean": "1.818 s", + "Error": "0.0212 s", + "StdDev": "0.0188 s", + "Median": "1.817 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.523 s", - "Error": "0.0173 s", - "StdDev": "0.0162 s", - "Median": "1.527 s" + "Mean": "1.722 s", + "Error": "0.0208 s", + "StdDev": "0.0195 s", + "Median": "1.723 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 482e01a132..3318c12ef3 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.219Z", + "timestamp": "2025-11-19T00:29:02.439Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "493.26 ms", - "Error": "3.582 ms", - "StdDev": "3.175 ms", - "Median": "492.16 ms" + "Mean": "503.36 ms", + "Error": "9.935 ms", + "StdDev": "16.870 ms", + "Median": "495.04 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "601.85 ms", - "Error": "11.895 ms", - "StdDev": "13.698 ms", - "Median": "601.22 ms" + "Mean": "545.44 ms", + "Error": "10.716 ms", + "StdDev": "17.606 ms", + "Median": "545.42 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "617.89 ms", - "Error": "11.698 ms", - "StdDev": "12.013 ms", - "Median": "622.69 ms" + "Mean": "509.42 ms", + "Error": "10.091 ms", + "StdDev": "18.704 ms", + "Median": "505.56 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "610.52 ms", - "Error": "11.777 ms", - "StdDev": "11.016 ms", - "Median": "609.06 ms" + "Mean": "572.97 ms", + "Error": "9.490 ms", + "StdDev": "7.924 ms", + "Median": "574.93 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "24.33 ms", - "Error": "0.263 ms", - "StdDev": "0.233 ms", - "Median": "24.31 ms" + "Mean": "24.12 ms", + "Error": "0.325 ms", + "StdDev": "0.288 ms", + "Median": "24.02 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 8519b4b264..19e4a2661c 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.219Z", + "timestamp": "2025-11-19T00:29:02.439Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "595.5 ms", - "Error": "2.81 ms", - "StdDev": "2.63 ms", - "Median": "595.7 ms" + "Mean": "594.4 ms", + "Error": "3.58 ms", + "StdDev": "2.99 ms", + "Median": "594.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,164.1 ms", - "Error": "6.78 ms", - "StdDev": "6.01 ms", - "Median": "1,163.4 ms" + "Mean": "1,171.3 ms", + "Error": "12.10 ms", + "StdDev": "10.73 ms", + "Median": "1,168.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,947.1 ms", + "Mean": "2,951.1 ms", "Error": "6.79 ms", "StdDev": "6.02 ms", - "Median": "2,948.2 ms" + "Median": "2,951.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,048.5 ms", - "Error": "15.99 ms", - "StdDev": "14.96 ms", - "Median": "3,046.6 ms" + "Mean": "3,050.8 ms", + "Error": "10.77 ms", + "StdDev": "10.07 ms", + "Median": "3,048.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "130.9 ms", - "Error": "0.44 ms", - "StdDev": "0.41 ms", - "Median": "130.9 ms" + "Mean": "130.6 ms", + "Error": "0.74 ms", + "StdDev": "0.69 ms", + "Median": "130.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index d48c2a3178..c67a0dced4 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.219Z", + "timestamp": "2025-11-19T00:29:02.440Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "561.43 ms", - "Error": "5.322 ms", - "StdDev": "4.718 ms", - "Median": "562.61 ms" + "Mean": "561.88 ms", + "Error": "3.246 ms", + "StdDev": "2.710 ms", + "Median": "561.36 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,556.36 ms", - "Error": "8.816 ms", - "StdDev": "7.815 ms", - "Median": "1,557.95 ms" + "Mean": "1,538.39 ms", + "Error": "11.917 ms", + "StdDev": "10.564 ms", + "Median": "1,541.13 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,517.35 ms", - "Error": "13.710 ms", - "StdDev": "12.824 ms", - "Median": "1,517.64 ms" + "Mean": "1,496.30 ms", + "Error": "8.288 ms", + "StdDev": "6.921 ms", + "Median": "1,496.64 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,602.60 ms", - "Error": "12.743 ms", - "StdDev": "11.920 ms", - "Median": "1,603.72 ms" + "Mean": "1,583.05 ms", + "Error": "6.117 ms", + "StdDev": "5.108 ms", + "Median": "1,584.35 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "79.00 ms", - "Error": "0.238 ms", - "StdDev": "0.223 ms", - "Median": "79.03 ms" + "Mean": "78.48 ms", + "Error": "0.324 ms", + "StdDev": "0.287 ms", + "Median": "78.54 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index a6dfe8b640..3181cc9396 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.219Z", + "timestamp": "2025-11-19T00:29:02.440Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "541.57 ms", - "Error": "4.341 ms", - "StdDev": "3.848 ms", - "Median": "540.90 ms" + "Mean": "513.84 ms", + "Error": "6.144 ms", + "StdDev": "5.747 ms", + "Median": "512.81 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "591.49 ms", - "Error": "10.469 ms", - "StdDev": "9.280 ms", - "Median": "591.89 ms" + "Mean": "679.95 ms", + "Error": "11.889 ms", + "StdDev": "9.927 ms", + "Median": "683.02 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "512.41 ms", - "Error": "10.194 ms", - "StdDev": "11.331 ms", - "Median": "507.96 ms" + "Mean": "668.53 ms", + "Error": "8.982 ms", + "StdDev": "7.963 ms", + "Median": "667.63 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "596.95 ms", - "Error": "10.457 ms", - "StdDev": "9.270 ms", - "Median": "593.96 ms" + "Mean": "675.14 ms", + "Error": "13.395 ms", + "StdDev": "13.155 ms", + "Median": "673.32 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "43.84 ms", - "Error": "1.157 ms", - "StdDev": "3.376 ms", - "Median": "43.96 ms" + "Mean": "44.50 ms", + "Error": "1.312 ms", + "StdDev": "3.868 ms", + "Median": "44.33 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 650a5db7b8..4c1b968a51 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.220Z", + "timestamp": "2025-11-19T00:29:02.440Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "578.7 ms", - "Error": "6.61 ms", - "StdDev": "6.18 ms", - "Median": "578.1 ms" + "Mean": "557.5 ms", + "Error": "7.29 ms", + "StdDev": "6.46 ms", + "Median": "555.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,182.7 ms", - "Error": "9.46 ms", - "StdDev": "8.39 ms", - "Median": "1,182.8 ms" + "Mean": "1,158.2 ms", + "Error": "8.60 ms", + "StdDev": "7.63 ms", + "Median": "1,160.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,152.5 ms", - "Error": "7.45 ms", - "StdDev": "6.97 ms", - "Median": "1,151.9 ms" + "Mean": "1,133.6 ms", + "Error": "9.11 ms", + "StdDev": "8.07 ms", + "Median": "1,133.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,229.3 ms", - "Error": "9.96 ms", - "StdDev": "9.31 ms", - "Median": "1,225.5 ms" + "Mean": "1,211.7 ms", + "Error": "10.79 ms", + "StdDev": "10.10 ms", + "Median": "1,210.4 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 26988cc598..55e6167702 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -54,5 +54,9 @@ { "date": "2025-11-18", "environment": "Ubuntu" + }, + { + "date": "2025-11-19", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 55ec1a5025..ad4aa4d097 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-18T00:28:14.221Z", + "timestamp": "2025-11-19T00:29:02.441Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "556.5 ms", - "Error": "2.29 ms", - "StdDev": "2.03 ms", - "Median": "556.3 ms" + "Mean": "560.1 ms", + "Error": "3.80 ms", + "StdDev": "3.17 ms", + "Median": "560.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "663.3 ms", - "Error": "10.81 ms", - "StdDev": "9.02 ms", - "Median": "662.2 ms" + "Mean": "656.0 ms", + "Error": "11.66 ms", + "StdDev": "10.34 ms", + "Median": "654.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "635.0 ms", - "Error": "12.02 ms", - "StdDev": "11.80 ms", - "Median": "632.0 ms" + "Mean": "630.9 ms", + "Error": "10.78 ms", + "StdDev": "10.08 ms", + "Median": "628.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "715.8 ms", - "Error": "9.34 ms", - "StdDev": "8.28 ms", - "Median": "716.7 ms" + "Mean": "706.4 ms", + "Error": "7.84 ms", + "StdDev": "7.34 ms", + "Median": "707.0 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "124.5 ms", - "Error": "0.31 ms", - "StdDev": "0.26 ms", - "Median": "124.5 ms" + "Mean": "123.5 ms", + "Error": "0.51 ms", + "StdDev": "0.45 ms", + "Median": "123.5 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "493.26 ms", - "Error": "3.582 ms", - "StdDev": "3.175 ms", - "Median": "492.16 ms" + "Mean": "503.36 ms", + "Error": "9.935 ms", + "StdDev": "16.870 ms", + "Median": "495.04 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "601.85 ms", - "Error": "11.895 ms", - "StdDev": "13.698 ms", - "Median": "601.22 ms" + "Mean": "545.44 ms", + "Error": "10.716 ms", + "StdDev": "17.606 ms", + "Median": "545.42 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "617.89 ms", - "Error": "11.698 ms", - "StdDev": "12.013 ms", - "Median": "622.69 ms" + "Mean": "509.42 ms", + "Error": "10.091 ms", + "StdDev": "18.704 ms", + "Median": "505.56 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "610.52 ms", - "Error": "11.777 ms", - "StdDev": "11.016 ms", - "Median": "609.06 ms" + "Mean": "572.97 ms", + "Error": "9.490 ms", + "StdDev": "7.924 ms", + "Median": "574.93 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "24.33 ms", - "Error": "0.263 ms", - "StdDev": "0.233 ms", - "Median": "24.31 ms" + "Mean": "24.12 ms", + "Error": "0.325 ms", + "StdDev": "0.288 ms", + "Median": "24.02 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "595.5 ms", - "Error": "2.81 ms", - "StdDev": "2.63 ms", - "Median": "595.7 ms" + "Mean": "594.4 ms", + "Error": "3.58 ms", + "StdDev": "2.99 ms", + "Median": "594.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,164.1 ms", - "Error": "6.78 ms", - "StdDev": "6.01 ms", - "Median": "1,163.4 ms" + "Mean": "1,171.3 ms", + "Error": "12.10 ms", + "StdDev": "10.73 ms", + "Median": "1,168.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,947.1 ms", + "Mean": "2,951.1 ms", "Error": "6.79 ms", "StdDev": "6.02 ms", - "Median": "2,948.2 ms" + "Median": "2,951.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,048.5 ms", - "Error": "15.99 ms", - "StdDev": "14.96 ms", - "Median": "3,046.6 ms" + "Mean": "3,050.8 ms", + "Error": "10.77 ms", + "StdDev": "10.07 ms", + "Median": "3,048.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "130.9 ms", - "Error": "0.44 ms", - "StdDev": "0.41 ms", - "Median": "130.9 ms" + "Mean": "130.6 ms", + "Error": "0.74 ms", + "StdDev": "0.69 ms", + "Median": "130.3 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "561.43 ms", - "Error": "5.322 ms", - "StdDev": "4.718 ms", - "Median": "562.61 ms" + "Mean": "561.88 ms", + "Error": "3.246 ms", + "StdDev": "2.710 ms", + "Median": "561.36 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,556.36 ms", - "Error": "8.816 ms", - "StdDev": "7.815 ms", - "Median": "1,557.95 ms" + "Mean": "1,538.39 ms", + "Error": "11.917 ms", + "StdDev": "10.564 ms", + "Median": "1,541.13 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,517.35 ms", - "Error": "13.710 ms", - "StdDev": "12.824 ms", - "Median": "1,517.64 ms" + "Mean": "1,496.30 ms", + "Error": "8.288 ms", + "StdDev": "6.921 ms", + "Median": "1,496.64 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,602.60 ms", - "Error": "12.743 ms", - "StdDev": "11.920 ms", - "Median": "1,603.72 ms" + "Mean": "1,583.05 ms", + "Error": "6.117 ms", + "StdDev": "5.108 ms", + "Median": "1,584.35 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "79.00 ms", - "Error": "0.238 ms", - "StdDev": "0.223 ms", - "Median": "79.03 ms" + "Mean": "78.48 ms", + "Error": "0.324 ms", + "StdDev": "0.287 ms", + "Median": "78.54 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "541.57 ms", - "Error": "4.341 ms", - "StdDev": "3.848 ms", - "Median": "540.90 ms" + "Mean": "513.84 ms", + "Error": "6.144 ms", + "StdDev": "5.747 ms", + "Median": "512.81 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "591.49 ms", - "Error": "10.469 ms", - "StdDev": "9.280 ms", - "Median": "591.89 ms" + "Mean": "679.95 ms", + "Error": "11.889 ms", + "StdDev": "9.927 ms", + "Median": "683.02 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "512.41 ms", - "Error": "10.194 ms", - "StdDev": "11.331 ms", - "Median": "507.96 ms" + "Mean": "668.53 ms", + "Error": "8.982 ms", + "StdDev": "7.963 ms", + "Median": "667.63 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "596.95 ms", - "Error": "10.457 ms", - "StdDev": "9.270 ms", - "Median": "593.96 ms" + "Mean": "675.14 ms", + "Error": "13.395 ms", + "StdDev": "13.155 ms", + "Median": "673.32 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.3", - "Mean": "43.84 ms", - "Error": "1.157 ms", - "StdDev": "3.376 ms", - "Median": "43.96 ms" + "Mean": "44.50 ms", + "Error": "1.312 ms", + "StdDev": "3.868 ms", + "Median": "44.33 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.3", - "Mean": "578.7 ms", - "Error": "6.61 ms", - "StdDev": "6.18 ms", - "Median": "578.1 ms" + "Mean": "557.5 ms", + "Error": "7.29 ms", + "StdDev": "6.46 ms", + "Median": "555.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,182.7 ms", - "Error": "9.46 ms", - "StdDev": "8.39 ms", - "Median": "1,182.8 ms" + "Mean": "1,158.2 ms", + "Error": "8.60 ms", + "StdDev": "7.63 ms", + "Median": "1,160.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,152.5 ms", - "Error": "7.45 ms", - "StdDev": "6.97 ms", - "Median": "1,151.9 ms" + "Mean": "1,133.6 ms", + "Error": "9.11 ms", + "StdDev": "8.07 ms", + "Median": "1,133.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,229.3 ms", - "Error": "9.96 ms", - "StdDev": "9.31 ms", - "Median": "1,225.5 ms" + "Mean": "1,211.7 ms", + "Error": "10.79 ms", + "StdDev": "10.10 ms", + "Median": "1,210.4 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.3", - "Mean": "1.947 s", - "Error": "0.0371 s", - "StdDev": "0.0381 s", - "Median": "1.953 s" + "Mean": "2.164 s", + "Error": "0.0271 s", + "StdDev": "0.0253 s", + "Median": "2.167 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.556 s", - "Error": "0.0183 s", - "StdDev": "0.0171 s", - "Median": "1.557 s" + "Mean": "1.749 s", + "Error": "0.0230 s", + "StdDev": "0.0215 s", + "Median": "1.741 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.621 s", - "Error": "0.0167 s", - "StdDev": "0.0156 s", - "Median": "1.624 s" + "Mean": "1.818 s", + "Error": "0.0212 s", + "StdDev": "0.0188 s", + "Median": "1.817 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.523 s", - "Error": "0.0173 s", - "StdDev": "0.0162 s", - "Median": "1.527 s" + "Mean": "1.722 s", + "Error": "0.0208 s", + "StdDev": "0.0195 s", + "Median": "1.723 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-18T00:28:14.217Z" + "lastUpdated": "2025-11-19T00:29:02.438Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index efa7dfbc9c..345d48e055 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-18", + "timestamp": "2025-11-19", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 99fd221dbe9b5abfe3a1ede3e106c16415c9a8ac Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:40:58 +0000 Subject: [PATCH 065/192] chore(deps): update tunit to 1.2.11 (#3870) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index cc33abe666..d49872d2ef 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index d2e029d0c6..c0ebc448b7 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 905a5dd8b7..afdec0e907 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 107780bda0..b48dbdcee6 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index bbe3ede435..210765cf61 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 1751db5e8c..0350fa763c 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index ee11fb3565..01a2c3a050 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 548b07f51c..d616c36161 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index b49bdc3b89..1f9eb15ef5 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From a5f09ada18803b38f3292f5f6a16d18c6dffceb3 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:48:06 +0000 Subject: [PATCH 066/192] chore(deps): update dependency microsoft.testing.platform.msbuild to 2.0.2 (#3869) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d49872d2ef..309084a685 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -43,7 +43,7 @@ - + From af9939c92d3690648314b0e57a1138ffdf941bb1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 19 Nov 2025 17:14:00 +0000 Subject: [PATCH 067/192] chore(deps): update dependency publicapigenerator to 11.5.1 (#3873) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 309084a685..5d5b7d8be8 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -60,7 +60,7 @@ - + From a5b03ed65d487fa33ef4a345dd4d858e60c1cf1b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 19 Nov 2025 19:06:18 +0000 Subject: [PATCH 068/192] chore(deps): update dependency cliwrap to 3.10.0 (#3874) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5d5b7d8be8..637cc27c1c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -10,7 +10,7 @@ - + From edffc356d06993abb346a03586cb6014e40096a3 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 20 Nov 2025 00:28:34 +0000 Subject: [PATCH 069/192] chore: update benchmark results (#3875) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 46 +-- .../benchmarks/MassiveParallelTests.json | 46 +-- docs/static/benchmarks/MatrixTests.json | 46 +-- docs/static/benchmarks/ScaleTests.json | 46 +-- .../static/benchmarks/SetupTeardownTests.json | 38 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 292 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 366 insertions(+), 362 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 22b9980ccd..fa657efd9d 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 560.1 ms | 560.4 ms | 3.17 ms | -| NUnit | 4.4.0 | 656.0 ms | 654.9 ms | 10.34 ms | -| MSTest | 4.0.2 | 630.9 ms | 628.0 ms | 10.08 ms | -| xUnit3 | 3.2.0 | 706.4 ms | 707.0 ms | 7.34 ms | -| **TUnit (AOT)** | 1.2.3 | 123.5 ms | 123.5 ms | 0.45 ms | +| **TUnit** | 1.2.11 | 556.3 ms | 556.3 ms | 4.46 ms | +| NUnit | 4.4.0 | 656.0 ms | 652.5 ms | 9.79 ms | +| MSTest | 4.0.2 | 626.0 ms | 625.3 ms | 8.22 ms | +| xUnit3 | 3.2.0 | 701.3 ms | 698.3 ms | 7.16 ms | +| **TUnit (AOT)** | 1.2.11 | 124.3 ms | 124.3 ms | 0.31 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 848 - bar [560.1, 656, 630.9, 706.4, 123.5] + y-axis "Time (ms)" 0 --> 842 + bar [556.3, 656, 626, 701.3, 124.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.438Z* +*Last generated: 2025-11-20T00:28:21.079Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 02dfbac55c..0f914badbf 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 2.164 s | 2.167 s | 0.0253 s | -| Build_NUnit | 4.4.0 | 1.749 s | 1.741 s | 0.0215 s | -| Build_MSTest | 4.0.2 | 1.818 s | 1.817 s | 0.0188 s | -| Build_xUnit3 | 3.2.0 | 1.722 s | 1.723 s | 0.0195 s | +| **TUnit** | 1.2.11 | 2.096 s | 2.087 s | 0.0247 s | +| Build_NUnit | 4.4.0 | 1.707 s | 1.713 s | 0.0257 s | +| Build_MSTest | 4.0.2 | 1.792 s | 1.795 s | 0.0227 s | +| Build_xUnit3 | 3.2.0 | 1.660 s | 1.664 s | 0.0171 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.164, 1.749, 1.818, 1.722] + bar [2.096, 1.707, 1.792, 1.66] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.441Z* +*Last generated: 2025-11-20T00:28:21.081Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 7d2a24a2e8..5cffd8cea6 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 503.36 ms | 495.04 ms | 16.870 ms | -| NUnit | 4.4.0 | 545.44 ms | 545.42 ms | 17.606 ms | -| MSTest | 4.0.2 | 509.42 ms | 505.56 ms | 18.704 ms | -| xUnit3 | 3.2.0 | 572.97 ms | 574.93 ms | 7.924 ms | -| **TUnit (AOT)** | 1.2.3 | 24.12 ms | 24.02 ms | 0.288 ms | +| **TUnit** | 1.2.11 | 504.85 ms | 504.93 ms | 4.652 ms | +| NUnit | 4.4.0 | 602.92 ms | 602.92 ms | 8.093 ms | +| MSTest | 4.0.2 | 617.40 ms | 616.45 ms | 5.510 ms | +| xUnit3 | 3.2.0 | 614.39 ms | 611.15 ms | 11.735 ms | +| **TUnit (AOT)** | 1.2.11 | 25.60 ms | 25.69 ms | 0.624 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 688 - bar [503.36, 545.44, 509.42, 572.97, 24.12] + y-axis "Time (ms)" 0 --> 741 + bar [504.85, 602.92, 617.4, 614.39, 25.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.439Z* +*Last generated: 2025-11-20T00:28:21.080Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 4fc0330cab..1c50a7b89c 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 594.4 ms | 594.6 ms | 2.99 ms | -| NUnit | 4.4.0 | 1,171.3 ms | 1,168.3 ms | 10.73 ms | -| MSTest | 4.0.2 | 2,951.1 ms | 2,951.4 ms | 6.02 ms | -| xUnit3 | 3.2.0 | 3,050.8 ms | 3,048.8 ms | 10.07 ms | -| **TUnit (AOT)** | 1.2.3 | 130.6 ms | 130.3 ms | 0.69 ms | +| **TUnit** | 1.2.11 | 601.9 ms | 601.6 ms | 7.25 ms | +| NUnit | 4.4.0 | 1,206.3 ms | 1,203.0 ms | 13.87 ms | +| MSTest | 4.0.2 | 2,983.3 ms | 2,984.1 ms | 5.48 ms | +| xUnit3 | 3.2.0 | 3,069.8 ms | 3,070.7 ms | 4.67 ms | +| **TUnit (AOT)** | 1.2.11 | 131.1 ms | 131.1 ms | 0.45 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3661 - bar [594.4, 1171.3, 2951.1, 3050.8, 130.6] + y-axis "Time (ms)" 0 --> 3684 + bar [601.9, 1206.3, 2983.3, 3069.8, 131.1] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.439Z* +*Last generated: 2025-11-20T00:28:21.080Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index a9d838a520..a455c09243 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 561.88 ms | 561.36 ms | 2.710 ms | -| NUnit | 4.4.0 | 1,538.39 ms | 1,541.13 ms | 10.564 ms | -| MSTest | 4.0.2 | 1,496.30 ms | 1,496.64 ms | 6.921 ms | -| xUnit3 | 3.2.0 | 1,583.05 ms | 1,584.35 ms | 5.108 ms | -| **TUnit (AOT)** | 1.2.3 | 78.48 ms | 78.54 ms | 0.287 ms | +| **TUnit** | 1.2.11 | 561.09 ms | 560.90 ms | 2.690 ms | +| NUnit | 4.4.0 | 1,568.63 ms | 1,568.52 ms | 6.683 ms | +| MSTest | 4.0.2 | 1,527.48 ms | 1,528.24 ms | 5.902 ms | +| xUnit3 | 3.2.0 | 1,607.99 ms | 1,607.91 ms | 4.911 ms | +| **TUnit (AOT)** | 1.2.11 | 78.98 ms | 79.04 ms | 0.171 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1900 - bar [561.88, 1538.39, 1496.3, 1583.05, 78.48] + y-axis "Time (ms)" 0 --> 1930 + bar [561.09, 1568.63, 1527.48, 1607.99, 78.98] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.439Z* +*Last generated: 2025-11-20T00:28:21.080Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 13672b12dd..6a36ca595e 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 513.84 ms | 512.81 ms | 5.747 ms | -| NUnit | 4.4.0 | 679.95 ms | 683.02 ms | 9.927 ms | -| MSTest | 4.0.2 | 668.53 ms | 667.63 ms | 7.963 ms | -| xUnit3 | 3.2.0 | 675.14 ms | 673.32 ms | 13.155 ms | -| **TUnit (AOT)** | 1.2.3 | 44.50 ms | 44.33 ms | 3.868 ms | +| **TUnit** | 1.2.11 | 522.86 ms | 521.98 ms | 4.879 ms | +| NUnit | 4.4.0 | 614.14 ms | 613.81 ms | 8.401 ms | +| MSTest | 4.0.2 | 620.73 ms | 619.89 ms | 10.717 ms | +| xUnit3 | 3.2.0 | 613.65 ms | 611.98 ms | 7.848 ms | +| **TUnit (AOT)** | 1.2.11 | 46.30 ms | 46.04 ms | 3.593 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 816 - bar [513.84, 679.95, 668.53, 675.14, 44.5] + y-axis "Time (ms)" 0 --> 745 + bar [522.86, 614.14, 620.73, 613.65, 46.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.440Z* +*Last generated: 2025-11-20T00:28:21.081Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index cc29e8f4b6..0a9488a739 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-19** from the latest CI run. +This benchmark was automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.3 | 557.5 ms | 555.9 ms | 6.46 ms | -| NUnit | 4.4.0 | 1,158.2 ms | 1,160.7 ms | 7.63 ms | -| MSTest | 4.0.2 | 1,133.6 ms | 1,133.1 ms | 8.07 ms | -| xUnit3 | 3.2.0 | 1,211.7 ms | 1,210.4 ms | 10.10 ms | -| **TUnit (AOT)** | 1.2.3 | NA | NA | NA | +| **TUnit** | 1.2.11 | 586.0 ms | 586.0 ms | 7.14 ms | +| NUnit | 4.4.0 | 1,160.8 ms | 1,161.1 ms | 8.37 ms | +| MSTest | 4.0.2 | 1,133.4 ms | 1,132.9 ms | 11.79 ms | +| xUnit3 | 3.2.0 | 1,220.2 ms | 1,221.4 ms | 4.97 ms | +| **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-19** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1455 - bar [557.5, 1158.2, 1133.6, 1211.7, 0] + y-axis "Time (ms)" 0 --> 1465 + bar [586, 1160.8, 1133.4, 1220.2, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-19T00:29:02.440Z* +*Last generated: 2025-11-20T00:28:21.081Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index a219249df0..a256f4f439 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-19** from the latest CI run. +These benchmarks were automatically generated on **2025-11-20** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.2.3 | +| **TUnit** | 1.2.11 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-19T00:29:02.441Z* +*Last generated: 2025-11-20T00:28:21.082Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 0c4ec5bb60..d96b4b5ccc 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.439Z", + "timestamp": "2025-11-20T00:28:21.079Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "560.1 ms", - "Error": "3.80 ms", - "StdDev": "3.17 ms", - "Median": "560.4 ms" + "Version": "1.2.11", + "Mean": "556.3 ms", + "Error": "5.03 ms", + "StdDev": "4.46 ms", + "Median": "556.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", "Mean": "656.0 ms", - "Error": "11.66 ms", - "StdDev": "10.34 ms", - "Median": "654.9 ms" + "Error": "11.05 ms", + "StdDev": "9.79 ms", + "Median": "652.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "630.9 ms", - "Error": "10.78 ms", - "StdDev": "10.08 ms", - "Median": "628.0 ms" + "Mean": "626.0 ms", + "Error": "8.79 ms", + "StdDev": "8.22 ms", + "Median": "625.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "706.4 ms", - "Error": "7.84 ms", - "StdDev": "7.34 ms", - "Median": "707.0 ms" + "Mean": "701.3 ms", + "Error": "8.08 ms", + "StdDev": "7.16 ms", + "Median": "698.3 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "123.5 ms", - "Error": "0.51 ms", - "StdDev": "0.45 ms", - "Median": "123.5 ms" + "Version": "1.2.11", + "Mean": "124.3 ms", + "Error": "0.40 ms", + "StdDev": "0.31 ms", + "Median": "124.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index ff06ac3067..f2c1d2bc07 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.441Z", + "timestamp": "2025-11-20T00:28:21.082Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,35 +9,35 @@ "results": [ { "Method": "Build_TUnit", - "Version": "1.2.3", - "Mean": "2.164 s", - "Error": "0.0271 s", - "StdDev": "0.0253 s", - "Median": "2.167 s" + "Version": "1.2.11", + "Mean": "2.096 s", + "Error": "0.0264 s", + "StdDev": "0.0247 s", + "Median": "2.087 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.749 s", - "Error": "0.0230 s", - "StdDev": "0.0215 s", - "Median": "1.741 s" + "Mean": "1.707 s", + "Error": "0.0275 s", + "StdDev": "0.0257 s", + "Median": "1.713 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.818 s", - "Error": "0.0212 s", - "StdDev": "0.0188 s", - "Median": "1.817 s" + "Mean": "1.792 s", + "Error": "0.0243 s", + "StdDev": "0.0227 s", + "Median": "1.795 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.722 s", - "Error": "0.0208 s", - "StdDev": "0.0195 s", - "Median": "1.723 s" + "Mean": "1.660 s", + "Error": "0.0183 s", + "StdDev": "0.0171 s", + "Median": "1.664 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 3318c12ef3..89375a2dfd 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.439Z", + "timestamp": "2025-11-20T00:28:21.080Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "503.36 ms", - "Error": "9.935 ms", - "StdDev": "16.870 ms", - "Median": "495.04 ms" + "Version": "1.2.11", + "Mean": "504.85 ms", + "Error": "5.248 ms", + "StdDev": "4.652 ms", + "Median": "504.93 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "545.44 ms", - "Error": "10.716 ms", - "StdDev": "17.606 ms", - "Median": "545.42 ms" + "Mean": "602.92 ms", + "Error": "8.652 ms", + "StdDev": "8.093 ms", + "Median": "602.92 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "509.42 ms", - "Error": "10.091 ms", - "StdDev": "18.704 ms", - "Median": "505.56 ms" + "Mean": "617.40 ms", + "Error": "5.890 ms", + "StdDev": "5.510 ms", + "Median": "616.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "572.97 ms", - "Error": "9.490 ms", - "StdDev": "7.924 ms", - "Median": "574.93 ms" + "Mean": "614.39 ms", + "Error": "11.427 ms", + "StdDev": "11.735 ms", + "Median": "611.15 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "24.12 ms", - "Error": "0.325 ms", - "StdDev": "0.288 ms", - "Median": "24.02 ms" + "Version": "1.2.11", + "Mean": "25.60 ms", + "Error": "0.508 ms", + "StdDev": "0.624 ms", + "Median": "25.69 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 19e4a2661c..c2b4ad50d7 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.439Z", + "timestamp": "2025-11-20T00:28:21.080Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "594.4 ms", - "Error": "3.58 ms", - "StdDev": "2.99 ms", - "Median": "594.6 ms" + "Version": "1.2.11", + "Mean": "601.9 ms", + "Error": "7.75 ms", + "StdDev": "7.25 ms", + "Median": "601.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,171.3 ms", - "Error": "12.10 ms", - "StdDev": "10.73 ms", - "Median": "1,168.3 ms" + "Mean": "1,206.3 ms", + "Error": "15.65 ms", + "StdDev": "13.87 ms", + "Median": "1,203.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,951.1 ms", - "Error": "6.79 ms", - "StdDev": "6.02 ms", - "Median": "2,951.4 ms" + "Mean": "2,983.3 ms", + "Error": "6.19 ms", + "StdDev": "5.48 ms", + "Median": "2,984.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,050.8 ms", - "Error": "10.77 ms", - "StdDev": "10.07 ms", - "Median": "3,048.8 ms" + "Mean": "3,069.8 ms", + "Error": "5.60 ms", + "StdDev": "4.67 ms", + "Median": "3,070.7 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "130.6 ms", - "Error": "0.74 ms", - "StdDev": "0.69 ms", - "Median": "130.3 ms" + "Version": "1.2.11", + "Mean": "131.1 ms", + "Error": "0.51 ms", + "StdDev": "0.45 ms", + "Median": "131.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index c67a0dced4..c6080a5301 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.440Z", + "timestamp": "2025-11-20T00:28:21.080Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "561.88 ms", - "Error": "3.246 ms", - "StdDev": "2.710 ms", - "Median": "561.36 ms" + "Version": "1.2.11", + "Mean": "561.09 ms", + "Error": "3.035 ms", + "StdDev": "2.690 ms", + "Median": "560.90 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,538.39 ms", - "Error": "11.917 ms", - "StdDev": "10.564 ms", - "Median": "1,541.13 ms" + "Mean": "1,568.63 ms", + "Error": "7.145 ms", + "StdDev": "6.683 ms", + "Median": "1,568.52 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,496.30 ms", - "Error": "8.288 ms", - "StdDev": "6.921 ms", - "Median": "1,496.64 ms" + "Mean": "1,527.48 ms", + "Error": "6.657 ms", + "StdDev": "5.902 ms", + "Median": "1,528.24 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,583.05 ms", - "Error": "6.117 ms", - "StdDev": "5.108 ms", - "Median": "1,584.35 ms" + "Mean": "1,607.99 ms", + "Error": "5.540 ms", + "StdDev": "4.911 ms", + "Median": "1,607.91 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "78.48 ms", - "Error": "0.324 ms", - "StdDev": "0.287 ms", - "Median": "78.54 ms" + "Version": "1.2.11", + "Mean": "78.98 ms", + "Error": "0.193 ms", + "StdDev": "0.171 ms", + "Median": "79.04 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 3181cc9396..d97a780fe6 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.440Z", + "timestamp": "2025-11-20T00:28:21.081Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "513.84 ms", - "Error": "6.144 ms", - "StdDev": "5.747 ms", - "Median": "512.81 ms" + "Version": "1.2.11", + "Mean": "522.86 ms", + "Error": "5.216 ms", + "StdDev": "4.879 ms", + "Median": "521.98 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "679.95 ms", - "Error": "11.889 ms", - "StdDev": "9.927 ms", - "Median": "683.02 ms" + "Mean": "614.14 ms", + "Error": "9.477 ms", + "StdDev": "8.401 ms", + "Median": "613.81 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "668.53 ms", - "Error": "8.982 ms", - "StdDev": "7.963 ms", - "Median": "667.63 ms" + "Mean": "620.73 ms", + "Error": "12.089 ms", + "StdDev": "10.717 ms", + "Median": "619.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "675.14 ms", - "Error": "13.395 ms", - "StdDev": "13.155 ms", - "Median": "673.32 ms" + "Mean": "613.65 ms", + "Error": "8.853 ms", + "StdDev": "7.848 ms", + "Median": "611.98 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "44.50 ms", - "Error": "1.312 ms", - "StdDev": "3.868 ms", - "Median": "44.33 ms" + "Version": "1.2.11", + "Mean": "46.30 ms", + "Error": "1.219 ms", + "StdDev": "3.593 ms", + "Median": "46.04 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 4c1b968a51..895ae24bd1 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.440Z", + "timestamp": "2025-11-20T00:28:21.081Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,39 +9,39 @@ "results": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "557.5 ms", - "Error": "7.29 ms", - "StdDev": "6.46 ms", - "Median": "555.9 ms" + "Version": "1.2.11", + "Mean": "586.0 ms", + "Error": "7.64 ms", + "StdDev": "7.14 ms", + "Median": "586.0 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,158.2 ms", - "Error": "8.60 ms", - "StdDev": "7.63 ms", - "Median": "1,160.7 ms" + "Mean": "1,160.8 ms", + "Error": "8.95 ms", + "StdDev": "8.37 ms", + "Median": "1,161.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,133.6 ms", - "Error": "9.11 ms", - "StdDev": "8.07 ms", - "Median": "1,133.1 ms" + "Mean": "1,133.4 ms", + "Error": "12.60 ms", + "StdDev": "11.79 ms", + "Median": "1,132.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,211.7 ms", - "Error": "10.79 ms", - "StdDev": "10.10 ms", - "Median": "1,210.4 ms" + "Mean": "1,220.2 ms", + "Error": "5.31 ms", + "StdDev": "4.97 ms", + "Median": "1,221.4 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", + "Version": "1.2.11", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 55e6167702..53ac744f38 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -58,5 +58,9 @@ { "date": "2025-11-19", "environment": "Ubuntu" + }, + { + "date": "2025-11-20", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index ad4aa4d097..eedc561da0 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-19T00:29:02.441Z", + "timestamp": "2025-11-20T00:28:21.082Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "560.1 ms", - "Error": "3.80 ms", - "StdDev": "3.17 ms", - "Median": "560.4 ms" + "Version": "1.2.11", + "Mean": "556.3 ms", + "Error": "5.03 ms", + "StdDev": "4.46 ms", + "Median": "556.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", "Mean": "656.0 ms", - "Error": "11.66 ms", - "StdDev": "10.34 ms", - "Median": "654.9 ms" + "Error": "11.05 ms", + "StdDev": "9.79 ms", + "Median": "652.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "630.9 ms", - "Error": "10.78 ms", - "StdDev": "10.08 ms", - "Median": "628.0 ms" + "Mean": "626.0 ms", + "Error": "8.79 ms", + "StdDev": "8.22 ms", + "Median": "625.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "706.4 ms", - "Error": "7.84 ms", - "StdDev": "7.34 ms", - "Median": "707.0 ms" + "Mean": "701.3 ms", + "Error": "8.08 ms", + "StdDev": "7.16 ms", + "Median": "698.3 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "123.5 ms", - "Error": "0.51 ms", - "StdDev": "0.45 ms", - "Median": "123.5 ms" + "Version": "1.2.11", + "Mean": "124.3 ms", + "Error": "0.40 ms", + "StdDev": "0.31 ms", + "Median": "124.3 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "503.36 ms", - "Error": "9.935 ms", - "StdDev": "16.870 ms", - "Median": "495.04 ms" + "Version": "1.2.11", + "Mean": "504.85 ms", + "Error": "5.248 ms", + "StdDev": "4.652 ms", + "Median": "504.93 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "545.44 ms", - "Error": "10.716 ms", - "StdDev": "17.606 ms", - "Median": "545.42 ms" + "Mean": "602.92 ms", + "Error": "8.652 ms", + "StdDev": "8.093 ms", + "Median": "602.92 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "509.42 ms", - "Error": "10.091 ms", - "StdDev": "18.704 ms", - "Median": "505.56 ms" + "Mean": "617.40 ms", + "Error": "5.890 ms", + "StdDev": "5.510 ms", + "Median": "616.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "572.97 ms", - "Error": "9.490 ms", - "StdDev": "7.924 ms", - "Median": "574.93 ms" + "Mean": "614.39 ms", + "Error": "11.427 ms", + "StdDev": "11.735 ms", + "Median": "611.15 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "24.12 ms", - "Error": "0.325 ms", - "StdDev": "0.288 ms", - "Median": "24.02 ms" + "Version": "1.2.11", + "Mean": "25.60 ms", + "Error": "0.508 ms", + "StdDev": "0.624 ms", + "Median": "25.69 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "594.4 ms", - "Error": "3.58 ms", - "StdDev": "2.99 ms", - "Median": "594.6 ms" + "Version": "1.2.11", + "Mean": "601.9 ms", + "Error": "7.75 ms", + "StdDev": "7.25 ms", + "Median": "601.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,171.3 ms", - "Error": "12.10 ms", - "StdDev": "10.73 ms", - "Median": "1,168.3 ms" + "Mean": "1,206.3 ms", + "Error": "15.65 ms", + "StdDev": "13.87 ms", + "Median": "1,203.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,951.1 ms", - "Error": "6.79 ms", - "StdDev": "6.02 ms", - "Median": "2,951.4 ms" + "Mean": "2,983.3 ms", + "Error": "6.19 ms", + "StdDev": "5.48 ms", + "Median": "2,984.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,050.8 ms", - "Error": "10.77 ms", - "StdDev": "10.07 ms", - "Median": "3,048.8 ms" + "Mean": "3,069.8 ms", + "Error": "5.60 ms", + "StdDev": "4.67 ms", + "Median": "3,070.7 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "130.6 ms", - "Error": "0.74 ms", - "StdDev": "0.69 ms", - "Median": "130.3 ms" + "Version": "1.2.11", + "Mean": "131.1 ms", + "Error": "0.51 ms", + "StdDev": "0.45 ms", + "Median": "131.1 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "561.88 ms", - "Error": "3.246 ms", - "StdDev": "2.710 ms", - "Median": "561.36 ms" + "Version": "1.2.11", + "Mean": "561.09 ms", + "Error": "3.035 ms", + "StdDev": "2.690 ms", + "Median": "560.90 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,538.39 ms", - "Error": "11.917 ms", - "StdDev": "10.564 ms", - "Median": "1,541.13 ms" + "Mean": "1,568.63 ms", + "Error": "7.145 ms", + "StdDev": "6.683 ms", + "Median": "1,568.52 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,496.30 ms", - "Error": "8.288 ms", - "StdDev": "6.921 ms", - "Median": "1,496.64 ms" + "Mean": "1,527.48 ms", + "Error": "6.657 ms", + "StdDev": "5.902 ms", + "Median": "1,528.24 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,583.05 ms", - "Error": "6.117 ms", - "StdDev": "5.108 ms", - "Median": "1,584.35 ms" + "Mean": "1,607.99 ms", + "Error": "5.540 ms", + "StdDev": "4.911 ms", + "Median": "1,607.91 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "78.48 ms", - "Error": "0.324 ms", - "StdDev": "0.287 ms", - "Median": "78.54 ms" + "Version": "1.2.11", + "Mean": "78.98 ms", + "Error": "0.193 ms", + "StdDev": "0.171 ms", + "Median": "79.04 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "513.84 ms", - "Error": "6.144 ms", - "StdDev": "5.747 ms", - "Median": "512.81 ms" + "Version": "1.2.11", + "Mean": "522.86 ms", + "Error": "5.216 ms", + "StdDev": "4.879 ms", + "Median": "521.98 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "679.95 ms", - "Error": "11.889 ms", - "StdDev": "9.927 ms", - "Median": "683.02 ms" + "Mean": "614.14 ms", + "Error": "9.477 ms", + "StdDev": "8.401 ms", + "Median": "613.81 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "668.53 ms", - "Error": "8.982 ms", - "StdDev": "7.963 ms", - "Median": "667.63 ms" + "Mean": "620.73 ms", + "Error": "12.089 ms", + "StdDev": "10.717 ms", + "Median": "619.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "675.14 ms", - "Error": "13.395 ms", - "StdDev": "13.155 ms", - "Median": "673.32 ms" + "Mean": "613.65 ms", + "Error": "8.853 ms", + "StdDev": "7.848 ms", + "Median": "611.98 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", - "Mean": "44.50 ms", - "Error": "1.312 ms", - "StdDev": "3.868 ms", - "Median": "44.33 ms" + "Version": "1.2.11", + "Mean": "46.30 ms", + "Error": "1.219 ms", + "StdDev": "3.593 ms", + "Median": "46.04 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.2.3", - "Mean": "557.5 ms", - "Error": "7.29 ms", - "StdDev": "6.46 ms", - "Median": "555.9 ms" + "Version": "1.2.11", + "Mean": "586.0 ms", + "Error": "7.64 ms", + "StdDev": "7.14 ms", + "Median": "586.0 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,158.2 ms", - "Error": "8.60 ms", - "StdDev": "7.63 ms", - "Median": "1,160.7 ms" + "Mean": "1,160.8 ms", + "Error": "8.95 ms", + "StdDev": "8.37 ms", + "Median": "1,161.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,133.6 ms", - "Error": "9.11 ms", - "StdDev": "8.07 ms", - "Median": "1,133.1 ms" + "Mean": "1,133.4 ms", + "Error": "12.60 ms", + "StdDev": "11.79 ms", + "Median": "1,132.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,211.7 ms", - "Error": "10.79 ms", - "StdDev": "10.10 ms", - "Median": "1,210.4 ms" + "Mean": "1,220.2 ms", + "Error": "5.31 ms", + "StdDev": "4.97 ms", + "Median": "1,221.4 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.3", + "Version": "1.2.11", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.2.3", - "Mean": "2.164 s", - "Error": "0.0271 s", - "StdDev": "0.0253 s", - "Median": "2.167 s" + "Version": "1.2.11", + "Mean": "2.096 s", + "Error": "0.0264 s", + "StdDev": "0.0247 s", + "Median": "2.087 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.749 s", - "Error": "0.0230 s", - "StdDev": "0.0215 s", - "Median": "1.741 s" + "Mean": "1.707 s", + "Error": "0.0275 s", + "StdDev": "0.0257 s", + "Median": "1.713 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.818 s", - "Error": "0.0212 s", - "StdDev": "0.0188 s", - "Median": "1.817 s" + "Mean": "1.792 s", + "Error": "0.0243 s", + "StdDev": "0.0227 s", + "Median": "1.795 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.722 s", - "Error": "0.0208 s", - "StdDev": "0.0195 s", - "Median": "1.723 s" + "Mean": "1.660 s", + "Error": "0.0183 s", + "StdDev": "0.0171 s", + "Median": "1.664 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-19T00:29:02.438Z" + "lastUpdated": "2025-11-20T00:28:21.079Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 345d48e055..3d0c6e2f8c 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-19", + "timestamp": "2025-11-20", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 2a1bbb15c48842653b76f172d8ddbd3c36a97496 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 20 Nov 2025 05:39:25 +0000 Subject: [PATCH 070/192] chore(deps): update dependency humanizer to v3 (#3876) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 637cc27c1c..5a0d1f5be4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -14,7 +14,7 @@ - + From b19c52fd6c8bb3374fddabd947760bd6169418b3 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 20 Nov 2025 17:14:15 +0000 Subject: [PATCH 071/192] chore(deps): update actions/checkout action to v6 (#3877) Co-authored-by: Renovate Bot --- .github/workflows/claude-code-review.yml | 2 +- .github/workflows/claude.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/deploy-pages-test.yml | 2 +- .github/workflows/deploy-pages.yml | 2 +- .github/workflows/dotnet-build-different-locale.yml | 2 +- .github/workflows/dotnet.yml | 2 +- .github/workflows/generate-readme.yml | 2 +- .github/workflows/speed-comparison.yml | 8 ++++---- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index dc3652b5b1..7c094737ee 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 6de0bdfc3e..dde9e4d915 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -26,7 +26,7 @@ jobs: actions: read # Required for Claude to read CI results on PRs steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4dde9743e2..3d2840bc6d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -55,7 +55,7 @@ jobs: # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup .NET 9 uses: actions/setup-dotnet@v5 diff --git a/.github/workflows/deploy-pages-test.yml b/.github/workflows/deploy-pages-test.yml index 261a136ea7..f7dddc272e 100644 --- a/.github/workflows/deploy-pages-test.yml +++ b/.github/workflows/deploy-pages-test.yml @@ -13,7 +13,7 @@ jobs: run: working-directory: docs steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-node@v6 diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index e41288cdef..2040177ff8 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -16,7 +16,7 @@ jobs: run: working-directory: docs steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-node@v6 diff --git a/.github/workflows/dotnet-build-different-locale.yml b/.github/workflows/dotnet-build-different-locale.yml index fcb846d76d..21309e9d00 100644 --- a/.github/workflows/dotnet-build-different-locale.yml +++ b/.github/workflows/dotnet-build-different-locale.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 60785d933d..5221fa8aed 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -26,7 +26,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/generate-readme.yml b/.github/workflows/generate-readme.yml index 9b06bcf623..f7a36d093f 100644 --- a/.github/workflows/generate-readme.yml +++ b/.github/workflows/generate-readme.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 27c762a3e4..91b0386172 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: cancel-in-progress: true steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -97,7 +97,7 @@ jobs: cancel-in-progress: true steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -132,7 +132,7 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.ADMIN_TOKEN }} From b7c8c33879313e4f28464fd49434b3715827df8c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 21 Nov 2025 09:58:28 +0000 Subject: [PATCH 072/192] chore(deps): update dependency polyfill to 9.2.0 (#3879) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index 3e87a68017..3688510603 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.1.0 + <_TUnitPolyfillVersion>9.2.0 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From 957c5c113c1911bf57f429b8be1d8775e80df0bc Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:03:47 +0000 Subject: [PATCH 073/192] chore(deps): update dependency polyfill to 9.2.0 (#3878) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5a0d1f5be4..74a0f29e93 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + From cba0ffac462c4dcd23b653b095fb846ab41be3c3 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:58:24 +0000 Subject: [PATCH 074/192] chore(deps): update dependency verify.tool to v0.7.0 (#3881) Co-authored-by: Renovate Bot --- .config/dotnet-tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index d86752265b..d5bd384a8d 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -10,7 +10,7 @@ "rollForward": false }, "verify.tool": { - "version": "0.6.0", + "version": "0.7.0", "commands": [ "dotnet-verify" ], From 4c625966e1b200c65e78b9963ed095d3f39538c5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 21 Nov 2025 12:35:08 +0000 Subject: [PATCH 075/192] chore(deps): update verify to 31.7.2 (#3880) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 74a0f29e93..81aaab106d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From 14ee798d15e3b88ecac32dc90110c39f004ea0d0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 22 Nov 2025 23:35:52 +0000 Subject: [PATCH 076/192] chore(config): add docusaurus-plugin-llms for better LLM documentation (#3885) --- docs/docusaurus.config.ts | 4 + docs/package.json | 1 + docs/yarn.lock | 3726 +++++++++++++++++++------------------ 3 files changed, 1939 insertions(+), 1792 deletions(-) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index d9b66cd3c6..4ef47a5e11 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -31,6 +31,10 @@ const config: Config = { locales: ['en'], }, + plugins: [ + 'docusaurus-plugin-llms', + ], + presets: [ [ 'classic', diff --git a/docs/package.json b/docs/package.json index 4aab3e1654..592ddaeb7c 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,6 +28,7 @@ "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@docusaurus/types": "3.9.2", + "docusaurus-plugin-llms": "^0.2.2", "typescript": "~5.9.0" }, "browserslist": { diff --git a/docs/yarn.lock b/docs/yarn.lock index 884c7aca68..76fbe75ef8 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2,22 +2,23 @@ # yarn lockfile v1 -"@ai-sdk/gateway@1.0.29": - version "1.0.29" - resolved "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.29.tgz" - integrity sha512-o9LtmBiG2WAgs3GAmL79F8idan/UupxHG8Tyr2gP4aUSOzflM0bsvfzozBp8x6WatQnOx+Pio7YNw45Y6I16iw== +"@ai-sdk/gateway@2.0.14": + version "2.0.14" + resolved "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.14.tgz" + integrity sha512-QU+ZVizSXN/V5uWgwapXrCLvkUEmmJeojAbikMH4gLgbeQF3oRugcQm3D8X9B+Rnestbz5cevNap7vKyJT/jfA== dependencies: "@ai-sdk/provider" "2.0.0" - "@ai-sdk/provider-utils" "3.0.9" + "@ai-sdk/provider-utils" "3.0.17" + "@vercel/oidc" "3.0.5" -"@ai-sdk/provider-utils@3.0.9": - version "3.0.9" - resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.9.tgz" - integrity sha512-Pm571x5efqaI4hf9yW4KsVlDBDme8++UepZRnq+kqVBWWjgvGhQlzU8glaFq0YJEB9kkxZHbRRyVeHoV2sRYaQ== +"@ai-sdk/provider-utils@3.0.17": + version "3.0.17" + resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.17.tgz" + integrity sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw== dependencies: "@ai-sdk/provider" "2.0.0" "@standard-schema/spec" "^1.0.0" - eventsource-parser "^3.0.5" + eventsource-parser "^3.0.6" "@ai-sdk/provider@2.0.0": version "2.0.0" @@ -27,24 +28,24 @@ json-schema "^0.4.0" "@ai-sdk/react@^2.0.30": - version "2.0.52" - resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.52.tgz" - integrity sha512-4/i40pykN4gTGH264+k1g4tMGdw4xN7vZ1qESFCIm/lhS/8YiJPYheBOk9c349hytOT1sGxp3UNPcOWzWS0H2A== + version "2.0.100" + resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.100.tgz" + integrity sha512-bC4cEoX9xfBKKnVyhyrhdRraji71uxpCKlNAwD6u1xPgcsCnz99X+9ByoBKvOHRzBtSFUq2K6016huip8Cvq6w== dependencies: - "@ai-sdk/provider-utils" "3.0.9" - ai "5.0.52" + "@ai-sdk/provider-utils" "3.0.17" + ai "5.0.100" swr "^2.2.5" throttleit "2.1.0" -"@algolia/abtesting@1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.4.0.tgz" - integrity sha512-N0blWT/C0KOZ/OJ9GXBX66odJZlrYjMj3M+01y8ob1mjBFnBaBo7gOCyHBDQy60+H4pJXp3pSGlJOqJIueBH+A== +"@algolia/abtesting@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.10.0.tgz" + integrity sha512-mQT3jwuTgX8QMoqbIR7mPlWkqQqBPQaPabQzm37xg2txMlaMogK/4hCiiESGdg39MlHZOVHeV+0VJuE7f5UK8A== dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" "@algolia/autocomplete-core@1.19.2": version "1.19.2" @@ -66,170 +67,126 @@ resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz" integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== -"@algolia/client-abtesting@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.38.0.tgz" - integrity sha512-15d6zv8vtj2l9pnnp/EH7Rhq3/snCCHRz56NnX6xIUPrbJl5gCsIYXAz8C2IEkwOpoDb0r5G6ArY2gKdVMNezw== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/client-analytics@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.38.0.tgz" - integrity sha512-jJIbYAhYvTG3+gEAP5Q5Dp6PFJfUR+atz5rsqm5KjAKK+faLFdHJbM2IbOo0xdyGd+SH259MzfQKLJ9mZZ27dQ== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/client-common@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.38.0.tgz" - integrity sha512-aMCXzVPGJTeQnVU3Sdf30TfMN2+QyWcjfPTCCHyqVVgjPipb6RnK40aISGoO+rlYjh9LunDsNVFLwv+JEIF8bQ== - -"@algolia/client-common@5.42.0": - version "5.42.0" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.42.0.tgz" - integrity sha512-6iiFbm2tRn6B2OqFv9XDTcw5LdWPudiJWIbRk+fsTX+hkPrPm4e1/SbU+lEYBciPoaTShLkDbRge4UePEyCPMQ== - -"@algolia/client-insights@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.38.0.tgz" - integrity sha512-4c3FbpMiJX+VcaAj0rYaQdTLS/CkrdOn4hW+5y1plPov7KC7iSHai/VBbirmHuAfW1hVPCIh1w/4erKKTKuo+Q== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/client-personalization@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.38.0.tgz" - integrity sha512-FzLs6c8TBL4FSgNfnH2NL7O33ktecGiaKO4ZFG51QYORUzD5d6YwB9UBteaIYu/sgFoEdY57diYU4vyBH8R6iA== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/client-query-suggestions@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.38.0.tgz" - integrity sha512-7apiahlgZLvOqrh0+hAYAp/UWjqz6AfSJrCwnsoQNzgIT09dLSPIKREelkuQeUrKy38vHWWpSQE3M0zWSp/YrA== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/client-search@>= 4.9.1 < 6": - version "5.42.0" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.42.0.tgz" - integrity sha512-NZR7yyHj2WzK6D5X8gn+/KOxPdzYEXOqVdSaK/biU8QfYUpUuEA0sCWg/XlO05tPVEcJelF/oLrrNY3UjRbOww== - dependencies: - "@algolia/client-common" "5.42.0" - "@algolia/requester-browser-xhr" "5.42.0" - "@algolia/requester-fetch" "5.42.0" - "@algolia/requester-node-http" "5.42.0" - -"@algolia/client-search@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.38.0.tgz" - integrity sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" +"@algolia/client-abtesting@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.44.0.tgz" + integrity sha512-KY5CcrWhRTUo/lV7KcyjrZkPOOF9bjgWpMj9z98VA+sXzVpZtkuskBLCKsWYFp2sbwchZFTd3wJM48H0IGgF7g== + dependencies: + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" + +"@algolia/client-analytics@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.44.0.tgz" + integrity sha512-LKOCE8S4ewI9bN3ot9RZoYASPi8b78E918/DVPW3HHjCMUe6i+NjbNG6KotU4RpP6AhRWZjjswbOkWelUO+OoA== + dependencies: + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" + +"@algolia/client-common@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.44.0.tgz" + integrity sha512-1yyJm4OYC2cztbS28XYVWwLXdwpLsMG4LoZLOltVglQ2+hc/i9q9fUDZyjRa2Bqt4DmkIfezagfMrokhyH4uxQ== + +"@algolia/client-insights@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.44.0.tgz" + integrity sha512-wVQWK6jYYsbEOjIMI+e5voLGPUIbXrvDj392IckXaCPvQ6vCMTXakQqOYCd+znQdL76S+3wHDo77HZWiAYKrtA== + dependencies: + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" + +"@algolia/client-personalization@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.44.0.tgz" + integrity sha512-lkgRjOjOkqmIkebHjHpU9rLJcJNUDMm+eVSW/KJQYLjGqykEZxal+nYJJTBbLceEU2roByP/+27ZmgIwCdf0iA== + dependencies: + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" + +"@algolia/client-query-suggestions@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.44.0.tgz" + integrity sha512-sYfhgwKu6NDVmZHL1WEKVLsOx/jUXCY4BHKLUOcYa8k4COCs6USGgz6IjFkUf+niwq8NCECMmTC4o/fVQOalsA== + dependencies: + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" + +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.44.0.tgz" + integrity sha512-/FRKUM1G4xn3vV8+9xH1WJ9XknU8rkBGlefruq9jDhYUAvYozKimhrmC2pRqw/RyHhPivmgZCRuC8jHP8piz4Q== + dependencies: + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" "@algolia/events@^4.0.1": version "4.0.1" resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/ingestion@1.38.0": - version "1.38.0" - resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.38.0.tgz" - integrity sha512-qGSUGgceJHGyJLZ06bFLwVe2Tpf9KwabmoBjFvFscVmMmU5scKya6voCYd9bdX7V0Xy1qya9MGbmTm4zlLuveQ== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/monitoring@1.38.0": - version "1.38.0" - resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.38.0.tgz" - integrity sha512-VnCtAUcHirvv/dDHg9jK1Z5oo4QOC5FKDxe40x8qloru2qDcjueT34jiAsB0gRos3VWf9v4iPSYTqMIFOcADpQ== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/recommend@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.38.0.tgz" - integrity sha512-fqgeU9GqxQorFUeGP4et1MyY28ccf9PCeciHwDPSbPYYiTqBItHdUIiytsNpjC5Dnc0RWtuXWCltLwSw9wN/bQ== - dependencies: - "@algolia/client-common" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" - -"@algolia/requester-browser-xhr@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.38.0.tgz" - integrity sha512-nAUKbv4YQIXbpPi02AQvSPisD5FDDbT8XeYSh9HFoYP0Z3IpBLLDg7R4ahPvzd7gGsVKgEbXzRPWESXSji5yIg== +"@algolia/ingestion@1.44.0": + version "1.44.0" + resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.44.0.tgz" + integrity sha512-5+S5ynwMmpTpCLXGjTDpeIa81J+R4BLH0lAojOhmeGSeGEHQTqacl/4sbPyDTcidvnWhaqtyf8m42ue6lvISAw== dependencies: - "@algolia/client-common" "5.38.0" + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" -"@algolia/requester-browser-xhr@5.42.0": - version "5.42.0" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.42.0.tgz" - integrity sha512-EbuxgteaYBlKgc2Fs3JzoPIKAIaevAIwmv1F+fakaEXeibG4pkmVNsyTUjpOZIgJ1kXeqNvDrcjRb6g3vYBJ9A== +"@algolia/monitoring@1.44.0": + version "1.44.0" + resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.44.0.tgz" + integrity sha512-xhaTN8pXJjR6zkrecg4Cc9YZaQK2LKm2R+LkbAq+AYGBCWJxtSGlNwftozZzkUyq4AXWoyoc0x2SyBtq5LRtqQ== dependencies: - "@algolia/client-common" "5.42.0" + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" -"@algolia/requester-fetch@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.38.0.tgz" - integrity sha512-bkuAHaadC6OxJd3SVyQQnU1oJ9G/zdCqua7fwr1tJDrA/v7KzeS5np4/m6BuRUpTgVgFZHSewGnMcgj9DLBoaQ== +"@algolia/recommend@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.44.0.tgz" + integrity sha512-GNcite/uOIS7wgRU1MT7SdNIupGSW+vbK9igIzMePvD2Dl8dy0O3urKPKIbTuZQqiVH1Cb84y5cgLvwNrdCj/Q== dependencies: - "@algolia/client-common" "5.38.0" + "@algolia/client-common" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" -"@algolia/requester-fetch@5.42.0": - version "5.42.0" - resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.42.0.tgz" - integrity sha512-4vnFvY5Q8QZL9eDNkywFLsk/eQCRBXCBpE8HWs8iUsFNHYoamiOxAeYMin0W/nszQj6abc+jNxMChHmejO+ftQ== +"@algolia/requester-browser-xhr@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.44.0.tgz" + integrity sha512-YZHBk72Cd7pcuNHzbhNzF/FbbYszlc7JhZlDyQAchnX5S7tcemSS96F39Sy8t4O4WQLpFvUf1MTNedlitWdOsQ== dependencies: - "@algolia/client-common" "5.42.0" + "@algolia/client-common" "5.44.0" -"@algolia/requester-node-http@5.38.0": - version "5.38.0" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.38.0.tgz" - integrity sha512-yHDKZTnMPR3/4bY0CVC1/uRnnbAaJ+pctRuX7G/HflBkKOrnUBDEGtQQHzEfMz2FHZ/tbCL+Q9r6mvwTSGp8nw== +"@algolia/requester-fetch@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.44.0.tgz" + integrity sha512-B9WHl+wQ7uf46t9cq+vVM/ypVbOeuldVDq9OtKsX2ApL2g/htx6ImB9ugDOOJmB5+fE31/XPTuCcYz/j03+idA== dependencies: - "@algolia/client-common" "5.38.0" + "@algolia/client-common" "5.44.0" -"@algolia/requester-node-http@5.42.0": - version "5.42.0" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.42.0.tgz" - integrity sha512-gkLNpU+b1pCIwk1hKTJz2NWQPT8gsfGhQasnZ5QVv4jd79fKRL/1ikd86P0AzuIQs9tbbhlMwxsSTyJmlq502w== +"@algolia/requester-node-http@5.44.0": + version "5.44.0" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.44.0.tgz" + integrity sha512-MULm0qeAIk4cdzZ/ehJnl1o7uB5NMokg83/3MKhPq0Pk7+I0uELGNbzIfAkvkKKEYcHALemKdArtySF9eKzh/A== dependencies: - "@algolia/client-common" "5.42.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@algolia/client-common" "5.44.0" "@antfu/install-pkg@^1.1.0": version "1.1.0" @@ -244,259 +201,248 @@ resolved "https://registry.npmjs.org/@antfu/utils/-/utils-9.3.0.tgz" integrity sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" - picocolors "^1.0.0" + picocolors "^1.1.1" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== +"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz" + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.21.3", "@babel/core@^7.25.9", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.25.9", "@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz" - integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== - dependencies: - "@babel/types" "^7.25.9" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz" - integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== +"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.27.3" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - "@babel/compat-data" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz" - integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-member-expression-to-functions" "^7.25.9" - "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/traverse" "^7.25.9" +"@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3", "@babel/helper-create-class-features-plugin@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz" + integrity sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-member-expression-to-functions" "^7.28.5" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.28.5" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz" - integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz" + integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.1.1" + "@babel/helper-annotate-as-pure" "^7.27.3" + regexpu-core "^6.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== +"@babel/helper-define-polyfill-provider@^0.6.5": + version "0.6.5" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz" + integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + debug "^4.4.1" lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-member-expression-to-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz" - integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" + resolve "^1.22.10" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-member-expression-to-functions@^7.27.1", "@babel/helper-member-expression-to-functions@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz" + integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== + dependencies: + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-remap-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz" + integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-wrap-function" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helper-wrap-function@^7.27.1": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz" + integrity sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g== + dependencies: + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.3" + "@babel/types" "^7.28.2" + +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.4" -"@babel/helper-optimise-call-expression@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz" - integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== +"@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== dependencies: - "@babel/types" "^7.25.9" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== - -"@babel/helper-remap-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz" - integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-wrap-function" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-replace-supers@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz" - integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.25.9" - "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-simple-access@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz" - integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz" - integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helper-wrap-function@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz" - integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== - dependencies: - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helpers@^7.26.0": - version "7.26.10" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz" - integrity sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g== - dependencies: - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.10" - -"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2", "@babel/parser@^7.26.9": - version "7.26.10" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz" - integrity sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA== + "@babel/types" "^7.28.5" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz" + integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== dependencies: - "@babel/types" "^7.26.10" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz" - integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz" - integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz" - integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz" - integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.28.5" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz" + integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz" + integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz" - integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz" + integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz" + integrity sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.28.3" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -510,33 +456,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-import-assertions@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz" - integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== +"@babel/plugin-syntax-import-assertions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz" + integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-syntax-import-attributes@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== +"@babel/plugin-syntax-import-attributes@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-syntax-jsx@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-syntax-typescript@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -546,531 +492,540 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz" - integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== +"@babel/plugin-transform-arrow-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz" + integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-async-generator-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz" - integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== +"@babel/plugin-transform-async-generator-functions@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz" + integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-remap-async-to-generator" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/traverse" "^7.28.0" -"@babel/plugin-transform-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz" - integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== +"@babel/plugin-transform-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz" + integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" -"@babel/plugin-transform-block-scoped-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz" - integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== +"@babel/plugin-transform-block-scoped-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz" + integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-block-scoping@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz" - integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== +"@babel/plugin-transform-block-scoping@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz" + integrity sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-class-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz" - integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== +"@babel/plugin-transform-class-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz" + integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-class-static-block@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz" - integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== +"@babel/plugin-transform-class-static-block@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz" + integrity sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.28.3" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-classes@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz" - integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== +"@babel/plugin-transform-classes@^7.28.4": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz" + integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" - "@babel/traverse" "^7.25.9" - globals "^11.1.0" + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-globals" "^7.28.0" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/traverse" "^7.28.4" -"@babel/plugin-transform-computed-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz" - integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== +"@babel/plugin-transform-computed-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz" + integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/template" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/template" "^7.27.1" -"@babel/plugin-transform-destructuring@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz" - integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== +"@babel/plugin-transform-destructuring@^7.28.0", "@babel/plugin-transform-destructuring@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz" + integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.28.5" -"@babel/plugin-transform-dotall-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz" - integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== +"@babel/plugin-transform-dotall-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz" + integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-duplicate-keys@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz" - integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== +"@babel/plugin-transform-duplicate-keys@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz" + integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz" - integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz" + integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-dynamic-import@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz" - integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== +"@babel/plugin-transform-dynamic-import@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz" + integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-exponentiation-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz" - integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== +"@babel/plugin-transform-explicit-resource-management@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz" + integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" -"@babel/plugin-transform-export-namespace-from@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz" - integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== +"@babel/plugin-transform-exponentiation-operator@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz" + integrity sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-for-of@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz" - integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== +"@babel/plugin-transform-export-namespace-from@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz" + integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-function-name@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz" - integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== +"@babel/plugin-transform-for-of@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz" + integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== dependencies: - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" -"@babel/plugin-transform-json-strings@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz" - integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== +"@babel/plugin-transform-function-name@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz" + integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" -"@babel/plugin-transform-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz" - integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== +"@babel/plugin-transform-json-strings@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz" + integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-logical-assignment-operators@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz" - integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== +"@babel/plugin-transform-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz" + integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-member-expression-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz" - integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== +"@babel/plugin-transform-logical-assignment-operators@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz" + integrity sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-modules-amd@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz" - integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== +"@babel/plugin-transform-member-expression-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz" + integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-modules-commonjs@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz" - integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== +"@babel/plugin-transform-modules-amd@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz" + integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-simple-access" "^7.25.9" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-modules-systemjs@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz" - integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== +"@babel/plugin-transform-modules-commonjs@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz" + integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-systemjs@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz" + integrity sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew== + dependencies: + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.5" -"@babel/plugin-transform-modules-umd@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz" - integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== +"@babel/plugin-transform-modules-umd@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz" + integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz" - integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz" + integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-new-target@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz" - integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== +"@babel/plugin-transform-new-target@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz" + integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz" - integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== +"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz" + integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-numeric-separator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz" - integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== +"@babel/plugin-transform-numeric-separator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz" + integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-object-rest-spread@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz" - integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== +"@babel/plugin-transform-object-rest-spread@^7.28.4": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz" + integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== dependencies: - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-parameters" "^7.27.7" + "@babel/traverse" "^7.28.4" -"@babel/plugin-transform-object-super@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz" - integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== +"@babel/plugin-transform-object-super@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz" + integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" -"@babel/plugin-transform-optional-catch-binding@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz" - integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== +"@babel/plugin-transform-optional-catch-binding@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz" + integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-optional-chaining@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz" - integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== +"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz" + integrity sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" -"@babel/plugin-transform-parameters@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz" - integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== +"@babel/plugin-transform-parameters@^7.27.7": + version "7.27.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz" + integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-private-methods@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz" - integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== +"@babel/plugin-transform-private-methods@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz" + integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-private-property-in-object@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz" - integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== +"@babel/plugin-transform-private-property-in-object@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz" + integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-property-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz" - integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== +"@babel/plugin-transform-property-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz" + integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-react-constant-elements@^7.21.3": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz" - integrity sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA== + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz" + integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-react-display-name@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz" - integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== +"@babel/plugin-transform-react-display-name@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz" + integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-react-jsx-development@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz" - integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== +"@babel/plugin-transform-react-jsx-development@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz" + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== dependencies: - "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.27.1" -"@babel/plugin-transform-react-jsx@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz" - integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== +"@babel/plugin-transform-react-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-syntax-jsx" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" -"@babel/plugin-transform-react-pure-annotations@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz" - integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== +"@babel/plugin-transform-react-pure-annotations@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz" + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-regenerator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz" - integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== +"@babel/plugin-transform-regenerator@^7.28.4": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz" + integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - regenerator-transform "^0.15.2" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-regexp-modifiers@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz" - integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== +"@babel/plugin-transform-regexp-modifiers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz" + integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-reserved-words@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz" - integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== +"@babel/plugin-transform-reserved-words@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz" + integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-runtime@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz" - integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.6" - babel-plugin-polyfill-regenerator "^0.6.1" + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz" + integrity sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz" - integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== +"@babel/plugin-transform-shorthand-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz" + integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-spread@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz" - integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== +"@babel/plugin-transform-spread@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz" + integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" -"@babel/plugin-transform-sticky-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz" - integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== +"@babel/plugin-transform-sticky-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz" + integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-template-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz" - integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== +"@babel/plugin-transform-template-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz" + integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-typeof-symbol@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz" - integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== +"@babel/plugin-transform-typeof-symbol@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz" + integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-typescript@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz" - integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== +"@babel/plugin-transform-typescript@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz" + integrity sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/plugin-syntax-typescript" "^7.25.9" + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-create-class-features-plugin" "^7.28.5" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" -"@babel/plugin-transform-unicode-escapes@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz" - integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== +"@babel/plugin-transform-unicode-escapes@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz" + integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-unicode-property-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz" - integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== +"@babel/plugin-transform-unicode-property-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz" + integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-unicode-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz" - integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== +"@babel/plugin-transform-unicode-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz" + integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-unicode-sets-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz" - integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== +"@babel/plugin-transform-unicode-sets-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz" + integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz" - integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== - dependencies: - "@babel/compat-data" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz" + integrity sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg== + dependencies: + "@babel/compat-data" "^7.28.5" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.3" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.26.0" - "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-import-assertions" "^7.27.1" + "@babel/plugin-syntax-import-attributes" "^7.27.1" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.25.9" - "@babel/plugin-transform-async-generator-functions" "^7.25.9" - "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.25.9" - "@babel/plugin-transform-block-scoping" "^7.25.9" - "@babel/plugin-transform-class-properties" "^7.25.9" - "@babel/plugin-transform-class-static-block" "^7.26.0" - "@babel/plugin-transform-classes" "^7.25.9" - "@babel/plugin-transform-computed-properties" "^7.25.9" - "@babel/plugin-transform-destructuring" "^7.25.9" - "@babel/plugin-transform-dotall-regex" "^7.25.9" - "@babel/plugin-transform-duplicate-keys" "^7.25.9" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" - "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.25.9" - "@babel/plugin-transform-export-namespace-from" "^7.25.9" - "@babel/plugin-transform-for-of" "^7.25.9" - "@babel/plugin-transform-function-name" "^7.25.9" - "@babel/plugin-transform-json-strings" "^7.25.9" - "@babel/plugin-transform-literals" "^7.25.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" - "@babel/plugin-transform-member-expression-literals" "^7.25.9" - "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" - "@babel/plugin-transform-modules-systemjs" "^7.25.9" - "@babel/plugin-transform-modules-umd" "^7.25.9" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" - "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" - "@babel/plugin-transform-numeric-separator" "^7.25.9" - "@babel/plugin-transform-object-rest-spread" "^7.25.9" - "@babel/plugin-transform-object-super" "^7.25.9" - "@babel/plugin-transform-optional-catch-binding" "^7.25.9" - "@babel/plugin-transform-optional-chaining" "^7.25.9" - "@babel/plugin-transform-parameters" "^7.25.9" - "@babel/plugin-transform-private-methods" "^7.25.9" - "@babel/plugin-transform-private-property-in-object" "^7.25.9" - "@babel/plugin-transform-property-literals" "^7.25.9" - "@babel/plugin-transform-regenerator" "^7.25.9" - "@babel/plugin-transform-regexp-modifiers" "^7.26.0" - "@babel/plugin-transform-reserved-words" "^7.25.9" - "@babel/plugin-transform-shorthand-properties" "^7.25.9" - "@babel/plugin-transform-spread" "^7.25.9" - "@babel/plugin-transform-sticky-regex" "^7.25.9" - "@babel/plugin-transform-template-literals" "^7.25.9" - "@babel/plugin-transform-typeof-symbol" "^7.25.9" - "@babel/plugin-transform-unicode-escapes" "^7.25.9" - "@babel/plugin-transform-unicode-property-regex" "^7.25.9" - "@babel/plugin-transform-unicode-regex" "^7.25.9" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/plugin-transform-arrow-functions" "^7.27.1" + "@babel/plugin-transform-async-generator-functions" "^7.28.0" + "@babel/plugin-transform-async-to-generator" "^7.27.1" + "@babel/plugin-transform-block-scoped-functions" "^7.27.1" + "@babel/plugin-transform-block-scoping" "^7.28.5" + "@babel/plugin-transform-class-properties" "^7.27.1" + "@babel/plugin-transform-class-static-block" "^7.28.3" + "@babel/plugin-transform-classes" "^7.28.4" + "@babel/plugin-transform-computed-properties" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.5" + "@babel/plugin-transform-dotall-regex" "^7.27.1" + "@babel/plugin-transform-duplicate-keys" "^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-dynamic-import" "^7.27.1" + "@babel/plugin-transform-explicit-resource-management" "^7.28.0" + "@babel/plugin-transform-exponentiation-operator" "^7.28.5" + "@babel/plugin-transform-export-namespace-from" "^7.27.1" + "@babel/plugin-transform-for-of" "^7.27.1" + "@babel/plugin-transform-function-name" "^7.27.1" + "@babel/plugin-transform-json-strings" "^7.27.1" + "@babel/plugin-transform-literals" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.28.5" + "@babel/plugin-transform-member-expression-literals" "^7.27.1" + "@babel/plugin-transform-modules-amd" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-modules-systemjs" "^7.28.5" + "@babel/plugin-transform-modules-umd" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-new-target" "^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" + "@babel/plugin-transform-numeric-separator" "^7.27.1" + "@babel/plugin-transform-object-rest-spread" "^7.28.4" + "@babel/plugin-transform-object-super" "^7.27.1" + "@babel/plugin-transform-optional-catch-binding" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.28.5" + "@babel/plugin-transform-parameters" "^7.27.7" + "@babel/plugin-transform-private-methods" "^7.27.1" + "@babel/plugin-transform-private-property-in-object" "^7.27.1" + "@babel/plugin-transform-property-literals" "^7.27.1" + "@babel/plugin-transform-regenerator" "^7.28.4" + "@babel/plugin-transform-regexp-modifiers" "^7.27.1" + "@babel/plugin-transform-reserved-words" "^7.27.1" + "@babel/plugin-transform-shorthand-properties" "^7.27.1" + "@babel/plugin-transform-spread" "^7.27.1" + "@babel/plugin-transform-sticky-regex" "^7.27.1" + "@babel/plugin-transform-template-literals" "^7.27.1" + "@babel/plugin-transform-typeof-symbol" "^7.27.1" + "@babel/plugin-transform-unicode-escapes" "^7.27.1" + "@babel/plugin-transform-unicode-property-regex" "^7.27.1" + "@babel/plugin-transform-unicode-regex" "^7.27.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.6" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.38.1" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" + core-js-compat "^3.43.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1083,72 +1038,71 @@ esutils "^2.0.2" "@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz" - integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz" + integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-transform-react-display-name" "^7.25.9" - "@babel/plugin-transform-react-jsx" "^7.25.9" - "@babel/plugin-transform-react-jsx-development" "^7.25.9" - "@babel/plugin-transform-react-pure-annotations" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-react-display-name" "^7.28.0" + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx-development" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations" "^7.27.1" "@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.25.9": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz" - integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz" + integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-syntax-jsx" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" - "@babel/plugin-transform-typescript" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.28.5" "@babel/runtime-corejs3@^7.25.9": - version "7.26.10" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.10.tgz" - integrity sha512-uITFQYO68pMEYR46AHgQoyBg7KPPJDAbGn4jUTIRgCFJIp88MIBUianVOplhZDEec07bp9zIyr4Kp0FCyQzmWg== + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz" + integrity sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ== dependencies: - core-js-pure "^3.30.2" - regenerator-runtime "^0.14.0" + core-js-pure "^3.43.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.25.9", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.25.9": version "7.26.10" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz" integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.9", "@babel/template@^7.26.9": - version "7.26.9" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz" - integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.26.9" - "@babel/types" "^7.26.9" - -"@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" +"@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.5" debug "^4.3.1" - globals "^11.1.0" -"@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.10", "@babel/types@^7.26.9", "@babel/types@^7.4.4": - version "7.26.10" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz" - integrity sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ== +"@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.4.4": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" "@braintree/sanitize-url@^7.1.1": version "7.1.1" @@ -1197,22 +1151,22 @@ resolved "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz" integrity sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A== -"@csstools/color-helpers@^5.0.2": - version "5.0.2" - resolved "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz" - integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== +"@csstools/color-helpers@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz" + integrity sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== "@csstools/css-calc@^2.1.4": version "2.1.4" resolved "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz" integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== -"@csstools/css-color-parser@^3.0.10": - version "3.0.10" - resolved "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz" - integrity sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg== +"@csstools/css-color-parser@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz" + integrity sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== dependencies: - "@csstools/color-helpers" "^5.0.2" + "@csstools/color-helpers" "^5.1.0" "@csstools/css-calc" "^2.1.4" "@csstools/css-parser-algorithms@^3.0.5": @@ -1230,55 +1184,88 @@ resolved "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz" integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== -"@csstools/postcss-cascade-layers@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz" - integrity sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ== +"@csstools/postcss-alpha-function@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz" + integrity sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-cascade-layers@^5.0.2": + version "5.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz" + integrity sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg== dependencies: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -"@csstools/postcss-color-function@^4.0.10": - version "4.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz" - integrity sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ== +"@csstools/postcss-color-function-display-p3-linear@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz" + integrity sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-color-mix-function@^3.0.10": - version "3.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz" - integrity sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q== +"@csstools/postcss-color-function@^4.0.12": + version "4.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz" + integrity sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz" - integrity sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ== +"@csstools/postcss-color-mix-function@^3.0.12": + version "3.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz" + integrity sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-content-alt-text@^2.0.6": - version "2.0.6" - resolved "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz" - integrity sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ== +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz" + integrity sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-content-alt-text@^2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz" + integrity sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-contrast-color-function@^2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz" + integrity sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA== dependencies: + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-exponential-functions@^2.0.9": @@ -1298,43 +1285,43 @@ "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-gamut-mapping@^2.0.10": - version "2.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz" - integrity sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg== +"@csstools/postcss-gamut-mapping@^2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz" + integrity sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-gradients-interpolation-method@^5.0.10": - version "5.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz" - integrity sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw== +"@csstools/postcss-gradients-interpolation-method@^5.0.12": + version "5.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz" + integrity sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-hwb-function@^4.0.10": - version "4.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz" - integrity sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ== +"@csstools/postcss-hwb-function@^4.0.12": + version "4.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz" + integrity sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-ic-unit@^4.0.2": - version "4.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz" - integrity sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA== +"@csstools/postcss-ic-unit@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz" + integrity sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg== dependencies: - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" @@ -1343,22 +1330,22 @@ resolved "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz" integrity sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg== -"@csstools/postcss-is-pseudo-class@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz" - integrity sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ== +"@csstools/postcss-is-pseudo-class@^5.0.3": + version "5.0.3" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz" + integrity sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ== dependencies: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -"@csstools/postcss-light-dark-function@^2.0.9": - version "2.0.9" - resolved "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz" - integrity sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ== +"@csstools/postcss-light-dark-function@^2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz" + integrity sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA== dependencies: "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-logical-float-and-clear@^3.0.0": @@ -1425,21 +1412,21 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^4.0.10": - version "4.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz" - integrity sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg== +"@csstools/postcss-oklab-function@^4.0.12": + version "4.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz" + integrity sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-progressive-custom-properties@^4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz" - integrity sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA== +"@csstools/postcss-progressive-custom-properties@^4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz" + integrity sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw== dependencies: postcss-value-parser "^4.2.0" @@ -1452,15 +1439,15 @@ "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-relative-color-syntax@^3.0.10": - version "3.0.10" - resolved "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz" - integrity sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g== +"@csstools/postcss-relative-color-syntax@^3.0.12": + version "3.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz" + integrity sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-scope-pseudo-class@^4.0.1": @@ -1488,12 +1475,12 @@ "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-text-decoration-shorthand@^4.0.2": - version "4.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz" - integrity sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA== +"@csstools/postcss-text-decoration-shorthand@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz" + integrity sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA== dependencies: - "@csstools/color-helpers" "^5.0.2" + "@csstools/color-helpers" "^5.1.0" postcss-value-parser "^4.2.0" "@csstools/postcss-trigonometric-functions@^4.0.9": @@ -1510,10 +1497,10 @@ resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz" integrity sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA== -"@csstools/selector-resolve-nested@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz" - integrity sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ== +"@csstools/selector-resolve-nested@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz" + integrity sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g== "@csstools/selector-specificity@^5.0.0": version "5.0.0" @@ -1530,19 +1517,25 @@ resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/css@4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-4.1.0.tgz" - integrity sha512-nuNKGjHj/FQeWgE9t+i83QD/V67QiaAmGY7xS9TVCRUiCqSljOgIKlsLoQZKKVwEG8f+OWKdznzZkJxGZ7d06A== +"@docsearch/core@4.3.1": + version "4.3.1" + resolved "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz" + integrity sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ== + +"@docsearch/css@4.3.2": + version "4.3.2" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz" + integrity sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ== "@docsearch/react@^3.9.0 || ^4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-4.1.0.tgz" - integrity sha512-4GHI7TT3sJZ2Vs4Kjadv7vAkMrTsJqHvzvxO3JA7UT8iPRKaDottG5o5uNshPWhVVaBYPC35Ukf8bfCotGpjSg== + version "4.3.2" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz" + integrity sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ== dependencies: "@ai-sdk/react" "^2.0.30" "@algolia/autocomplete-core" "1.19.2" - "@docsearch/css" "4.1.0" + "@docsearch/core" "4.3.1" + "@docsearch/css" "4.3.2" ai "^5.0.30" algoliasearch "^5.28.0" marked "^16.3.0" @@ -1599,7 +1592,7 @@ webpack "^5.95.0" webpackbar "^6.0.1" -"@docusaurus/core@3.9.2": +"@docusaurus/core@^3.0.0", "@docusaurus/core@3.9.2": version "3.9.2" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz" integrity sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw== @@ -2086,13 +2079,20 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": @@ -2100,11 +2100,6 @@ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - "@jridgewell/source-map@^0.3.3": version "0.3.5" resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" @@ -2113,15 +2108,15 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2131,10 +2126,10 @@ resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz" integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== -"@jsonjoy.com/buffers@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz" - integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q== +"@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": + version "1.2.1" + resolved "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz" + integrity sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== "@jsonjoy.com/codegen@^1.0.0": version "1.0.0" @@ -2142,19 +2137,20 @@ integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== "@jsonjoy.com/json-pack@^1.11.0": - version "1.14.0" - resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz" - integrity sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw== + version "1.21.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz" + integrity sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== dependencies: "@jsonjoy.com/base64" "^1.1.2" - "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/buffers" "^1.2.0" "@jsonjoy.com/codegen" "^1.0.0" - "@jsonjoy.com/json-pointer" "^1.0.1" + "@jsonjoy.com/json-pointer" "^1.0.2" "@jsonjoy.com/util" "^1.9.0" hyperdyperid "^1.2.0" thingies "^2.5.0" + tree-dump "^1.1.0" -"@jsonjoy.com/json-pointer@^1.0.1": +"@jsonjoy.com/json-pointer@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz" integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== @@ -2171,29 +2167,31 @@ "@jsonjoy.com/codegen" "^1.0.0" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@mdx-js/mdx@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz" - integrity sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA== + version "3.1.1" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz" + integrity sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ== dependencies: "@types/estree" "^1.0.0" "@types/estree-jsx" "^1.0.0" "@types/hast" "^3.0.0" "@types/mdx" "^2.0.0" + acorn "^8.0.0" collapse-white-space "^2.0.0" devlop "^1.0.0" - estree-util-build-jsx "^3.0.0" estree-util-is-identifier-name "^3.0.0" - estree-util-to-js "^2.0.0" + estree-util-scope "^1.0.0" estree-walker "^3.0.0" - hast-util-to-estree "^3.0.0" hast-util-to-jsx-runtime "^2.0.0" markdown-extensions "^2.0.0" - periscopic "^3.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" remark-mdx "^3.0.0" remark-parse "^11.0.0" remark-rehype "^11.0.0" @@ -2205,9 +2203,9 @@ vfile "^6.0.0" "@mdx-js/react@^3.0.0": - version "3.1.1" - resolved "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz" - integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + version "3.1.0" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz" + integrity sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ== dependencies: "@types/mdx" "^2.0.0" @@ -2434,17 +2432,10 @@ resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@types/acorn@^4.0.0": - version "4.0.6" - resolved "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz" - integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== - dependencies: - "@types/estree" "*" - "@types/body-parser@*": - version "1.19.5" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + version "1.19.6" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz" + integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== dependencies: "@types/connect" "*" "@types/node" "*" @@ -2705,9 +2696,9 @@ "@types/json-schema" "*" "@types/estree-jsx@^1.0.0": - version "1.0.4" - resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz" - integrity sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ== + version "1.0.5" + resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== dependencies: "@types/estree" "*" @@ -2717,9 +2708,9 @@ integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + version "4.19.7" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz" + integrity sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2727,14 +2718,14 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.21": - version "4.17.23" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz" - integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== + version "4.17.25" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz" + integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" - "@types/serve-static" "*" + "@types/serve-static" "^1" "@types/geojson@*": version "7946.0.16" @@ -2769,14 +2760,14 @@ integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/http-errors@*": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + version "2.0.5" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz" + integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== "@types/http-proxy@^1.17.8": - version "1.17.14" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz" - integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + version "1.17.17" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz" + integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== dependencies: "@types/node" "*" @@ -2805,9 +2796,9 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mdast@^4.0.0", "@types/mdast@^4.0.2": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz" - integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + version "4.0.4" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: "@types/unist" "*" @@ -2822,14 +2813,14 @@ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/ms@*": - version "0.7.34" - resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + version "2.1.0" + resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node-forge@^1.3.0": - version "1.3.11" - resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz" - integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + version "1.3.14" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz" + integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== dependencies: "@types/node" "*" @@ -2851,9 +2842,9 @@ integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ== "@types/qs@*": - version "6.9.11" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz" - integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + version "6.14.0" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz" + integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== "@types/range-parser@*": version "1.2.7" @@ -2887,9 +2878,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>= 16.8.0 < 20.0.0", "@types/react@>=16": - version "19.2.2" - resolved "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz" - integrity sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA== + version "19.1.9" + resolved "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz" + integrity sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA== dependencies: csstype "^3.0.2" @@ -2906,9 +2897,16 @@ "@types/node" "*" "@types/send@*": - version "0.17.4" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + version "1.2.1" + resolved "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz" + integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== + dependencies: + "@types/node" "*" + +"@types/send@<1": + version "0.17.6" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz" + integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== dependencies: "@types/mime" "^1" "@types/node" "*" @@ -2920,14 +2918,14 @@ dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.15.5": - version "1.15.8" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz" - integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== +"@types/serve-static@^1", "@types/serve-static@^1.15.5": + version "1.15.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz" + integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== dependencies: "@types/http-errors" "*" "@types/node" "*" - "@types/send" "*" + "@types/send" "<1" "@types/sockjs@^0.3.36": version "0.3.36" @@ -2942,14 +2940,14 @@ integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== "@types/unist@*", "@types/unist@^3.0.0": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz" - integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + version "3.0.3" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== "@types/unist@^2.0.0": - version "2.0.10" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + version "2.0.11" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/ws@^8.5.10": version "8.18.1" @@ -2964,16 +2962,21 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.35" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== dependencies: "@types/yargs-parser" "*" "@ungap/structured-clone@^1.0.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.3.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@vercel/oidc@3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz" + integrity sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw== "@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": version "1.12.1" @@ -3106,7 +3109,7 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3142,14 +3145,14 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ai@^5.0.30, ai@5.0.52: - version "5.0.52" - resolved "https://registry.npmjs.org/ai/-/ai-5.0.52.tgz" - integrity sha512-GLlRHjMlvN9+w7UYGxCpUQ8GgCRv5Z+JCprRH3Q8YbXJ/JyIc6EP9+YRUmQsyExX/qQsuehe7y/LLygarbSTOw== +ai@^5.0.30, ai@5.0.100: + version "5.0.100" + resolved "https://registry.npmjs.org/ai/-/ai-5.0.100.tgz" + integrity sha512-+ANP4EJomTcUKdEF3UpVAWEl6DGn+ozDLxVZKXmTV7NRfyEC2cLYcKwoU4o3sKJpqXMUKNzpFlJFBKOcsKdMyg== dependencies: - "@ai-sdk/gateway" "1.0.29" + "@ai-sdk/gateway" "2.0.14" "@ai-sdk/provider" "2.0.0" - "@ai-sdk/provider-utils" "3.0.9" + "@ai-sdk/provider-utils" "3.0.17" "@opentelemetry/api" "1.9.0" ajv-formats@^2.1.1: @@ -3182,41 +3185,41 @@ ajv@^6.12.5, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" algoliasearch-helper@^3.26.0: - version "3.26.0" - resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz" - integrity sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw== + version "3.26.1" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz" + integrity sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw== dependencies: "@algolia/events" "^4.0.1" algoliasearch@^5.28.0, algoliasearch@^5.37.0, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": - version "5.38.0" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.38.0.tgz" - integrity sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g== - dependencies: - "@algolia/abtesting" "1.4.0" - "@algolia/client-abtesting" "5.38.0" - "@algolia/client-analytics" "5.38.0" - "@algolia/client-common" "5.38.0" - "@algolia/client-insights" "5.38.0" - "@algolia/client-personalization" "5.38.0" - "@algolia/client-query-suggestions" "5.38.0" - "@algolia/client-search" "5.38.0" - "@algolia/ingestion" "1.38.0" - "@algolia/monitoring" "1.38.0" - "@algolia/recommend" "5.38.0" - "@algolia/requester-browser-xhr" "5.38.0" - "@algolia/requester-fetch" "5.38.0" - "@algolia/requester-node-http" "5.38.0" + version "5.44.0" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.44.0.tgz" + integrity sha512-f8IpsbdQjzTjr/4mJ/jv5UplrtyMnnciGax6/B0OnLCs2/GJTK13O4Y7Ff1AvJVAaztanH+m5nzPoUq6EAy+aA== + dependencies: + "@algolia/abtesting" "1.10.0" + "@algolia/client-abtesting" "5.44.0" + "@algolia/client-analytics" "5.44.0" + "@algolia/client-common" "5.44.0" + "@algolia/client-insights" "5.44.0" + "@algolia/client-personalization" "5.44.0" + "@algolia/client-query-suggestions" "5.44.0" + "@algolia/client-search" "5.44.0" + "@algolia/ingestion" "1.44.0" + "@algolia/monitoring" "1.44.0" + "@algolia/recommend" "5.44.0" + "@algolia/requester-browser-xhr" "5.44.0" + "@algolia/requester-fetch" "5.44.0" + "@algolia/requester-node-http" "5.44.0" ansi-align@^3.0.1: version "3.0.1" @@ -3295,18 +3298,18 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== astring@^1.8.0: - version "1.8.6" - resolved "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz" - integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== + version "1.9.0" + resolved "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== autoprefixer@^10.4.19, autoprefixer@^10.4.21: - version "10.4.21" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" - integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== + version "10.4.22" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz" + integrity sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg== dependencies: - browserslist "^4.24.4" - caniuse-lite "^1.0.30001702" - fraction.js "^4.3.7" + browserslist "^4.27.0" + caniuse-lite "^1.0.30001754" + fraction.js "^5.3.4" normalize-range "^0.1.2" picocolors "^1.1.1" postcss-value-parser "^4.2.0" @@ -3326,29 +3329,29 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== +babel-plugin-polyfill-corejs2@^0.4.14: + version "0.4.14" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz" + integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/compat-data" "^7.27.7" + "@babel/helper-define-polyfill-provider" "^0.6.5" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.6: - version "0.10.6" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz" - integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== +babel-plugin-polyfill-corejs3@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz" + integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" - core-js-compat "^3.38.0" + "@babel/helper-define-polyfill-provider" "^0.6.5" + core-js-compat "^3.43.0" -babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== +babel-plugin-polyfill-regenerator@^0.6.5: + version "0.6.5" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz" + integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.5" bail@^2.0.0: version "2.0.2" @@ -3360,6 +3363,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +baseline-browser-mapping@^2.8.25: + version "2.8.30" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.30.tgz" + integrity sha512-aTUKW4ptQhS64+v2d6IkPzymEzzhw+G0bA1g3uBRV3+ntkH+svttKseW5IOR4Ed6NUVKqnY7qT3dKvzQ7io4AA== + batch@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" @@ -3371,9 +3379,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== body-parser@1.20.3: version "1.20.3" @@ -3435,13 +3443,20 @@ boxen@^7.0.0: wrap-ansi "^8.1.0" brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" @@ -3449,15 +3464,16 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.2, browserslist@^4.24.4, browserslist@^4.25.0, "browserslist@>= 4.21.0": - version "4.25.0" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz" - integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.26.0, browserslist@^4.27.0, browserslist@^4.28.0, "browserslist@>= 4.21.0": + version "4.28.0" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz" + integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== dependencies: - caniuse-lite "^1.0.30001718" - electron-to-chromium "^1.5.160" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" + baseline-browser-mapping "^2.8.25" + caniuse-lite "^1.0.30001754" + electron-to-chromium "^1.5.249" + node-releases "^2.0.27" + update-browserslist-db "^1.1.4" buffer-from@^1.0.0: version "1.1.2" @@ -3499,16 +3515,31 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -call-bind@^1.0.5, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" callsites@^3.0.0: version "3.1.0" @@ -3543,10 +3574,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001718: - version "1.0.30001721" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz" - integrity sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001754: + version "1.0.30001756" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz" + integrity sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A== ccount@^2.0.0: version "2.0.1" @@ -3772,7 +3803,7 @@ common-path-prefix@^3.0.0: resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -3780,16 +3811,16 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.8.1" + resolved "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -3832,9 +3863,9 @@ connect-history-api-fallback@^2.0.0: integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== consola@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz" - integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + version "3.4.2" + resolved "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== content-disposition@0.5.2: version "0.5.2" @@ -3880,17 +3911,17 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.38.0, core-js-compat@^3.38.1: - version "3.39.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz" - integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== +core-js-compat@^3.43.0: + version "3.47.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz" + integrity sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ== dependencies: - browserslist "^4.24.2" + browserslist "^4.28.0" -core-js-pure@^3.30.2: - version "3.36.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz" - integrity sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ== +core-js-pure@^3.43.0: + version "3.47.0" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz" + integrity sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw== core-js@^3.31.1: version "3.36.0" @@ -3950,14 +3981,14 @@ css-blank-pseudo@^7.0.1: postcss-selector-parser "^7.0.0" css-declaration-sorter@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz" - integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== + version "7.3.0" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz" + integrity sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ== -css-has-pseudo@^7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz" - integrity sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ== +css-has-pseudo@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz" + integrity sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA== dependencies: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" @@ -4006,9 +4037,9 @@ css-select@^4.1.3: nth-check "^2.0.1" css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + version "5.2.2" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz" + integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== dependencies: boolbase "^1.0.0" css-what "^6.1.0" @@ -4037,10 +4068,10 @@ css-what@^6.0.1, css-what@^6.1.0: resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssdb@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz" - integrity sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ== +cssdb@^8.4.2: + version "8.4.2" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz" + integrity sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg== cssesc@^3.0.0: version "3.0.0" @@ -4429,7 +4460,7 @@ debounce@^1.2.1: resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.4.1, debug@4: +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.1, debug@4: version "4.4.3" resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -4444,9 +4475,9 @@ debug@2.6.9: ms "2.0.0" decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + version "1.2.0" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz" + integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== dependencies: character-entities "^2.0.0" @@ -4468,14 +4499,14 @@ deepmerge@^4.3.1: integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-browser-id@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz" - integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + version "5.0.1" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz" + integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== default-browser@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz" - integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + version "5.4.0" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz" + integrity sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg== dependencies: bundle-name "^4.1.0" default-browser-id "^5.0.0" @@ -4485,7 +4516,7 @@ defer-to-connect@^2.0.1: resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.0.1, define-data-property@^1.1.2: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -4574,6 +4605,15 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +docusaurus-plugin-llms@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/docusaurus-plugin-llms/-/docusaurus-plugin-llms-0.2.2.tgz" + integrity sha512-DZlZ6cv9p5poFE00Qg78aurBNWhLa4o0VhH4kI33DUT0y4ydlFEJJbf8Bks9BuuGPFbY/Guebn+hRc2QymMImg== + dependencies: + gray-matter "^4.0.3" + minimatch "^9.0.3" + yaml "^2.8.1" + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" @@ -4635,9 +4675,9 @@ domutils@^2.5.2, domutils@^2.8.0: domhandler "^4.2.0" domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + version "3.2.2" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" @@ -4658,6 +4698,15 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" @@ -4673,10 +4722,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.160: - version "1.5.165" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz" - integrity sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw== +electron-to-chromium@^1.5.249: + version "1.5.259" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.259.tgz" + integrity sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ== emoji-regex@^8.0.0: version "8.0.0" @@ -4699,9 +4748,9 @@ emojis-list@^3.0.0: integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== emoticon@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz" - integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== + version "4.1.0" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz" + integrity sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ== encodeurl@~1.0.2: version "1.0.2" @@ -4731,19 +4780,22 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + version "1.3.4" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: is-arrayish "^0.2.1" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" @@ -4755,6 +4807,33 @@ es-module-lexer@^1.2.1: resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz" integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" + +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" + escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" @@ -4837,6 +4916,14 @@ estree-util-is-identifier-name@^3.0.0: resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz" integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-to-js@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz" @@ -4847,9 +4934,9 @@ estree-util-to-js@^2.0.0: source-map "^0.7.0" estree-util-value-to-estree@^3.0.1: - version "3.3.3" - resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.3.tgz" - integrity sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ== + version "3.5.0" + resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz" + integrity sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ== dependencies: "@types/estree" "^1.0.0" @@ -4901,7 +4988,7 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource-parser@^3.0.5: +eventsource-parser@^3.0.6: version "3.0.6" resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz" integrity sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg== @@ -4981,25 +5068,30 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.19.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" @@ -5081,9 +5173,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.0.0: - version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.11" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== form-data-encoder@^2.1.2: version "2.1.4" @@ -5100,10 +5192,10 @@ forwarded@0.2.0: resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fraction.js@^5.3.4: + version "5.3.4" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz" + integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== fresh@0.5.2: version "0.5.2" @@ -5129,22 +5221,35 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" @@ -5170,9 +5275,9 @@ glob-parent@^6.0.1: is-glob "^4.0.3" glob-to-regex.js@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz" - integrity sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg== + version "1.2.0" + resolved "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz" + integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== glob-to-regexp@^0.4.1: version "0.4.1" @@ -5186,11 +5291,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^15.15.0: version "15.15.0" resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz" @@ -5219,12 +5319,10 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^12.1.0: version "12.6.1" @@ -5285,45 +5383,40 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-yarn@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz" integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -hasown@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz" - integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-from-parse5@^8.0.0: - version "8.0.1" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz" - integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + version "8.0.3" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" devlop "^1.0.0" - hastscript "^8.0.0" - property-information "^6.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" vfile "^6.0.0" vfile-location "^5.0.0" web-namespaces "^2.0.0" @@ -5336,9 +5429,9 @@ hast-util-parse-selector@^4.0.0: "@types/hast" "^3.0.0" hast-util-raw@^9.0.0: - version "9.0.2" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz" - integrity sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA== + version "9.1.0" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" @@ -5355,9 +5448,9 @@ hast-util-raw@^9.0.0: zwitch "^2.0.0" hast-util-to-estree@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz" - integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== + version "3.1.3" + resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz" + integrity sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== dependencies: "@types/estree" "^1.0.0" "@types/estree-jsx" "^1.0.0" @@ -5370,16 +5463,16 @@ hast-util-to-estree@^3.0.0: mdast-util-mdx-expression "^2.0.0" mdast-util-mdx-jsx "^3.0.0" mdast-util-mdxjs-esm "^2.0.0" - property-information "^6.0.0" + property-information "^7.0.0" space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" + style-to-js "^1.0.0" unist-util-position "^5.0.0" zwitch "^2.0.0" hast-util-to-jsx-runtime@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz" - integrity sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== + version "2.3.6" + resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz" + integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== dependencies: "@types/estree" "^1.0.0" "@types/hast" "^3.0.0" @@ -5391,9 +5484,9 @@ hast-util-to-jsx-runtime@^2.0.0: mdast-util-mdx-expression "^2.0.0" mdast-util-mdx-jsx "^3.0.0" mdast-util-mdxjs-esm "^2.0.0" - property-information "^6.0.0" + property-information "^7.0.0" space-separated-tokens "^2.0.0" - style-to-object "^1.0.0" + style-to-js "^1.0.0" unist-util-position "^5.0.0" vfile-message "^4.0.0" @@ -5417,15 +5510,15 @@ hast-util-whitespace@^3.0.0: dependencies: "@types/hast" "^3.0.0" -hastscript@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz" - integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== dependencies: "@types/hast" "^3.0.0" comma-separated-tokens "^2.0.0" hast-util-parse-selector "^4.0.0" - property-information "^6.0.0" + property-information "^7.0.0" space-separated-tokens "^2.0.0" he@^1.2.0: @@ -5566,9 +5659,9 @@ http-errors@2.0.0: toidentifier "1.0.1" http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + version "0.5.10" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz" + integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== http-proxy-middleware@^2.0.9: version "2.0.9" @@ -5628,9 +5721,9 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@^2.0.2: version "2.0.2" @@ -5638,9 +5731,9 @@ image-size@^2.0.2: integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -5675,12 +5768,7 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -5690,15 +5778,10 @@ ini@2.0.0: resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -inline-style-parser@0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz" - integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== internmap@^1.0.0: version "1.0.1" @@ -5759,12 +5842,12 @@ is-ci@^3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-decimal@^2.0.0: version "2.0.1" @@ -5870,13 +5953,6 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-reference@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz" - integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== - dependencies: - "@types/estree" "*" - is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" @@ -5963,14 +6039,14 @@ jest-worker@^29.4.3: supports-color "^8.0.0" jiti@^1.20.0: - version "1.21.0" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + version "1.21.7" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== joi@^17.9.2: - version "17.12.1" - resolved "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz" - integrity sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ== + version "17.13.3" + resolved "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== dependencies: "@hapi/hoek" "^9.3.0" "@hapi/topo" "^5.1.0" @@ -5984,24 +6060,24 @@ joi@^17.9.2: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + version "3.14.2" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== dependencies: argparse "^1.0.7" esprima "^4.0.0" js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + version "4.1.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" -jsesc@^3.0.2, jsesc@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== +jsesc@^3.0.2, jsesc@~3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" @@ -6095,9 +6171,9 @@ latest-version@^7.0.0: package-json "^8.1.0" launch-editor@^2.6.1: - version "2.11.1" - resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz" - integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg== + version "2.12.0" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz" + integrity sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg== dependencies: picocolors "^1.1.1" shell-quote "^1.8.3" @@ -6118,9 +6194,9 @@ leven@^3.1.0: integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== lilconfig@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + version "3.1.3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" @@ -6233,22 +6309,28 @@ markdown-table@^2.0.0: repeat-string "^1.0.0" markdown-table@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" - integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + version "3.0.4" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== marked@^16.2.1, marked@^16.3.0: - version "16.3.0" - resolved "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz" - integrity sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w== + version "16.4.2" + resolved "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz" + integrity sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mdast-util-directive@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz" - integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== + version "3.1.0" + resolved "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz" + integrity sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q== dependencies: "@types/mdast" "^4.0.0" "@types/unist" "^3.0.0" + ccount "^2.0.0" devlop "^1.0.0" mdast-util-from-markdown "^2.0.0" mdast-util-to-markdown "^2.0.0" @@ -6257,9 +6339,9 @@ mdast-util-directive@^3.0.0: unist-util-visit-parents "^6.0.0" mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz" - integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + version "3.0.2" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== dependencies: "@types/mdast" "^4.0.0" escape-string-regexp "^5.0.0" @@ -6267,9 +6349,9 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: unist-util-visit-parents "^6.0.0" mdast-util-from-markdown@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz" - integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== + version "2.0.2" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== dependencies: "@types/mdast" "^4.0.0" "@types/unist" "^3.0.0" @@ -6297,9 +6379,9 @@ mdast-util-frontmatter@^2.0.0: micromark-extension-frontmatter "^2.0.0" mdast-util-gfm-autolink-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz" - integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + version "2.0.1" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== dependencies: "@types/mdast" "^4.0.0" ccount "^2.0.0" @@ -6308,9 +6390,9 @@ mdast-util-gfm-autolink-literal@^2.0.0: micromark-util-character "^2.0.0" mdast-util-gfm-footnote@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz" - integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + version "2.1.0" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== dependencies: "@types/mdast" "^4.0.0" devlop "^1.1.0" @@ -6349,9 +6431,9 @@ mdast-util-gfm-task-list-item@^2.0.0: mdast-util-to-markdown "^2.0.0" mdast-util-gfm@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz" - integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + version "3.1.0" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== dependencies: mdast-util-from-markdown "^2.0.0" mdast-util-gfm-autolink-literal "^2.0.0" @@ -6362,9 +6444,9 @@ mdast-util-gfm@^3.0.0: mdast-util-to-markdown "^2.0.0" mdast-util-mdx-expression@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz" - integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== + version "2.0.1" + resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== dependencies: "@types/estree-jsx" "^1.0.0" "@types/hast" "^3.0.0" @@ -6374,9 +6456,9 @@ mdast-util-mdx-expression@^2.0.0: mdast-util-to-markdown "^2.0.0" mdast-util-mdx-jsx@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz" - integrity sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w== + version "3.2.0" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== dependencies: "@types/estree-jsx" "^1.0.0" "@types/hast" "^3.0.0" @@ -6388,7 +6470,6 @@ mdast-util-mdx-jsx@^3.0.0: mdast-util-to-markdown "^2.0.0" parse-entities "^4.0.0" stringify-entities "^4.0.0" - unist-util-remove-position "^5.0.0" unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" @@ -6424,9 +6505,9 @@ mdast-util-phrasing@^4.0.0: unist-util-is "^6.0.0" mdast-util-to-hast@^13.0.0: - version "13.1.0" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz" - integrity sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA== + version "13.2.0" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -6439,15 +6520,16 @@ mdast-util-to-hast@^13.0.0: vfile "^6.0.0" mdast-util-to-markdown@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz" - integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + version "2.1.2" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== dependencies: "@types/mdast" "^4.0.0" "@types/unist" "^3.0.0" longest-streak "^3.0.0" mdast-util-phrasing "^4.0.0" mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" micromark-util-decode-string "^2.0.0" unist-util-visit "^5.0.0" zwitch "^2.0.0" @@ -6475,9 +6557,9 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^4.43.1: - version "4.46.1" - resolved "https://registry.npmjs.org/memfs/-/memfs-4.46.1.tgz" - integrity sha512-2wjHDg7IjP+ufAqqqSxjiNePFDrvWviA79ajUwG9lkHhk3HzZOLBzzoUG8cx9vCagj6VvBQD7oXuLuFz5LaAOQ== + version "4.51.0" + resolved "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz" + integrity sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A== dependencies: "@jsonjoy.com/json-pack" "^1.11.0" "@jsonjoy.com/util" "^1.9.0" @@ -6533,9 +6615,9 @@ methods@~1.1.2: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromark-core-commonmark@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz" - integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== dependencies: decode-named-character-reference "^1.0.0" devlop "^1.0.0" @@ -6555,9 +6637,9 @@ micromark-core-commonmark@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-directive@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz" - integrity sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== + version "3.0.2" + resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== dependencies: devlop "^1.0.0" micromark-factory-space "^2.0.0" @@ -6578,9 +6660,9 @@ micromark-extension-frontmatter@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-gfm-autolink-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz" - integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== dependencies: micromark-util-character "^2.0.0" micromark-util-sanitize-uri "^2.0.0" @@ -6588,9 +6670,9 @@ micromark-extension-gfm-autolink-literal@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-gfm-footnote@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz" - integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== dependencies: devlop "^1.0.0" micromark-core-commonmark "^2.0.0" @@ -6602,9 +6684,9 @@ micromark-extension-gfm-footnote@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-gfm-strikethrough@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz" - integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== dependencies: devlop "^1.0.0" micromark-util-chunked "^2.0.0" @@ -6614,9 +6696,9 @@ micromark-extension-gfm-strikethrough@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-gfm-table@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz" - integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== + version "2.1.1" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== dependencies: devlop "^1.0.0" micromark-factory-space "^2.0.0" @@ -6632,9 +6714,9 @@ micromark-extension-gfm-tagfilter@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-gfm-task-list-item@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz" - integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== dependencies: devlop "^1.0.0" micromark-factory-space "^2.0.0" @@ -6657,9 +6739,9 @@ micromark-extension-gfm@^3.0.0: micromark-util-types "^2.0.0" micromark-extension-mdx-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz" - integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + version "3.0.1" + resolved "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz" + integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== dependencies: "@types/estree" "^1.0.0" devlop "^1.0.0" @@ -6671,17 +6753,17 @@ micromark-extension-mdx-expression@^3.0.0: micromark-util-types "^2.0.0" micromark-extension-mdx-jsx@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz" - integrity sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== + version "3.0.2" + resolved "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz" + integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== dependencies: - "@types/acorn" "^4.0.0" "@types/estree" "^1.0.0" devlop "^1.0.0" estree-util-is-identifier-name "^3.0.0" micromark-factory-mdx-expression "^2.0.0" micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" vfile-message "^4.0.0" @@ -6723,18 +6805,18 @@ micromark-extension-mdxjs@^3.0.0: micromark-util-types "^2.0.0" micromark-factory-destination@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz" - integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== dependencies: micromark-util-character "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" micromark-factory-label@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz" - integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== dependencies: devlop "^1.0.0" micromark-util-character "^2.0.0" @@ -6742,12 +6824,13 @@ micromark-factory-label@^2.0.0: micromark-util-types "^2.0.0" micromark-factory-mdx-expression@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz" - integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz" + integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== dependencies: "@types/estree" "^1.0.0" devlop "^1.0.0" + micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" micromark-util-events-to-acorn "^2.0.0" micromark-util-symbol "^2.0.0" @@ -6764,17 +6847,17 @@ micromark-factory-space@^1.0.0: micromark-util-types "^1.0.0" micromark-factory-space@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz" - integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== dependencies: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" micromark-factory-title@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz" - integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== dependencies: micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" @@ -6782,9 +6865,9 @@ micromark-factory-title@^2.0.0: micromark-util-types "^2.0.0" micromark-factory-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz" - integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== dependencies: micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" @@ -6800,48 +6883,48 @@ micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: micromark-util-types "^1.0.0" micromark-util-character@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz" - integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== + version "2.1.1" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" micromark-util-chunked@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz" - integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== dependencies: micromark-util-symbol "^2.0.0" micromark-util-classify-character@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz" - integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== dependencies: micromark-util-character "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" micromark-util-combine-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz" - integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== dependencies: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" micromark-util-decode-numeric-character-reference@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz" - integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + version "2.0.2" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== dependencies: micromark-util-symbol "^2.0.0" micromark-util-decode-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz" - integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: decode-named-character-reference "^1.0.0" micromark-util-character "^2.0.0" @@ -6849,16 +6932,15 @@ micromark-util-decode-string@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz" - integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== micromark-util-events-to-acorn@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz" - integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz" + integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== dependencies: - "@types/acorn" "^4.0.0" "@types/estree" "^1.0.0" "@types/unist" "^3.0.0" devlop "^1.0.0" @@ -6868,37 +6950,37 @@ micromark-util-events-to-acorn@^2.0.0: vfile-message "^4.0.0" micromark-util-html-tag-name@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz" - integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== micromark-util-normalize-identifier@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz" - integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-resolve-all@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz" - integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== dependencies: micromark-util-types "^2.0.0" micromark-util-sanitize-uri@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz" - integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: micromark-util-character "^2.0.0" micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-subtokenize@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz" - integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== dependencies: devlop "^1.0.0" micromark-util-chunked "^2.0.0" @@ -6911,9 +6993,9 @@ micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-symbol@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz" - integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== micromark-util-types@^1.0.0: version "1.1.0" @@ -6921,14 +7003,14 @@ micromark-util-types@^1.0.0: integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark-util-types@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz" - integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + version "2.0.2" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== micromark@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz" - integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + version "4.0.2" + resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz" + integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -6948,7 +7030,7 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -6961,7 +7043,7 @@ mime-db@^1.54.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== -"mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -6971,12 +7053,7 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27: +mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -6984,33 +7061,19 @@ mime-types@^2.1.27: mime-db "1.52.0" mime-types@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" - integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + version "3.0.2" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== dependencies: mime-db "^1.54.0" -mime-types@~2.1.17, mime-types@2.1.18: +mime-types@2.1.18: version "2.1.18" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@~2.1.24: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" @@ -7032,9 +7095,9 @@ mimic-response@^4.0.0: integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== mini-css-extract-plugin@^2.9.2: - version "2.9.2" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz" - integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== + version "2.9.4" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz" + integrity sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" @@ -7044,6 +7107,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimatch@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -7094,6 +7164,11 @@ nanoid@^3.3.11: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" @@ -7113,9 +7188,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-emoji@^2.1.0: - version "2.1.3" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz" - integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== + version "2.2.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz" + integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== dependencies: "@sindresorhus/is" "^4.6.0" char-regex "^1.0.2" @@ -7127,10 +7202,10 @@ node-forge@^1: resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7179,10 +7254,10 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" @@ -7190,13 +7265,15 @@ object-keys@^1.1.1: integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + version "4.1.7" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - has-symbols "^1.0.3" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" obuf@^1.0.0, obuf@^1.1.2: @@ -7211,10 +7288,10 @@ on-finished@^2.4.1, on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== onetime@^5.1.2: version "5.1.2" @@ -7333,12 +7410,11 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-entities@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz" - integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + version "4.0.2" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: "@types/unist" "^2.0.0" - character-entities "^2.0.0" character-entities-legacy "^3.0.0" character-reference-invalid "^2.0.0" decode-named-character-reference "^1.0.0" @@ -7362,19 +7438,19 @@ parse-numeric-range@^1.3.0: integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + version "7.1.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== dependencies: - domhandler "^5.0.2" + domhandler "^5.0.3" parse5 "^7.0.0" parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + version "7.3.0" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== dependencies: - entities "^4.4.0" + entities "^6.0.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" @@ -7441,15 +7517,6 @@ pathe@^2.0.1, pathe@^2.0.3: resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -periscopic@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz" - integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^3.0.0" - is-reference "^3.0.0" - picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" @@ -7520,15 +7587,15 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^7.0.10: - version "7.0.10" - resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz" - integrity sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA== +postcss-color-functional-notation@^7.0.12: + version "7.0.12" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz" + integrity sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-color-hex-alpha@^10.0.0: @@ -7630,12 +7697,12 @@ postcss-discard-unused@^6.0.5: dependencies: postcss-selector-parser "^6.0.16" -postcss-double-position-gradients@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz" - integrity sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q== +postcss-double-position-gradients@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz" + integrity sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g== dependencies: - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" @@ -7671,15 +7738,15 @@ postcss-image-set-function@^7.0.0: "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-lab-function@^7.0.10: - version "7.0.10" - resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz" - integrity sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ== +postcss-lab-function@^7.0.12: + version "7.0.12" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz" + integrity sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w== dependencies: - "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-loader@^7.3.4: @@ -7784,12 +7851,12 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^13.0.1: - version "13.0.1" - resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz" - integrity sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ== +postcss-nesting@^13.0.2: + version "13.0.2" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz" + integrity sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ== dependencies: - "@csstools/selector-resolve-nested" "^3.0.0" + "@csstools/selector-resolve-nested" "^3.1.0" "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" @@ -7888,24 +7955,27 @@ postcss-place@^10.0.0: postcss-value-parser "^4.2.0" postcss-preset-env@^10.2.1: - version "10.2.1" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.1.tgz" - integrity sha512-mDInnlm4mYhmR0S79hNLzseW9nx4Ihd8s15K99iu6u6QhoSQgqWX9Oj6nTd/8Dz3b0T7v2JSrfnXsDfv9TFvDg== - dependencies: - "@csstools/postcss-cascade-layers" "^5.0.1" - "@csstools/postcss-color-function" "^4.0.10" - "@csstools/postcss-color-mix-function" "^3.0.10" - "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.0" - "@csstools/postcss-content-alt-text" "^2.0.6" + version "10.4.0" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz" + integrity sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw== + dependencies: + "@csstools/postcss-alpha-function" "^1.0.1" + "@csstools/postcss-cascade-layers" "^5.0.2" + "@csstools/postcss-color-function" "^4.0.12" + "@csstools/postcss-color-function-display-p3-linear" "^1.0.1" + "@csstools/postcss-color-mix-function" "^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.2" + "@csstools/postcss-content-alt-text" "^2.0.8" + "@csstools/postcss-contrast-color-function" "^2.0.12" "@csstools/postcss-exponential-functions" "^2.0.9" "@csstools/postcss-font-format-keywords" "^4.0.0" - "@csstools/postcss-gamut-mapping" "^2.0.10" - "@csstools/postcss-gradients-interpolation-method" "^5.0.10" - "@csstools/postcss-hwb-function" "^4.0.10" - "@csstools/postcss-ic-unit" "^4.0.2" + "@csstools/postcss-gamut-mapping" "^2.0.11" + "@csstools/postcss-gradients-interpolation-method" "^5.0.12" + "@csstools/postcss-hwb-function" "^4.0.12" + "@csstools/postcss-ic-unit" "^4.0.4" "@csstools/postcss-initial" "^2.0.1" - "@csstools/postcss-is-pseudo-class" "^5.0.1" - "@csstools/postcss-light-dark-function" "^2.0.9" + "@csstools/postcss-is-pseudo-class" "^5.0.3" + "@csstools/postcss-light-dark-function" "^2.0.11" "@csstools/postcss-logical-float-and-clear" "^3.0.0" "@csstools/postcss-logical-overflow" "^2.0.0" "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" @@ -7915,40 +7985,40 @@ postcss-preset-env@^10.2.1: "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" "@csstools/postcss-nested-calc" "^4.0.0" "@csstools/postcss-normalize-display-values" "^4.0.0" - "@csstools/postcss-oklab-function" "^4.0.10" - "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-oklab-function" "^4.0.12" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/postcss-random-function" "^2.0.1" - "@csstools/postcss-relative-color-syntax" "^3.0.10" + "@csstools/postcss-relative-color-syntax" "^3.0.12" "@csstools/postcss-scope-pseudo-class" "^4.0.1" "@csstools/postcss-sign-functions" "^1.1.4" "@csstools/postcss-stepped-value-functions" "^4.0.9" - "@csstools/postcss-text-decoration-shorthand" "^4.0.2" + "@csstools/postcss-text-decoration-shorthand" "^4.0.3" "@csstools/postcss-trigonometric-functions" "^4.0.9" "@csstools/postcss-unset-value" "^4.0.0" autoprefixer "^10.4.21" - browserslist "^4.25.0" + browserslist "^4.26.0" css-blank-pseudo "^7.0.1" - css-has-pseudo "^7.0.2" + css-has-pseudo "^7.0.3" css-prefers-color-scheme "^10.0.0" - cssdb "^8.3.0" + cssdb "^8.4.2" postcss-attribute-case-insensitive "^7.0.1" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^7.0.10" + postcss-color-functional-notation "^7.0.12" postcss-color-hex-alpha "^10.0.0" postcss-color-rebeccapurple "^10.0.0" postcss-custom-media "^11.0.6" postcss-custom-properties "^14.0.6" postcss-custom-selectors "^8.0.5" postcss-dir-pseudo-class "^9.0.1" - postcss-double-position-gradients "^6.0.2" + postcss-double-position-gradients "^6.0.4" postcss-focus-visible "^10.0.1" postcss-focus-within "^9.0.1" postcss-font-variant "^5.0.0" postcss-gap-properties "^6.0.0" postcss-image-set-function "^7.0.0" - postcss-lab-function "^7.0.10" + postcss-lab-function "^7.0.12" postcss-logical "^8.1.0" - postcss-nesting "^13.0.1" + postcss-nesting "^13.0.2" postcss-opacity-percentage "^3.0.0" postcss-overflow-shorthand "^6.0.0" postcss-page-break "^3.0.4" @@ -7999,17 +8069,17 @@ postcss-selector-not@^8.0.1: postcss-selector-parser "^7.0.0" postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: - version "6.0.16" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + version "6.1.2" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-selector-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz" - integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== + version "7.1.0" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8047,9 +8117,9 @@ postcss-zindex@^6.0.2: integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== "postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.2, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.6, postcss@^8.5.4: - version "8.5.4" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz" - integrity sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w== + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: nanoid "^3.3.11" picocolors "^1.1.1" @@ -8104,9 +8174,14 @@ prop-types@^15.6.2, prop-types@^15.7.2: react-is "^16.13.1" property-information@^6.0.0: - version "6.4.1" - resolved "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz" - integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== + version "6.5.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +property-information@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz" + integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== proto-list@~1.2.1: version "1.2.4" @@ -8162,12 +8237,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -8198,11 +8268,11 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.0.0, "react-dom@>= 16.8.0 < 20.0.0": - version "19.2.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz" - integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== + version "19.1.1" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz" + integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== dependencies: - scheduler "^0.27.0" + scheduler "^0.26.0" react-fast-compare@^3.2.0: version "3.2.2" @@ -8226,9 +8296,9 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-json-view-lite@^2.3.0: - version "2.4.1" - resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz" - integrity sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA== + version "2.5.0" + resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz" + integrity sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g== react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" @@ -8279,10 +8349,10 @@ react-router@^5.3.4, react-router@>=5, react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@*, "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.2.0, "react@>= 16.8.0 < 20.0.0", react@>=15, react@>=16, react@>=16.0.0: - version "19.2.0" - resolved "https://registry.npmjs.org/react/-/react-19.2.0.tgz" - integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== +react@*, "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.1.1, "react@>= 16.8.0 < 20.0.0", react@>=15, react@>=16, react@>=16.0.0: + version "19.1.1" + resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz" + integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== readable-stream@^2.0.1: version "2.3.8" @@ -8313,10 +8383,50 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -regenerate-unicode-properties@^10.2.0: - version "10.2.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" - integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" + +recma-jsx@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz" + integrity sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w== + dependencies: + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" + +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== + dependencies: + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +regenerate-unicode-properties@^10.2.2: + version "10.2.2" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz" + integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== dependencies: regenerate "^1.4.2" @@ -8330,24 +8440,17 @@ regenerator-runtime@^0.14.0: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexpu-core@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz" - integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== +regexpu-core@^6.3.1: + version "6.4.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz" + integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== dependencies: regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.0" + regenerate-unicode-properties "^10.2.2" regjsgen "^0.8.0" - regjsparser "^0.11.0" + regjsparser "^0.13.0" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" + unicode-match-property-value-ecmascript "^2.2.1" registry-auth-token@^5.0.1: version "5.0.2" @@ -8368,12 +8471,12 @@ regjsgen@^0.8.0: resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.11.0: - version "0.11.2" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz" - integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== +regjsparser@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz" + integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== dependencies: - jsesc "~3.0.2" + jsesc "~3.1.0" rehype-raw@^7.0.0: version "7.0.0" @@ -8384,15 +8487,24 @@ rehype-raw@^7.0.0: hast-util-raw "^9.0.0" vfile "^6.0.0" +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remark-directive@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz" - integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== + version "3.0.1" + resolved "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz" + integrity sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A== dependencies: "@types/mdast" "^4.0.0" mdast-util-directive "^3.0.0" @@ -8421,9 +8533,9 @@ remark-frontmatter@^5.0.0: unified "^11.0.0" remark-gfm@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz" - integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + version "4.0.1" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== dependencies: "@types/mdast" "^4.0.0" mdast-util-gfm "^3.0.0" @@ -8433,9 +8545,9 @@ remark-gfm@^4.0.0: unified "^11.0.0" remark-mdx@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz" - integrity sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== + version "3.1.1" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz" + integrity sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg== dependencies: mdast-util-mdx "^3.0.0" micromark-extension-mdxjs "^3.0.0" @@ -8451,9 +8563,9 @@ remark-parse@^11.0.0: unified "^11.0.0" remark-rehype@^11.0.0: - version "11.1.0" - resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz" - integrity sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== + version "11.1.2" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz" + integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -8516,12 +8628,12 @@ resolve-pathname@^3.0.0: resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.14.2: - version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== +resolve@^1.22.10: + version "1.22.11" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -8538,9 +8650,9 @@ retry@^0.13.1: integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== robust-predicates@^3.0.2: version "3.0.2" @@ -8558,9 +8670,9 @@ roughjs@^4.6.6: points-on-path "^0.2.1" rtlcss@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz" - integrity sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ== + version "4.3.0" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz" + integrity sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -8594,25 +8706,20 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: - version "1.3.0" - resolved "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.3" + resolved "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz" + integrity sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ== -scheduler@^0.27.0: - version "0.27.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" - integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== schema-dts@^1.1.2: version "1.1.5" @@ -8647,9 +8754,9 @@ schema-utils@^3.2.0: ajv-keywords "^3.5.2" schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + version "4.3.3" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz" + integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -8694,7 +8801,21 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: +semver@^7.3.5: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: version "7.6.0" resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -8763,17 +8884,17 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" -set-function-length@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz" - integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.2" + define-data-property "^1.1.4" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.3" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.1" + has-property-descriptors "^1.0.2" setprototypeof@1.1.0: version "1.1.0" @@ -8814,15 +8935,45 @@ shell-quote@^1.8.3: resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz" integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" @@ -8844,9 +8995,9 @@ sisteransi@^1.0.5: integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + version "7.1.2" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz" + integrity sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== dependencies: "@types/node" "^17.0.5" "@types/sax" "^1.2.1" @@ -8905,20 +9056,15 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map@^0.6.0, source-map@~0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.0: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + version "0.7.6" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== space-separated-tokens@^2.0.0: version "2.0.2" @@ -8969,9 +9115,9 @@ statuses@2.0.1: integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + version "3.10.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== string_decoder@^1.1.1: version "1.3.0" @@ -9015,9 +9161,9 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + version "4.0.4" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" @@ -9065,19 +9211,19 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@^0.4.0: - version "0.4.4" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz" - integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== +style-to-js@^1.0.0: + version "1.1.21" + resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== dependencies: - inline-style-parser "0.1.1" + style-to-object "1.0.14" -style-to-object@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz" - integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== dependencies: - inline-style-parser "0.2.2" + inline-style-parser "0.2.7" stylehacks@^6.1.1: version "6.1.1" @@ -9117,9 +9263,9 @@ svg-parser@^2.0.4: integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^3.0.2, svgo@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz" - integrity sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ== + version "3.3.2" + resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz" + integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" @@ -9215,7 +9361,7 @@ totalist@^3.0.0: resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== -tree-dump@^1.0.3: +tree-dump@^1.0.3, tree-dump@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz" integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== @@ -9271,9 +9417,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@>=4.9.5, typescript@~5.9.0: - version "5.9.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + version "5.9.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== ufo@^1.6.1: version "1.6.1" @@ -9286,9 +9432,9 @@ undici-types@~5.26.4: integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-emoji-modifier-base@^1.0.0: version "1.0.0" @@ -9303,20 +9449,20 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== +unicode-match-property-value-ecmascript@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz" + integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + version "2.2.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz" + integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: - version "11.0.4" - resolved "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz" - integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + version "11.0.5" + resolved "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== dependencies: "@types/unist" "^3.0.0" bail "^2.0.0" @@ -9334,9 +9480,9 @@ unique-string@^3.0.0: crypto-random-string "^4.0.0" unist-util-is@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" - integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + version "6.0.1" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== dependencies: "@types/unist" "^3.0.0" @@ -9354,14 +9500,6 @@ unist-util-position@^5.0.0: dependencies: "@types/unist" "^3.0.0" -unist-util-remove-position@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz" - integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== - dependencies: - "@types/unist" "^3.0.0" - unist-util-visit "^5.0.0" - unist-util-stringify-position@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" @@ -9370,9 +9508,9 @@ unist-util-stringify-position@^4.0.0: "@types/unist" "^3.0.0" unist-util-visit-parents@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" - integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + version "6.0.2" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== dependencies: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" @@ -9396,10 +9534,10 @@ unpipe@~1.0.0, unpipe@1.0.0: resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== +update-browserslist-db@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz" + integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -9441,9 +9579,9 @@ url-loader@^4.1.1: schema-utils "^3.0.0" use-sync-external-store@^1.4.0: - version "1.5.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz" - integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== + version "1.6.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz" + integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -9486,28 +9624,27 @@ vary@~1.1.2: integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vfile-location@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz" - integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== + version "5.0.3" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== dependencies: "@types/unist" "^3.0.0" vfile "^6.0.0" vfile-message@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz" - integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + version "4.0.3" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz" + integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== dependencies: "@types/unist" "^3.0.0" unist-util-stringify-position "^4.0.0" vfile@^6.0.0, vfile@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz" - integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + version "6.0.3" + resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== dependencies: "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" vscode-jsonrpc@8.2.0: @@ -9795,15 +9932,20 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz" + integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== + yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + version "1.2.2" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz" + integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== -"zod@^3.25.76 || ^4", zod@^4.1.8: - version "4.1.11" - resolved "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz" - integrity sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg== +"zod@^3.25.76 || ^4.1.8", zod@^4.1.8: + version "4.1.12" + resolved "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz" + integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ== zwitch@^2.0.0: version "2.0.4" From 4f7972d938f85774a4f2b933de0ee3f73f62b5c1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 23 Nov 2025 00:11:05 +0000 Subject: [PATCH 077/192] chore(deps): update dependency typescript to v5.9.3 (#3887) Co-authored-by: Renovate Bot --- docs/yarn.lock | 408 ++++++++++++++++++++++--------------------------- 1 file changed, 181 insertions(+), 227 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 76fbe75ef8..43d13a5c4a 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -122,7 +122,7 @@ "@algolia/requester-fetch" "5.44.0" "@algolia/requester-node-http" "5.44.0" -"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@5.44.0": +"@algolia/client-search@5.44.0": version "5.44.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.44.0.tgz" integrity sha512-/FRKUM1G4xn3vV8+9xH1WJ9XknU8rkBGlefruq9jDhYUAvYozKimhrmC2pRqw/RyHhPivmgZCRuC8jHP8piz4Q== @@ -215,7 +215,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz" integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.21.3", "@babel/core@^7.25.9", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": +"@babel/core@^7.21.3", "@babel/core@^7.25.9": version "7.28.5" resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== @@ -1592,7 +1592,7 @@ webpack "^5.95.0" webpackbar "^6.0.1" -"@docusaurus/core@^3.0.0", "@docusaurus/core@3.9.2": +"@docusaurus/core@3.9.2": version "3.9.2" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz" integrity sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw== @@ -1725,7 +1725,7 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@*", "@docusaurus/plugin-content-docs@3.9.2": +"@docusaurus/plugin-content-docs@3.9.2": version "3.9.2" resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz" integrity sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg== @@ -2224,7 +2224,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2368,7 +2368,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" "@svgr/babel-plugin-transform-svg-component" "8.0.0" -"@svgr/core@*", "@svgr/core@8.1.0": +"@svgr/core@8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== @@ -2717,7 +2717,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.21": +"@types/express@*", "@types/express@^4.17.21": version "4.17.25" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz" integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== @@ -2877,7 +2877,7 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*", "@types/react@>= 16.8.0 < 20.0.0", "@types/react@>=16": +"@types/react@*": version "19.1.9" resolved "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz" integrity sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA== @@ -2978,7 +2978,7 @@ resolved "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz" integrity sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw== -"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== @@ -3079,7 +3079,7 @@ "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": version "1.12.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== @@ -3127,7 +3127,7 @@ acorn-walk@^8.0.0: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.0.4, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.8.2: +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.8.2: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -3145,7 +3145,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ai@^5.0.30, ai@5.0.100: +ai@5.0.100, ai@^5.0.30: version "5.0.100" resolved "https://registry.npmjs.org/ai/-/ai-5.0.100.tgz" integrity sha512-+ANP4EJomTcUKdEF3UpVAWEl6DGn+ozDLxVZKXmTV7NRfyEC2cLYcKwoU4o3sKJpqXMUKNzpFlJFBKOcsKdMyg== @@ -3174,7 +3174,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3184,7 +3184,7 @@ ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -3201,7 +3201,7 @@ algoliasearch-helper@^3.26.0: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^5.28.0, algoliasearch@^5.37.0, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": +algoliasearch@^5.28.0, algoliasearch@^5.37.0: version "5.44.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.44.0.tgz" integrity sha512-f8IpsbdQjzTjr/4mJ/jv5UplrtyMnnciGax6/B0OnLCs2/GJTK13O4Y7Ff1AvJVAaztanH+m5nzPoUq6EAy+aA== @@ -3464,7 +3464,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.26.0, browserslist@^4.27.0, browserslist@^4.28.0, "browserslist@>= 4.21.0": +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.26.0, browserslist@^4.27.0, browserslist@^4.28.0: version "4.28.0" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz" integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== @@ -3654,7 +3654,7 @@ chevrotain-allstar@~0.3.0: dependencies: lodash-es "^4.17.21" -chevrotain@^11.0.0, chevrotain@~11.0.3: +chevrotain@~11.0.3: version "11.0.3" resolved "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz" integrity sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw== @@ -3768,6 +3768,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^10.0.0: version "10.0.1" resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" @@ -3783,21 +3788,11 @@ commander@^5.1.0: resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.3.0: version "8.3.0" resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@7: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" @@ -4166,18 +4161,11 @@ cytoscape-fcose@^2.2.0: dependencies: cose-base "^2.2.0" -cytoscape@^3.2.0, cytoscape@^3.29.3: +cytoscape@^3.29.3: version "3.33.1" resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz" integrity sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ== -d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: - version "3.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" - integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== - dependencies: - internmap "1 - 2" - "d3-array@1 - 2": version "2.12.1" resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" @@ -4185,6 +4173,13 @@ d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", dependencies: internmap "^1.0.0" +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + d3-axis@3: version "3.0.0" resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" @@ -4294,16 +4289,16 @@ d3-hierarchy@3: dependencies: d3-color "1 - 3" -d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - d3-path@1: version "1.0.9" resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + d3-polygon@3: version "3.0.1" resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" @@ -4351,13 +4346,6 @@ d3-scale@4: resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -d3-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - d3-shape@3: version "3.2.0" resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" @@ -4365,6 +4353,13 @@ d3-shape@3: dependencies: d3-path "^3.1.0" +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" @@ -4460,13 +4455,6 @@ debounce@^1.2.1: resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.1, debug@4: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -4474,6 +4462,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.1: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decode-named-character-reference@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz" @@ -4551,16 +4546,16 @@ delaunator@5: dependencies: robust-predicates "^3.0.2" -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" @@ -5123,7 +5118,7 @@ figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -file-loader@*, file-loader@^6.2.0: +file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -5211,6 +5206,11 @@ fs-extra@^11.1.1, fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -5341,16 +5341,16 @@ got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + gray-matter@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" @@ -5637,16 +5637,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -5658,6 +5648,16 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.10" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz" @@ -5758,41 +5758,41 @@ infima@0.2.0-alpha.45: resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz" integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== -inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - inherits@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inline-style-parser@0.2.7: version "0.2.7" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz" integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== - "internmap@1 - 2": version "2.0.3" resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" @@ -5800,16 +5800,16 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ipaddr.js@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" @@ -5987,16 +5987,16 @@ is-yarn-global@^0.4.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz" integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -6233,7 +6233,7 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash-es@^4.17.21, lodash-es@4.17.21: +lodash-es@4.17.21, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -7038,21 +7038,28 @@ micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-db@^1.54.0: version "1.54.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - mime-db@~1.33.0: version "1.33.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" @@ -7067,13 +7074,6 @@ mime-types@^3.0.1: dependencies: mime-db "^1.54.0" -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" @@ -7107,13 +7107,6 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^9.0.3: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - minimatch@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -7121,6 +7114,13 @@ minimatch@3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -7141,16 +7141,16 @@ mrmime@^2.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== -ms@^2.1.3, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" @@ -7164,16 +7164,16 @@ nanoid@^3.3.11: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" @@ -7281,7 +7281,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@^2.4.1, on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -7465,7 +7465,7 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-data-parser@^0.1.0, path-data-parser@0.1.0: +path-data-parser@0.1.0, path-data-parser@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz" integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w== @@ -7490,13 +7490,6 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-to-regexp@0.1.12: version "0.1.12" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" @@ -7507,6 +7500,13 @@ path-to-regexp@3.3.0: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz" integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -7552,7 +7552,7 @@ pkg-types@^2.3.0: exsolve "^1.0.7" pathe "^2.0.3" -points-on-curve@^0.2.0, points-on-curve@0.2.0: +points-on-curve@0.2.0, points-on-curve@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz" integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A== @@ -8116,7 +8116,7 @@ postcss-zindex@^6.0.2: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz" integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.2, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.6, postcss@^8.5.4: +postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -8237,16 +8237,16 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - range-parser@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + raw-body@2.5.2: version "2.5.2" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" @@ -8267,7 +8267,7 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.0.0, "react-dom@>= 16.8.0 < 20.0.0": +react-dom@^19.0.0: version "19.1.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz" integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== @@ -8307,7 +8307,7 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" -react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@6.0.0": +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": version "6.0.0" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz" integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ== @@ -8334,7 +8334,7 @@ react-router-dom@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@^5.3.4, react-router@>=5, react-router@5.3.4: +react-router@5.3.4, react-router@^5.3.4: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== @@ -8349,7 +8349,7 @@ react-router@^5.3.4, react-router@>=5, react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@*, "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.1.1, "react@>= 16.8.0 < 20.0.0", react@>=15, react@>=16, react@>=16.0.0: +react@^19.0.0: version "19.1.1" resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz" integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== @@ -8696,7 +8696,7 @@ rw@1: resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8726,25 +8726,7 @@ schema-dts@^1.1.2: resolved "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz" integrity sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg== -schema-utils@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.2.0: +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -8763,11 +8745,6 @@ schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -"search-insights@>= 1 < 3": - version "2.17.3" - resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz" - integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ== - section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -8801,21 +8778,7 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.4: +semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: version "7.6.0" resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -9104,45 +9067,22 @@ srcset@^4.0.0: resolved "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz" integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + std-env@^3.7.0: version "3.10.0" resolved "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz" integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9160,6 +9100,20 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" @@ -9381,7 +9335,7 @@ ts-dedent@^2.2.0: resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== -tslib@^2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.6.0, tslib@2: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.6.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -9416,10 +9370,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@>=4.9.5, typescript@~5.9.0: - version "5.9.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== +typescript@~5.9.0: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== ufo@^1.6.1: version "1.6.1" @@ -9529,7 +9483,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -9789,7 +9743,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -"webpack@^4.0.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.88.1, webpack@^5.95.0, "webpack@>=4.41.1 || 5.x", webpack@>=5, "webpack@3 || 4 || 5": +webpack@^5.88.1, webpack@^5.95.0: version "5.96.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz" integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== @@ -9832,7 +9786,7 @@ webpackbar@^6.0.1: std-env "^3.7.0" wrap-ansi "^7.0.0" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -9942,7 +9896,7 @@ yocto-queue@^1.0.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz" integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== -"zod@^3.25.76 || ^4.1.8", zod@^4.1.8: +zod@^4.1.8: version "4.1.12" resolved "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz" integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ== From 48c115f33d20bd9b9dcc68005282abb8dc64bf9a Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 23 Nov 2025 00:33:26 +0000 Subject: [PATCH 078/192] chore: update benchmark results (#3890) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 40 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 266 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 338 insertions(+), 334 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index fa657efd9d..138ed9f545 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 556.3 ms | 556.3 ms | 4.46 ms | -| NUnit | 4.4.0 | 656.0 ms | 652.5 ms | 9.79 ms | -| MSTest | 4.0.2 | 626.0 ms | 625.3 ms | 8.22 ms | -| xUnit3 | 3.2.0 | 701.3 ms | 698.3 ms | 7.16 ms | -| **TUnit (AOT)** | 1.2.11 | 124.3 ms | 124.3 ms | 0.31 ms | +| **TUnit** | 1.2.11 | 565.8 ms | 565.5 ms | 2.61 ms | +| NUnit | 4.4.0 | 663.9 ms | 663.3 ms | 8.44 ms | +| MSTest | 4.0.2 | 627.6 ms | 628.8 ms | 4.97 ms | +| xUnit3 | 3.2.0 | 715.6 ms | 714.6 ms | 8.31 ms | +| **TUnit (AOT)** | 1.2.11 | 124.2 ms | 124.3 ms | 0.35 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 842 - bar [556.3, 656, 626, 701.3, 124.3] + y-axis "Time (ms)" 0 --> 859 + bar [565.8, 663.9, 627.6, 715.6, 124.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.079Z* +*Last generated: 2025-11-23T00:33:08.378Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 0f914badbf..b72d150d68 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.096 s | 2.087 s | 0.0247 s | -| Build_NUnit | 4.4.0 | 1.707 s | 1.713 s | 0.0257 s | -| Build_MSTest | 4.0.2 | 1.792 s | 1.795 s | 0.0227 s | -| Build_xUnit3 | 3.2.0 | 1.660 s | 1.664 s | 0.0171 s | +| **TUnit** | 1.2.11 | 2.057 s | 2.052 s | 0.0363 s | +| Build_NUnit | 4.4.0 | 1.639 s | 1.641 s | 0.0244 s | +| Build_MSTest | 4.0.2 | 1.720 s | 1.722 s | 0.0156 s | +| Build_xUnit3 | 3.2.0 | 1.620 s | 1.620 s | 0.0195 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.096, 1.707, 1.792, 1.66] + bar [2.057, 1.639, 1.72, 1.62] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.081Z* +*Last generated: 2025-11-23T00:33:08.380Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 5cffd8cea6..916390fab0 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 504.85 ms | 504.93 ms | 4.652 ms | -| NUnit | 4.4.0 | 602.92 ms | 602.92 ms | 8.093 ms | -| MSTest | 4.0.2 | 617.40 ms | 616.45 ms | 5.510 ms | -| xUnit3 | 3.2.0 | 614.39 ms | 611.15 ms | 11.735 ms | -| **TUnit (AOT)** | 1.2.11 | 25.60 ms | 25.69 ms | 0.624 ms | +| **TUnit** | 1.2.11 | 493.89 ms | 493.75 ms | 3.597 ms | +| NUnit | 4.4.0 | 526.36 ms | 525.02 ms | 7.358 ms | +| MSTest | 4.0.2 | 493.66 ms | 494.45 ms | 7.024 ms | +| xUnit3 | 3.2.0 | 572.74 ms | 575.02 ms | 7.551 ms | +| **TUnit (AOT)** | 1.2.11 | 23.74 ms | 23.76 ms | 0.112 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 741 - bar [504.85, 602.92, 617.4, 614.39, 25.6] + y-axis "Time (ms)" 0 --> 688 + bar [493.89, 526.36, 493.66, 572.74, 23.74] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.080Z* +*Last generated: 2025-11-23T00:33:08.378Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 1c50a7b89c..154b3a2d02 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 601.9 ms | 601.6 ms | 7.25 ms | -| NUnit | 4.4.0 | 1,206.3 ms | 1,203.0 ms | 13.87 ms | -| MSTest | 4.0.2 | 2,983.3 ms | 2,984.1 ms | 5.48 ms | -| xUnit3 | 3.2.0 | 3,069.8 ms | 3,070.7 ms | 4.67 ms | -| **TUnit (AOT)** | 1.2.11 | 131.1 ms | 131.1 ms | 0.45 ms | +| **TUnit** | 1.2.11 | 603.5 ms | 603.0 ms | 3.89 ms | +| NUnit | 4.4.0 | 1,213.0 ms | 1,213.1 ms | 7.41 ms | +| MSTest | 4.0.2 | 3,000.0 ms | 2,998.4 ms | 9.38 ms | +| xUnit3 | 3.2.0 | 3,089.8 ms | 3,087.9 ms | 8.18 ms | +| **TUnit (AOT)** | 1.2.11 | 131.4 ms | 131.3 ms | 0.36 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3684 - bar [601.9, 1206.3, 2983.3, 3069.8, 131.1] + y-axis "Time (ms)" 0 --> 3708 + bar [603.5, 1213, 3000, 3089.8, 131.4] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.080Z* +*Last generated: 2025-11-23T00:33:08.379Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index a455c09243..6a0f85809f 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 561.09 ms | 560.90 ms | 2.690 ms | -| NUnit | 4.4.0 | 1,568.63 ms | 1,568.52 ms | 6.683 ms | -| MSTest | 4.0.2 | 1,527.48 ms | 1,528.24 ms | 5.902 ms | -| xUnit3 | 3.2.0 | 1,607.99 ms | 1,607.91 ms | 4.911 ms | -| **TUnit (AOT)** | 1.2.11 | 78.98 ms | 79.04 ms | 0.171 ms | +| **TUnit** | 1.2.11 | 559.21 ms | 559.52 ms | 4.212 ms | +| NUnit | 4.4.0 | 1,586.70 ms | 1,588.09 ms | 15.075 ms | +| MSTest | 4.0.2 | 1,551.25 ms | 1,551.96 ms | 13.470 ms | +| xUnit3 | 3.2.0 | 1,628.81 ms | 1,616.75 ms | 19.456 ms | +| **TUnit (AOT)** | 1.2.11 | 78.72 ms | 78.56 ms | 0.429 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1930 - bar [561.09, 1568.63, 1527.48, 1607.99, 78.98] + y-axis "Time (ms)" 0 --> 1955 + bar [559.21, 1586.7, 1551.25, 1628.81, 78.72] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.080Z* +*Last generated: 2025-11-23T00:33:08.379Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 6a36ca595e..8833cea2e2 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 522.86 ms | 521.98 ms | 4.879 ms | -| NUnit | 4.4.0 | 614.14 ms | 613.81 ms | 8.401 ms | -| MSTest | 4.0.2 | 620.73 ms | 619.89 ms | 10.717 ms | -| xUnit3 | 3.2.0 | 613.65 ms | 611.98 ms | 7.848 ms | -| **TUnit (AOT)** | 1.2.11 | 46.30 ms | 46.04 ms | 3.593 ms | +| **TUnit** | 1.2.11 | 519.71 ms | 517.98 ms | 5.112 ms | +| NUnit | 4.4.0 | 565.90 ms | 566.29 ms | 7.194 ms | +| MSTest | 4.0.2 | 497.34 ms | 495.08 ms | 11.872 ms | +| xUnit3 | 3.2.0 | 576.49 ms | 578.68 ms | 9.104 ms | +| **TUnit (AOT)** | 1.2.11 | 46.08 ms | 46.38 ms | 3.790 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 745 - bar [522.86, 614.14, 620.73, 613.65, 46.3] + y-axis "Time (ms)" 0 --> 692 + bar [519.71, 565.9, 497.34, 576.49, 46.08] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.081Z* +*Last generated: 2025-11-23T00:33:08.379Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 0a9488a739..df5551a33c 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-20** from the latest CI run. +This benchmark was automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 586.0 ms | 586.0 ms | 7.14 ms | -| NUnit | 4.4.0 | 1,160.8 ms | 1,161.1 ms | 8.37 ms | -| MSTest | 4.0.2 | 1,133.4 ms | 1,132.9 ms | 11.79 ms | -| xUnit3 | 3.2.0 | 1,220.2 ms | 1,221.4 ms | 4.97 ms | +| **TUnit** | 1.2.11 | 584.4 ms | 584.6 ms | 6.90 ms | +| NUnit | 4.4.0 | 1,172.5 ms | 1,170.6 ms | 7.24 ms | +| MSTest | 4.0.2 | 1,145.4 ms | 1,144.0 ms | 13.26 ms | +| xUnit3 | 3.2.0 | 1,245.2 ms | 1,247.0 ms | 17.89 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-20** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1465 - bar [586, 1160.8, 1133.4, 1220.2, 0] + y-axis "Time (ms)" 0 --> 1495 + bar [584.4, 1172.5, 1145.4, 1245.2, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-20T00:28:21.081Z* +*Last generated: 2025-11-23T00:33:08.380Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index a256f4f439..122aab992c 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-20** from the latest CI run. +These benchmarks were automatically generated on **2025-11-23** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-20T00:28:21.082Z* +*Last generated: 2025-11-23T00:33:08.380Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index d96b4b5ccc..1bbbfb6312 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.079Z", + "timestamp": "2025-11-23T00:33:08.378Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,41 +10,41 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "556.3 ms", - "Error": "5.03 ms", - "StdDev": "4.46 ms", - "Median": "556.3 ms" + "Mean": "565.8 ms", + "Error": "2.95 ms", + "StdDev": "2.61 ms", + "Median": "565.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "656.0 ms", - "Error": "11.05 ms", - "StdDev": "9.79 ms", - "Median": "652.5 ms" + "Mean": "663.9 ms", + "Error": "9.52 ms", + "StdDev": "8.44 ms", + "Median": "663.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "626.0 ms", - "Error": "8.79 ms", - "StdDev": "8.22 ms", - "Median": "625.3 ms" + "Mean": "627.6 ms", + "Error": "5.61 ms", + "StdDev": "4.97 ms", + "Median": "628.8 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "701.3 ms", - "Error": "8.08 ms", - "StdDev": "7.16 ms", - "Median": "698.3 ms" + "Mean": "715.6 ms", + "Error": "9.37 ms", + "StdDev": "8.31 ms", + "Median": "714.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.3 ms", - "Error": "0.40 ms", - "StdDev": "0.31 ms", + "Mean": "124.2 ms", + "Error": "0.38 ms", + "StdDev": "0.35 ms", "Median": "124.3 ms" } ] diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index f2c1d2bc07..3356022d01 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.082Z", + "timestamp": "2025-11-23T00:33:08.380Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.096 s", - "Error": "0.0264 s", - "StdDev": "0.0247 s", - "Median": "2.087 s" + "Mean": "2.057 s", + "Error": "0.0388 s", + "StdDev": "0.0363 s", + "Median": "2.052 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.707 s", - "Error": "0.0275 s", - "StdDev": "0.0257 s", - "Median": "1.713 s" + "Mean": "1.639 s", + "Error": "0.0261 s", + "StdDev": "0.0244 s", + "Median": "1.641 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.792 s", - "Error": "0.0243 s", - "StdDev": "0.0227 s", - "Median": "1.795 s" + "Mean": "1.720 s", + "Error": "0.0166 s", + "StdDev": "0.0156 s", + "Median": "1.722 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.660 s", - "Error": "0.0183 s", - "StdDev": "0.0171 s", - "Median": "1.664 s" + "Mean": "1.620 s", + "Error": "0.0220 s", + "StdDev": "0.0195 s", + "Median": "1.620 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 89375a2dfd..7f432aac44 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.080Z", + "timestamp": "2025-11-23T00:33:08.379Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "504.85 ms", - "Error": "5.248 ms", - "StdDev": "4.652 ms", - "Median": "504.93 ms" + "Mean": "493.89 ms", + "Error": "4.307 ms", + "StdDev": "3.597 ms", + "Median": "493.75 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "602.92 ms", - "Error": "8.652 ms", - "StdDev": "8.093 ms", - "Median": "602.92 ms" + "Mean": "526.36 ms", + "Error": "8.811 ms", + "StdDev": "7.358 ms", + "Median": "525.02 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "617.40 ms", - "Error": "5.890 ms", - "StdDev": "5.510 ms", - "Median": "616.45 ms" + "Mean": "493.66 ms", + "Error": "7.924 ms", + "StdDev": "7.024 ms", + "Median": "494.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "614.39 ms", - "Error": "11.427 ms", - "StdDev": "11.735 ms", - "Median": "611.15 ms" + "Mean": "572.74 ms", + "Error": "9.043 ms", + "StdDev": "7.551 ms", + "Median": "575.02 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "25.60 ms", - "Error": "0.508 ms", - "StdDev": "0.624 ms", - "Median": "25.69 ms" + "Mean": "23.74 ms", + "Error": "0.127 ms", + "StdDev": "0.112 ms", + "Median": "23.76 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index c2b4ad50d7..a30d29c8af 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.080Z", + "timestamp": "2025-11-23T00:33:08.379Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "601.9 ms", - "Error": "7.75 ms", - "StdDev": "7.25 ms", - "Median": "601.6 ms" + "Mean": "603.5 ms", + "Error": "4.39 ms", + "StdDev": "3.89 ms", + "Median": "603.0 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,206.3 ms", - "Error": "15.65 ms", - "StdDev": "13.87 ms", - "Median": "1,203.0 ms" + "Mean": "1,213.0 ms", + "Error": "7.92 ms", + "StdDev": "7.41 ms", + "Median": "1,213.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,983.3 ms", - "Error": "6.19 ms", - "StdDev": "5.48 ms", - "Median": "2,984.1 ms" + "Mean": "3,000.0 ms", + "Error": "10.03 ms", + "StdDev": "9.38 ms", + "Median": "2,998.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,069.8 ms", - "Error": "5.60 ms", - "StdDev": "4.67 ms", - "Median": "3,070.7 ms" + "Mean": "3,089.8 ms", + "Error": "8.75 ms", + "StdDev": "8.18 ms", + "Median": "3,087.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.1 ms", - "Error": "0.51 ms", - "StdDev": "0.45 ms", - "Median": "131.1 ms" + "Mean": "131.4 ms", + "Error": "0.39 ms", + "StdDev": "0.36 ms", + "Median": "131.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index c6080a5301..bdad28bde7 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.080Z", + "timestamp": "2025-11-23T00:33:08.379Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "561.09 ms", - "Error": "3.035 ms", - "StdDev": "2.690 ms", - "Median": "560.90 ms" + "Mean": "559.21 ms", + "Error": "4.752 ms", + "StdDev": "4.212 ms", + "Median": "559.52 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,568.63 ms", - "Error": "7.145 ms", - "StdDev": "6.683 ms", - "Median": "1,568.52 ms" + "Mean": "1,586.70 ms", + "Error": "16.116 ms", + "StdDev": "15.075 ms", + "Median": "1,588.09 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,527.48 ms", - "Error": "6.657 ms", - "StdDev": "5.902 ms", - "Median": "1,528.24 ms" + "Mean": "1,551.25 ms", + "Error": "14.400 ms", + "StdDev": "13.470 ms", + "Median": "1,551.96 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,607.99 ms", - "Error": "5.540 ms", - "StdDev": "4.911 ms", - "Median": "1,607.91 ms" + "Mean": "1,628.81 ms", + "Error": "20.799 ms", + "StdDev": "19.456 ms", + "Median": "1,616.75 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "78.98 ms", - "Error": "0.193 ms", - "StdDev": "0.171 ms", - "Median": "79.04 ms" + "Mean": "78.72 ms", + "Error": "0.458 ms", + "StdDev": "0.429 ms", + "Median": "78.56 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index d97a780fe6..6711e495d7 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.081Z", + "timestamp": "2025-11-23T00:33:08.379Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "522.86 ms", - "Error": "5.216 ms", - "StdDev": "4.879 ms", - "Median": "521.98 ms" + "Mean": "519.71 ms", + "Error": "5.767 ms", + "StdDev": "5.112 ms", + "Median": "517.98 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "614.14 ms", - "Error": "9.477 ms", - "StdDev": "8.401 ms", - "Median": "613.81 ms" + "Mean": "565.90 ms", + "Error": "8.115 ms", + "StdDev": "7.194 ms", + "Median": "566.29 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "620.73 ms", - "Error": "12.089 ms", - "StdDev": "10.717 ms", - "Median": "619.89 ms" + "Mean": "497.34 ms", + "Error": "9.667 ms", + "StdDev": "11.872 ms", + "Median": "495.08 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "613.65 ms", - "Error": "8.853 ms", - "StdDev": "7.848 ms", - "Median": "611.98 ms" + "Mean": "576.49 ms", + "Error": "9.733 ms", + "StdDev": "9.104 ms", + "Median": "578.68 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.30 ms", - "Error": "1.219 ms", - "StdDev": "3.593 ms", - "Median": "46.04 ms" + "Mean": "46.08 ms", + "Error": "1.286 ms", + "StdDev": "3.790 ms", + "Median": "46.38 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 895ae24bd1..122de65ae8 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.081Z", + "timestamp": "2025-11-23T00:33:08.380Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "586.0 ms", - "Error": "7.64 ms", - "StdDev": "7.14 ms", - "Median": "586.0 ms" + "Mean": "584.4 ms", + "Error": "8.26 ms", + "StdDev": "6.90 ms", + "Median": "584.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,160.8 ms", - "Error": "8.95 ms", - "StdDev": "8.37 ms", - "Median": "1,161.1 ms" + "Mean": "1,172.5 ms", + "Error": "7.74 ms", + "StdDev": "7.24 ms", + "Median": "1,170.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,133.4 ms", - "Error": "12.60 ms", - "StdDev": "11.79 ms", - "Median": "1,132.9 ms" + "Mean": "1,145.4 ms", + "Error": "14.17 ms", + "StdDev": "13.26 ms", + "Median": "1,144.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,220.2 ms", - "Error": "5.31 ms", - "StdDev": "4.97 ms", - "Median": "1,221.4 ms" + "Mean": "1,245.2 ms", + "Error": "19.13 ms", + "StdDev": "17.89 ms", + "Median": "1,247.0 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 53ac744f38..608a3f6f5e 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -62,5 +62,9 @@ { "date": "2025-11-20", "environment": "Ubuntu" + }, + { + "date": "2025-11-23", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index eedc561da0..a513f7b6db 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-20T00:28:21.082Z", + "timestamp": "2025-11-23T00:33:08.381Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,41 +10,41 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "556.3 ms", - "Error": "5.03 ms", - "StdDev": "4.46 ms", - "Median": "556.3 ms" + "Mean": "565.8 ms", + "Error": "2.95 ms", + "StdDev": "2.61 ms", + "Median": "565.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "656.0 ms", - "Error": "11.05 ms", - "StdDev": "9.79 ms", - "Median": "652.5 ms" + "Mean": "663.9 ms", + "Error": "9.52 ms", + "StdDev": "8.44 ms", + "Median": "663.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "626.0 ms", - "Error": "8.79 ms", - "StdDev": "8.22 ms", - "Median": "625.3 ms" + "Mean": "627.6 ms", + "Error": "5.61 ms", + "StdDev": "4.97 ms", + "Median": "628.8 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "701.3 ms", - "Error": "8.08 ms", - "StdDev": "7.16 ms", - "Median": "698.3 ms" + "Mean": "715.6 ms", + "Error": "9.37 ms", + "StdDev": "8.31 ms", + "Median": "714.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.3 ms", - "Error": "0.40 ms", - "StdDev": "0.31 ms", + "Mean": "124.2 ms", + "Error": "0.38 ms", + "StdDev": "0.35 ms", "Median": "124.3 ms" } ], @@ -52,202 +52,202 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "504.85 ms", - "Error": "5.248 ms", - "StdDev": "4.652 ms", - "Median": "504.93 ms" + "Mean": "493.89 ms", + "Error": "4.307 ms", + "StdDev": "3.597 ms", + "Median": "493.75 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "602.92 ms", - "Error": "8.652 ms", - "StdDev": "8.093 ms", - "Median": "602.92 ms" + "Mean": "526.36 ms", + "Error": "8.811 ms", + "StdDev": "7.358 ms", + "Median": "525.02 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "617.40 ms", - "Error": "5.890 ms", - "StdDev": "5.510 ms", - "Median": "616.45 ms" + "Mean": "493.66 ms", + "Error": "7.924 ms", + "StdDev": "7.024 ms", + "Median": "494.45 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "614.39 ms", - "Error": "11.427 ms", - "StdDev": "11.735 ms", - "Median": "611.15 ms" + "Mean": "572.74 ms", + "Error": "9.043 ms", + "StdDev": "7.551 ms", + "Median": "575.02 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "25.60 ms", - "Error": "0.508 ms", - "StdDev": "0.624 ms", - "Median": "25.69 ms" + "Mean": "23.74 ms", + "Error": "0.127 ms", + "StdDev": "0.112 ms", + "Median": "23.76 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "601.9 ms", - "Error": "7.75 ms", - "StdDev": "7.25 ms", - "Median": "601.6 ms" + "Mean": "603.5 ms", + "Error": "4.39 ms", + "StdDev": "3.89 ms", + "Median": "603.0 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,206.3 ms", - "Error": "15.65 ms", - "StdDev": "13.87 ms", - "Median": "1,203.0 ms" + "Mean": "1,213.0 ms", + "Error": "7.92 ms", + "StdDev": "7.41 ms", + "Median": "1,213.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,983.3 ms", - "Error": "6.19 ms", - "StdDev": "5.48 ms", - "Median": "2,984.1 ms" + "Mean": "3,000.0 ms", + "Error": "10.03 ms", + "StdDev": "9.38 ms", + "Median": "2,998.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,069.8 ms", - "Error": "5.60 ms", - "StdDev": "4.67 ms", - "Median": "3,070.7 ms" + "Mean": "3,089.8 ms", + "Error": "8.75 ms", + "StdDev": "8.18 ms", + "Median": "3,087.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.1 ms", - "Error": "0.51 ms", - "StdDev": "0.45 ms", - "Median": "131.1 ms" + "Mean": "131.4 ms", + "Error": "0.39 ms", + "StdDev": "0.36 ms", + "Median": "131.3 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "561.09 ms", - "Error": "3.035 ms", - "StdDev": "2.690 ms", - "Median": "560.90 ms" + "Mean": "559.21 ms", + "Error": "4.752 ms", + "StdDev": "4.212 ms", + "Median": "559.52 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,568.63 ms", - "Error": "7.145 ms", - "StdDev": "6.683 ms", - "Median": "1,568.52 ms" + "Mean": "1,586.70 ms", + "Error": "16.116 ms", + "StdDev": "15.075 ms", + "Median": "1,588.09 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,527.48 ms", - "Error": "6.657 ms", - "StdDev": "5.902 ms", - "Median": "1,528.24 ms" + "Mean": "1,551.25 ms", + "Error": "14.400 ms", + "StdDev": "13.470 ms", + "Median": "1,551.96 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,607.99 ms", - "Error": "5.540 ms", - "StdDev": "4.911 ms", - "Median": "1,607.91 ms" + "Mean": "1,628.81 ms", + "Error": "20.799 ms", + "StdDev": "19.456 ms", + "Median": "1,616.75 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "78.98 ms", - "Error": "0.193 ms", - "StdDev": "0.171 ms", - "Median": "79.04 ms" + "Mean": "78.72 ms", + "Error": "0.458 ms", + "StdDev": "0.429 ms", + "Median": "78.56 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "522.86 ms", - "Error": "5.216 ms", - "StdDev": "4.879 ms", - "Median": "521.98 ms" + "Mean": "519.71 ms", + "Error": "5.767 ms", + "StdDev": "5.112 ms", + "Median": "517.98 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "614.14 ms", - "Error": "9.477 ms", - "StdDev": "8.401 ms", - "Median": "613.81 ms" + "Mean": "565.90 ms", + "Error": "8.115 ms", + "StdDev": "7.194 ms", + "Median": "566.29 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "620.73 ms", - "Error": "12.089 ms", - "StdDev": "10.717 ms", - "Median": "619.89 ms" + "Mean": "497.34 ms", + "Error": "9.667 ms", + "StdDev": "11.872 ms", + "Median": "495.08 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "613.65 ms", - "Error": "8.853 ms", - "StdDev": "7.848 ms", - "Median": "611.98 ms" + "Mean": "576.49 ms", + "Error": "9.733 ms", + "StdDev": "9.104 ms", + "Median": "578.68 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.30 ms", - "Error": "1.219 ms", - "StdDev": "3.593 ms", - "Median": "46.04 ms" + "Mean": "46.08 ms", + "Error": "1.286 ms", + "StdDev": "3.790 ms", + "Median": "46.38 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "586.0 ms", - "Error": "7.64 ms", - "StdDev": "7.14 ms", - "Median": "586.0 ms" + "Mean": "584.4 ms", + "Error": "8.26 ms", + "StdDev": "6.90 ms", + "Median": "584.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,160.8 ms", - "Error": "8.95 ms", - "StdDev": "8.37 ms", - "Median": "1,161.1 ms" + "Mean": "1,172.5 ms", + "Error": "7.74 ms", + "StdDev": "7.24 ms", + "Median": "1,170.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,133.4 ms", - "Error": "12.60 ms", - "StdDev": "11.79 ms", - "Median": "1,132.9 ms" + "Mean": "1,145.4 ms", + "Error": "14.17 ms", + "StdDev": "13.26 ms", + "Median": "1,144.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,220.2 ms", - "Error": "5.31 ms", - "StdDev": "4.97 ms", - "Median": "1,221.4 ms" + "Mean": "1,245.2 ms", + "Error": "19.13 ms", + "StdDev": "17.89 ms", + "Median": "1,247.0 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.096 s", - "Error": "0.0264 s", - "StdDev": "0.0247 s", - "Median": "2.087 s" + "Mean": "2.057 s", + "Error": "0.0388 s", + "StdDev": "0.0363 s", + "Median": "2.052 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.707 s", - "Error": "0.0275 s", - "StdDev": "0.0257 s", - "Median": "1.713 s" + "Mean": "1.639 s", + "Error": "0.0261 s", + "StdDev": "0.0244 s", + "Median": "1.641 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.792 s", - "Error": "0.0243 s", - "StdDev": "0.0227 s", - "Median": "1.795 s" + "Mean": "1.720 s", + "Error": "0.0166 s", + "StdDev": "0.0156 s", + "Median": "1.722 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.660 s", - "Error": "0.0183 s", - "StdDev": "0.0171 s", - "Median": "1.664 s" + "Mean": "1.620 s", + "Error": "0.0220 s", + "StdDev": "0.0195 s", + "Median": "1.620 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-20T00:28:21.079Z" + "lastUpdated": "2025-11-23T00:33:08.377Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 3d0c6e2f8c..8169a5bf08 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-20", + "timestamp": "2025-11-23", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 3aa025270d506e2190c67d4bc0eb057670c4d671 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 23 Nov 2025 09:03:00 +0000 Subject: [PATCH 079/192] chore(deps): update dependency polyfill to 9.3.0 (#3891) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 81aaab106d..3fa7f0f0fd 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + From ac12d7dc420dd260a60a26bd096d04faa9ddfb62 Mon Sep 17 00:00:00 2001 From: bogdanefremenko <105855904+bogdanefremenko@users.noreply.github.com> Date: Sun, 23 Nov 2025 22:21:15 +0200 Subject: [PATCH 080/192] docs: fix typo in DependsOn documentation (#3897) --- docs/docs/test-authoring/depends-on.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/test-authoring/depends-on.md b/docs/docs/test-authoring/depends-on.md index 0a066bb90d..aa59ac5319 100644 --- a/docs/docs/test-authoring/depends-on.md +++ b/docs/docs/test-authoring/depends-on.md @@ -23,7 +23,7 @@ This takes a test name, which you can easily reference by using the `nameof(Test :::info -If you have multiple tests with the same name, but different parameter types, then you you must include the types of parameters in the `[DependsOn]` attribute too so TUnit can locate the correct test. +If you have multiple tests with the same name, but different parameter types, then you must include the types of parameters in the `[DependsOn]` attribute too so TUnit can locate the correct test. ::: From 4e47b5394e08fb57fdbd850c6fb8bb25f1430c6d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 23 Nov 2025 21:05:46 +0000 Subject: [PATCH 081/192] chore(deps): update dependency testcontainers.redis to 4.9.0 (#3896) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 3fa7f0f0fd..5e18529f8b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -78,7 +78,7 @@ - + From 691babaa15757cc7ec83a5ff16eb9c8ecd5931a0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 23 Nov 2025 21:29:04 +0000 Subject: [PATCH 082/192] chore(deps): update dependency polyfill to 9.3.0 (#3892) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index 3688510603..7e0cdfbd3e 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.2.0 + <_TUnitPolyfillVersion>9.3.0 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From 5408cde1dbf443bfc3383cd90ff7985858a62541 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 24 Nov 2025 00:30:26 +0000 Subject: [PATCH 083/192] chore: update benchmark results (#3899) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 138ed9f545..af7ef85a69 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 565.8 ms | 565.5 ms | 2.61 ms | -| NUnit | 4.4.0 | 663.9 ms | 663.3 ms | 8.44 ms | -| MSTest | 4.0.2 | 627.6 ms | 628.8 ms | 4.97 ms | -| xUnit3 | 3.2.0 | 715.6 ms | 714.6 ms | 8.31 ms | -| **TUnit (AOT)** | 1.2.11 | 124.2 ms | 124.3 ms | 0.35 ms | +| **TUnit** | 1.2.11 | 564.9 ms | 565.7 ms | 3.11 ms | +| NUnit | 4.4.0 | 699.7 ms | 700.8 ms | 9.17 ms | +| MSTest | 4.0.2 | 660.6 ms | 661.7 ms | 5.14 ms | +| xUnit3 | 3.2.0 | 743.1 ms | 743.9 ms | 5.98 ms | +| **TUnit (AOT)** | 1.2.11 | 124.0 ms | 124.1 ms | 0.41 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 859 - bar [565.8, 663.9, 627.6, 715.6, 124.2] + y-axis "Time (ms)" 0 --> 892 + bar [564.9, 699.7, 660.6, 743.1, 124] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.378Z* +*Last generated: 2025-11-24T00:30:13.235Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index b72d150d68..6da4f3c7e3 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.057 s | 2.052 s | 0.0363 s | -| Build_NUnit | 4.4.0 | 1.639 s | 1.641 s | 0.0244 s | -| Build_MSTest | 4.0.2 | 1.720 s | 1.722 s | 0.0156 s | -| Build_xUnit3 | 3.2.0 | 1.620 s | 1.620 s | 0.0195 s | +| **TUnit** | 1.2.11 | 2.056 s | 2.054 s | 0.0226 s | +| Build_NUnit | 4.4.0 | 1.672 s | 1.673 s | 0.0237 s | +| Build_MSTest | 4.0.2 | 1.732 s | 1.731 s | 0.0220 s | +| Build_xUnit3 | 3.2.0 | 1.637 s | 1.637 s | 0.0303 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.057, 1.639, 1.72, 1.62] + bar [2.056, 1.672, 1.732, 1.637] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.380Z* +*Last generated: 2025-11-24T00:30:13.238Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 916390fab0..c3506a0155 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 493.89 ms | 493.75 ms | 3.597 ms | -| NUnit | 4.4.0 | 526.36 ms | 525.02 ms | 7.358 ms | -| MSTest | 4.0.2 | 493.66 ms | 494.45 ms | 7.024 ms | -| xUnit3 | 3.2.0 | 572.74 ms | 575.02 ms | 7.551 ms | -| **TUnit (AOT)** | 1.2.11 | 23.74 ms | 23.76 ms | 0.112 ms | +| **TUnit** | 1.2.11 | 502.79 ms | 501.79 ms | 8.766 ms | +| NUnit | 4.4.0 | 545.05 ms | 545.30 ms | 4.726 ms | +| MSTest | 4.0.2 | 567.99 ms | 565.89 ms | 18.418 ms | +| xUnit3 | 3.2.0 | 592.12 ms | 595.76 ms | 10.598 ms | +| **TUnit (AOT)** | 1.2.11 | 24.43 ms | 24.37 ms | 0.321 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 688 - bar [493.89, 526.36, 493.66, 572.74, 23.74] + y-axis "Time (ms)" 0 --> 711 + bar [502.79, 545.05, 567.99, 592.12, 24.43] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.378Z* +*Last generated: 2025-11-24T00:30:13.236Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 154b3a2d02..992a342b45 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 603.5 ms | 603.0 ms | 3.89 ms | -| NUnit | 4.4.0 | 1,213.0 ms | 1,213.1 ms | 7.41 ms | -| MSTest | 4.0.2 | 3,000.0 ms | 2,998.4 ms | 9.38 ms | -| xUnit3 | 3.2.0 | 3,089.8 ms | 3,087.9 ms | 8.18 ms | -| **TUnit (AOT)** | 1.2.11 | 131.4 ms | 131.3 ms | 0.36 ms | +| **TUnit** | 1.2.11 | 618.8 ms | 616.1 ms | 16.88 ms | +| NUnit | 4.4.0 | 1,217.4 ms | 1,217.8 ms | 16.73 ms | +| MSTest | 4.0.2 | 3,017.6 ms | 3,018.9 ms | 16.28 ms | +| xUnit3 | 3.2.0 | 3,109.0 ms | 3,107.9 ms | 11.03 ms | +| **TUnit (AOT)** | 1.2.11 | 132.8 ms | 132.5 ms | 1.43 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3708 - bar [603.5, 1213, 3000, 3089.8, 131.4] + y-axis "Time (ms)" 0 --> 3731 + bar [618.8, 1217.4, 3017.6, 3109, 132.8] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.379Z* +*Last generated: 2025-11-24T00:30:13.236Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 6a0f85809f..a1ccf6e56b 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 559.21 ms | 559.52 ms | 4.212 ms | -| NUnit | 4.4.0 | 1,586.70 ms | 1,588.09 ms | 15.075 ms | -| MSTest | 4.0.2 | 1,551.25 ms | 1,551.96 ms | 13.470 ms | -| xUnit3 | 3.2.0 | 1,628.81 ms | 1,616.75 ms | 19.456 ms | -| **TUnit (AOT)** | 1.2.11 | 78.72 ms | 78.56 ms | 0.429 ms | +| **TUnit** | 1.2.11 | 556.10 ms | 555.91 ms | 3.095 ms | +| NUnit | 4.4.0 | 1,569.08 ms | 1,567.04 ms | 7.288 ms | +| MSTest | 4.0.2 | 1,528.84 ms | 1,528.89 ms | 10.057 ms | +| xUnit3 | 3.2.0 | 1,607.16 ms | 1,605.83 ms | 6.566 ms | +| **TUnit (AOT)** | 1.2.11 | 78.31 ms | 78.33 ms | 0.202 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1955 - bar [559.21, 1586.7, 1551.25, 1628.81, 78.72] + y-axis "Time (ms)" 0 --> 1929 + bar [556.1, 1569.08, 1528.84, 1607.16, 78.31] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.379Z* +*Last generated: 2025-11-24T00:30:13.236Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 8833cea2e2..de46b177a9 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 519.71 ms | 517.98 ms | 5.112 ms | -| NUnit | 4.4.0 | 565.90 ms | 566.29 ms | 7.194 ms | -| MSTest | 4.0.2 | 497.34 ms | 495.08 ms | 11.872 ms | -| xUnit3 | 3.2.0 | 576.49 ms | 578.68 ms | 9.104 ms | -| **TUnit (AOT)** | 1.2.11 | 46.08 ms | 46.38 ms | 3.790 ms | +| **TUnit** | 1.2.11 | 488.07 ms | 487.71 ms | 1.888 ms | +| NUnit | 4.4.0 | 539.71 ms | 541.92 ms | 6.082 ms | +| MSTest | 4.0.2 | 535.47 ms | 532.30 ms | 11.457 ms | +| xUnit3 | 3.2.0 | 563.81 ms | 560.87 ms | 10.520 ms | +| **TUnit (AOT)** | 1.2.11 | 47.69 ms | 47.78 ms | 3.991 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 692 - bar [519.71, 565.9, 497.34, 576.49, 46.08] + y-axis "Time (ms)" 0 --> 677 + bar [488.07, 539.71, 535.47, 563.81, 47.69] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.379Z* +*Last generated: 2025-11-24T00:30:13.237Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index df5551a33c..5a88ec2135 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-23** from the latest CI run. +This benchmark was automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 584.4 ms | 584.6 ms | 6.90 ms | -| NUnit | 4.4.0 | 1,172.5 ms | 1,170.6 ms | 7.24 ms | -| MSTest | 4.0.2 | 1,145.4 ms | 1,144.0 ms | 13.26 ms | -| xUnit3 | 3.2.0 | 1,245.2 ms | 1,247.0 ms | 17.89 ms | +| **TUnit** | 1.2.11 | 562.5 ms | 562.3 ms | 3.82 ms | +| NUnit | 4.4.0 | 1,181.4 ms | 1,181.3 ms | 11.56 ms | +| MSTest | 4.0.2 | 1,151.1 ms | 1,150.2 ms | 6.04 ms | +| xUnit3 | 3.2.0 | 1,231.9 ms | 1,230.6 ms | 6.20 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-23** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1495 - bar [584.4, 1172.5, 1145.4, 1245.2, 0] + y-axis "Time (ms)" 0 --> 1479 + bar [562.5, 1181.4, 1151.1, 1231.9, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-23T00:33:08.380Z* +*Last generated: 2025-11-24T00:30:13.237Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 122aab992c..5c190ef26f 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-23** from the latest CI run. +These benchmarks were automatically generated on **2025-11-24** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-23T00:33:08.380Z* +*Last generated: 2025-11-24T00:30:13.238Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 1bbbfb6312..ab00c0b021 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.378Z", + "timestamp": "2025-11-24T00:30:13.235Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "565.8 ms", - "Error": "2.95 ms", - "StdDev": "2.61 ms", - "Median": "565.5 ms" + "Mean": "564.9 ms", + "Error": "3.50 ms", + "StdDev": "3.11 ms", + "Median": "565.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "663.9 ms", - "Error": "9.52 ms", - "StdDev": "8.44 ms", - "Median": "663.3 ms" + "Mean": "699.7 ms", + "Error": "9.80 ms", + "StdDev": "9.17 ms", + "Median": "700.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "627.6 ms", - "Error": "5.61 ms", - "StdDev": "4.97 ms", - "Median": "628.8 ms" + "Mean": "660.6 ms", + "Error": "5.80 ms", + "StdDev": "5.14 ms", + "Median": "661.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "715.6 ms", - "Error": "9.37 ms", - "StdDev": "8.31 ms", - "Median": "714.6 ms" + "Mean": "743.1 ms", + "Error": "6.40 ms", + "StdDev": "5.98 ms", + "Median": "743.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.2 ms", - "Error": "0.38 ms", - "StdDev": "0.35 ms", - "Median": "124.3 ms" + "Mean": "124.0 ms", + "Error": "0.47 ms", + "StdDev": "0.41 ms", + "Median": "124.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 3356022d01..bcc8b67e03 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.380Z", + "timestamp": "2025-11-24T00:30:13.238Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.057 s", - "Error": "0.0388 s", - "StdDev": "0.0363 s", - "Median": "2.052 s" + "Mean": "2.056 s", + "Error": "0.0241 s", + "StdDev": "0.0226 s", + "Median": "2.054 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.639 s", - "Error": "0.0261 s", - "StdDev": "0.0244 s", - "Median": "1.641 s" + "Mean": "1.672 s", + "Error": "0.0254 s", + "StdDev": "0.0237 s", + "Median": "1.673 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.720 s", - "Error": "0.0166 s", - "StdDev": "0.0156 s", - "Median": "1.722 s" + "Mean": "1.732 s", + "Error": "0.0248 s", + "StdDev": "0.0220 s", + "Median": "1.731 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.620 s", - "Error": "0.0220 s", - "StdDev": "0.0195 s", - "Median": "1.620 s" + "Mean": "1.637 s", + "Error": "0.0309 s", + "StdDev": "0.0303 s", + "Median": "1.637 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 7f432aac44..96baa83ad7 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.379Z", + "timestamp": "2025-11-24T00:30:13.236Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "493.89 ms", - "Error": "4.307 ms", - "StdDev": "3.597 ms", - "Median": "493.75 ms" + "Mean": "502.79 ms", + "Error": "9.372 ms", + "StdDev": "8.766 ms", + "Median": "501.79 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "526.36 ms", - "Error": "8.811 ms", - "StdDev": "7.358 ms", - "Median": "525.02 ms" + "Mean": "545.05 ms", + "Error": "6.053 ms", + "StdDev": "4.726 ms", + "Median": "545.30 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "493.66 ms", - "Error": "7.924 ms", - "StdDev": "7.024 ms", - "Median": "494.45 ms" + "Mean": "567.99 ms", + "Error": "11.210 ms", + "StdDev": "18.418 ms", + "Median": "565.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "572.74 ms", - "Error": "9.043 ms", - "StdDev": "7.551 ms", - "Median": "575.02 ms" + "Mean": "592.12 ms", + "Error": "11.330 ms", + "StdDev": "10.598 ms", + "Median": "595.76 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "23.74 ms", - "Error": "0.127 ms", - "StdDev": "0.112 ms", - "Median": "23.76 ms" + "Mean": "24.43 ms", + "Error": "0.343 ms", + "StdDev": "0.321 ms", + "Median": "24.37 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index a30d29c8af..57f8180b5a 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.379Z", + "timestamp": "2025-11-24T00:30:13.236Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "603.5 ms", - "Error": "4.39 ms", - "StdDev": "3.89 ms", - "Median": "603.0 ms" + "Mean": "618.8 ms", + "Error": "12.04 ms", + "StdDev": "16.88 ms", + "Median": "616.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,213.0 ms", - "Error": "7.92 ms", - "StdDev": "7.41 ms", - "Median": "1,213.1 ms" + "Mean": "1,217.4 ms", + "Error": "20.03 ms", + "StdDev": "16.73 ms", + "Median": "1,217.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,000.0 ms", - "Error": "10.03 ms", - "StdDev": "9.38 ms", - "Median": "2,998.4 ms" + "Mean": "3,017.6 ms", + "Error": "19.50 ms", + "StdDev": "16.28 ms", + "Median": "3,018.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,089.8 ms", - "Error": "8.75 ms", - "StdDev": "8.18 ms", - "Median": "3,087.9 ms" + "Mean": "3,109.0 ms", + "Error": "13.21 ms", + "StdDev": "11.03 ms", + "Median": "3,107.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.4 ms", - "Error": "0.39 ms", - "StdDev": "0.36 ms", - "Median": "131.3 ms" + "Mean": "132.8 ms", + "Error": "1.71 ms", + "StdDev": "1.43 ms", + "Median": "132.5 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index bdad28bde7..182ae5333f 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.379Z", + "timestamp": "2025-11-24T00:30:13.236Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "559.21 ms", - "Error": "4.752 ms", - "StdDev": "4.212 ms", - "Median": "559.52 ms" + "Mean": "556.10 ms", + "Error": "3.309 ms", + "StdDev": "3.095 ms", + "Median": "555.91 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,586.70 ms", - "Error": "16.116 ms", - "StdDev": "15.075 ms", - "Median": "1,588.09 ms" + "Mean": "1,569.08 ms", + "Error": "7.791 ms", + "StdDev": "7.288 ms", + "Median": "1,567.04 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,551.25 ms", - "Error": "14.400 ms", - "StdDev": "13.470 ms", - "Median": "1,551.96 ms" + "Mean": "1,528.84 ms", + "Error": "10.751 ms", + "StdDev": "10.057 ms", + "Median": "1,528.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,628.81 ms", - "Error": "20.799 ms", - "StdDev": "19.456 ms", - "Median": "1,616.75 ms" + "Mean": "1,607.16 ms", + "Error": "7.019 ms", + "StdDev": "6.566 ms", + "Median": "1,605.83 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "78.72 ms", - "Error": "0.458 ms", - "StdDev": "0.429 ms", - "Median": "78.56 ms" + "Mean": "78.31 ms", + "Error": "0.228 ms", + "StdDev": "0.202 ms", + "Median": "78.33 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 6711e495d7..b037c27adf 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.379Z", + "timestamp": "2025-11-24T00:30:13.237Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "519.71 ms", - "Error": "5.767 ms", - "StdDev": "5.112 ms", - "Median": "517.98 ms" + "Mean": "488.07 ms", + "Error": "2.261 ms", + "StdDev": "1.888 ms", + "Median": "487.71 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "565.90 ms", - "Error": "8.115 ms", - "StdDev": "7.194 ms", - "Median": "566.29 ms" + "Mean": "539.71 ms", + "Error": "6.503 ms", + "StdDev": "6.082 ms", + "Median": "541.92 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "497.34 ms", - "Error": "9.667 ms", - "StdDev": "11.872 ms", - "Median": "495.08 ms" + "Mean": "535.47 ms", + "Error": "10.308 ms", + "StdDev": "11.457 ms", + "Median": "532.30 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "576.49 ms", - "Error": "9.733 ms", - "StdDev": "9.104 ms", - "Median": "578.68 ms" + "Mean": "563.81 ms", + "Error": "11.246 ms", + "StdDev": "10.520 ms", + "Median": "560.87 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.08 ms", - "Error": "1.286 ms", - "StdDev": "3.790 ms", - "Median": "46.38 ms" + "Mean": "47.69 ms", + "Error": "1.353 ms", + "StdDev": "3.991 ms", + "Median": "47.78 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 122de65ae8..77ecb42ef0 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.380Z", + "timestamp": "2025-11-24T00:30:13.237Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "584.4 ms", - "Error": "8.26 ms", - "StdDev": "6.90 ms", - "Median": "584.6 ms" + "Mean": "562.5 ms", + "Error": "4.08 ms", + "StdDev": "3.82 ms", + "Median": "562.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,172.5 ms", - "Error": "7.74 ms", - "StdDev": "7.24 ms", - "Median": "1,170.6 ms" + "Mean": "1,181.4 ms", + "Error": "12.36 ms", + "StdDev": "11.56 ms", + "Median": "1,181.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,145.4 ms", - "Error": "14.17 ms", - "StdDev": "13.26 ms", - "Median": "1,144.0 ms" + "Mean": "1,151.1 ms", + "Error": "6.81 ms", + "StdDev": "6.04 ms", + "Median": "1,150.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,245.2 ms", - "Error": "19.13 ms", - "StdDev": "17.89 ms", - "Median": "1,247.0 ms" + "Mean": "1,231.9 ms", + "Error": "6.99 ms", + "StdDev": "6.20 ms", + "Median": "1,230.6 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 608a3f6f5e..312b078ef3 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -66,5 +66,9 @@ { "date": "2025-11-23", "environment": "Ubuntu" + }, + { + "date": "2025-11-24", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index a513f7b6db..2e55fb4a96 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T00:33:08.381Z", + "timestamp": "2025-11-24T00:30:13.238Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "565.8 ms", - "Error": "2.95 ms", - "StdDev": "2.61 ms", - "Median": "565.5 ms" + "Mean": "564.9 ms", + "Error": "3.50 ms", + "StdDev": "3.11 ms", + "Median": "565.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "663.9 ms", - "Error": "9.52 ms", - "StdDev": "8.44 ms", - "Median": "663.3 ms" + "Mean": "699.7 ms", + "Error": "9.80 ms", + "StdDev": "9.17 ms", + "Median": "700.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "627.6 ms", - "Error": "5.61 ms", - "StdDev": "4.97 ms", - "Median": "628.8 ms" + "Mean": "660.6 ms", + "Error": "5.80 ms", + "StdDev": "5.14 ms", + "Median": "661.7 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "715.6 ms", - "Error": "9.37 ms", - "StdDev": "8.31 ms", - "Median": "714.6 ms" + "Mean": "743.1 ms", + "Error": "6.40 ms", + "StdDev": "5.98 ms", + "Median": "743.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.2 ms", - "Error": "0.38 ms", - "StdDev": "0.35 ms", - "Median": "124.3 ms" + "Mean": "124.0 ms", + "Error": "0.47 ms", + "StdDev": "0.41 ms", + "Median": "124.1 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "493.89 ms", - "Error": "4.307 ms", - "StdDev": "3.597 ms", - "Median": "493.75 ms" + "Mean": "502.79 ms", + "Error": "9.372 ms", + "StdDev": "8.766 ms", + "Median": "501.79 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "526.36 ms", - "Error": "8.811 ms", - "StdDev": "7.358 ms", - "Median": "525.02 ms" + "Mean": "545.05 ms", + "Error": "6.053 ms", + "StdDev": "4.726 ms", + "Median": "545.30 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "493.66 ms", - "Error": "7.924 ms", - "StdDev": "7.024 ms", - "Median": "494.45 ms" + "Mean": "567.99 ms", + "Error": "11.210 ms", + "StdDev": "18.418 ms", + "Median": "565.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "572.74 ms", - "Error": "9.043 ms", - "StdDev": "7.551 ms", - "Median": "575.02 ms" + "Mean": "592.12 ms", + "Error": "11.330 ms", + "StdDev": "10.598 ms", + "Median": "595.76 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "23.74 ms", - "Error": "0.127 ms", - "StdDev": "0.112 ms", - "Median": "23.76 ms" + "Mean": "24.43 ms", + "Error": "0.343 ms", + "StdDev": "0.321 ms", + "Median": "24.37 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "603.5 ms", - "Error": "4.39 ms", - "StdDev": "3.89 ms", - "Median": "603.0 ms" + "Mean": "618.8 ms", + "Error": "12.04 ms", + "StdDev": "16.88 ms", + "Median": "616.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,213.0 ms", - "Error": "7.92 ms", - "StdDev": "7.41 ms", - "Median": "1,213.1 ms" + "Mean": "1,217.4 ms", + "Error": "20.03 ms", + "StdDev": "16.73 ms", + "Median": "1,217.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,000.0 ms", - "Error": "10.03 ms", - "StdDev": "9.38 ms", - "Median": "2,998.4 ms" + "Mean": "3,017.6 ms", + "Error": "19.50 ms", + "StdDev": "16.28 ms", + "Median": "3,018.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,089.8 ms", - "Error": "8.75 ms", - "StdDev": "8.18 ms", - "Median": "3,087.9 ms" + "Mean": "3,109.0 ms", + "Error": "13.21 ms", + "StdDev": "11.03 ms", + "Median": "3,107.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.4 ms", - "Error": "0.39 ms", - "StdDev": "0.36 ms", - "Median": "131.3 ms" + "Mean": "132.8 ms", + "Error": "1.71 ms", + "StdDev": "1.43 ms", + "Median": "132.5 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "559.21 ms", - "Error": "4.752 ms", - "StdDev": "4.212 ms", - "Median": "559.52 ms" + "Mean": "556.10 ms", + "Error": "3.309 ms", + "StdDev": "3.095 ms", + "Median": "555.91 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,586.70 ms", - "Error": "16.116 ms", - "StdDev": "15.075 ms", - "Median": "1,588.09 ms" + "Mean": "1,569.08 ms", + "Error": "7.791 ms", + "StdDev": "7.288 ms", + "Median": "1,567.04 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,551.25 ms", - "Error": "14.400 ms", - "StdDev": "13.470 ms", - "Median": "1,551.96 ms" + "Mean": "1,528.84 ms", + "Error": "10.751 ms", + "StdDev": "10.057 ms", + "Median": "1,528.89 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,628.81 ms", - "Error": "20.799 ms", - "StdDev": "19.456 ms", - "Median": "1,616.75 ms" + "Mean": "1,607.16 ms", + "Error": "7.019 ms", + "StdDev": "6.566 ms", + "Median": "1,605.83 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "78.72 ms", - "Error": "0.458 ms", - "StdDev": "0.429 ms", - "Median": "78.56 ms" + "Mean": "78.31 ms", + "Error": "0.228 ms", + "StdDev": "0.202 ms", + "Median": "78.33 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "519.71 ms", - "Error": "5.767 ms", - "StdDev": "5.112 ms", - "Median": "517.98 ms" + "Mean": "488.07 ms", + "Error": "2.261 ms", + "StdDev": "1.888 ms", + "Median": "487.71 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "565.90 ms", - "Error": "8.115 ms", - "StdDev": "7.194 ms", - "Median": "566.29 ms" + "Mean": "539.71 ms", + "Error": "6.503 ms", + "StdDev": "6.082 ms", + "Median": "541.92 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "497.34 ms", - "Error": "9.667 ms", - "StdDev": "11.872 ms", - "Median": "495.08 ms" + "Mean": "535.47 ms", + "Error": "10.308 ms", + "StdDev": "11.457 ms", + "Median": "532.30 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "576.49 ms", - "Error": "9.733 ms", - "StdDev": "9.104 ms", - "Median": "578.68 ms" + "Mean": "563.81 ms", + "Error": "11.246 ms", + "StdDev": "10.520 ms", + "Median": "560.87 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.08 ms", - "Error": "1.286 ms", - "StdDev": "3.790 ms", - "Median": "46.38 ms" + "Mean": "47.69 ms", + "Error": "1.353 ms", + "StdDev": "3.991 ms", + "Median": "47.78 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "584.4 ms", - "Error": "8.26 ms", - "StdDev": "6.90 ms", - "Median": "584.6 ms" + "Mean": "562.5 ms", + "Error": "4.08 ms", + "StdDev": "3.82 ms", + "Median": "562.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,172.5 ms", - "Error": "7.74 ms", - "StdDev": "7.24 ms", - "Median": "1,170.6 ms" + "Mean": "1,181.4 ms", + "Error": "12.36 ms", + "StdDev": "11.56 ms", + "Median": "1,181.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,145.4 ms", - "Error": "14.17 ms", - "StdDev": "13.26 ms", - "Median": "1,144.0 ms" + "Mean": "1,151.1 ms", + "Error": "6.81 ms", + "StdDev": "6.04 ms", + "Median": "1,150.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,245.2 ms", - "Error": "19.13 ms", - "StdDev": "17.89 ms", - "Median": "1,247.0 ms" + "Mean": "1,231.9 ms", + "Error": "6.99 ms", + "StdDev": "6.20 ms", + "Median": "1,230.6 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.057 s", - "Error": "0.0388 s", - "StdDev": "0.0363 s", - "Median": "2.052 s" + "Mean": "2.056 s", + "Error": "0.0241 s", + "StdDev": "0.0226 s", + "Median": "2.054 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.639 s", - "Error": "0.0261 s", - "StdDev": "0.0244 s", - "Median": "1.641 s" + "Mean": "1.672 s", + "Error": "0.0254 s", + "StdDev": "0.0237 s", + "Median": "1.673 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.720 s", - "Error": "0.0166 s", - "StdDev": "0.0156 s", - "Median": "1.722 s" + "Mean": "1.732 s", + "Error": "0.0248 s", + "StdDev": "0.0220 s", + "Median": "1.731 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.620 s", - "Error": "0.0220 s", - "StdDev": "0.0195 s", - "Median": "1.620 s" + "Mean": "1.637 s", + "Error": "0.0309 s", + "StdDev": "0.0303 s", + "Median": "1.637 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-23T00:33:08.377Z" + "lastUpdated": "2025-11-24T00:30:13.235Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 8169a5bf08..94c440d4ea 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-23", + "timestamp": "2025-11-24", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 5fc78dd9d74fb75b59838981de04e73d2a39f598 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:22:02 +0000 Subject: [PATCH 084/192] chore(deps): update dependency testcontainers.kafka to 4.9.0 (#3894) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5e18529f8b..7c011af154 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -76,7 +76,7 @@ - + From 60367ca149ddf34bdbbb9ca294801f81dbc12dc8 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:58:56 +0000 Subject: [PATCH 085/192] chore(deps): update dependency testcontainers.postgresql to 4.9.0 (#3895) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- .../ExampleNamespace.ApiService.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7c011af154..a24b05463a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -77,7 +77,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj index e3c1bc99c1..ed704c50b0 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ApiService/ExampleNamespace.ApiService.csproj @@ -11,7 +11,7 @@ - + From a4bf9c27df26aa206850c47947ac96f1d93c27e4 Mon Sep 17 00:00:00 2001 From: mgraf1 Date: Mon, 24 Nov 2025 13:31:46 -0800 Subject: [PATCH 086/192] Fix example in event-subscribing.md (#3898) --- docs/docs/test-lifecycle/event-subscribing.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/test-lifecycle/event-subscribing.md b/docs/docs/test-lifecycle/event-subscribing.md index 1602e1c7c1..4588f92671 100644 --- a/docs/docs/test-lifecycle/event-subscribing.md +++ b/docs/docs/test-lifecycle/event-subscribing.md @@ -66,7 +66,7 @@ public class DatabaseConnectionAttribute : Attribute, ITestStartEventReceiver await _connection.OpenAsync(); // Store connection in test context for use by hooks and test - context.GetOrAdd("DbConnection", () => _connection); + context.StateBag.GetOrAdd("DbConnection", _ => _connection); } } @@ -77,7 +77,7 @@ public class MyTests public async Task TestWithDatabase() { // Database connection is already open and available - var connection = TestContext.Current!.Get("DbConnection"); + TestContext.Current!.StateBag.TryGetValue("DbConnection", out var connection); // ... test logic } @@ -85,7 +85,7 @@ public class MyTests public void BeforeTest() { // Database connection is already available here - var connection = TestContext.Current!.Get("DbConnection"); + TestContext.Current!.StateBag.TryGetValue("DbConnection", out var connection); // ... setup that needs the database } } @@ -128,7 +128,7 @@ public class DependencyInjectionClassConstructor : IClassConstructor, ITestEndEv { private readonly IServiceProvider _serviceProvider = CreateServiceProvider(); private AsyncServiceScope _scope; - + public Task Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type, ClassConstructorMetadata classConstructorMetadata) { _scope = _serviceProvider.CreateAsyncScope(); @@ -138,7 +138,7 @@ public class DependencyInjectionClassConstructor : IClassConstructor, ITestEndEv } public ValueTask OnTestEnd(TestContext testContext) - { + { return _scope.DisposeAsync(); } From 849f6e3d3b4ac887fb97c56db35bde05ae771cfe Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 24 Nov 2025 22:35:52 +0000 Subject: [PATCH 087/192] chore(deps): update dependency nuget.protocol to 7.0.1 (#3906) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index a24b05463a..4147a33854 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -52,7 +52,7 @@ - + From 50c4155b6b8ae5824e78aa9dd6aed21c067d5b4b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:05:33 +0000 Subject: [PATCH 088/192] chore(deps): update dependency polly to 8.6.5 (#3893) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 4147a33854..d5bc2bc3ac 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -58,7 +58,7 @@ - + From 4a55613a5632739861d898dcb1a508f398d5a62e Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:34:09 +0000 Subject: [PATCH 089/192] chore(deps): update dependency vogen to 8.0.3 (#3907) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d5bc2bc3ac..fb73192255 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -87,7 +87,7 @@ - + From 5c8a7605359f4fe3ed17c38d1704988a738d0b22 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 25 Nov 2025 00:27:25 +0000 Subject: [PATCH 090/192] chore: update benchmark results (#3909) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index af7ef85a69..ddffa9f56b 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 564.9 ms | 565.7 ms | 3.11 ms | -| NUnit | 4.4.0 | 699.7 ms | 700.8 ms | 9.17 ms | -| MSTest | 4.0.2 | 660.6 ms | 661.7 ms | 5.14 ms | -| xUnit3 | 3.2.0 | 743.1 ms | 743.9 ms | 5.98 ms | -| **TUnit (AOT)** | 1.2.11 | 124.0 ms | 124.1 ms | 0.41 ms | +| **TUnit** | 1.2.11 | 560.7 ms | 560.6 ms | 3.58 ms | +| NUnit | 4.4.0 | 678.8 ms | 677.3 ms | 7.62 ms | +| MSTest | 4.0.2 | 651.1 ms | 650.0 ms | 5.52 ms | +| xUnit3 | 3.2.0 | 726.4 ms | 726.1 ms | 5.91 ms | +| **TUnit (AOT)** | 1.2.11 | 122.9 ms | 122.9 ms | 0.46 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 892 - bar [564.9, 699.7, 660.6, 743.1, 124] + y-axis "Time (ms)" 0 --> 872 + bar [560.7, 678.8, 651.1, 726.4, 122.9] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.235Z* +*Last generated: 2025-11-25T00:27:11.745Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 6da4f3c7e3..04fa564dc2 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.056 s | 2.054 s | 0.0226 s | -| Build_NUnit | 4.4.0 | 1.672 s | 1.673 s | 0.0237 s | -| Build_MSTest | 4.0.2 | 1.732 s | 1.731 s | 0.0220 s | -| Build_xUnit3 | 3.2.0 | 1.637 s | 1.637 s | 0.0303 s | +| **TUnit** | 1.2.11 | 2.075 s | 2.073 s | 0.0218 s | +| Build_NUnit | 4.4.0 | 1.703 s | 1.705 s | 0.0219 s | +| Build_MSTest | 4.0.2 | 1.748 s | 1.745 s | 0.0210 s | +| Build_xUnit3 | 3.2.0 | 1.651 s | 1.654 s | 0.0181 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.056, 1.672, 1.732, 1.637] + bar [2.075, 1.703, 1.748, 1.651] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.238Z* +*Last generated: 2025-11-25T00:27:11.747Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index c3506a0155..4682c15dfd 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 502.79 ms | 501.79 ms | 8.766 ms | -| NUnit | 4.4.0 | 545.05 ms | 545.30 ms | 4.726 ms | -| MSTest | 4.0.2 | 567.99 ms | 565.89 ms | 18.418 ms | -| xUnit3 | 3.2.0 | 592.12 ms | 595.76 ms | 10.598 ms | -| **TUnit (AOT)** | 1.2.11 | 24.43 ms | 24.37 ms | 0.321 ms | +| **TUnit** | 1.2.11 | 501.02 ms | 499.88 ms | 5.641 ms | +| NUnit | 4.4.0 | 531.32 ms | 530.68 ms | 8.239 ms | +| MSTest | 4.0.2 | 492.03 ms | 490.97 ms | 5.242 ms | +| xUnit3 | 3.2.0 | 573.68 ms | 574.18 ms | 9.040 ms | +| **TUnit (AOT)** | 1.2.11 | 24.58 ms | 24.57 ms | 0.249 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 711 - bar [502.79, 545.05, 567.99, 592.12, 24.43] + y-axis "Time (ms)" 0 --> 689 + bar [501.02, 531.32, 492.03, 573.68, 24.58] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.236Z* +*Last generated: 2025-11-25T00:27:11.745Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 992a342b45..c8118a1d41 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 618.8 ms | 616.1 ms | 16.88 ms | -| NUnit | 4.4.0 | 1,217.4 ms | 1,217.8 ms | 16.73 ms | -| MSTest | 4.0.2 | 3,017.6 ms | 3,018.9 ms | 16.28 ms | -| xUnit3 | 3.2.0 | 3,109.0 ms | 3,107.9 ms | 11.03 ms | -| **TUnit (AOT)** | 1.2.11 | 132.8 ms | 132.5 ms | 1.43 ms | +| **TUnit** | 1.2.11 | 589.0 ms | 585.7 ms | 8.74 ms | +| NUnit | 4.4.0 | 1,197.0 ms | 1,196.7 ms | 4.87 ms | +| MSTest | 4.0.2 | 2,999.4 ms | 2,999.0 ms | 4.44 ms | +| xUnit3 | 3.2.0 | 3,085.6 ms | 3,085.6 ms | 8.46 ms | +| **TUnit (AOT)** | 1.2.11 | 130.1 ms | 130.1 ms | 0.49 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3731 - bar [618.8, 1217.4, 3017.6, 3109, 132.8] + y-axis "Time (ms)" 0 --> 3703 + bar [589, 1197, 2999.4, 3085.6, 130.1] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.236Z* +*Last generated: 2025-11-25T00:27:11.746Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index a1ccf6e56b..1057d2108c 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 556.10 ms | 555.91 ms | 3.095 ms | -| NUnit | 4.4.0 | 1,569.08 ms | 1,567.04 ms | 7.288 ms | -| MSTest | 4.0.2 | 1,528.84 ms | 1,528.89 ms | 10.057 ms | -| xUnit3 | 3.2.0 | 1,607.16 ms | 1,605.83 ms | 6.566 ms | -| **TUnit (AOT)** | 1.2.11 | 78.31 ms | 78.33 ms | 0.202 ms | +| **TUnit** | 1.2.11 | 583.20 ms | 583.31 ms | 11.167 ms | +| NUnit | 4.4.0 | 1,560.64 ms | 1,558.69 ms | 5.548 ms | +| MSTest | 4.0.2 | 1,522.12 ms | 1,519.90 ms | 7.840 ms | +| xUnit3 | 3.2.0 | 1,605.16 ms | 1,605.32 ms | 1.938 ms | +| **TUnit (AOT)** | 1.2.11 | 80.63 ms | 80.69 ms | 0.344 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1929 - bar [556.1, 1569.08, 1528.84, 1607.16, 78.31] + y-axis "Time (ms)" 0 --> 1927 + bar [583.2, 1560.64, 1522.12, 1605.16, 80.63] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.236Z* +*Last generated: 2025-11-25T00:27:11.746Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index de46b177a9..88b5689a5e 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 488.07 ms | 487.71 ms | 1.888 ms | -| NUnit | 4.4.0 | 539.71 ms | 541.92 ms | 6.082 ms | -| MSTest | 4.0.2 | 535.47 ms | 532.30 ms | 11.457 ms | -| xUnit3 | 3.2.0 | 563.81 ms | 560.87 ms | 10.520 ms | -| **TUnit (AOT)** | 1.2.11 | 47.69 ms | 47.78 ms | 3.991 ms | +| **TUnit** | 1.2.11 | 522.19 ms | 519.59 ms | 5.051 ms | +| NUnit | 4.4.0 | 611.51 ms | 604.72 ms | 22.064 ms | +| MSTest | 4.0.2 | 616.29 ms | 607.40 ms | 26.577 ms | +| xUnit3 | 3.2.0 | 604.23 ms | 594.88 ms | 17.251 ms | +| **TUnit (AOT)** | 1.2.11 | 46.30 ms | 46.54 ms | 3.985 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 677 - bar [488.07, 539.71, 535.47, 563.81, 47.69] + y-axis "Time (ms)" 0 --> 740 + bar [522.19, 611.51, 616.29, 604.23, 46.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.237Z* +*Last generated: 2025-11-25T00:27:11.746Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 5a88ec2135..6d29630ebf 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-24** from the latest CI run. +This benchmark was automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 562.5 ms | 562.3 ms | 3.82 ms | -| NUnit | 4.4.0 | 1,181.4 ms | 1,181.3 ms | 11.56 ms | -| MSTest | 4.0.2 | 1,151.1 ms | 1,150.2 ms | 6.04 ms | -| xUnit3 | 3.2.0 | 1,231.9 ms | 1,230.6 ms | 6.20 ms | +| **TUnit** | 1.2.11 | 598.2 ms | 599.2 ms | 6.67 ms | +| NUnit | 4.4.0 | 1,167.1 ms | 1,165.5 ms | 7.03 ms | +| MSTest | 4.0.2 | 1,141.3 ms | 1,141.4 ms | 7.52 ms | +| xUnit3 | 3.2.0 | 1,226.4 ms | 1,227.9 ms | 8.48 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-24** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1479 - bar [562.5, 1181.4, 1151.1, 1231.9, 0] + y-axis "Time (ms)" 0 --> 1472 + bar [598.2, 1167.1, 1141.3, 1226.4, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-24T00:30:13.237Z* +*Last generated: 2025-11-25T00:27:11.747Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 5c190ef26f..7820d132dc 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-24** from the latest CI run. +These benchmarks were automatically generated on **2025-11-25** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-24T00:30:13.238Z* +*Last generated: 2025-11-25T00:27:11.748Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index ab00c0b021..fd9ac128ae 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.235Z", + "timestamp": "2025-11-25T00:27:11.745Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "564.9 ms", - "Error": "3.50 ms", - "StdDev": "3.11 ms", - "Median": "565.7 ms" + "Mean": "560.7 ms", + "Error": "3.82 ms", + "StdDev": "3.58 ms", + "Median": "560.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "699.7 ms", - "Error": "9.80 ms", - "StdDev": "9.17 ms", - "Median": "700.8 ms" + "Mean": "678.8 ms", + "Error": "8.60 ms", + "StdDev": "7.62 ms", + "Median": "677.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "660.6 ms", - "Error": "5.80 ms", - "StdDev": "5.14 ms", - "Median": "661.7 ms" + "Mean": "651.1 ms", + "Error": "6.23 ms", + "StdDev": "5.52 ms", + "Median": "650.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "743.1 ms", - "Error": "6.40 ms", - "StdDev": "5.98 ms", - "Median": "743.9 ms" + "Mean": "726.4 ms", + "Error": "7.08 ms", + "StdDev": "5.91 ms", + "Median": "726.1 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.0 ms", - "Error": "0.47 ms", - "StdDev": "0.41 ms", - "Median": "124.1 ms" + "Mean": "122.9 ms", + "Error": "0.52 ms", + "StdDev": "0.46 ms", + "Median": "122.9 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index bcc8b67e03..2119299399 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.238Z", + "timestamp": "2025-11-25T00:27:11.747Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.056 s", - "Error": "0.0241 s", - "StdDev": "0.0226 s", - "Median": "2.054 s" + "Mean": "2.075 s", + "Error": "0.0246 s", + "StdDev": "0.0218 s", + "Median": "2.073 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.672 s", - "Error": "0.0254 s", - "StdDev": "0.0237 s", - "Median": "1.673 s" + "Mean": "1.703 s", + "Error": "0.0234 s", + "StdDev": "0.0219 s", + "Median": "1.705 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.732 s", - "Error": "0.0248 s", - "StdDev": "0.0220 s", - "Median": "1.731 s" + "Mean": "1.748 s", + "Error": "0.0224 s", + "StdDev": "0.0210 s", + "Median": "1.745 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.637 s", - "Error": "0.0309 s", - "StdDev": "0.0303 s", - "Median": "1.637 s" + "Mean": "1.651 s", + "Error": "0.0193 s", + "StdDev": "0.0181 s", + "Median": "1.654 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 96baa83ad7..69b82c629f 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.236Z", + "timestamp": "2025-11-25T00:27:11.745Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "502.79 ms", - "Error": "9.372 ms", - "StdDev": "8.766 ms", - "Median": "501.79 ms" + "Mean": "501.02 ms", + "Error": "6.031 ms", + "StdDev": "5.641 ms", + "Median": "499.88 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "545.05 ms", - "Error": "6.053 ms", - "StdDev": "4.726 ms", - "Median": "545.30 ms" + "Mean": "531.32 ms", + "Error": "8.808 ms", + "StdDev": "8.239 ms", + "Median": "530.68 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "567.99 ms", - "Error": "11.210 ms", - "StdDev": "18.418 ms", - "Median": "565.89 ms" + "Mean": "492.03 ms", + "Error": "6.715 ms", + "StdDev": "5.242 ms", + "Median": "490.97 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "592.12 ms", - "Error": "11.330 ms", - "StdDev": "10.598 ms", - "Median": "595.76 ms" + "Mean": "573.68 ms", + "Error": "9.665 ms", + "StdDev": "9.040 ms", + "Median": "574.18 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.43 ms", - "Error": "0.343 ms", - "StdDev": "0.321 ms", - "Median": "24.37 ms" + "Mean": "24.58 ms", + "Error": "0.266 ms", + "StdDev": "0.249 ms", + "Median": "24.57 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 57f8180b5a..0dffe8bfd2 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.236Z", + "timestamp": "2025-11-25T00:27:11.746Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "618.8 ms", - "Error": "12.04 ms", - "StdDev": "16.88 ms", - "Median": "616.1 ms" + "Mean": "589.0 ms", + "Error": "9.34 ms", + "StdDev": "8.74 ms", + "Median": "585.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,217.4 ms", - "Error": "20.03 ms", - "StdDev": "16.73 ms", - "Median": "1,217.8 ms" + "Mean": "1,197.0 ms", + "Error": "6.24 ms", + "StdDev": "4.87 ms", + "Median": "1,196.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,017.6 ms", - "Error": "19.50 ms", - "StdDev": "16.28 ms", - "Median": "3,018.9 ms" + "Mean": "2,999.4 ms", + "Error": "5.31 ms", + "StdDev": "4.44 ms", + "Median": "2,999.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,109.0 ms", - "Error": "13.21 ms", - "StdDev": "11.03 ms", - "Median": "3,107.9 ms" + "Mean": "3,085.6 ms", + "Error": "9.54 ms", + "StdDev": "8.46 ms", + "Median": "3,085.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "132.8 ms", - "Error": "1.71 ms", - "StdDev": "1.43 ms", - "Median": "132.5 ms" + "Mean": "130.1 ms", + "Error": "0.52 ms", + "StdDev": "0.49 ms", + "Median": "130.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 182ae5333f..4a764c0c95 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.236Z", + "timestamp": "2025-11-25T00:27:11.746Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "556.10 ms", - "Error": "3.309 ms", - "StdDev": "3.095 ms", - "Median": "555.91 ms" + "Mean": "583.20 ms", + "Error": "10.874 ms", + "StdDev": "11.167 ms", + "Median": "583.31 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,569.08 ms", - "Error": "7.791 ms", - "StdDev": "7.288 ms", - "Median": "1,567.04 ms" + "Mean": "1,560.64 ms", + "Error": "6.258 ms", + "StdDev": "5.548 ms", + "Median": "1,558.69 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,528.84 ms", - "Error": "10.751 ms", - "StdDev": "10.057 ms", - "Median": "1,528.89 ms" + "Mean": "1,522.12 ms", + "Error": "8.382 ms", + "StdDev": "7.840 ms", + "Median": "1,519.90 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,607.16 ms", - "Error": "7.019 ms", - "StdDev": "6.566 ms", - "Median": "1,605.83 ms" + "Mean": "1,605.16 ms", + "Error": "2.482 ms", + "StdDev": "1.938 ms", + "Median": "1,605.32 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "78.31 ms", - "Error": "0.228 ms", - "StdDev": "0.202 ms", - "Median": "78.33 ms" + "Mean": "80.63 ms", + "Error": "0.367 ms", + "StdDev": "0.344 ms", + "Median": "80.69 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index b037c27adf..fd5d4aca41 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.237Z", + "timestamp": "2025-11-25T00:27:11.747Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "488.07 ms", - "Error": "2.261 ms", - "StdDev": "1.888 ms", - "Median": "487.71 ms" + "Mean": "522.19 ms", + "Error": "5.400 ms", + "StdDev": "5.051 ms", + "Median": "519.59 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "539.71 ms", - "Error": "6.503 ms", - "StdDev": "6.082 ms", - "Median": "541.92 ms" + "Mean": "611.51 ms", + "Error": "12.066 ms", + "StdDev": "22.064 ms", + "Median": "604.72 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "535.47 ms", - "Error": "10.308 ms", - "StdDev": "11.457 ms", - "Median": "532.30 ms" + "Mean": "616.29 ms", + "Error": "12.226 ms", + "StdDev": "26.577 ms", + "Median": "607.40 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "563.81 ms", - "Error": "11.246 ms", - "StdDev": "10.520 ms", - "Median": "560.87 ms" + "Mean": "604.23 ms", + "Error": "11.769 ms", + "StdDev": "17.251 ms", + "Median": "594.88 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "47.69 ms", - "Error": "1.353 ms", - "StdDev": "3.991 ms", - "Median": "47.78 ms" + "Mean": "46.30 ms", + "Error": "1.352 ms", + "StdDev": "3.985 ms", + "Median": "46.54 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 77ecb42ef0..f6ddff55d0 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.237Z", + "timestamp": "2025-11-25T00:27:11.747Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "562.5 ms", - "Error": "4.08 ms", - "StdDev": "3.82 ms", - "Median": "562.3 ms" + "Mean": "598.2 ms", + "Error": "7.13 ms", + "StdDev": "6.67 ms", + "Median": "599.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,181.4 ms", - "Error": "12.36 ms", - "StdDev": "11.56 ms", - "Median": "1,181.3 ms" + "Mean": "1,167.1 ms", + "Error": "7.51 ms", + "StdDev": "7.03 ms", + "Median": "1,165.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,151.1 ms", - "Error": "6.81 ms", - "StdDev": "6.04 ms", - "Median": "1,150.2 ms" + "Mean": "1,141.3 ms", + "Error": "8.48 ms", + "StdDev": "7.52 ms", + "Median": "1,141.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,231.9 ms", - "Error": "6.99 ms", - "StdDev": "6.20 ms", - "Median": "1,230.6 ms" + "Mean": "1,226.4 ms", + "Error": "9.57 ms", + "StdDev": "8.48 ms", + "Median": "1,227.9 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 312b078ef3..45a92272ea 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -70,5 +70,9 @@ { "date": "2025-11-24", "environment": "Ubuntu" + }, + { + "date": "2025-11-25", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 2e55fb4a96..0800aec703 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-24T00:30:13.238Z", + "timestamp": "2025-11-25T00:27:11.748Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "564.9 ms", - "Error": "3.50 ms", - "StdDev": "3.11 ms", - "Median": "565.7 ms" + "Mean": "560.7 ms", + "Error": "3.82 ms", + "StdDev": "3.58 ms", + "Median": "560.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "699.7 ms", - "Error": "9.80 ms", - "StdDev": "9.17 ms", - "Median": "700.8 ms" + "Mean": "678.8 ms", + "Error": "8.60 ms", + "StdDev": "7.62 ms", + "Median": "677.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "660.6 ms", - "Error": "5.80 ms", - "StdDev": "5.14 ms", - "Median": "661.7 ms" + "Mean": "651.1 ms", + "Error": "6.23 ms", + "StdDev": "5.52 ms", + "Median": "650.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "743.1 ms", - "Error": "6.40 ms", - "StdDev": "5.98 ms", - "Median": "743.9 ms" + "Mean": "726.4 ms", + "Error": "7.08 ms", + "StdDev": "5.91 ms", + "Median": "726.1 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.0 ms", - "Error": "0.47 ms", - "StdDev": "0.41 ms", - "Median": "124.1 ms" + "Mean": "122.9 ms", + "Error": "0.52 ms", + "StdDev": "0.46 ms", + "Median": "122.9 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "502.79 ms", - "Error": "9.372 ms", - "StdDev": "8.766 ms", - "Median": "501.79 ms" + "Mean": "501.02 ms", + "Error": "6.031 ms", + "StdDev": "5.641 ms", + "Median": "499.88 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "545.05 ms", - "Error": "6.053 ms", - "StdDev": "4.726 ms", - "Median": "545.30 ms" + "Mean": "531.32 ms", + "Error": "8.808 ms", + "StdDev": "8.239 ms", + "Median": "530.68 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "567.99 ms", - "Error": "11.210 ms", - "StdDev": "18.418 ms", - "Median": "565.89 ms" + "Mean": "492.03 ms", + "Error": "6.715 ms", + "StdDev": "5.242 ms", + "Median": "490.97 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "592.12 ms", - "Error": "11.330 ms", - "StdDev": "10.598 ms", - "Median": "595.76 ms" + "Mean": "573.68 ms", + "Error": "9.665 ms", + "StdDev": "9.040 ms", + "Median": "574.18 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.43 ms", - "Error": "0.343 ms", - "StdDev": "0.321 ms", - "Median": "24.37 ms" + "Mean": "24.58 ms", + "Error": "0.266 ms", + "StdDev": "0.249 ms", + "Median": "24.57 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "618.8 ms", - "Error": "12.04 ms", - "StdDev": "16.88 ms", - "Median": "616.1 ms" + "Mean": "589.0 ms", + "Error": "9.34 ms", + "StdDev": "8.74 ms", + "Median": "585.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,217.4 ms", - "Error": "20.03 ms", - "StdDev": "16.73 ms", - "Median": "1,217.8 ms" + "Mean": "1,197.0 ms", + "Error": "6.24 ms", + "StdDev": "4.87 ms", + "Median": "1,196.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,017.6 ms", - "Error": "19.50 ms", - "StdDev": "16.28 ms", - "Median": "3,018.9 ms" + "Mean": "2,999.4 ms", + "Error": "5.31 ms", + "StdDev": "4.44 ms", + "Median": "2,999.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,109.0 ms", - "Error": "13.21 ms", - "StdDev": "11.03 ms", - "Median": "3,107.9 ms" + "Mean": "3,085.6 ms", + "Error": "9.54 ms", + "StdDev": "8.46 ms", + "Median": "3,085.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "132.8 ms", - "Error": "1.71 ms", - "StdDev": "1.43 ms", - "Median": "132.5 ms" + "Mean": "130.1 ms", + "Error": "0.52 ms", + "StdDev": "0.49 ms", + "Median": "130.1 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "556.10 ms", - "Error": "3.309 ms", - "StdDev": "3.095 ms", - "Median": "555.91 ms" + "Mean": "583.20 ms", + "Error": "10.874 ms", + "StdDev": "11.167 ms", + "Median": "583.31 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,569.08 ms", - "Error": "7.791 ms", - "StdDev": "7.288 ms", - "Median": "1,567.04 ms" + "Mean": "1,560.64 ms", + "Error": "6.258 ms", + "StdDev": "5.548 ms", + "Median": "1,558.69 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,528.84 ms", - "Error": "10.751 ms", - "StdDev": "10.057 ms", - "Median": "1,528.89 ms" + "Mean": "1,522.12 ms", + "Error": "8.382 ms", + "StdDev": "7.840 ms", + "Median": "1,519.90 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,607.16 ms", - "Error": "7.019 ms", - "StdDev": "6.566 ms", - "Median": "1,605.83 ms" + "Mean": "1,605.16 ms", + "Error": "2.482 ms", + "StdDev": "1.938 ms", + "Median": "1,605.32 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "78.31 ms", - "Error": "0.228 ms", - "StdDev": "0.202 ms", - "Median": "78.33 ms" + "Mean": "80.63 ms", + "Error": "0.367 ms", + "StdDev": "0.344 ms", + "Median": "80.69 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "488.07 ms", - "Error": "2.261 ms", - "StdDev": "1.888 ms", - "Median": "487.71 ms" + "Mean": "522.19 ms", + "Error": "5.400 ms", + "StdDev": "5.051 ms", + "Median": "519.59 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "539.71 ms", - "Error": "6.503 ms", - "StdDev": "6.082 ms", - "Median": "541.92 ms" + "Mean": "611.51 ms", + "Error": "12.066 ms", + "StdDev": "22.064 ms", + "Median": "604.72 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "535.47 ms", - "Error": "10.308 ms", - "StdDev": "11.457 ms", - "Median": "532.30 ms" + "Mean": "616.29 ms", + "Error": "12.226 ms", + "StdDev": "26.577 ms", + "Median": "607.40 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "563.81 ms", - "Error": "11.246 ms", - "StdDev": "10.520 ms", - "Median": "560.87 ms" + "Mean": "604.23 ms", + "Error": "11.769 ms", + "StdDev": "17.251 ms", + "Median": "594.88 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "47.69 ms", - "Error": "1.353 ms", - "StdDev": "3.991 ms", - "Median": "47.78 ms" + "Mean": "46.30 ms", + "Error": "1.352 ms", + "StdDev": "3.985 ms", + "Median": "46.54 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "562.5 ms", - "Error": "4.08 ms", - "StdDev": "3.82 ms", - "Median": "562.3 ms" + "Mean": "598.2 ms", + "Error": "7.13 ms", + "StdDev": "6.67 ms", + "Median": "599.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,181.4 ms", - "Error": "12.36 ms", - "StdDev": "11.56 ms", - "Median": "1,181.3 ms" + "Mean": "1,167.1 ms", + "Error": "7.51 ms", + "StdDev": "7.03 ms", + "Median": "1,165.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,151.1 ms", - "Error": "6.81 ms", - "StdDev": "6.04 ms", - "Median": "1,150.2 ms" + "Mean": "1,141.3 ms", + "Error": "8.48 ms", + "StdDev": "7.52 ms", + "Median": "1,141.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,231.9 ms", - "Error": "6.99 ms", - "StdDev": "6.20 ms", - "Median": "1,230.6 ms" + "Mean": "1,226.4 ms", + "Error": "9.57 ms", + "StdDev": "8.48 ms", + "Median": "1,227.9 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.056 s", - "Error": "0.0241 s", - "StdDev": "0.0226 s", - "Median": "2.054 s" + "Mean": "2.075 s", + "Error": "0.0246 s", + "StdDev": "0.0218 s", + "Median": "2.073 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.672 s", - "Error": "0.0254 s", - "StdDev": "0.0237 s", - "Median": "1.673 s" + "Mean": "1.703 s", + "Error": "0.0234 s", + "StdDev": "0.0219 s", + "Median": "1.705 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.732 s", - "Error": "0.0248 s", - "StdDev": "0.0220 s", - "Median": "1.731 s" + "Mean": "1.748 s", + "Error": "0.0224 s", + "StdDev": "0.0210 s", + "Median": "1.745 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.637 s", - "Error": "0.0309 s", - "StdDev": "0.0303 s", - "Median": "1.637 s" + "Mean": "1.651 s", + "Error": "0.0193 s", + "StdDev": "0.0181 s", + "Median": "1.654 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-24T00:30:13.235Z" + "lastUpdated": "2025-11-25T00:27:11.744Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 94c440d4ea..71f8d47e01 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-24", + "timestamp": "2025-11-25", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From ff1720a46537572eddf0a8881d6be31e79e3185d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 25 Nov 2025 23:29:42 +0000 Subject: [PATCH 091/192] chore(deps): update dependency publicapigenerator to 11.5.2 (#3914) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index fb73192255..2d2888e97a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -60,7 +60,7 @@ - + From 109080704700ed3526e3d6c412b5f8ace5115ae5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 26 Nov 2025 00:28:43 +0000 Subject: [PATCH 092/192] chore: update benchmark results (#3915) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index ddffa9f56b..c995b041c7 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 560.7 ms | 560.6 ms | 3.58 ms | -| NUnit | 4.4.0 | 678.8 ms | 677.3 ms | 7.62 ms | -| MSTest | 4.0.2 | 651.1 ms | 650.0 ms | 5.52 ms | -| xUnit3 | 3.2.0 | 726.4 ms | 726.1 ms | 5.91 ms | -| **TUnit (AOT)** | 1.2.11 | 122.9 ms | 122.9 ms | 0.46 ms | +| **TUnit** | 1.2.11 | 573.9 ms | 574.0 ms | 3.37 ms | +| NUnit | 4.4.0 | 676.5 ms | 676.8 ms | 7.59 ms | +| MSTest | 4.0.2 | 646.7 ms | 645.2 ms | 8.98 ms | +| xUnit3 | 3.2.0 | 728.7 ms | 728.5 ms | 10.94 ms | +| **TUnit (AOT)** | 1.2.11 | 124.5 ms | 124.5 ms | 0.30 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 872 - bar [560.7, 678.8, 651.1, 726.4, 122.9] + y-axis "Time (ms)" 0 --> 875 + bar [573.9, 676.5, 646.7, 728.7, 124.5] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.745Z* +*Last generated: 2025-11-26T00:28:24.624Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 04fa564dc2..88acdbd9cf 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.075 s | 2.073 s | 0.0218 s | -| Build_NUnit | 4.4.0 | 1.703 s | 1.705 s | 0.0219 s | -| Build_MSTest | 4.0.2 | 1.748 s | 1.745 s | 0.0210 s | -| Build_xUnit3 | 3.2.0 | 1.651 s | 1.654 s | 0.0181 s | +| **TUnit** | 1.2.11 | 2.007 s | 2.006 s | 0.0239 s | +| Build_NUnit | 4.4.0 | 1.615 s | 1.612 s | 0.0144 s | +| Build_MSTest | 4.0.2 | 1.692 s | 1.696 s | 0.0181 s | +| Build_xUnit3 | 3.2.0 | 1.592 s | 1.595 s | 0.0176 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.075, 1.703, 1.748, 1.651] + bar [2.007, 1.615, 1.692, 1.592] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.747Z* +*Last generated: 2025-11-26T00:28:24.626Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 4682c15dfd..a40d06395a 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 501.02 ms | 499.88 ms | 5.641 ms | -| NUnit | 4.4.0 | 531.32 ms | 530.68 ms | 8.239 ms | -| MSTest | 4.0.2 | 492.03 ms | 490.97 ms | 5.242 ms | -| xUnit3 | 3.2.0 | 573.68 ms | 574.18 ms | 9.040 ms | -| **TUnit (AOT)** | 1.2.11 | 24.58 ms | 24.57 ms | 0.249 ms | +| **TUnit** | 1.2.11 | 506.10 ms | 505.58 ms | 5.293 ms | +| NUnit | 4.4.0 | 700.46 ms | 703.26 ms | 12.049 ms | +| MSTest | 4.0.2 | 687.05 ms | 686.19 ms | 8.024 ms | +| xUnit3 | 3.2.0 | 714.25 ms | 717.42 ms | 13.777 ms | +| **TUnit (AOT)** | 1.2.11 | 24.88 ms | 25.01 ms | 0.716 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 689 - bar [501.02, 531.32, 492.03, 573.68, 24.58] + y-axis "Time (ms)" 0 --> 858 + bar [506.1, 700.46, 687.05, 714.25, 24.88] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.745Z* +*Last generated: 2025-11-26T00:28:24.625Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index c8118a1d41..ed2509047b 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 589.0 ms | 585.7 ms | 8.74 ms | -| NUnit | 4.4.0 | 1,197.0 ms | 1,196.7 ms | 4.87 ms | -| MSTest | 4.0.2 | 2,999.4 ms | 2,999.0 ms | 4.44 ms | -| xUnit3 | 3.2.0 | 3,085.6 ms | 3,085.6 ms | 8.46 ms | -| **TUnit (AOT)** | 1.2.11 | 130.1 ms | 130.1 ms | 0.49 ms | +| **TUnit** | 1.2.11 | 597.0 ms | 597.7 ms | 4.28 ms | +| NUnit | 4.4.0 | 1,167.8 ms | 1,166.4 ms | 5.99 ms | +| MSTest | 4.0.2 | 2,944.5 ms | 2,944.3 ms | 7.25 ms | +| xUnit3 | 3.2.0 | 3,042.1 ms | 3,041.4 ms | 10.49 ms | +| **TUnit (AOT)** | 1.2.11 | 131.2 ms | 131.2 ms | 0.39 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3703 - bar [589, 1197, 2999.4, 3085.6, 130.1] + y-axis "Time (ms)" 0 --> 3651 + bar [597, 1167.8, 2944.5, 3042.1, 131.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.746Z* +*Last generated: 2025-11-26T00:28:24.625Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 1057d2108c..98161cba95 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 583.20 ms | 583.31 ms | 11.167 ms | -| NUnit | 4.4.0 | 1,560.64 ms | 1,558.69 ms | 5.548 ms | -| MSTest | 4.0.2 | 1,522.12 ms | 1,519.90 ms | 7.840 ms | -| xUnit3 | 3.2.0 | 1,605.16 ms | 1,605.32 ms | 1.938 ms | -| **TUnit (AOT)** | 1.2.11 | 80.63 ms | 80.69 ms | 0.344 ms | +| **TUnit** | 1.2.11 | 562.48 ms | 563.33 ms | 2.936 ms | +| NUnit | 4.4.0 | 1,566.45 ms | 1,565.56 ms | 8.007 ms | +| MSTest | 4.0.2 | 1,519.01 ms | 1,516.06 ms | 9.149 ms | +| xUnit3 | 3.2.0 | 1,601.38 ms | 1,600.62 ms | 7.409 ms | +| **TUnit (AOT)** | 1.2.11 | 79.09 ms | 79.07 ms | 0.297 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1927 - bar [583.2, 1560.64, 1522.12, 1605.16, 80.63] + y-axis "Time (ms)" 0 --> 1922 + bar [562.48, 1566.45, 1519.01, 1601.38, 79.09] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.746Z* +*Last generated: 2025-11-26T00:28:24.625Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 88b5689a5e..06b2711e91 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 522.19 ms | 519.59 ms | 5.051 ms | -| NUnit | 4.4.0 | 611.51 ms | 604.72 ms | 22.064 ms | -| MSTest | 4.0.2 | 616.29 ms | 607.40 ms | 26.577 ms | -| xUnit3 | 3.2.0 | 604.23 ms | 594.88 ms | 17.251 ms | -| **TUnit (AOT)** | 1.2.11 | 46.30 ms | 46.54 ms | 3.985 ms | +| **TUnit** | 1.2.11 | 493.34 ms | 494.16 ms | 3.565 ms | +| NUnit | 4.4.0 | 685.29 ms | 678.93 ms | 19.108 ms | +| MSTest | 4.0.2 | 679.12 ms | 679.56 ms | 12.372 ms | +| xUnit3 | 3.2.0 | 688.01 ms | 684.84 ms | 10.760 ms | +| **TUnit (AOT)** | 1.2.11 | 48.87 ms | 48.31 ms | 3.685 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 740 - bar [522.19, 611.51, 616.29, 604.23, 46.3] + y-axis "Time (ms)" 0 --> 826 + bar [493.34, 685.29, 679.12, 688.01, 48.87] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.746Z* +*Last generated: 2025-11-26T00:28:24.626Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 6d29630ebf..505a0d1170 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-25** from the latest CI run. +This benchmark was automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 598.2 ms | 599.2 ms | 6.67 ms | -| NUnit | 4.4.0 | 1,167.1 ms | 1,165.5 ms | 7.03 ms | -| MSTest | 4.0.2 | 1,141.3 ms | 1,141.4 ms | 7.52 ms | -| xUnit3 | 3.2.0 | 1,226.4 ms | 1,227.9 ms | 8.48 ms | +| **TUnit** | 1.2.11 | 569.8 ms | 570.3 ms | 4.52 ms | +| NUnit | 4.4.0 | 1,166.7 ms | 1,168.1 ms | 14.01 ms | +| MSTest | 4.0.2 | 1,158.1 ms | 1,156.0 ms | 12.38 ms | +| xUnit3 | 3.2.0 | 1,249.6 ms | 1,248.7 ms | 16.82 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-25** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1472 - bar [598.2, 1167.1, 1141.3, 1226.4, 0] + y-axis "Time (ms)" 0 --> 1500 + bar [569.8, 1166.7, 1158.1, 1249.6, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-25T00:27:11.747Z* +*Last generated: 2025-11-26T00:28:24.626Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 7820d132dc..e3b154e8a3 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-25** from the latest CI run. +These benchmarks were automatically generated on **2025-11-26** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-25T00:27:11.748Z* +*Last generated: 2025-11-26T00:28:24.626Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index fd9ac128ae..bc210fb997 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.745Z", + "timestamp": "2025-11-26T00:28:24.625Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "560.7 ms", - "Error": "3.82 ms", - "StdDev": "3.58 ms", - "Median": "560.6 ms" + "Mean": "573.9 ms", + "Error": "3.61 ms", + "StdDev": "3.37 ms", + "Median": "574.0 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "678.8 ms", - "Error": "8.60 ms", - "StdDev": "7.62 ms", - "Median": "677.3 ms" + "Mean": "676.5 ms", + "Error": "8.11 ms", + "StdDev": "7.59 ms", + "Median": "676.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "651.1 ms", - "Error": "6.23 ms", - "StdDev": "5.52 ms", - "Median": "650.0 ms" + "Mean": "646.7 ms", + "Error": "9.60 ms", + "StdDev": "8.98 ms", + "Median": "645.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "726.4 ms", - "Error": "7.08 ms", - "StdDev": "5.91 ms", - "Median": "726.1 ms" + "Mean": "728.7 ms", + "Error": "11.69 ms", + "StdDev": "10.94 ms", + "Median": "728.5 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "122.9 ms", - "Error": "0.52 ms", - "StdDev": "0.46 ms", - "Median": "122.9 ms" + "Mean": "124.5 ms", + "Error": "0.32 ms", + "StdDev": "0.30 ms", + "Median": "124.5 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 2119299399..0c71082a3e 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.747Z", + "timestamp": "2025-11-26T00:28:24.626Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.075 s", - "Error": "0.0246 s", - "StdDev": "0.0218 s", - "Median": "2.073 s" + "Mean": "2.007 s", + "Error": "0.0255 s", + "StdDev": "0.0239 s", + "Median": "2.006 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.703 s", - "Error": "0.0234 s", - "StdDev": "0.0219 s", - "Median": "1.705 s" + "Mean": "1.615 s", + "Error": "0.0154 s", + "StdDev": "0.0144 s", + "Median": "1.612 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.748 s", - "Error": "0.0224 s", - "StdDev": "0.0210 s", - "Median": "1.745 s" + "Mean": "1.692 s", + "Error": "0.0194 s", + "StdDev": "0.0181 s", + "Median": "1.696 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.651 s", - "Error": "0.0193 s", - "StdDev": "0.0181 s", - "Median": "1.654 s" + "Mean": "1.592 s", + "Error": "0.0189 s", + "StdDev": "0.0176 s", + "Median": "1.595 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 69b82c629f..e5e1d84a11 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.745Z", + "timestamp": "2025-11-26T00:28:24.625Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "501.02 ms", - "Error": "6.031 ms", - "StdDev": "5.641 ms", - "Median": "499.88 ms" + "Mean": "506.10 ms", + "Error": "5.659 ms", + "StdDev": "5.293 ms", + "Median": "505.58 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "531.32 ms", - "Error": "8.808 ms", - "StdDev": "8.239 ms", - "Median": "530.68 ms" + "Mean": "700.46 ms", + "Error": "13.592 ms", + "StdDev": "12.049 ms", + "Median": "703.26 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "492.03 ms", - "Error": "6.715 ms", - "StdDev": "5.242 ms", - "Median": "490.97 ms" + "Mean": "687.05 ms", + "Error": "9.051 ms", + "StdDev": "8.024 ms", + "Median": "686.19 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "573.68 ms", - "Error": "9.665 ms", - "StdDev": "9.040 ms", - "Median": "574.18 ms" + "Mean": "714.25 ms", + "Error": "14.028 ms", + "StdDev": "13.777 ms", + "Median": "717.42 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.58 ms", - "Error": "0.266 ms", - "StdDev": "0.249 ms", - "Median": "24.57 ms" + "Mean": "24.88 ms", + "Error": "0.429 ms", + "StdDev": "0.716 ms", + "Median": "25.01 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 0dffe8bfd2..d222f26eb9 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.746Z", + "timestamp": "2025-11-26T00:28:24.625Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "589.0 ms", - "Error": "9.34 ms", - "StdDev": "8.74 ms", - "Median": "585.7 ms" + "Mean": "597.0 ms", + "Error": "4.57 ms", + "StdDev": "4.28 ms", + "Median": "597.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,197.0 ms", - "Error": "6.24 ms", - "StdDev": "4.87 ms", - "Median": "1,196.7 ms" + "Mean": "1,167.8 ms", + "Error": "7.17 ms", + "StdDev": "5.99 ms", + "Median": "1,166.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,999.4 ms", - "Error": "5.31 ms", - "StdDev": "4.44 ms", - "Median": "2,999.0 ms" + "Mean": "2,944.5 ms", + "Error": "8.18 ms", + "StdDev": "7.25 ms", + "Median": "2,944.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,085.6 ms", - "Error": "9.54 ms", - "StdDev": "8.46 ms", - "Median": "3,085.6 ms" + "Mean": "3,042.1 ms", + "Error": "11.21 ms", + "StdDev": "10.49 ms", + "Median": "3,041.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "130.1 ms", - "Error": "0.52 ms", - "StdDev": "0.49 ms", - "Median": "130.1 ms" + "Mean": "131.2 ms", + "Error": "0.42 ms", + "StdDev": "0.39 ms", + "Median": "131.2 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 4a764c0c95..dc4c58232c 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.746Z", + "timestamp": "2025-11-26T00:28:24.625Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "583.20 ms", - "Error": "10.874 ms", - "StdDev": "11.167 ms", - "Median": "583.31 ms" + "Mean": "562.48 ms", + "Error": "3.312 ms", + "StdDev": "2.936 ms", + "Median": "563.33 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,560.64 ms", - "Error": "6.258 ms", - "StdDev": "5.548 ms", - "Median": "1,558.69 ms" + "Mean": "1,566.45 ms", + "Error": "9.032 ms", + "StdDev": "8.007 ms", + "Median": "1,565.56 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,522.12 ms", - "Error": "8.382 ms", - "StdDev": "7.840 ms", - "Median": "1,519.90 ms" + "Mean": "1,519.01 ms", + "Error": "10.320 ms", + "StdDev": "9.149 ms", + "Median": "1,516.06 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,605.16 ms", - "Error": "2.482 ms", - "StdDev": "1.938 ms", - "Median": "1,605.32 ms" + "Mean": "1,601.38 ms", + "Error": "7.921 ms", + "StdDev": "7.409 ms", + "Median": "1,600.62 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "80.63 ms", - "Error": "0.367 ms", - "StdDev": "0.344 ms", - "Median": "80.69 ms" + "Mean": "79.09 ms", + "Error": "0.335 ms", + "StdDev": "0.297 ms", + "Median": "79.07 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index fd5d4aca41..31f7f39b35 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.747Z", + "timestamp": "2025-11-26T00:28:24.626Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "522.19 ms", - "Error": "5.400 ms", - "StdDev": "5.051 ms", - "Median": "519.59 ms" + "Mean": "493.34 ms", + "Error": "4.270 ms", + "StdDev": "3.565 ms", + "Median": "494.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "611.51 ms", - "Error": "12.066 ms", - "StdDev": "22.064 ms", - "Median": "604.72 ms" + "Mean": "685.29 ms", + "Error": "13.631 ms", + "StdDev": "19.108 ms", + "Median": "678.93 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "616.29 ms", - "Error": "12.226 ms", - "StdDev": "26.577 ms", - "Median": "607.40 ms" + "Mean": "679.12 ms", + "Error": "12.597 ms", + "StdDev": "12.372 ms", + "Median": "679.56 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "604.23 ms", - "Error": "11.769 ms", - "StdDev": "17.251 ms", - "Median": "594.88 ms" + "Mean": "688.01 ms", + "Error": "11.503 ms", + "StdDev": "10.760 ms", + "Median": "684.84 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.30 ms", - "Error": "1.352 ms", - "StdDev": "3.985 ms", - "Median": "46.54 ms" + "Mean": "48.87 ms", + "Error": "1.250 ms", + "StdDev": "3.685 ms", + "Median": "48.31 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index f6ddff55d0..36b63e572e 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.747Z", + "timestamp": "2025-11-26T00:28:24.626Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "598.2 ms", - "Error": "7.13 ms", - "StdDev": "6.67 ms", - "Median": "599.2 ms" + "Mean": "569.8 ms", + "Error": "4.83 ms", + "StdDev": "4.52 ms", + "Median": "570.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,167.1 ms", - "Error": "7.51 ms", - "StdDev": "7.03 ms", - "Median": "1,165.5 ms" + "Mean": "1,166.7 ms", + "Error": "14.97 ms", + "StdDev": "14.01 ms", + "Median": "1,168.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,141.3 ms", - "Error": "8.48 ms", - "StdDev": "7.52 ms", - "Median": "1,141.4 ms" + "Mean": "1,158.1 ms", + "Error": "13.97 ms", + "StdDev": "12.38 ms", + "Median": "1,156.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,226.4 ms", - "Error": "9.57 ms", - "StdDev": "8.48 ms", - "Median": "1,227.9 ms" + "Mean": "1,249.6 ms", + "Error": "18.97 ms", + "StdDev": "16.82 ms", + "Median": "1,248.7 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 45a92272ea..f8617d7ca5 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -74,5 +74,9 @@ { "date": "2025-11-25", "environment": "Ubuntu" + }, + { + "date": "2025-11-26", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 0800aec703..2cfce60dbf 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-25T00:27:11.748Z", + "timestamp": "2025-11-26T00:28:24.627Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "560.7 ms", - "Error": "3.82 ms", - "StdDev": "3.58 ms", - "Median": "560.6 ms" + "Mean": "573.9 ms", + "Error": "3.61 ms", + "StdDev": "3.37 ms", + "Median": "574.0 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "678.8 ms", - "Error": "8.60 ms", - "StdDev": "7.62 ms", - "Median": "677.3 ms" + "Mean": "676.5 ms", + "Error": "8.11 ms", + "StdDev": "7.59 ms", + "Median": "676.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "651.1 ms", - "Error": "6.23 ms", - "StdDev": "5.52 ms", - "Median": "650.0 ms" + "Mean": "646.7 ms", + "Error": "9.60 ms", + "StdDev": "8.98 ms", + "Median": "645.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "726.4 ms", - "Error": "7.08 ms", - "StdDev": "5.91 ms", - "Median": "726.1 ms" + "Mean": "728.7 ms", + "Error": "11.69 ms", + "StdDev": "10.94 ms", + "Median": "728.5 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "122.9 ms", - "Error": "0.52 ms", - "StdDev": "0.46 ms", - "Median": "122.9 ms" + "Mean": "124.5 ms", + "Error": "0.32 ms", + "StdDev": "0.30 ms", + "Median": "124.5 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "501.02 ms", - "Error": "6.031 ms", - "StdDev": "5.641 ms", - "Median": "499.88 ms" + "Mean": "506.10 ms", + "Error": "5.659 ms", + "StdDev": "5.293 ms", + "Median": "505.58 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "531.32 ms", - "Error": "8.808 ms", - "StdDev": "8.239 ms", - "Median": "530.68 ms" + "Mean": "700.46 ms", + "Error": "13.592 ms", + "StdDev": "12.049 ms", + "Median": "703.26 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "492.03 ms", - "Error": "6.715 ms", - "StdDev": "5.242 ms", - "Median": "490.97 ms" + "Mean": "687.05 ms", + "Error": "9.051 ms", + "StdDev": "8.024 ms", + "Median": "686.19 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "573.68 ms", - "Error": "9.665 ms", - "StdDev": "9.040 ms", - "Median": "574.18 ms" + "Mean": "714.25 ms", + "Error": "14.028 ms", + "StdDev": "13.777 ms", + "Median": "717.42 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.58 ms", - "Error": "0.266 ms", - "StdDev": "0.249 ms", - "Median": "24.57 ms" + "Mean": "24.88 ms", + "Error": "0.429 ms", + "StdDev": "0.716 ms", + "Median": "25.01 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "589.0 ms", - "Error": "9.34 ms", - "StdDev": "8.74 ms", - "Median": "585.7 ms" + "Mean": "597.0 ms", + "Error": "4.57 ms", + "StdDev": "4.28 ms", + "Median": "597.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,197.0 ms", - "Error": "6.24 ms", - "StdDev": "4.87 ms", - "Median": "1,196.7 ms" + "Mean": "1,167.8 ms", + "Error": "7.17 ms", + "StdDev": "5.99 ms", + "Median": "1,166.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,999.4 ms", - "Error": "5.31 ms", - "StdDev": "4.44 ms", - "Median": "2,999.0 ms" + "Mean": "2,944.5 ms", + "Error": "8.18 ms", + "StdDev": "7.25 ms", + "Median": "2,944.3 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,085.6 ms", - "Error": "9.54 ms", - "StdDev": "8.46 ms", - "Median": "3,085.6 ms" + "Mean": "3,042.1 ms", + "Error": "11.21 ms", + "StdDev": "10.49 ms", + "Median": "3,041.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "130.1 ms", - "Error": "0.52 ms", - "StdDev": "0.49 ms", - "Median": "130.1 ms" + "Mean": "131.2 ms", + "Error": "0.42 ms", + "StdDev": "0.39 ms", + "Median": "131.2 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "583.20 ms", - "Error": "10.874 ms", - "StdDev": "11.167 ms", - "Median": "583.31 ms" + "Mean": "562.48 ms", + "Error": "3.312 ms", + "StdDev": "2.936 ms", + "Median": "563.33 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,560.64 ms", - "Error": "6.258 ms", - "StdDev": "5.548 ms", - "Median": "1,558.69 ms" + "Mean": "1,566.45 ms", + "Error": "9.032 ms", + "StdDev": "8.007 ms", + "Median": "1,565.56 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,522.12 ms", - "Error": "8.382 ms", - "StdDev": "7.840 ms", - "Median": "1,519.90 ms" + "Mean": "1,519.01 ms", + "Error": "10.320 ms", + "StdDev": "9.149 ms", + "Median": "1,516.06 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,605.16 ms", - "Error": "2.482 ms", - "StdDev": "1.938 ms", - "Median": "1,605.32 ms" + "Mean": "1,601.38 ms", + "Error": "7.921 ms", + "StdDev": "7.409 ms", + "Median": "1,600.62 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "80.63 ms", - "Error": "0.367 ms", - "StdDev": "0.344 ms", - "Median": "80.69 ms" + "Mean": "79.09 ms", + "Error": "0.335 ms", + "StdDev": "0.297 ms", + "Median": "79.07 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "522.19 ms", - "Error": "5.400 ms", - "StdDev": "5.051 ms", - "Median": "519.59 ms" + "Mean": "493.34 ms", + "Error": "4.270 ms", + "StdDev": "3.565 ms", + "Median": "494.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "611.51 ms", - "Error": "12.066 ms", - "StdDev": "22.064 ms", - "Median": "604.72 ms" + "Mean": "685.29 ms", + "Error": "13.631 ms", + "StdDev": "19.108 ms", + "Median": "678.93 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "616.29 ms", - "Error": "12.226 ms", - "StdDev": "26.577 ms", - "Median": "607.40 ms" + "Mean": "679.12 ms", + "Error": "12.597 ms", + "StdDev": "12.372 ms", + "Median": "679.56 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "604.23 ms", - "Error": "11.769 ms", - "StdDev": "17.251 ms", - "Median": "594.88 ms" + "Mean": "688.01 ms", + "Error": "11.503 ms", + "StdDev": "10.760 ms", + "Median": "684.84 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.30 ms", - "Error": "1.352 ms", - "StdDev": "3.985 ms", - "Median": "46.54 ms" + "Mean": "48.87 ms", + "Error": "1.250 ms", + "StdDev": "3.685 ms", + "Median": "48.31 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "598.2 ms", - "Error": "7.13 ms", - "StdDev": "6.67 ms", - "Median": "599.2 ms" + "Mean": "569.8 ms", + "Error": "4.83 ms", + "StdDev": "4.52 ms", + "Median": "570.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,167.1 ms", - "Error": "7.51 ms", - "StdDev": "7.03 ms", - "Median": "1,165.5 ms" + "Mean": "1,166.7 ms", + "Error": "14.97 ms", + "StdDev": "14.01 ms", + "Median": "1,168.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,141.3 ms", - "Error": "8.48 ms", - "StdDev": "7.52 ms", - "Median": "1,141.4 ms" + "Mean": "1,158.1 ms", + "Error": "13.97 ms", + "StdDev": "12.38 ms", + "Median": "1,156.0 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,226.4 ms", - "Error": "9.57 ms", - "StdDev": "8.48 ms", - "Median": "1,227.9 ms" + "Mean": "1,249.6 ms", + "Error": "18.97 ms", + "StdDev": "16.82 ms", + "Median": "1,248.7 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.075 s", - "Error": "0.0246 s", - "StdDev": "0.0218 s", - "Median": "2.073 s" + "Mean": "2.007 s", + "Error": "0.0255 s", + "StdDev": "0.0239 s", + "Median": "2.006 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.703 s", - "Error": "0.0234 s", - "StdDev": "0.0219 s", - "Median": "1.705 s" + "Mean": "1.615 s", + "Error": "0.0154 s", + "StdDev": "0.0144 s", + "Median": "1.612 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.748 s", - "Error": "0.0224 s", - "StdDev": "0.0210 s", - "Median": "1.745 s" + "Mean": "1.692 s", + "Error": "0.0194 s", + "StdDev": "0.0181 s", + "Median": "1.696 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.651 s", - "Error": "0.0193 s", - "StdDev": "0.0181 s", - "Median": "1.654 s" + "Mean": "1.592 s", + "Error": "0.0189 s", + "StdDev": "0.0176 s", + "Median": "1.595 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-25T00:27:11.744Z" + "lastUpdated": "2025-11-26T00:28:24.624Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 71f8d47e01..a885d6ad3b 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-25", + "timestamp": "2025-11-26", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 9ca92d8bf3bf1b5c3fb48817503b8eefd39db996 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 26 Nov 2025 07:09:32 +0000 Subject: [PATCH 093/192] chore(deps): update dependency publicapigenerator to 11.5.3 (#3916) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 2d2888e97a..1052b3a500 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -60,7 +60,7 @@ - + From a58dcfffc63f19c2091d4de2c547d2b8fed428c4 Mon Sep 17 00:00:00 2001 From: Krzysztof Begiedza <8686134+kbegiedza@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:51:29 +0100 Subject: [PATCH 094/192] Update command for generating TRX report (#3917) * Update command for generating TRX report Previous command results in: ``` Option '--report-trx-filename' has invalid arguments: file name argument must not contain path (e.g. --report-trx-filename myreport.trx) ``` * Fix command --- docs/docs/extensions/extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/extensions/extensions.md b/docs/docs/extensions/extensions.md index fd78fc7d22..f8869d3589 100644 --- a/docs/docs/extensions/extensions.md +++ b/docs/docs/extensions/extensions.md @@ -108,7 +108,7 @@ Run your tests with the `--report-trx` flag: dotnet run --configuration Release --report-trx # Specify output location -dotnet run --configuration Release --report-trx --report-trx-filename ./reports/testresults.trx +dotnet run --configuration Release --results-directory ./reports --report-trx --report-trx-filename testresults.trx ``` **šŸ“š More Resources:** From a9ca8cbc7e50eefc0c1dee6c2a0e953af7a9b88a Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:38:21 +0000 Subject: [PATCH 095/192] docs: Remove non-existent MaxParallelTests attribute from documentation (#3920) * Initial plan * docs: Replace non-existent MaxParallelTests with correct APIs Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- .../advanced/performance-best-practices.md | 23 +++++++++++++++---- docs/docs/guides/best-practices.md | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/docs/advanced/performance-best-practices.md b/docs/docs/advanced/performance-best-practices.md index 65587e29db..6818badae3 100644 --- a/docs/docs/advanced/performance-best-practices.md +++ b/docs/docs/advanced/performance-best-practices.md @@ -99,11 +99,26 @@ public class LazyDataProvider #### Configure Appropriate Parallelism ```csharp -// Set maximum parallel test execution -[assembly: MaxParallelTests(Environment.ProcessorCount)] +using TUnit.Core; +using TUnit.Core.Interfaces; -// Or use command line -// dotnet test --maximum-parallel-tests 8 +// Set maximum parallel test execution using an assembly-level parallel limiter +[assembly: ParallelLimiter] + +public class ProcessorCountLimit : IParallelLimit +{ + public int Limit => Environment.ProcessorCount; +} +``` + +Alternatively, use the command line flag: +```bash +dotnet test -- --maximum-parallel-tests 8 +``` + +Or set an environment variable: +```bash +export TUNIT_MAX_PARALLEL_TESTS=8 ``` #### Group Related Tests diff --git a/docs/docs/guides/best-practices.md b/docs/docs/guides/best-practices.md index 6bc1304297..b67eec7ed8 100644 --- a/docs/docs/guides/best-practices.md +++ b/docs/docs/guides/best-practices.md @@ -665,7 +665,7 @@ TUnit is designed for performance at scale. Follow these guidelines to keep your - Let tests run in parallel (it's fast!) - Only use `[NotInParallel]` when absolutely necessary -- Configure parallelism based on your CPU: `[assembly: MaxParallelTests(Environment.ProcessorCount)]` +- Configure parallelism using the `--maximum-parallel-tests` CLI flag or `[assembly: ParallelLimiter]` attribute - Avoid expensive setup in `[Before(Test)]` hooks - use class or assembly-level hooks for shared resources ### Avoid Slow Operations in Tests From 0c8ddf410ded2aa6d76e2ec8273be2f63101550d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 26 Nov 2025 20:03:26 +0000 Subject: [PATCH 096/192] chore(deps): update aspire to 13.0.1 (#3921) Co-authored-by: Renovate Bot --- .../ExampleNamespace.AppHost.csproj | 6 +++--- .../ExampleNamespace.TestProject.csproj | 2 +- .../ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj index 44bd877374..933b33dc7e 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj @@ -1,6 +1,6 @@  - + Exe @@ -12,8 +12,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index b48dbdcee6..6e6da7a8ab 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj index 3d403305bb..4c50183a69 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj @@ -7,7 +7,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 210765cf61..61108ed7e0 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -9,7 +9,7 @@ - + From 27f0f3656960af6f03f5fde42845eca552e53c89 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 27 Nov 2025 00:28:55 +0000 Subject: [PATCH 097/192] chore: update benchmark results (#3922) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index c995b041c7..98eed244c2 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 573.9 ms | 574.0 ms | 3.37 ms | -| NUnit | 4.4.0 | 676.5 ms | 676.8 ms | 7.59 ms | -| MSTest | 4.0.2 | 646.7 ms | 645.2 ms | 8.98 ms | -| xUnit3 | 3.2.0 | 728.7 ms | 728.5 ms | 10.94 ms | -| **TUnit (AOT)** | 1.2.11 | 124.5 ms | 124.5 ms | 0.30 ms | +| **TUnit** | 1.2.11 | 567.1 ms | 566.4 ms | 2.57 ms | +| NUnit | 4.4.0 | 688.2 ms | 683.1 ms | 13.62 ms | +| MSTest | 4.0.2 | 658.5 ms | 659.6 ms | 10.71 ms | +| xUnit3 | 3.2.0 | 736.1 ms | 733.4 ms | 13.54 ms | +| **TUnit (AOT)** | 1.2.11 | 124.7 ms | 124.8 ms | 0.42 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 875 - bar [573.9, 676.5, 646.7, 728.7, 124.5] + y-axis "Time (ms)" 0 --> 884 + bar [567.1, 688.2, 658.5, 736.1, 124.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.624Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 88acdbd9cf..0e293d83f3 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.007 s | 2.006 s | 0.0239 s | -| Build_NUnit | 4.4.0 | 1.615 s | 1.612 s | 0.0144 s | -| Build_MSTest | 4.0.2 | 1.692 s | 1.696 s | 0.0181 s | -| Build_xUnit3 | 3.2.0 | 1.592 s | 1.595 s | 0.0176 s | +| **TUnit** | 1.2.11 | 2.043 s | 2.035 s | 0.0196 s | +| Build_NUnit | 4.4.0 | 1.639 s | 1.639 s | 0.0088 s | +| Build_MSTest | 4.0.2 | 1.715 s | 1.712 s | 0.0172 s | +| Build_xUnit3 | 3.2.0 | 1.616 s | 1.621 s | 0.0283 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.007, 1.615, 1.692, 1.592] + bar [2.043, 1.639, 1.715, 1.616] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.626Z* +*Last generated: 2025-11-27T00:28:35.447Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index a40d06395a..3c58c40c9d 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 506.10 ms | 505.58 ms | 5.293 ms | -| NUnit | 4.4.0 | 700.46 ms | 703.26 ms | 12.049 ms | -| MSTest | 4.0.2 | 687.05 ms | 686.19 ms | 8.024 ms | -| xUnit3 | 3.2.0 | 714.25 ms | 717.42 ms | 13.777 ms | -| **TUnit (AOT)** | 1.2.11 | 24.88 ms | 25.01 ms | 0.716 ms | +| **TUnit** | 1.2.11 | 497.25 ms | 497.97 ms | 3.518 ms | +| NUnit | 4.4.0 | 526.05 ms | 524.98 ms | 6.301 ms | +| MSTest | 4.0.2 | 482.94 ms | 483.13 ms | 10.339 ms | +| xUnit3 | 3.2.0 | 573.56 ms | 576.44 ms | 10.043 ms | +| **TUnit (AOT)** | 1.2.11 | 24.70 ms | 24.72 ms | 0.182 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 858 - bar [506.1, 700.46, 687.05, 714.25, 24.88] + y-axis "Time (ms)" 0 --> 689 + bar [497.25, 526.05, 482.94, 573.56, 24.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.625Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index ed2509047b..9136b82712 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 597.0 ms | 597.7 ms | 4.28 ms | -| NUnit | 4.4.0 | 1,167.8 ms | 1,166.4 ms | 5.99 ms | -| MSTest | 4.0.2 | 2,944.5 ms | 2,944.3 ms | 7.25 ms | -| xUnit3 | 3.2.0 | 3,042.1 ms | 3,041.4 ms | 10.49 ms | -| **TUnit (AOT)** | 1.2.11 | 131.2 ms | 131.2 ms | 0.39 ms | +| **TUnit** | 1.2.11 | 623.3 ms | 624.8 ms | 4.14 ms | +| NUnit | 4.4.0 | 1,212.4 ms | 1,210.2 ms | 9.48 ms | +| MSTest | 4.0.2 | 3,001.4 ms | 2,999.8 ms | 10.05 ms | +| xUnit3 | 3.2.0 | 3,086.1 ms | 3,086.8 ms | 7.57 ms | +| **TUnit (AOT)** | 1.2.11 | 132.7 ms | 132.6 ms | 0.54 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3651 - bar [597, 1167.8, 2944.5, 3042.1, 131.2] + y-axis "Time (ms)" 0 --> 3704 + bar [623.3, 1212.4, 3001.4, 3086.1, 132.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.625Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 98161cba95..7b17a6c761 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 562.48 ms | 563.33 ms | 2.936 ms | -| NUnit | 4.4.0 | 1,566.45 ms | 1,565.56 ms | 8.007 ms | -| MSTest | 4.0.2 | 1,519.01 ms | 1,516.06 ms | 9.149 ms | -| xUnit3 | 3.2.0 | 1,601.38 ms | 1,600.62 ms | 7.409 ms | -| **TUnit (AOT)** | 1.2.11 | 79.09 ms | 79.07 ms | 0.297 ms | +| **TUnit** | 1.2.11 | 566.13 ms | 565.43 ms | 6.050 ms | +| NUnit | 4.4.0 | 1,578.62 ms | 1,578.58 ms | 6.773 ms | +| MSTest | 4.0.2 | 1,539.67 ms | 1,540.17 ms | 3.979 ms | +| xUnit3 | 3.2.0 | 1,625.28 ms | 1,624.99 ms | 11.364 ms | +| **TUnit (AOT)** | 1.2.11 | 79.52 ms | 79.55 ms | 0.341 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1922 - bar [562.48, 1566.45, 1519.01, 1601.38, 79.09] + y-axis "Time (ms)" 0 --> 1951 + bar [566.13, 1578.62, 1539.67, 1625.28, 79.52] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.625Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 06b2711e91..c459176451 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 493.34 ms | 494.16 ms | 3.565 ms | -| NUnit | 4.4.0 | 685.29 ms | 678.93 ms | 19.108 ms | -| MSTest | 4.0.2 | 679.12 ms | 679.56 ms | 12.372 ms | -| xUnit3 | 3.2.0 | 688.01 ms | 684.84 ms | 10.760 ms | -| **TUnit (AOT)** | 1.2.11 | 48.87 ms | 48.31 ms | 3.685 ms | +| **TUnit** | 1.2.11 | 522.37 ms | 521.16 ms | 5.026 ms | +| NUnit | 4.4.0 | 611.57 ms | 612.00 ms | 8.234 ms | +| MSTest | 4.0.2 | 615.51 ms | 617.04 ms | 9.675 ms | +| xUnit3 | 3.2.0 | 614.63 ms | 610.65 ms | 7.412 ms | +| **TUnit (AOT)** | 1.2.11 | 43.96 ms | 44.10 ms | 3.394 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 826 - bar [493.34, 685.29, 679.12, 688.01, 48.87] + y-axis "Time (ms)" 0 --> 739 + bar [522.37, 611.57, 615.51, 614.63, 43.96] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.626Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 505a0d1170..348cafc187 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-26** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 569.8 ms | 570.3 ms | 4.52 ms | -| NUnit | 4.4.0 | 1,166.7 ms | 1,168.1 ms | 14.01 ms | -| MSTest | 4.0.2 | 1,158.1 ms | 1,156.0 ms | 12.38 ms | -| xUnit3 | 3.2.0 | 1,249.6 ms | 1,248.7 ms | 16.82 ms | +| **TUnit** | 1.2.11 | 575.6 ms | 575.7 ms | 4.64 ms | +| NUnit | 4.4.0 | 1,194.3 ms | 1,195.1 ms | 6.50 ms | +| MSTest | 4.0.2 | 1,165.8 ms | 1,164.6 ms | 9.87 ms | +| xUnit3 | 3.2.0 | 1,258.5 ms | 1,258.8 ms | 7.83 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-26** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1500 - bar [569.8, 1166.7, 1158.1, 1249.6, 0] + y-axis "Time (ms)" 0 --> 1511 + bar [575.6, 1194.3, 1165.8, 1258.5, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-26T00:28:24.626Z* +*Last generated: 2025-11-27T00:28:35.447Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index e3b154e8a3..871d642265 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-26** from the latest CI run. +These benchmarks were automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-26T00:28:24.626Z* +*Last generated: 2025-11-27T00:28:35.447Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index bc210fb997..d31c3d85de 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.625Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "573.9 ms", - "Error": "3.61 ms", - "StdDev": "3.37 ms", - "Median": "574.0 ms" + "Mean": "567.1 ms", + "Error": "3.08 ms", + "StdDev": "2.57 ms", + "Median": "566.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "676.5 ms", - "Error": "8.11 ms", - "StdDev": "7.59 ms", - "Median": "676.8 ms" + "Mean": "688.2 ms", + "Error": "13.26 ms", + "StdDev": "13.62 ms", + "Median": "683.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "646.7 ms", - "Error": "9.60 ms", - "StdDev": "8.98 ms", - "Median": "645.2 ms" + "Mean": "658.5 ms", + "Error": "12.82 ms", + "StdDev": "10.71 ms", + "Median": "659.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "728.7 ms", - "Error": "11.69 ms", - "StdDev": "10.94 ms", - "Median": "728.5 ms" + "Mean": "736.1 ms", + "Error": "14.47 ms", + "StdDev": "13.54 ms", + "Median": "733.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.5 ms", - "Error": "0.32 ms", - "StdDev": "0.30 ms", - "Median": "124.5 ms" + "Mean": "124.7 ms", + "Error": "0.45 ms", + "StdDev": "0.42 ms", + "Median": "124.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 0c71082a3e..c71476e2e7 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.626Z", + "timestamp": "2025-11-27T00:28:35.447Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.007 s", - "Error": "0.0255 s", - "StdDev": "0.0239 s", - "Median": "2.006 s" + "Mean": "2.043 s", + "Error": "0.0210 s", + "StdDev": "0.0196 s", + "Median": "2.035 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.615 s", - "Error": "0.0154 s", - "StdDev": "0.0144 s", - "Median": "1.612 s" + "Mean": "1.639 s", + "Error": "0.0094 s", + "StdDev": "0.0088 s", + "Median": "1.639 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.692 s", - "Error": "0.0194 s", - "StdDev": "0.0181 s", - "Median": "1.696 s" + "Mean": "1.715 s", + "Error": "0.0184 s", + "StdDev": "0.0172 s", + "Median": "1.712 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.592 s", - "Error": "0.0189 s", - "StdDev": "0.0176 s", - "Median": "1.595 s" + "Mean": "1.616 s", + "Error": "0.0302 s", + "StdDev": "0.0283 s", + "Median": "1.621 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index e5e1d84a11..cf5ab9e10b 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.625Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "506.10 ms", - "Error": "5.659 ms", - "StdDev": "5.293 ms", - "Median": "505.58 ms" + "Mean": "497.25 ms", + "Error": "4.213 ms", + "StdDev": "3.518 ms", + "Median": "497.97 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "700.46 ms", - "Error": "13.592 ms", - "StdDev": "12.049 ms", - "Median": "703.26 ms" + "Mean": "526.05 ms", + "Error": "7.107 ms", + "StdDev": "6.301 ms", + "Median": "524.98 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "687.05 ms", - "Error": "9.051 ms", - "StdDev": "8.024 ms", - "Median": "686.19 ms" + "Mean": "482.94 ms", + "Error": "9.302 ms", + "StdDev": "10.339 ms", + "Median": "483.13 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "714.25 ms", - "Error": "14.028 ms", - "StdDev": "13.777 ms", - "Median": "717.42 ms" + "Mean": "573.56 ms", + "Error": "10.737 ms", + "StdDev": "10.043 ms", + "Median": "576.44 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.88 ms", - "Error": "0.429 ms", - "StdDev": "0.716 ms", - "Median": "25.01 ms" + "Mean": "24.70 ms", + "Error": "0.194 ms", + "StdDev": "0.182 ms", + "Median": "24.72 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index d222f26eb9..3bbbbc8549 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.625Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "597.0 ms", - "Error": "4.57 ms", - "StdDev": "4.28 ms", - "Median": "597.7 ms" + "Mean": "623.3 ms", + "Error": "4.42 ms", + "StdDev": "4.14 ms", + "Median": "624.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,167.8 ms", - "Error": "7.17 ms", - "StdDev": "5.99 ms", - "Median": "1,166.4 ms" + "Mean": "1,212.4 ms", + "Error": "10.13 ms", + "StdDev": "9.48 ms", + "Median": "1,210.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,944.5 ms", - "Error": "8.18 ms", - "StdDev": "7.25 ms", - "Median": "2,944.3 ms" + "Mean": "3,001.4 ms", + "Error": "12.87 ms", + "StdDev": "10.05 ms", + "Median": "2,999.8 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,042.1 ms", - "Error": "11.21 ms", - "StdDev": "10.49 ms", - "Median": "3,041.4 ms" + "Mean": "3,086.1 ms", + "Error": "9.06 ms", + "StdDev": "7.57 ms", + "Median": "3,086.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.2 ms", - "Error": "0.42 ms", - "StdDev": "0.39 ms", - "Median": "131.2 ms" + "Mean": "132.7 ms", + "Error": "0.58 ms", + "StdDev": "0.54 ms", + "Median": "132.6 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index dc4c58232c..8d10cf0aa4 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.625Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "562.48 ms", - "Error": "3.312 ms", - "StdDev": "2.936 ms", - "Median": "563.33 ms" + "Mean": "566.13 ms", + "Error": "6.468 ms", + "StdDev": "6.050 ms", + "Median": "565.43 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,566.45 ms", - "Error": "9.032 ms", - "StdDev": "8.007 ms", - "Median": "1,565.56 ms" + "Mean": "1,578.62 ms", + "Error": "7.240 ms", + "StdDev": "6.773 ms", + "Median": "1,578.58 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,519.01 ms", - "Error": "10.320 ms", - "StdDev": "9.149 ms", - "Median": "1,516.06 ms" + "Mean": "1,539.67 ms", + "Error": "4.489 ms", + "StdDev": "3.979 ms", + "Median": "1,540.17 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,601.38 ms", - "Error": "7.921 ms", - "StdDev": "7.409 ms", - "Median": "1,600.62 ms" + "Mean": "1,625.28 ms", + "Error": "13.608 ms", + "StdDev": "11.364 ms", + "Median": "1,624.99 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.09 ms", - "Error": "0.335 ms", - "StdDev": "0.297 ms", - "Median": "79.07 ms" + "Mean": "79.52 ms", + "Error": "0.365 ms", + "StdDev": "0.341 ms", + "Median": "79.55 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 31f7f39b35..7cd77e77f9 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.626Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "493.34 ms", - "Error": "4.270 ms", - "StdDev": "3.565 ms", - "Median": "494.16 ms" + "Mean": "522.37 ms", + "Error": "5.373 ms", + "StdDev": "5.026 ms", + "Median": "521.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "685.29 ms", - "Error": "13.631 ms", - "StdDev": "19.108 ms", - "Median": "678.93 ms" + "Mean": "611.57 ms", + "Error": "9.860 ms", + "StdDev": "8.234 ms", + "Median": "612.00 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "679.12 ms", - "Error": "12.597 ms", - "StdDev": "12.372 ms", - "Median": "679.56 ms" + "Mean": "615.51 ms", + "Error": "10.914 ms", + "StdDev": "9.675 ms", + "Median": "617.04 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "688.01 ms", - "Error": "11.503 ms", - "StdDev": "10.760 ms", - "Median": "684.84 ms" + "Mean": "614.63 ms", + "Error": "8.361 ms", + "StdDev": "7.412 ms", + "Median": "610.65 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "48.87 ms", - "Error": "1.250 ms", - "StdDev": "3.685 ms", - "Median": "48.31 ms" + "Mean": "43.96 ms", + "Error": "1.151 ms", + "StdDev": "3.394 ms", + "Median": "44.10 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 36b63e572e..d3f8eaa939 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.626Z", + "timestamp": "2025-11-27T00:28:35.447Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "569.8 ms", - "Error": "4.83 ms", - "StdDev": "4.52 ms", - "Median": "570.3 ms" + "Mean": "575.6 ms", + "Error": "4.96 ms", + "StdDev": "4.64 ms", + "Median": "575.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,166.7 ms", - "Error": "14.97 ms", - "StdDev": "14.01 ms", - "Median": "1,168.1 ms" + "Mean": "1,194.3 ms", + "Error": "7.33 ms", + "StdDev": "6.50 ms", + "Median": "1,195.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,158.1 ms", - "Error": "13.97 ms", - "StdDev": "12.38 ms", - "Median": "1,156.0 ms" + "Mean": "1,165.8 ms", + "Error": "10.55 ms", + "StdDev": "9.87 ms", + "Median": "1,164.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,249.6 ms", - "Error": "18.97 ms", - "StdDev": "16.82 ms", - "Median": "1,248.7 ms" + "Mean": "1,258.5 ms", + "Error": "8.37 ms", + "StdDev": "7.83 ms", + "Median": "1,258.8 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index f8617d7ca5..943a897347 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -78,5 +78,9 @@ { "date": "2025-11-26", "environment": "Ubuntu" + }, + { + "date": "2025-11-27", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 2cfce60dbf..45e79f39d6 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-26T00:28:24.627Z", + "timestamp": "2025-11-27T00:28:35.447Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "573.9 ms", - "Error": "3.61 ms", - "StdDev": "3.37 ms", - "Median": "574.0 ms" + "Mean": "567.1 ms", + "Error": "3.08 ms", + "StdDev": "2.57 ms", + "Median": "566.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "676.5 ms", - "Error": "8.11 ms", - "StdDev": "7.59 ms", - "Median": "676.8 ms" + "Mean": "688.2 ms", + "Error": "13.26 ms", + "StdDev": "13.62 ms", + "Median": "683.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "646.7 ms", - "Error": "9.60 ms", - "StdDev": "8.98 ms", - "Median": "645.2 ms" + "Mean": "658.5 ms", + "Error": "12.82 ms", + "StdDev": "10.71 ms", + "Median": "659.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "728.7 ms", - "Error": "11.69 ms", - "StdDev": "10.94 ms", - "Median": "728.5 ms" + "Mean": "736.1 ms", + "Error": "14.47 ms", + "StdDev": "13.54 ms", + "Median": "733.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.5 ms", - "Error": "0.32 ms", - "StdDev": "0.30 ms", - "Median": "124.5 ms" + "Mean": "124.7 ms", + "Error": "0.45 ms", + "StdDev": "0.42 ms", + "Median": "124.8 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "506.10 ms", - "Error": "5.659 ms", - "StdDev": "5.293 ms", - "Median": "505.58 ms" + "Mean": "497.25 ms", + "Error": "4.213 ms", + "StdDev": "3.518 ms", + "Median": "497.97 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "700.46 ms", - "Error": "13.592 ms", - "StdDev": "12.049 ms", - "Median": "703.26 ms" + "Mean": "526.05 ms", + "Error": "7.107 ms", + "StdDev": "6.301 ms", + "Median": "524.98 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "687.05 ms", - "Error": "9.051 ms", - "StdDev": "8.024 ms", - "Median": "686.19 ms" + "Mean": "482.94 ms", + "Error": "9.302 ms", + "StdDev": "10.339 ms", + "Median": "483.13 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "714.25 ms", - "Error": "14.028 ms", - "StdDev": "13.777 ms", - "Median": "717.42 ms" + "Mean": "573.56 ms", + "Error": "10.737 ms", + "StdDev": "10.043 ms", + "Median": "576.44 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.88 ms", - "Error": "0.429 ms", - "StdDev": "0.716 ms", - "Median": "25.01 ms" + "Mean": "24.70 ms", + "Error": "0.194 ms", + "StdDev": "0.182 ms", + "Median": "24.72 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "597.0 ms", - "Error": "4.57 ms", - "StdDev": "4.28 ms", - "Median": "597.7 ms" + "Mean": "623.3 ms", + "Error": "4.42 ms", + "StdDev": "4.14 ms", + "Median": "624.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,167.8 ms", - "Error": "7.17 ms", - "StdDev": "5.99 ms", - "Median": "1,166.4 ms" + "Mean": "1,212.4 ms", + "Error": "10.13 ms", + "StdDev": "9.48 ms", + "Median": "1,210.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,944.5 ms", - "Error": "8.18 ms", - "StdDev": "7.25 ms", - "Median": "2,944.3 ms" + "Mean": "3,001.4 ms", + "Error": "12.87 ms", + "StdDev": "10.05 ms", + "Median": "2,999.8 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,042.1 ms", - "Error": "11.21 ms", - "StdDev": "10.49 ms", - "Median": "3,041.4 ms" + "Mean": "3,086.1 ms", + "Error": "9.06 ms", + "StdDev": "7.57 ms", + "Median": "3,086.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.2 ms", - "Error": "0.42 ms", - "StdDev": "0.39 ms", - "Median": "131.2 ms" + "Mean": "132.7 ms", + "Error": "0.58 ms", + "StdDev": "0.54 ms", + "Median": "132.6 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "562.48 ms", - "Error": "3.312 ms", - "StdDev": "2.936 ms", - "Median": "563.33 ms" + "Mean": "566.13 ms", + "Error": "6.468 ms", + "StdDev": "6.050 ms", + "Median": "565.43 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,566.45 ms", - "Error": "9.032 ms", - "StdDev": "8.007 ms", - "Median": "1,565.56 ms" + "Mean": "1,578.62 ms", + "Error": "7.240 ms", + "StdDev": "6.773 ms", + "Median": "1,578.58 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,519.01 ms", - "Error": "10.320 ms", - "StdDev": "9.149 ms", - "Median": "1,516.06 ms" + "Mean": "1,539.67 ms", + "Error": "4.489 ms", + "StdDev": "3.979 ms", + "Median": "1,540.17 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,601.38 ms", - "Error": "7.921 ms", - "StdDev": "7.409 ms", - "Median": "1,600.62 ms" + "Mean": "1,625.28 ms", + "Error": "13.608 ms", + "StdDev": "11.364 ms", + "Median": "1,624.99 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.09 ms", - "Error": "0.335 ms", - "StdDev": "0.297 ms", - "Median": "79.07 ms" + "Mean": "79.52 ms", + "Error": "0.365 ms", + "StdDev": "0.341 ms", + "Median": "79.55 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "493.34 ms", - "Error": "4.270 ms", - "StdDev": "3.565 ms", - "Median": "494.16 ms" + "Mean": "522.37 ms", + "Error": "5.373 ms", + "StdDev": "5.026 ms", + "Median": "521.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "685.29 ms", - "Error": "13.631 ms", - "StdDev": "19.108 ms", - "Median": "678.93 ms" + "Mean": "611.57 ms", + "Error": "9.860 ms", + "StdDev": "8.234 ms", + "Median": "612.00 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "679.12 ms", - "Error": "12.597 ms", - "StdDev": "12.372 ms", - "Median": "679.56 ms" + "Mean": "615.51 ms", + "Error": "10.914 ms", + "StdDev": "9.675 ms", + "Median": "617.04 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "688.01 ms", - "Error": "11.503 ms", - "StdDev": "10.760 ms", - "Median": "684.84 ms" + "Mean": "614.63 ms", + "Error": "8.361 ms", + "StdDev": "7.412 ms", + "Median": "610.65 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "48.87 ms", - "Error": "1.250 ms", - "StdDev": "3.685 ms", - "Median": "48.31 ms" + "Mean": "43.96 ms", + "Error": "1.151 ms", + "StdDev": "3.394 ms", + "Median": "44.10 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "569.8 ms", - "Error": "4.83 ms", - "StdDev": "4.52 ms", - "Median": "570.3 ms" + "Mean": "575.6 ms", + "Error": "4.96 ms", + "StdDev": "4.64 ms", + "Median": "575.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,166.7 ms", - "Error": "14.97 ms", - "StdDev": "14.01 ms", - "Median": "1,168.1 ms" + "Mean": "1,194.3 ms", + "Error": "7.33 ms", + "StdDev": "6.50 ms", + "Median": "1,195.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,158.1 ms", - "Error": "13.97 ms", - "StdDev": "12.38 ms", - "Median": "1,156.0 ms" + "Mean": "1,165.8 ms", + "Error": "10.55 ms", + "StdDev": "9.87 ms", + "Median": "1,164.6 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,249.6 ms", - "Error": "18.97 ms", - "StdDev": "16.82 ms", - "Median": "1,248.7 ms" + "Mean": "1,258.5 ms", + "Error": "8.37 ms", + "StdDev": "7.83 ms", + "Median": "1,258.8 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.007 s", - "Error": "0.0255 s", - "StdDev": "0.0239 s", - "Median": "2.006 s" + "Mean": "2.043 s", + "Error": "0.0210 s", + "StdDev": "0.0196 s", + "Median": "2.035 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.615 s", - "Error": "0.0154 s", - "StdDev": "0.0144 s", - "Median": "1.612 s" + "Mean": "1.639 s", + "Error": "0.0094 s", + "StdDev": "0.0088 s", + "Median": "1.639 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.692 s", - "Error": "0.0194 s", - "StdDev": "0.0181 s", - "Median": "1.696 s" + "Mean": "1.715 s", + "Error": "0.0184 s", + "StdDev": "0.0172 s", + "Median": "1.712 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.592 s", - "Error": "0.0189 s", - "StdDev": "0.0176 s", - "Median": "1.595 s" + "Mean": "1.616 s", + "Error": "0.0302 s", + "StdDev": "0.0283 s", + "Median": "1.621 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-26T00:28:24.624Z" + "lastUpdated": "2025-11-27T00:28:35.445Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index a885d6ad3b..ff4e003094 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-26", + "timestamp": "2025-11-27", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From ff6fe7c97f1438d72fc314907cdf1156c63f8475 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 27 Nov 2025 13:13:39 +0000 Subject: [PATCH 098/192] chore(deps): update docker/setup-docker-action action to v4.6.0 (#3924) Co-authored-by: Renovate Bot --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 5221fa8aed..628377cef7 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -66,7 +66,7 @@ jobs: - name: Docker Setup Docker if: matrix.os == 'ubuntu-latest' - uses: docker/setup-docker-action@v4.5.0 + uses: docker/setup-docker-action@v4.6.0 - name: Cache Playwright Browsers uses: actions/cache@v4 From 472b487510b6de495283115e7995b4fbbbaf41d6 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:58:33 +0000 Subject: [PATCH 099/192] feat: add string length assertions and update documentation for new assertion methods (#3926) --- .../StringLengthAssertionTests.cs | 164 ++++++++++++++++++ .../Conditions/StringLengthValueAssertion.cs | 16 ++ .../Extensions/AssertionExtensions.cs | 13 ++ .../Sources/CollectionAssertionBase.cs | 2 + ...Has_No_API_Changes.DotNet10_0.verified.txt | 11 ++ ..._Has_No_API_Changes.DotNet8_0.verified.txt | 11 ++ ..._Has_No_API_Changes.DotNet9_0.verified.txt | 11 ++ ...ary_Has_No_API_Changes.Net4_7.verified.txt | 11 ++ .../advanced/performance-best-practices.md | 6 +- docs/docs/assertions/awaiting.md | 10 +- docs/docs/assertions/collections.md | 30 ++-- docs/docs/assertions/dictionaries.md | 16 +- .../assertions/equality-and-comparison.md | 2 +- .../extensibility-chaining-and-converting.md | 2 +- docs/docs/assertions/getting-started.md | 10 +- docs/docs/assertions/member-assertions.md | 4 +- docs/docs/assertions/null-and-default.md | 2 +- docs/docs/assertions/regex-assertions.md | 10 +- docs/docs/assertions/string.md | 20 +-- .../writing-your-first-test.md | 2 +- docs/docs/guides/cookbook.md | 4 +- docs/docs/migration/nunit.md | 4 +- docs/docs/migration/xunit.md | 2 +- docs/docs/troubleshooting.md | 8 +- 24 files changed, 305 insertions(+), 66 deletions(-) create mode 100644 TUnit.Assertions.Tests/StringLengthAssertionTests.cs create mode 100644 TUnit.Assertions/Conditions/StringLengthValueAssertion.cs diff --git a/TUnit.Assertions.Tests/StringLengthAssertionTests.cs b/TUnit.Assertions.Tests/StringLengthAssertionTests.cs new file mode 100644 index 0000000000..87fd7e2ae2 --- /dev/null +++ b/TUnit.Assertions.Tests/StringLengthAssertionTests.cs @@ -0,0 +1,164 @@ +using TUnit.Assertions.Exceptions; + +namespace TUnit.Assertions.Tests; + +public class StringLengthAssertionTests +{ + [Test] + public async Task Length_IsEqualTo_Passes_When_Length_Matches() + { + var str = "Hello"; + await Assert.That(str).Length().IsEqualTo(5); + } + + [Test] + public async Task Length_IsEqualTo_Fails_When_Length_DoesNotMatch() + { + var str = "Hello"; + await Assert.That(async () => await Assert.That(str).Length().IsEqualTo(10)) + .Throws() + .And.HasMessageContaining("10"); + } + + [Test] + public async Task Length_IsGreaterThan_Passes_When_Length_IsGreater() + { + var str = "Hello, World!"; + await Assert.That(str).Length().IsGreaterThan(5); + } + + [Test] + public async Task Length_IsGreaterThan_Fails_When_Length_IsNotGreater() + { + var str = "Hi"; + await Assert.That(async () => await Assert.That(str).Length().IsGreaterThan(5)) + .Throws() + .And.HasMessageContaining("greater than") + .And.HasMessageContaining("5"); + } + + [Test] + public async Task Length_IsLessThan_Passes_When_Length_IsLess() + { + var str = "Hi"; + await Assert.That(str).Length().IsLessThan(10); + } + + [Test] + public async Task Length_IsLessThan_Fails_When_Length_IsNotLess() + { + var str = "Hello, World!"; + await Assert.That(async () => await Assert.That(str).Length().IsLessThan(5)) + .Throws() + .And.HasMessageContaining("less than") + .And.HasMessageContaining("5"); + } + + [Test] + public async Task Length_IsGreaterThanOrEqualTo_Passes_When_Equal() + { + var str = "Hello"; + await Assert.That(str).Length().IsGreaterThanOrEqualTo(5); + } + + [Test] + public async Task Length_IsGreaterThanOrEqualTo_Passes_When_Greater() + { + var str = "Hello, World!"; + await Assert.That(str).Length().IsGreaterThanOrEqualTo(5); + } + + [Test] + public async Task Length_IsGreaterThanOrEqualTo_Fails_When_Less() + { + var str = "Hi"; + await Assert.That(async () => await Assert.That(str).Length().IsGreaterThanOrEqualTo(5)) + .Throws() + .And.HasMessageContaining("greater than or equal to") + .And.HasMessageContaining("5"); + } + + [Test] + public async Task Length_IsLessThanOrEqualTo_Passes_When_Equal() + { + var str = "Hello"; + await Assert.That(str).Length().IsLessThanOrEqualTo(5); + } + + [Test] + public async Task Length_IsLessThanOrEqualTo_Passes_When_Less() + { + var str = "Hi"; + await Assert.That(str).Length().IsLessThanOrEqualTo(5); + } + + [Test] + public async Task Length_IsLessThanOrEqualTo_Fails_When_Greater() + { + var str = "Hello, World!"; + await Assert.That(async () => await Assert.That(str).Length().IsLessThanOrEqualTo(5)) + .Throws() + .And.HasMessageContaining("less than or equal to") + .And.HasMessageContaining("5"); + } + + [Test] + public async Task Length_IsBetween_Passes_When_InRange() + { + var str = "Hello"; + await Assert.That(str).Length().IsBetween(1, 10); + } + + [Test] + public async Task Length_IsBetween_Fails_When_OutOfRange() + { + var str = "Hello, World!"; + await Assert.That(async () => await Assert.That(str).Length().IsBetween(1, 5)) + .Throws() + .And.HasMessageContaining("between"); + } + + [Test] + public async Task Length_IsPositive_Passes_For_NonEmptyString() + { + var str = "Hello"; + await Assert.That(str).Length().IsPositive(); + } + + [Test] + public async Task Length_IsGreaterThanOrEqualTo_Zero_Passes_Always() + { + var str = ""; + await Assert.That(str).Length().IsGreaterThanOrEqualTo(0); + } + + [Test] + public async Task Length_IsZero_Passes_For_EmptyString() + { + var str = ""; + await Assert.That(str).Length().IsZero(); + } + + [Test] + public async Task Length_IsNotZero_Passes_For_NonEmptyString() + { + var str = "Hello"; + await Assert.That(str).Length().IsNotZero(); + } + + [Test] + public async Task Length_WithNullString_Returns_Zero() + { + string? str = null; + await Assert.That(str).Length().IsZero(); + } + + [Test] + public async Task Length_Chained_With_And() + { + var str = "Hello"; + await Assert.That(str) + .Length().IsGreaterThan(3) + .And.IsLessThan(10); + } +} diff --git a/TUnit.Assertions/Conditions/StringLengthValueAssertion.cs b/TUnit.Assertions/Conditions/StringLengthValueAssertion.cs new file mode 100644 index 0000000000..faf24a95dc --- /dev/null +++ b/TUnit.Assertions/Conditions/StringLengthValueAssertion.cs @@ -0,0 +1,16 @@ +using TUnit.Assertions.Core; + +namespace TUnit.Assertions.Conditions; + +/// +/// Assertion that evaluates the length of a string and provides numeric assertions on that length. +/// Implements IAssertionSource<int> to enable all numeric assertion methods. +/// Example: await Assert.That(str).Length().IsGreaterThan(5); +/// +public class StringLengthValueAssertion : Sources.ValueAssertion +{ + public StringLengthValueAssertion(AssertionContext stringContext) + : base(stringContext.Map(s => s?.Length ?? 0)) + { + } +} diff --git a/TUnit.Assertions/Extensions/AssertionExtensions.cs b/TUnit.Assertions/Extensions/AssertionExtensions.cs index 8287c6ebdd..d065942ad1 100644 --- a/TUnit.Assertions/Extensions/AssertionExtensions.cs +++ b/TUnit.Assertions/Extensions/AssertionExtensions.cs @@ -683,10 +683,22 @@ private static string GetMemberPath(Expression 0 ? string.Join(".", parts) : "Unknown"; } + /// + /// Gets the length of the string as an integer for numeric assertions. + /// Example: await Assert.That(str).Length().IsGreaterThan(5); + /// + public static StringLengthValueAssertion Length( + this IAssertionSource source) + { + source.Context.ExpressionBuilder.Append(".Length()"); + return new StringLengthValueAssertion(source.Context); + } + /// /// Returns a wrapper for string length assertions. /// Example: await Assert.That(str).HasLength().EqualTo(5); /// + [Obsolete("Use Length() instead, which provides all numeric assertion methods. Example: Assert.That(str).Length().IsGreaterThan(5)")] public static LengthWrapper HasLength( this IAssertionSource source) { @@ -698,6 +710,7 @@ public static LengthWrapper HasLength( /// Asserts that the string has the expected length. /// Example: await Assert.That(str).HasLength(5); /// + [Obsolete("Use Length().IsEqualTo(expectedLength) instead.")] public static StringLengthAssertion HasLength( this IAssertionSource source, int expectedLength, diff --git a/TUnit.Assertions/Sources/CollectionAssertionBase.cs b/TUnit.Assertions/Sources/CollectionAssertionBase.cs index 233e954ca4..d6e0ee81f4 100644 --- a/TUnit.Assertions/Sources/CollectionAssertionBase.cs +++ b/TUnit.Assertions/Sources/CollectionAssertionBase.cs @@ -109,6 +109,7 @@ public CollectionContainsPredicateAssertion Contains( /// This instance method enables calling HasCount with proper type inference. /// Example: await Assert.That(list).HasCount(5); /// + [Obsolete("Use Count().IsEqualTo(expectedCount) instead.")] public CollectionCountAssertion HasCount( int expectedCount, [CallerArgumentExpression(nameof(expectedCount))] string? expression = null) @@ -122,6 +123,7 @@ public CollectionCountAssertion HasCount( /// This enables the pattern: .HasCount().GreaterThan(5) /// Example: await Assert.That(list).HasCount().EqualTo(5); /// + [Obsolete("Use Count() instead, which provides all numeric assertion methods. Example: Assert.That(list).Count().IsGreaterThan(5)")] public CountWrapper HasCount() { Context.ExpressionBuilder.Append(".HasCount()"); diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 9714184f79..24dee33ea7 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1115,6 +1115,10 @@ namespace .Conditions protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } } + public class StringLengthValueAssertion : . + { + public StringLengthValueAssertion(. stringContext) { } + } public class StringMatchesAssertion : .<..RegexMatchCollection> { public StringMatchesAssertion(. context, . regex) { } @@ -1578,7 +1582,10 @@ namespace .Extensions public static . EqualTo(this . source, TValue? expected, [.("expected")] string? expression = null) { } public static ..HasFlagAssertion HasFlag(this . source, TEnum expectedFlag, [.("expectedFlag")] string? expression = null) where TEnum : struct, { } + [("Use Length() instead, which provides all numeric assertion methods. Example: Asse" + + "(str).Length().IsGreaterThan(5)")] public static ..LengthWrapper HasLength(this . source) { } + [("Use Length().IsEqualTo(expectedLength) instead.")] public static . HasLength(this . source, int expectedLength, [.("expectedLength")] string? expression = null) { } public static . HasMessageContaining(this . source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) where TException : { } @@ -1633,6 +1640,7 @@ namespace .Extensions where TValue : { } public static . IsPositive(this . source) where TValue : struct, { } + public static . Length(this . source) { } [.(1)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member DoesNotContain( predicate, [.("predicate")] string? expression = null) { } public . DoesNotContain(TItem expected, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } + [("Use Count() instead, which provides all numeric assertion methods. Example: Asser" + + "(list).Count().IsGreaterThan(5)")] public ..CountWrapper HasCount() { } + [("Use Count().IsEqualTo(expectedCount) instead.")] public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 665faeb994..9f3c6cccc7 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1112,6 +1112,10 @@ namespace .Conditions protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } } + public class StringLengthValueAssertion : . + { + public StringLengthValueAssertion(. stringContext) { } + } public class StringMatchesAssertion : .<..RegexMatchCollection> { public StringMatchesAssertion(. context, . regex) { } @@ -1575,7 +1579,10 @@ namespace .Extensions public static . EqualTo(this . source, TValue? expected, [.("expected")] string? expression = null) { } public static ..HasFlagAssertion HasFlag(this . source, TEnum expectedFlag, [.("expectedFlag")] string? expression = null) where TEnum : struct, { } + [("Use Length() instead, which provides all numeric assertion methods. Example: Asse" + + "(str).Length().IsGreaterThan(5)")] public static ..LengthWrapper HasLength(this . source) { } + [("Use Length().IsEqualTo(expectedLength) instead.")] public static . HasLength(this . source, int expectedLength, [.("expectedLength")] string? expression = null) { } public static . HasMessageContaining(this . source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) where TException : { } @@ -1630,6 +1637,7 @@ namespace .Extensions where TValue : { } public static . IsPositive(this . source) where TValue : struct, { } + public static . Length(this . source) { } public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] @@ -4330,7 +4338,10 @@ namespace .Sources public . DoesNotContain( predicate, [.("predicate")] string? expression = null) { } public . DoesNotContain(TItem expected, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } + [("Use Count() instead, which provides all numeric assertion methods. Example: Asser" + + "(list).Count().IsGreaterThan(5)")] public ..CountWrapper HasCount() { } + [("Use Count().IsEqualTo(expectedCount) instead.")] public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index c8665a0b6a..ea9a094de1 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1115,6 +1115,10 @@ namespace .Conditions protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } } + public class StringLengthValueAssertion : . + { + public StringLengthValueAssertion(. stringContext) { } + } public class StringMatchesAssertion : .<..RegexMatchCollection> { public StringMatchesAssertion(. context, . regex) { } @@ -1578,7 +1582,10 @@ namespace .Extensions public static . EqualTo(this . source, TValue? expected, [.("expected")] string? expression = null) { } public static ..HasFlagAssertion HasFlag(this . source, TEnum expectedFlag, [.("expectedFlag")] string? expression = null) where TEnum : struct, { } + [("Use Length() instead, which provides all numeric assertion methods. Example: Asse" + + "(str).Length().IsGreaterThan(5)")] public static ..LengthWrapper HasLength(this . source) { } + [("Use Length().IsEqualTo(expectedLength) instead.")] public static . HasLength(this . source, int expectedLength, [.("expectedLength")] string? expression = null) { } public static . HasMessageContaining(this . source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) where TException : { } @@ -1633,6 +1640,7 @@ namespace .Extensions where TValue : { } public static . IsPositive(this . source) where TValue : struct, { } + public static . Length(this . source) { } [.(1)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member DoesNotContain( predicate, [.("predicate")] string? expression = null) { } public . DoesNotContain(TItem expected, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } + [("Use Count() instead, which provides all numeric assertion methods. Example: Asser" + + "(list).Count().IsGreaterThan(5)")] public ..CountWrapper HasCount() { } + [("Use Count().IsEqualTo(expectedCount) instead.")] public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index bd832a6fca..6444294fe0 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1044,6 +1044,10 @@ namespace .Conditions protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } } + public class StringLengthValueAssertion : . + { + public StringLengthValueAssertion(. stringContext) { } + } public class StringMatchesAssertion : .<..RegexMatchCollection> { public StringMatchesAssertion(. context, . regex) { } @@ -1476,7 +1480,10 @@ namespace .Extensions public static . EqualTo(this . source, TValue? expected, [.("expected")] string? expression = null) { } public static ..HasFlagAssertion HasFlag(this . source, TEnum expectedFlag, [.("expectedFlag")] string? expression = null) where TEnum : struct, { } + [("Use Length() instead, which provides all numeric assertion methods. Example: Asse" + + "(str).Length().IsGreaterThan(5)")] public static ..LengthWrapper HasLength(this . source) { } + [("Use Length().IsEqualTo(expectedLength) instead.")] public static . HasLength(this . source, int expectedLength, [.("expectedLength")] string? expression = null) { } public static . HasMessageContaining(this . source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) where TException : { } @@ -1521,6 +1528,7 @@ namespace .Extensions where TValue : { } public static . IsPositive(this . source) where TValue : struct, { } + public static . Length(this . source) { } public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } public static . Member(this . source, .<>> memberSelector, <.<., TItem>, object> assertions) { } public static . Member(this . source, .<> memberSelector, <., .> assertions) { } @@ -3819,7 +3827,10 @@ namespace .Sources public . DoesNotContain( predicate, [.("predicate")] string? expression = null) { } public . DoesNotContain(TItem expected, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } + [("Use Count() instead, which provides all numeric assertion methods. Example: Asser" + + "(list).Count().IsGreaterThan(5)")] public ..CountWrapper HasCount() { } + [("Use Count().IsEqualTo(expectedCount) instead.")] public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } diff --git a/docs/docs/advanced/performance-best-practices.md b/docs/docs/advanced/performance-best-practices.md index 6818badae3..3e7f0abb2f 100644 --- a/docs/docs/advanced/performance-best-practices.md +++ b/docs/docs/advanced/performance-best-practices.md @@ -222,8 +222,8 @@ public class PerformantTests ```csharp // āŒ Bad: Expensive operation in assertion await Assert.That(await GetAllUsersFromDatabase()) - .HasCount() - .EqualTo(1000); + .Count() + .IsEqualTo(1000); // āœ… Good: Use efficient queries var userCount = await GetUserCountFromDatabase(); @@ -246,7 +246,7 @@ public async Task EfficientValidation() } // More expensive validations only if needed - await Assert.That(result.Items).HasCount().GreaterThan(0); + await Assert.That(result.Items).Count().IsGreaterThan(0); } ``` diff --git a/docs/docs/assertions/awaiting.md b/docs/docs/assertions/awaiting.md index 2185db045c..540a19102c 100644 --- a/docs/docs/assertions/awaiting.md +++ b/docs/docs/assertions/awaiting.md @@ -90,7 +90,7 @@ public async Task ComplexCollectionAssertions() // Assert multiple conditions on a collection await Assert.That(orders) - .HasCount().IsGreaterThan(0) + .Count().IsGreaterThan(0) .And.Contains(o => o.Status == OrderStatus.Completed) .And.DoesNotContain(o => o.Total < 0) .And.HasDistinctItems(); @@ -146,7 +146,7 @@ public async Task DetailedExceptionAssertions() var exception = await Assert.That(() => ParallelOperationAsync()) .Throws(); - await Assert.That(exception.InnerExceptions).HasCount(3); + await Assert.That(exception.InnerExceptions).Count().IsEqualTo(3); await Assert.That(exception.InnerExceptions).All(e => e is TaskCanceledException); } ``` @@ -169,7 +169,7 @@ public async Task CustomAssertionConditions() // Combine built-in and custom assertions await Assert.That(measurements) - .HasCount().GreaterThan(100) + .Count().IsGreaterThan(100) .And.All(m => m > 0) .And.Satisfies(IsNormallyDistributed, "Data should be normally distributed"); } @@ -242,7 +242,7 @@ public async Task StringPatternAssertions() .StartsWith("Report Generated:") .And.Contains("Total Items:") .And.DoesNotContain("null") - .And.HasLength().IsBetween(1000, 5000); + .And.Length().IsBetween(1000, 5000); } ``` @@ -299,7 +299,7 @@ public async Task PerformanceAssertions() await Assert.That(results.Max()) .IsLessThan(500); // No operation over 500ms - await Assert.That(results.Where(r => r > 200).HasCount()) + await Assert.That(results.Where(r => r > 200).Count()) .IsLessThan(5); // Less than 5% over 200ms } ``` diff --git a/docs/docs/assertions/collections.md b/docs/docs/assertions/collections.md index 52f72d5d27..db49665263 100644 --- a/docs/docs/assertions/collections.md +++ b/docs/docs/assertions/collections.md @@ -98,7 +98,7 @@ public async Task Collection_Does_Not_Contain_Matching() ## Count Assertions -### HasCount +### Count Tests that a collection has an exact count: @@ -108,7 +108,7 @@ public async Task Collection_Has_Count() { var numbers = new[] { 1, 2, 3, 4, 5 }; - await Assert.That(numbers).HasCount(5); + await Assert.That(numbers).Count().IsEqualTo(5); } ``` @@ -123,11 +123,11 @@ public async Task Count_With_Comparison() var numbers = new[] { 1, 2, 3, 4, 5 }; await Assert.That(numbers) - .HasCount().EqualTo(5); + .Count().IsEqualTo(5); await Assert.That(numbers) - .HasCount().GreaterThan(3) - .And.HasCount().LessThan(10); + .Count().IsGreaterThan(3) + .And.Count().IsLessThan(10); } ``` @@ -160,7 +160,7 @@ public async Task Collection_Is_Empty() var empty = new List(); await Assert.That(empty).IsEmpty(); - await Assert.That(empty).HasCount(0); + await Assert.That(empty).Count().IsEqualTo(0); } ``` @@ -638,7 +638,7 @@ public async Task Filter_And_Assert() var evens = numbers.Where(n => n % 2 == 0).ToArray(); await Assert.That(evens) - .HasCount(5) + .Count().IsEqualTo(5) .And.All(n => n % 2 == 0); } ``` @@ -659,7 +659,7 @@ public async Task LINQ_Query_Results() var adults = users.Where(u => u.Age >= 18).ToArray(); await Assert.That(adults) - .HasCount(3) + .Count().IsEqualTo(3) .And.All(u => u.Age >= 18); } ``` @@ -708,7 +708,7 @@ public async Task Map_And_Verify() var names = users.Select(u => u.Name).ToArray(); await Assert.That(names) - .HasCount(2) + .Count().IsEqualTo(2) .And.Contains("Alice") .And.Contains("Bob") .And.All(name => !string.IsNullOrEmpty(name)); @@ -745,12 +745,12 @@ public async Task Nested_Collections() new[] { 7, 8, 9 } }; - await Assert.That(matrix).HasCount(3); + await Assert.That(matrix).Count().IsEqualTo(3); await Assert.That(matrix).All(row => row.Length == 3); // Flatten and assert var flattened = matrix.SelectMany(x => x).ToArray(); - await Assert.That(flattened).HasCount(9); + await Assert.That(flattened).Count().IsEqualTo(9); } ``` @@ -768,7 +768,7 @@ public async Task Collection_Of_Collections() }; await Assert.That(groups) - .HasCount(3) + .Count().IsEqualTo(3) .And.All(group => group.Count > 0); } ``` @@ -783,7 +783,7 @@ public async Task Chained_Collection_Assertions() await Assert.That(numbers) .IsNotEmpty() - .And.HasCount(5) + .And.Count().IsEqualTo(5) .And.Contains(3) .And.DoesNotContain(10) .And.IsInOrder() @@ -807,7 +807,7 @@ public async Task Materialize_Before_Multiple_Assertions() // Materialize once to avoid re-execution var materialized = query.ToArray(); - await Assert.That(materialized).HasCount().GreaterThan(1000); + await Assert.That(materialized).Count().IsGreaterThan(1000); await Assert.That(materialized).Contains(100); await Assert.That(materialized).All(n => n % 2 == 0); } @@ -822,7 +822,7 @@ public async Task HashSet_Assertions() var set = new HashSet { 1, 2, 3, 4, 5 }; await Assert.That(set) - .HasCount(5) + .Count().IsEqualTo(5) .And.Contains(3) .And.HasDistinctItems(); } diff --git a/docs/docs/assertions/dictionaries.md b/docs/docs/assertions/dictionaries.md index 938a723f6e..24320dffa8 100644 --- a/docs/docs/assertions/dictionaries.md +++ b/docs/docs/assertions/dictionaries.md @@ -104,7 +104,7 @@ public async Task Dictionary_Count() ["c"] = 3 }; - await Assert.That(dict).HasCount(3); + await Assert.That(dict).Count().IsEqualTo(3); } ``` @@ -223,7 +223,7 @@ public async Task Lookup_Table() }; await Assert.That(statusCodes) - .HasCount(3) + .Count().IsEqualTo(3) .And.ContainsKey(200) .And.ContainsValue("OK"); } @@ -243,7 +243,7 @@ public async Task Cache_Contains_Entry() await Assert.That(cache) .ContainsKey("user:123") - .And.HasCount(2) + .And.Count().IsEqualTo(2) .And.IsNotEmpty(); } ``` @@ -306,7 +306,7 @@ public async Task Dictionary_Keys() var keys = dict.Keys; await Assert.That(keys) - .HasCount(3) + .Count().IsEqualTo(3) .And.Contains("a") .And.Contains("b") .And.Contains("c"); @@ -329,7 +329,7 @@ public async Task Dictionary_Values() var values = dict.Values; await Assert.That(values) - .HasCount(3) + .Count().IsEqualTo(3) .And.Contains(1) .And.Contains(2) .And.All(v => v > 0); @@ -376,7 +376,7 @@ public async Task Chained_Dictionary_Assertions() await Assert.That(dict) .IsNotEmpty() - .And.HasCount(3) + .And.Count().IsEqualTo(3) .And.ContainsKey("apple") .And.ContainsKey("banana") .And.ContainsValue(2) @@ -397,7 +397,7 @@ public async Task Concurrent_Dictionary() concurrent.TryAdd("b", 2); await Assert.That(concurrent) - .HasCount(2) + .Count().IsEqualTo(2) .And.ContainsKey("a"); } ``` @@ -412,7 +412,7 @@ public async Task ReadOnly_Dictionary() var readOnly = new ReadOnlyDictionary(dict); await Assert.That(readOnly) - .HasCount(1) + .Count().IsEqualTo(1) .And.ContainsKey("a"); } ``` diff --git a/docs/docs/assertions/equality-and-comparison.md b/docs/docs/assertions/equality-and-comparison.md index f20912b79f..f2b14bc868 100644 --- a/docs/docs/assertions/equality-and-comparison.md +++ b/docs/docs/assertions/equality-and-comparison.md @@ -54,7 +54,7 @@ public async Task Using_EqualTo_Alias() var numbers = new[] { 1, 2, 3 }; await Assert.That(numbers) - .HasCount().EqualTo(3) + .Count().IsEqualTo(3) .And.Contains(2); } ``` diff --git a/docs/docs/assertions/extensibility/extensibility-chaining-and-converting.md b/docs/docs/assertions/extensibility/extensibility-chaining-and-converting.md index befc48a581..59e748ad0f 100644 --- a/docs/docs/assertions/extensibility/extensibility-chaining-and-converting.md +++ b/docs/docs/assertions/extensibility/extensibility-chaining-and-converting.md @@ -185,4 +185,4 @@ public class HasDetailAssertion : Assertion TUnit includes several built-in examples of type conversion assertions: - `WhenParsedInto()` - Converts a string to a parsed type (e.g., `await Assert.That("123").WhenParsedInto().IsEqualTo(123)`) -- `IsTypeOf()` - Converts to a specific type (e.g., `await Assert.That(obj).IsTypeOf().HasLength(5)`) +- `IsTypeOf()` - Converts to a specific type (e.g., `await Assert.That(obj).IsTypeOf().Length().IsEqualTo(5)`) diff --git a/docs/docs/assertions/getting-started.md b/docs/docs/assertions/getting-started.md index 67c466360b..a078a9af9b 100644 --- a/docs/docs/assertions/getting-started.md +++ b/docs/docs/assertions/getting-started.md @@ -63,7 +63,7 @@ await Assert.That(input).IsNotEmpty(); ```csharp await Assert.That(numbers).Contains(42); -await Assert.That(items).HasCount(5); +await Assert.That(items).Count().IsEqualTo(5); await Assert.That(list).IsNotEmpty(); await Assert.That(values).All(x => x > 0); ``` @@ -99,8 +99,8 @@ Combine multiple assertions on the same value using `.And`: await Assert.That(username) .IsNotNull() .And.IsNotEmpty() - .And.HasLength().GreaterThan(3) - .And.HasLength().LessThan(20); + .And.Length().IsGreaterThan(3) + .And.Length().IsLessThan(20); ``` Use `.Or` when any condition can be true: @@ -153,7 +153,7 @@ Collections have rich assertion support: var numbers = new[] { 1, 2, 3, 4, 5 }; // Count and emptiness -await Assert.That(numbers).HasCount(5); +await Assert.That(numbers).Count().IsEqualTo(5); await Assert.That(numbers).IsNotEmpty(); // Membership @@ -397,7 +397,7 @@ Now that you understand the basics, explore specific assertion types: | Null/Default | `IsNull()`, `IsNotNull()`, `IsDefault()` | | Boolean | `IsTrue()`, `IsFalse()` | | Strings | `Contains()`, `StartsWith()`, `Matches()` | -| Collections | `Contains()`, `HasCount()`, `All()`, `Any()` | +| Collections | `Contains()`, `Count()`, `All()`, `Any()` | | Exceptions | `Throws()`, `ThrowsNothing()` | | Types | `IsTypeOf()`, `IsAssignableTo()` | | Async | `CompletesWithin()`, async exception testing | diff --git a/docs/docs/assertions/member-assertions.md b/docs/docs/assertions/member-assertions.md index ea0b7e4e4d..c0d8d7cec4 100644 --- a/docs/docs/assertions/member-assertions.md +++ b/docs/docs/assertions/member-assertions.md @@ -72,7 +72,7 @@ public async Task ComplexMemberAssertions() await Assert.That(team) .Member(t => t.Name, name => name.StartsWith("Team")) .And.Member(t => t.Members, members => members - .HasCount().IsGreaterThan(0) + .Count().IsGreaterThan(0) .And.All(m => m.IsActive) .And.Any(m => m.Role == "Lead")) .And.Member(t => t.CreatedDate, date => date @@ -134,7 +134,7 @@ public async Task NestedObjectAssertions() .And.Member(c => c.Address.City, city => city.IsEqualTo("Seattle")) .And.Member(c => c.Address.ZipCode, zip => zip.Matches(@"^\d{5}$")) .And.Member(c => c.Employees, employees => employees - .HasCount().IsBetween(100, 500) + .Count().IsBetween(100, 500) .And.All(e => e.Email.EndsWith("@techcorp.com"))); } ``` diff --git a/docs/docs/assertions/null-and-default.md b/docs/docs/assertions/null-and-default.md index c0570f6fbd..b2a241aa3a 100644 --- a/docs/docs/assertions/null-and-default.md +++ b/docs/docs/assertions/null-and-default.md @@ -69,7 +69,7 @@ public async Task Chained_After_Null_Check() await Assert.That(input) .IsNotNull() .And.IsNotEmpty() // Compiler knows input is not null - .And.HasLength().GreaterThan(5); + .And.Length().IsGreaterThan(5); } ``` diff --git a/docs/docs/assertions/regex-assertions.md b/docs/docs/assertions/regex-assertions.md index 6b2d9b1261..048aefc022 100644 --- a/docs/docs/assertions/regex-assertions.md +++ b/docs/docs/assertions/regex-assertions.md @@ -108,13 +108,13 @@ public async Task PositionAndLengthAssertions() // Assert that match has specific length await Assert.That(text) .Matches(pattern) - .HasLength(3); + .Length().IsEqualTo(3); // Combine with group assertions await Assert.That(text) .Matches(pattern) .AtIndex(12) - .And.HasLength(3); + .And.Length().IsEqualTo(3); } ``` @@ -149,7 +149,7 @@ public async Task ProductCodeValidation() .Matches(pattern) .And.Group("code", code => code.StartsWith("ABC")) .And.Group("price", price => price.Contains(".99")) - .And.Group("stock", stock => stock.HasLength(2)); + .And.Group("stock", stock => stock.Length().IsEqualTo(2)); } ``` @@ -259,9 +259,9 @@ public async Task CompleteEmailValidation() .And.Group("local", local => local.StartsWith("john")) .And.Group("subdomain", sub => sub.IsEqualTo("mail")) .And.Group("domain", domain => domain.IsEqualTo("example")) - .And.Group("tld", tld => tld.HasLength(3)) + .And.Group("tld", tld => tld.Length().IsEqualTo(3)) .And.AtIndex(0) - .And.HasLength(email.Length); + .And.Length().IsEqualTo(email.Length); } ``` diff --git a/docs/docs/assertions/string.md b/docs/docs/assertions/string.md index 7ffadc6bd6..6d9336f4a0 100644 --- a/docs/docs/assertions/string.md +++ b/docs/docs/assertions/string.md @@ -291,7 +291,7 @@ public async Task String_Is_Not_Empty() } ``` -### HasLength +### Length Tests that a string has a specific length: @@ -301,7 +301,7 @@ public async Task String_Has_Length() { var code = "ABC123"; - await Assert.That(code).HasLength(6); + await Assert.That(code).Length().IsEqualTo(6); } ``` @@ -314,12 +314,12 @@ public async Task Length_With_Comparison() var username = "alice"; await Assert.That(username) - .HasLength().GreaterThan(3) - .And.HasLength().LessThan(20); + .Length().IsGreaterThan(3) + .And.Length().IsLessThan(20); } ``` -Or more concisely: +Using `IsBetween`: ```csharp [Test] @@ -327,7 +327,7 @@ public async Task Length_Range() { var username = "alice"; - await Assert.That(username.Length).IsBetween(3, 20); + await Assert.That(username).Length().IsBetween(3, 20); } ``` @@ -459,8 +459,8 @@ public async Task Validate_Username() var username = "alice_123"; await Assert.That(username) - .HasLength().GreaterThanOrEqualTo(3) - .And.HasLength().LessThanOrEqualTo(20) + .Length().IsGreaterThanOrEqualTo(3) + .And.Length().IsLessThanOrEqualTo(20) .And.Matches(@"^[a-zA-Z0-9_]+$") .And.DoesNotContain(" "); } @@ -475,7 +475,7 @@ public async Task Validate_Password() var password = "SecureP@ss123"; await Assert.That(password) - .HasLength().GreaterThanOrEqualTo(8) + .Length().IsGreaterThanOrEqualTo(8) .And.Matches(@"[A-Z]") // Has uppercase .And.Matches(@"[a-z]") // Has lowercase .And.Matches(@"\d") // Has digit @@ -600,7 +600,7 @@ public async Task Chained_String_Assertions() .And.Contains("World") .And.StartsWith("Hello") .And.EndsWith("!") - .And.HasLength(13); + .And.Length().IsEqualTo(13); } ``` diff --git a/docs/docs/getting-started/writing-your-first-test.md b/docs/docs/getting-started/writing-your-first-test.md index ef503ae7d3..346ce02d08 100644 --- a/docs/docs/getting-started/writing-your-first-test.md +++ b/docs/docs/getting-started/writing-your-first-test.md @@ -188,7 +188,7 @@ public class StringTests // Assert await Assert.That(result).IsEqualTo("HELLO"); - await Assert.That(result).HasLength(5); + await Assert.That(result).Length().IsEqualTo(5); await Assert.That(result.StartsWith("HE")).IsTrue(); } } diff --git a/docs/docs/guides/cookbook.md b/docs/docs/guides/cookbook.md index 95b0eaad8d..6721c8df26 100644 --- a/docs/docs/guides/cookbook.md +++ b/docs/docs/guides/cookbook.md @@ -89,7 +89,7 @@ public class OrderServiceTests }); await Assert.That(order.Id).IsGreaterThan(0); - await Assert.That(order.Items).HasCount().EqualTo(1); + await Assert.That(order.Items).Count().IsEqualTo(1); } } ``` @@ -616,7 +616,7 @@ public class OrderRepositoryIntegrationTests var loaded = await repository.GetWithItemsAsync(order.Id); await Assert.That(loaded).IsNotNull(); - await Assert.That(loaded!.Items).HasCount().EqualTo(2); + await Assert.That(loaded!.Items).Count().IsEqualTo(2); } } ``` diff --git a/docs/docs/migration/nunit.md b/docs/docs/migration/nunit.md index ad278b1fcd..1e996268a1 100644 --- a/docs/docs/migration/nunit.md +++ b/docs/docs/migration/nunit.md @@ -137,7 +137,7 @@ await Assert.That(actual).IsEqualTo(expected); await Assert.That(value).IsTrue(); await Assert.That(value).IsNull(); await Assert.That(text).Contains("substring"); -await Assert.That(collection).HasCount().EqualTo(5); +await Assert.That(collection).Count().IsEqualTo(5); ``` ### Collection Assertions @@ -610,7 +610,7 @@ public async Task ComplexAssertions() await Assert.That(text).Matches(@"^Hello"); // Collection assertions - await Assert.That(list).HasCount().EqualTo(5); + await Assert.That(list).Count().IsEqualTo(5); await Assert.That(list).Contains(3); await Assert.That(list).AllSatisfy(x => x > 0); await Assert.That(list).IsInAscendingOrder(); diff --git a/docs/docs/migration/xunit.md b/docs/docs/migration/xunit.md index 97a96bb507..f452d62eb7 100644 --- a/docs/docs/migration/xunit.md +++ b/docs/docs/migration/xunit.md @@ -790,7 +790,7 @@ public async Task Collection_Assertions() await Assert.That(list).DoesNotContain(5); await Assert.That(Array.Empty()).IsEmpty(); await Assert.That(list).IsNotEmpty(); - await Assert.That(list).HasCount().EqualTo(3); + await Assert.That(list).Count().IsEqualTo(3); } ``` diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index b0f44ddad1..4dfa0bb1ab 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -463,7 +463,7 @@ await Assert.That(actual).IsEquivalentTo(expected, CollectionOrdering.Matching); Or assert on elements individually: ```csharp -await Assert.That(actual).HasCount().EqualTo(expected.Length); +await Assert.That(actual).Count().IsEqualTo(expected.Length); for (int i = 0; i < expected.Length; i++) { await Assert.That(actual[i]).IsEqualTo(expected[i]); @@ -483,7 +483,7 @@ var expected = new[] await Assert.That(actual).IsEquivalentTo(expected); // More reliable - assert on properties -await Assert.That(actual).HasCount().EqualTo(2); +await Assert.That(actual).Count().IsEqualTo(2); await Assert.That(actual[0].Name).IsEqualTo("Alice"); await Assert.That(actual[1].Name).IsEqualTo("Bob"); @@ -502,7 +502,7 @@ var actual = new[] { (1, "a"), (2, "b") }; // await Assert.That(actual).IsEquivalentTo(expected); // Workaround - assert individual elements -await Assert.That(actual).HasCount().EqualTo(2); +await Assert.That(actual).Count().IsEqualTo(2); await Assert.That(actual[0]).IsEqualTo((1, "a")); await Assert.That(actual[1]).IsEqualTo((2, "b")); ``` @@ -516,7 +516,7 @@ var list = new List { 1, 2, 3 }; await Assert.That(list).IsEquivalentTo(new[] { 1, 2, 3 }); // Check specific properties -await Assert.That(list).HasCount().EqualTo(3); +await Assert.That(list).Count().IsEqualTo(3); await Assert.That(list).Contains(2); await Assert.That(list).DoesNotContain(5); ``` From 989adb788ce9928c0d43a34da8d571a0b51a1d35 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:59:30 +0000 Subject: [PATCH 100/192] feat: improve assertion typing for enumerable returning delegates (#3927) * feat: improve assertion typing for enumerable returning delegates * feat: add support for lambda-wrapped collection assertions in FuncCollectionAssertion and AsyncFuncCollectionAssertion * feat: add async and func collection assertions to assertion library --- .../CollectionAssertionTests.cs | 36 +++ .../FuncCollectionAssertionTests.cs | 229 ++++++++++++++++++ TUnit.Assertions/Extensions/Assert.cs | 28 +++ .../Sources/AsyncFuncCollectionAssertion.cs | 60 +++++ .../Sources/FuncCollectionAssertion.cs | 60 +++++ ...Has_No_API_Changes.DotNet10_0.verified.txt | 20 ++ ..._Has_No_API_Changes.DotNet8_0.verified.txt | 18 ++ ..._Has_No_API_Changes.DotNet9_0.verified.txt | 20 ++ ...ary_Has_No_API_Changes.Net4_7.verified.txt | 18 ++ 9 files changed, 489 insertions(+) create mode 100644 TUnit.Assertions.Tests/CollectionAssertionTests.cs create mode 100644 TUnit.Assertions.Tests/FuncCollectionAssertionTests.cs create mode 100644 TUnit.Assertions/Sources/AsyncFuncCollectionAssertion.cs create mode 100644 TUnit.Assertions/Sources/FuncCollectionAssertion.cs diff --git a/TUnit.Assertions.Tests/CollectionAssertionTests.cs b/TUnit.Assertions.Tests/CollectionAssertionTests.cs new file mode 100644 index 0000000000..1cc925828e --- /dev/null +++ b/TUnit.Assertions.Tests/CollectionAssertionTests.cs @@ -0,0 +1,36 @@ +namespace TUnit.Assertions.Tests; + +public class CollectionAssertionTests +{ + [Test] + public async Task IsEmpty() + { + var items = new List(); + + await Assert.That(items).IsEmpty(); + } + + [Test] + public async Task IsEmpty2() + { + var items = new List(); + + await Assert.That(() => items).IsEmpty(); + } + + [Test] + public async Task Count() + { + var items = new List(); + + await Assert.That(items).Count().IsEqualTo(0); + } + + [Test] + public async Task Count2() + { + var items = new List(); + + await Assert.That(() => items).Count().IsEqualTo(0); + } +} diff --git a/TUnit.Assertions.Tests/FuncCollectionAssertionTests.cs b/TUnit.Assertions.Tests/FuncCollectionAssertionTests.cs new file mode 100644 index 0000000000..ffa4fee039 --- /dev/null +++ b/TUnit.Assertions.Tests/FuncCollectionAssertionTests.cs @@ -0,0 +1,229 @@ +using TUnit.Assertions.Exceptions; + +namespace TUnit.Assertions.Tests; + +/// +/// Tests for FuncCollectionAssertion - verifies that collection assertions work when +/// collections are wrapped in lambdas. Addresses GitHub issue #3910. +/// +public class FuncCollectionAssertionTests +{ + [Test] + public async Task Lambda_Collection_IsEmpty_Passes_For_Empty_Collection() + { + var items = new List(); + await Assert.That(() => items).IsEmpty(); + } + + [Test] + public async Task Lambda_Collection_IsEmpty_Fails_For_NonEmpty_Collection() + { + var items = new List { 1, 2, 3 }; + await Assert.That(async () => await Assert.That(() => items).IsEmpty()) + .Throws(); + } + + [Test] + public async Task Lambda_Collection_IsNotEmpty_Passes_For_NonEmpty_Collection() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items).IsNotEmpty(); + } + + [Test] + public async Task Lambda_Collection_IsNotEmpty_Fails_For_Empty_Collection() + { + var items = new List(); + await Assert.That(async () => await Assert.That(() => items).IsNotEmpty()) + .Throws(); + } + + [Test] + public async Task Lambda_Collection_Count_IsEqualTo_Passes() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items).Count().IsEqualTo(3); + } + + [Test] + public async Task Lambda_Collection_Count_IsGreaterThan_Passes() + { + var items = new List { 1, 2, 3, 4, 5 }; + await Assert.That(() => items).Count().IsGreaterThan(3); + } + + [Test] + public async Task Lambda_Collection_Contains_Passes() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items).Contains(2); + } + + [Test] + public async Task Lambda_Collection_Contains_Fails_When_Item_Not_Present() + { + var items = new List { 1, 2, 3 }; + await Assert.That(async () => await Assert.That(() => items).Contains(99)) + .Throws(); + } + + [Test] + public async Task Lambda_Collection_DoesNotContain_Passes() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items).DoesNotContain(99); + } + + [Test] + public async Task Lambda_Collection_HasSingleItem_Passes() + { + var items = new List { 42 }; + await Assert.That(() => items).HasSingleItem(); + } + + [Test] + public async Task Lambda_Collection_All_Passes() + { + var items = new List { 2, 4, 6 }; + await Assert.That(() => items).All(x => x % 2 == 0); + } + + [Test] + public async Task Lambda_Collection_Any_Passes() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items).Any(x => x > 2); + } + + [Test] + public async Task Lambda_Collection_IsInOrder_Passes() + { + var items = new List { 1, 2, 3, 4, 5 }; + await Assert.That(() => items).IsInOrder(); + } + + [Test] + public async Task Lambda_Collection_IsInDescendingOrder_Passes() + { + var items = new List { 5, 4, 3, 2, 1 }; + await Assert.That(() => items).IsInDescendingOrder(); + } + + [Test] + public async Task Lambda_Collection_HasDistinctItems_Passes() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items).HasDistinctItems(); + } + + [Test] + public async Task Lambda_Collection_Throws_Passes_When_Exception_Thrown() + { + await Assert.That(() => ThrowingMethod()).Throws(); + } + + [Test] + public async Task Lambda_Collection_Chaining_With_And() + { + var items = new List { 1, 2, 3 }; + await Assert.That(() => items) + .IsNotEmpty() + .And.Contains(2) + .And.HasDistinctItems(); + } + + [Test] + public async Task Lambda_Array_IsEmpty_Passes() + { + var items = Array.Empty(); + await Assert.That(() => items).IsEmpty(); + } + + [Test] + public async Task Lambda_Array_IsNotEmpty_Passes() + { + var items = new[] { "a", "b", "c" }; + await Assert.That(() => items).IsNotEmpty(); + } + + [Test] + public async Task Lambda_Enumerable_IsEmpty_Passes() + { + IEnumerable items = Enumerable.Empty(); + await Assert.That(() => items).IsEmpty(); + } + + [Test] + public async Task Lambda_HashSet_Contains_Passes() + { + var items = new HashSet { 1, 2, 3 }; + await Assert.That(() => items).Contains(2); + } + + private static IEnumerable ThrowingMethod() + { + throw new InvalidOperationException("Test exception"); + } + + // Async lambda tests + [Test] + public async Task AsyncLambda_Collection_IsEmpty_Passes() + { + await Assert.That(async () => await GetEmptyCollectionAsync()).IsEmpty(); + } + + [Test] + public async Task AsyncLambda_Collection_IsNotEmpty_Passes() + { + await Assert.That(async () => await GetCollectionAsync()).IsNotEmpty(); + } + + [Test] + public async Task AsyncLambda_Collection_Count_IsEqualTo_Passes() + { + await Assert.That(async () => await GetCollectionAsync()).Count().IsEqualTo(3); + } + + [Test] + public async Task AsyncLambda_Collection_Contains_Passes() + { + await Assert.That(async () => await GetCollectionAsync()).Contains(2); + } + + [Test] + public async Task AsyncLambda_Collection_All_Passes() + { + await Assert.That(async () => await GetCollectionAsync()).All(x => x > 0); + } + + [Test] + public async Task AsyncLambda_Collection_Throws_Passes() + { + await Assert.That(async () => await ThrowingMethodAsync()).Throws(); + } + + [Test] + public async Task AsyncLambda_Collection_Chaining_With_And() + { + await Assert.That(async () => await GetCollectionAsync()) + .IsNotEmpty() + .And.Contains(2) + .And.HasDistinctItems(); + } + + private static Task> GetEmptyCollectionAsync() + { + return Task.FromResult>(new List()); + } + + private static Task> GetCollectionAsync() + { + return Task.FromResult>(new List { 1, 2, 3 }); + } + + private static async Task> ThrowingMethodAsync() + { + await Task.Yield(); + throw new InvalidOperationException("Test exception"); + } +} diff --git a/TUnit.Assertions/Extensions/Assert.cs b/TUnit.Assertions/Extensions/Assert.cs index 2e4a731f2e..c1835304b7 100644 --- a/TUnit.Assertions/Extensions/Assert.cs +++ b/TUnit.Assertions/Extensions/Assert.cs @@ -86,6 +86,20 @@ public static ValueAssertion That( return new ValueAssertion(value, expression); } + /// + /// Creates an assertion for a synchronous function that returns a collection. + /// This overload enables collection-specific assertions (IsEmpty, IsNotEmpty, HasCount, etc.) on lambda-wrapped collections. + /// Example: await Assert.That(() => GetItems()).IsEmpty(); + /// Example: await Assert.That(() => GetItems()).HasCount(5); + /// + [OverloadResolutionPriority(1)] + public static FuncCollectionAssertion That( + Func?> func, + [CallerArgumentExpression(nameof(func))] string? expression = null) + { + return new FuncCollectionAssertion(func!, expression); + } + /// /// Creates an assertion for a synchronous function. /// Example: await Assert.That(() => GetValue()).IsGreaterThan(10); @@ -97,6 +111,20 @@ public static FuncAssertion That( return new FuncAssertion(func, expression); } + /// + /// Creates an assertion for an asynchronous function that returns a collection. + /// This overload enables collection-specific assertions (IsEmpty, IsNotEmpty, HasCount, etc.) on async lambda-wrapped collections. + /// Example: await Assert.That(async () => await GetItemsAsync()).IsEmpty(); + /// Example: await Assert.That(async () => await GetItemsAsync()).HasCount(5); + /// + [OverloadResolutionPriority(1)] + public static AsyncFuncCollectionAssertion That( + Func?>> func, + [CallerArgumentExpression(nameof(func))] string? expression = null) + { + return new AsyncFuncCollectionAssertion(func!, expression); + } + /// /// Creates an assertion for an asynchronous function. /// Example: await Assert.That(async () => await GetValueAsync()).IsEqualTo(expected); diff --git a/TUnit.Assertions/Sources/AsyncFuncCollectionAssertion.cs b/TUnit.Assertions/Sources/AsyncFuncCollectionAssertion.cs new file mode 100644 index 0000000000..1e0512e4e7 --- /dev/null +++ b/TUnit.Assertions/Sources/AsyncFuncCollectionAssertion.cs @@ -0,0 +1,60 @@ +using System.Text; +using TUnit.Assertions.Conditions; +using TUnit.Assertions.Core; + +namespace TUnit.Assertions.Sources; + +/// +/// Source assertion for asynchronous functions that return collections. +/// This is the entry point for: Assert.That(async () => await GetCollectionAsync()) +/// Combines the lazy evaluation of AsyncFuncAssertion with the collection methods of CollectionAssertionBase. +/// Enables collection assertions like IsEmpty(), IsNotEmpty(), HasCount() on async lambda-wrapped collections. +/// +public class AsyncFuncCollectionAssertion : CollectionAssertionBase, TItem>, IDelegateAssertionSource> +{ + public AsyncFuncCollectionAssertion(Func?>> func, string? expression) + : base(CreateContext(func, expression)) + { + } + + private static AssertionContext> CreateContext(Func?>> func, string? expression) + { + var expressionBuilder = new StringBuilder(); + expressionBuilder.Append($"Assert.That({expression ?? "?"})"); + var evaluationContext = new EvaluationContext>(async () => + { + try + { + var result = await func().ConfigureAwait(false); + return (result, null); + } + catch (Exception ex) + { + return (default, ex); + } + }); + return new AssertionContext>(evaluationContext, expressionBuilder); + } + + /// + /// Asserts that the function throws the specified exception type (or subclass). + /// Example: await Assert.That(async () => await GetItemsAsync()).Throws<InvalidOperationException>(); + /// + public ThrowsAssertion Throws() where TException : Exception + { + Context.ExpressionBuilder.Append($".Throws<{typeof(TException).Name}>()"); + var mappedContext = Context.MapException(); + return new ThrowsAssertion(mappedContext!); + } + + /// + /// Asserts that the function throws exactly the specified exception type (not subclasses). + /// Example: await Assert.That(async () => await GetItemsAsync()).ThrowsExactly<InvalidOperationException>(); + /// + public ThrowsExactlyAssertion ThrowsExactly() where TException : Exception + { + Context.ExpressionBuilder.Append($".ThrowsExactly<{typeof(TException).Name}>()"); + var mappedContext = Context.MapException(); + return new ThrowsExactlyAssertion(mappedContext!); + } +} diff --git a/TUnit.Assertions/Sources/FuncCollectionAssertion.cs b/TUnit.Assertions/Sources/FuncCollectionAssertion.cs new file mode 100644 index 0000000000..dc4117846a --- /dev/null +++ b/TUnit.Assertions/Sources/FuncCollectionAssertion.cs @@ -0,0 +1,60 @@ +using System.Text; +using TUnit.Assertions.Conditions; +using TUnit.Assertions.Core; + +namespace TUnit.Assertions.Sources; + +/// +/// Source assertion for synchronous functions that return collections. +/// This is the entry point for: Assert.That(() => GetCollection()) +/// Combines the lazy evaluation of FuncAssertion with the collection methods of CollectionAssertionBase. +/// Enables collection assertions like IsEmpty(), IsNotEmpty(), HasCount() on lambda-wrapped collections. +/// +public class FuncCollectionAssertion : CollectionAssertionBase, TItem>, IDelegateAssertionSource> +{ + public FuncCollectionAssertion(Func?> func, string? expression) + : base(CreateContext(func, expression)) + { + } + + private static AssertionContext> CreateContext(Func?> func, string? expression) + { + var expressionBuilder = new StringBuilder(); + expressionBuilder.Append($"Assert.That({expression ?? "?"})"); + var evaluationContext = new EvaluationContext>(() => + { + try + { + var result = func(); + return Task.FromResult<(IEnumerable?, Exception?)>((result, null)); + } + catch (Exception ex) + { + return Task.FromResult<(IEnumerable?, Exception?)>((default, ex)); + } + }); + return new AssertionContext>(evaluationContext, expressionBuilder); + } + + /// + /// Asserts that the function throws the specified exception type (or subclass). + /// Example: await Assert.That(() => GetItems()).Throws<InvalidOperationException>(); + /// + public ThrowsAssertion Throws() where TException : Exception + { + Context.ExpressionBuilder.Append($".Throws<{typeof(TException).Name}>()"); + var mappedContext = Context.MapException(); + return new ThrowsAssertion(mappedContext!); + } + + /// + /// Asserts that the function throws exactly the specified exception type (not subclasses). + /// Example: await Assert.That(() => GetItems()).ThrowsExactly<InvalidOperationException>(); + /// + public ThrowsExactlyAssertion ThrowsExactly() where TException : Exception + { + Context.ExpressionBuilder.Append($".ThrowsExactly<{typeof(TException).Name}>()"); + var mappedContext = Context.MapException(); + return new ThrowsExactlyAssertion(mappedContext!); + } +} diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 24dee33ea7..e1e5f6bbf0 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -21,6 +21,10 @@ namespace public static . That(string? value, [.("value")] string? expression = null) { } [.(1)] public static . That(.? value, [.("value")] string? expression = null) { } + [.(1)] + public static . That(<.?> func, [.("func")] string? expression = null) { } + [.(1)] + public static . That(<.<.?>> func, [.("func")] string? expression = null) { } public static . That(<.> func, [.("func")] string? expression = null) { } public static . That( func, [.("func")] string? expression = null) { } public static . That(. task, [.("task")] string? expression = null) { } @@ -4341,6 +4345,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class AsyncFuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public AsyncFuncCollectionAssertion(<.<.?>> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public abstract class CollectionAssertionBase : ., ., . where TCollection : . { @@ -4423,6 +4435,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class FuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public FuncCollectionAssertion(<.?> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public class TaskAssertion : ., .<.>, ., . { public TaskAssertion(. task, string? expression) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 9f3c6cccc7..d5b2de52a2 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -19,6 +19,8 @@ namespace public static . That(. task, [.("task")] string? expression = null) { } public static . That(string? value, [.("value")] string? expression = null) { } public static . That(.? value, [.("value")] string? expression = null) { } + public static . That(<.?> func, [.("func")] string? expression = null) { } + public static . That(<.<.?>> func, [.("func")] string? expression = null) { } public static . That(<.> func, [.("func")] string? expression = null) { } public static . That( func, [.("func")] string? expression = null) { } public static . That(. task, [.("task")] string? expression = null) { } @@ -4321,6 +4323,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class AsyncFuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public AsyncFuncCollectionAssertion(<.<.?>> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public abstract class CollectionAssertionBase : ., ., . where TCollection : . { @@ -4403,6 +4413,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class FuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public FuncCollectionAssertion(<.?> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public class TaskAssertion : ., .<.>, ., . { public TaskAssertion(. task, string? expression) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index ea9a094de1..a6c9c27621 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -21,6 +21,10 @@ namespace public static . That(string? value, [.("value")] string? expression = null) { } [.(1)] public static . That(.? value, [.("value")] string? expression = null) { } + [.(1)] + public static . That(<.?> func, [.("func")] string? expression = null) { } + [.(1)] + public static . That(<.<.?>> func, [.("func")] string? expression = null) { } public static . That(<.> func, [.("func")] string? expression = null) { } public static . That( func, [.("func")] string? expression = null) { } public static . That(. task, [.("task")] string? expression = null) { } @@ -4341,6 +4345,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class AsyncFuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public AsyncFuncCollectionAssertion(<.<.?>> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public abstract class CollectionAssertionBase : ., ., . where TCollection : . { @@ -4423,6 +4435,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class FuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public FuncCollectionAssertion(<.?> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public class TaskAssertion : ., .<.>, ., . { public TaskAssertion(. task, string? expression) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index 6444294fe0..6e579544ed 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -19,6 +19,8 @@ namespace public static . That(. task, [.("task")] string? expression = null) { } public static . That(string? value, [.("value")] string? expression = null) { } public static . That(.? value, [.("value")] string? expression = null) { } + public static . That(<.?> func, [.("func")] string? expression = null) { } + public static . That(<.<.?>> func, [.("func")] string? expression = null) { } public static . That(<.> func, [.("func")] string? expression = null) { } public static . That( func, [.("func")] string? expression = null) { } public static . That(. task, [.("task")] string? expression = null) { } @@ -3810,6 +3812,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class AsyncFuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public AsyncFuncCollectionAssertion(<.<.?>> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public abstract class CollectionAssertionBase : ., ., . where TCollection : . { @@ -3892,6 +3902,14 @@ namespace .Sources public . ThrowsExactly() where TException : { } } + public class FuncCollectionAssertion : .<., TItem>, ., .<.>, .<.> + { + public FuncCollectionAssertion(<.?> func, string? expression) { } + public . Throws() + where TException : { } + public . ThrowsExactly() + where TException : { } + } public class TaskAssertion : ., .<.>, ., . { public TaskAssertion(. task, string? expression) { } From 7d5e29311f7f2ed23f91778bd9f68ef8a967c6e0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 28 Nov 2025 00:16:25 +0000 Subject: [PATCH 101/192] feat: add disposal execution support in hook executors and related tests (#3928) --- .../Executors/GenericAbstractExecutor.cs | 5 +++ TUnit.Core/Interfaces/IHookExecutor.cs | 7 ++++ .../ReflectionHookDiscoveryService.cs | 3 ++ .../Services/TestExecution/TestCoordinator.cs | 4 ++- TUnit.Engine/TestExecutor.cs | 16 +++++++-- ...Has_No_API_Changes.DotNet10_0.verified.txt | 2 ++ ..._Has_No_API_Changes.DotNet8_0.verified.txt | 2 ++ ..._Has_No_API_Changes.DotNet9_0.verified.txt | 2 ++ ...ary_Has_No_API_Changes.Net4_7.verified.txt | 2 ++ TUnit.TestProject/SetHookExecutorTests.cs | 33 +++++++++++++++++++ 10 files changed, 73 insertions(+), 3 deletions(-) diff --git a/TUnit.Core/Executors/GenericAbstractExecutor.cs b/TUnit.Core/Executors/GenericAbstractExecutor.cs index 8631771b9e..8be73248ba 100644 --- a/TUnit.Core/Executors/GenericAbstractExecutor.cs +++ b/TUnit.Core/Executors/GenericAbstractExecutor.cs @@ -57,6 +57,11 @@ public ValueTask ExecuteAfterTestHook(MethodMetadata hookMethodInfo, TestContext return ExecuteAsync(action); } + public ValueTask ExecuteDisposal(TestContext context, Func action) + { + return ExecuteAsync(action); + } + public ValueTask ExecuteTest(TestContext context, Func action) { return ExecuteAsync(action); diff --git a/TUnit.Core/Interfaces/IHookExecutor.cs b/TUnit.Core/Interfaces/IHookExecutor.cs index 6d3d1c8e81..13ec72d8fd 100644 --- a/TUnit.Core/Interfaces/IHookExecutor.cs +++ b/TUnit.Core/Interfaces/IHookExecutor.cs @@ -13,4 +13,11 @@ public interface IHookExecutor ValueTask ExecuteAfterAssemblyHook(MethodMetadata hookMethodInfo, AssemblyHookContext context, Func action); ValueTask ExecuteAfterClassHook(MethodMetadata hookMethodInfo, ClassHookContext context, Func action); ValueTask ExecuteAfterTestHook(MethodMetadata hookMethodInfo, TestContext context, Func action); + +#if NETSTANDARD2_0 + ValueTask ExecuteDisposal(TestContext context, Func action); +#else + ValueTask ExecuteDisposal(TestContext context, Func action) + => action(); +#endif } diff --git a/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs b/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs index cc3954b121..de062bd768 100644 --- a/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs +++ b/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs @@ -1029,4 +1029,7 @@ public ValueTask ExecuteBeforeTestSessionHook(MethodMetadata testMethod, TestSes public ValueTask ExecuteAfterTestSessionHook(MethodMetadata testMethod, TestSessionContext context, Func action) => action(); + + public ValueTask ExecuteDisposal(TestContext context, Func action) + => action(); } diff --git a/TUnit.Engine/Services/TestExecution/TestCoordinator.cs b/TUnit.Engine/Services/TestExecution/TestCoordinator.cs index c34181a332..928f603df0 100644 --- a/TUnit.Engine/Services/TestExecution/TestCoordinator.cs +++ b/TUnit.Engine/Services/TestExecution/TestCoordinator.cs @@ -1,6 +1,7 @@ using System.Linq; using TUnit.Core; using TUnit.Core.Exceptions; +using TUnit.Core.Interfaces; using TUnit.Core.Logging; using TUnit.Core.Tracking; using TUnit.Engine.Helpers; @@ -152,7 +153,8 @@ await TimeoutHelper.ExecuteWithTimeoutAsync( try { - await TestExecutor.DisposeTestInstance(test).ConfigureAwait(false); + var hookExecutor = test.Context.CustomHookExecutor; + await TestExecutor.DisposeTestInstance(test, hookExecutor).ConfigureAwait(false); } catch (Exception disposeEx) { diff --git a/TUnit.Engine/TestExecutor.cs b/TUnit.Engine/TestExecutor.cs index 18a3a21430..8418bcb322 100644 --- a/TUnit.Engine/TestExecutor.cs +++ b/TUnit.Engine/TestExecutor.cs @@ -247,12 +247,12 @@ public IContextProvider GetContextProvider() return _contextProvider; } - internal static async Task DisposeTestInstance(AbstractExecutableTest test) + internal static async Task DisposeTestInstance(AbstractExecutableTest test, IHookExecutor? hookExecutor = null) { // Dispose the test instance if it's disposable if (test.Context.Metadata.TestDetails.ClassInstance is not SkippedTestInstance) { - try + async ValueTask DisposeAsync() { var instance = test.Context.Metadata.TestDetails.ClassInstance; @@ -266,6 +266,18 @@ internal static async Task DisposeTestInstance(AbstractExecutableTest test) break; } } + + try + { + if (hookExecutor != null) + { + await hookExecutor.ExecuteDisposal(test.Context, DisposeAsync).ConfigureAwait(false); + } + else + { + await DisposeAsync().ConfigureAwait(false); + } + } catch { // Swallow disposal errors - they shouldn't fail the test diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 556486d6e4..8dd30a5468 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -749,6 +749,7 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } + public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2269,6 +2270,7 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); + . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 8bbca55ff3..917f3ce1f2 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -749,6 +749,7 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } + public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2269,6 +2270,7 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); + . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index e7945a9846..dc18aa6f69 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -749,6 +749,7 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } + public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2269,6 +2270,7 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); + . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index dd3923472e..7cfcb2a8fc 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -726,6 +726,7 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } + public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2201,6 +2202,7 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); + . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.TestProject/SetHookExecutorTests.cs b/TUnit.TestProject/SetHookExecutorTests.cs index 5d11036a32..dc2427011b 100644 --- a/TUnit.TestProject/SetHookExecutorTests.cs +++ b/TUnit.TestProject/SetHookExecutorTests.cs @@ -117,3 +117,36 @@ public async Task Test_StaticHooksExecuteInCustomExecutor() await Assert.That(Thread.CurrentThread.Name).IsEqualTo("CrossPlatformTestExecutor"); } } + +/// +/// Tests demonstrating SetHookExecutor affects disposal execution - Issue #3918 +/// +[EngineTest(ExpectedResult.Pass)] +[SetBothExecutors] // This attribute sets both executors +public class DisposalWithHookExecutorTests : IAsyncDisposable +{ + private static bool _disposalExecutedInCustomExecutor; + + [Test] + public async Task Test_ExecutesInCustomExecutor() + { + // Test should execute in custom executor + await Assert.That(Thread.CurrentThread.Name).IsEqualTo("CrossPlatformTestExecutor"); + await Assert.That(CrossPlatformTestExecutor.IsRunningInTestExecutor.Value).IsTrue(); + } + + public ValueTask DisposeAsync() + { + // Verify disposal runs in the custom executor + _disposalExecutedInCustomExecutor = + Thread.CurrentThread.Name == "CrossPlatformTestExecutor" && + CrossPlatformTestExecutor.IsRunningInTestExecutor.Value; + return default; + } + + [After(Class)] + public static async Task VerifyDisposalRanInCustomExecutor(ClassHookContext context) + { + await Assert.That(_disposalExecutedInCustomExecutor).IsTrue(); + } +} From 8894b3f8b94b06f95a76084defba0b41ea5c6fed Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 28 Nov 2025 00:29:44 +0000 Subject: [PATCH 102/192] chore: update benchmark results (#3929) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 98eed244c2..f724f6c0e5 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 567.1 ms | 566.4 ms | 2.57 ms | -| NUnit | 4.4.0 | 688.2 ms | 683.1 ms | 13.62 ms | -| MSTest | 4.0.2 | 658.5 ms | 659.6 ms | 10.71 ms | -| xUnit3 | 3.2.0 | 736.1 ms | 733.4 ms | 13.54 ms | -| **TUnit (AOT)** | 1.2.11 | 124.7 ms | 124.8 ms | 0.42 ms | +| **TUnit** | 1.2.11 | 576.3 ms | 576.2 ms | 5.87 ms | +| NUnit | 4.4.0 | 689.7 ms | 688.0 ms | 7.29 ms | +| MSTest | 4.0.2 | 644.4 ms | 643.1 ms | 9.95 ms | +| xUnit3 | 3.2.0 | 734.3 ms | 729.7 ms | 10.57 ms | +| **TUnit (AOT)** | 1.2.11 | 124.6 ms | 124.6 ms | 0.44 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 884 - bar [567.1, 688.2, 658.5, 736.1, 124.7] + y-axis "Time (ms)" 0 --> 882 + bar [576.3, 689.7, 644.4, 734.3, 124.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-11-28T00:29:30.392Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 0e293d83f3..158719761e 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.043 s | 2.035 s | 0.0196 s | -| Build_NUnit | 4.4.0 | 1.639 s | 1.639 s | 0.0088 s | -| Build_MSTest | 4.0.2 | 1.715 s | 1.712 s | 0.0172 s | -| Build_xUnit3 | 3.2.0 | 1.616 s | 1.621 s | 0.0283 s | +| **TUnit** | 1.2.11 | 2.206 s | 2.201 s | 0.0426 s | +| Build_NUnit | 4.4.0 | 1.761 s | 1.762 s | 0.0320 s | +| Build_MSTest | 4.0.2 | 1.828 s | 1.830 s | 0.0351 s | +| Build_xUnit3 | 3.2.0 | 1.709 s | 1.702 s | 0.0388 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.043, 1.639, 1.715, 1.616] + bar [2.206, 1.761, 1.828, 1.709] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.447Z* +*Last generated: 2025-11-28T00:29:30.394Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 3c58c40c9d..011a6413ee 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 497.25 ms | 497.97 ms | 3.518 ms | -| NUnit | 4.4.0 | 526.05 ms | 524.98 ms | 6.301 ms | -| MSTest | 4.0.2 | 482.94 ms | 483.13 ms | 10.339 ms | -| xUnit3 | 3.2.0 | 573.56 ms | 576.44 ms | 10.043 ms | -| **TUnit (AOT)** | 1.2.11 | 24.70 ms | 24.72 ms | 0.182 ms | +| **TUnit** | 1.2.11 | 482.09 ms | 480.78 ms | 4.482 ms | +| NUnit | 4.4.0 | 675.54 ms | 671.70 ms | 18.149 ms | +| MSTest | 4.0.2 | 662.49 ms | 662.42 ms | 5.452 ms | +| xUnit3 | 3.2.0 | 675.22 ms | 672.45 ms | 9.573 ms | +| **TUnit (AOT)** | 1.2.11 | 24.02 ms | 24.07 ms | 0.159 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 689 - bar [497.25, 526.05, 482.94, 573.56, 24.7] + y-axis "Time (ms)" 0 --> 811 + bar [482.09, 675.54, 662.49, 675.22, 24.02] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-11-28T00:29:30.392Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 9136b82712..40c75035ab 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 623.3 ms | 624.8 ms | 4.14 ms | -| NUnit | 4.4.0 | 1,212.4 ms | 1,210.2 ms | 9.48 ms | -| MSTest | 4.0.2 | 3,001.4 ms | 2,999.8 ms | 10.05 ms | -| xUnit3 | 3.2.0 | 3,086.1 ms | 3,086.8 ms | 7.57 ms | -| **TUnit (AOT)** | 1.2.11 | 132.7 ms | 132.6 ms | 0.54 ms | +| **TUnit** | 1.2.11 | 599.1 ms | 597.3 ms | 5.47 ms | +| NUnit | 4.4.0 | 1,205.9 ms | 1,207.4 ms | 4.44 ms | +| MSTest | 4.0.2 | 2,989.7 ms | 2,990.1 ms | 9.41 ms | +| xUnit3 | 3.2.0 | 3,076.8 ms | 3,076.2 ms | 9.36 ms | +| **TUnit (AOT)** | 1.2.11 | 131.0 ms | 131.0 ms | 0.47 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3704 - bar [623.3, 1212.4, 3001.4, 3086.1, 132.7] + y-axis "Time (ms)" 0 --> 3693 + bar [599.1, 1205.9, 2989.7, 3076.8, 131] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-11-28T00:29:30.393Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 7b17a6c761..69998c8c9f 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 566.13 ms | 565.43 ms | 6.050 ms | -| NUnit | 4.4.0 | 1,578.62 ms | 1,578.58 ms | 6.773 ms | -| MSTest | 4.0.2 | 1,539.67 ms | 1,540.17 ms | 3.979 ms | -| xUnit3 | 3.2.0 | 1,625.28 ms | 1,624.99 ms | 11.364 ms | -| **TUnit (AOT)** | 1.2.11 | 79.52 ms | 79.55 ms | 0.341 ms | +| **TUnit** | 1.2.11 | 563.40 ms | 563.35 ms | 4.161 ms | +| NUnit | 4.4.0 | 1,537.43 ms | 1,536.67 ms | 8.606 ms | +| MSTest | 4.0.2 | 1,490.73 ms | 1,491.63 ms | 5.278 ms | +| xUnit3 | 3.2.0 | 1,582.33 ms | 1,582.19 ms | 8.848 ms | +| **TUnit (AOT)** | 1.2.11 | 79.14 ms | 78.95 ms | 0.395 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1951 - bar [566.13, 1578.62, 1539.67, 1625.28, 79.52] + y-axis "Time (ms)" 0 --> 1899 + bar [563.4, 1537.43, 1490.73, 1582.33, 79.14] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-11-28T00:29:30.393Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index c459176451..bc4a26f2fd 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 522.37 ms | 521.16 ms | 5.026 ms | -| NUnit | 4.4.0 | 611.57 ms | 612.00 ms | 8.234 ms | -| MSTest | 4.0.2 | 615.51 ms | 617.04 ms | 9.675 ms | -| xUnit3 | 3.2.0 | 614.63 ms | 610.65 ms | 7.412 ms | -| **TUnit (AOT)** | 1.2.11 | 43.96 ms | 44.10 ms | 3.394 ms | +| **TUnit** | 1.2.11 | 532.88 ms | 531.46 ms | 3.588 ms | +| NUnit | 4.4.0 | 582.78 ms | 583.36 ms | 6.070 ms | +| MSTest | 4.0.2 | 500.42 ms | 498.63 ms | 6.733 ms | +| xUnit3 | 3.2.0 | 593.09 ms | 591.89 ms | 6.914 ms | +| **TUnit (AOT)** | 1.2.11 | 45.31 ms | 45.54 ms | 3.177 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 739 - bar [522.37, 611.57, 615.51, 614.63, 43.96] + y-axis "Time (ms)" 0 --> 712 + bar [532.88, 582.78, 500.42, 593.09, 45.31] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-11-28T00:29:30.393Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 348cafc187..45ed94ac63 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 575.6 ms | 575.7 ms | 4.64 ms | -| NUnit | 4.4.0 | 1,194.3 ms | 1,195.1 ms | 6.50 ms | -| MSTest | 4.0.2 | 1,165.8 ms | 1,164.6 ms | 9.87 ms | -| xUnit3 | 3.2.0 | 1,258.5 ms | 1,258.8 ms | 7.83 ms | +| **TUnit** | 1.2.11 | 571.6 ms | 571.4 ms | 3.64 ms | +| NUnit | 4.4.0 | 1,159.0 ms | 1,158.6 ms | 8.21 ms | +| MSTest | 4.0.2 | 1,138.2 ms | 1,134.9 ms | 12.44 ms | +| xUnit3 | 3.2.0 | 1,210.7 ms | 1,208.0 ms | 11.71 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1511 - bar [575.6, 1194.3, 1165.8, 1258.5, 0] + y-axis "Time (ms)" 0 --> 1453 + bar [571.6, 1159, 1138.2, 1210.7, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.447Z* +*Last generated: 2025-11-28T00:29:30.394Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 871d642265..96007a9dd5 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-27** from the latest CI run. +These benchmarks were automatically generated on **2025-11-28** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-27T00:28:35.447Z* +*Last generated: 2025-11-28T00:29:30.395Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index d31c3d85de..384f49b3ff 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-11-28T00:29:30.392Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "567.1 ms", - "Error": "3.08 ms", - "StdDev": "2.57 ms", - "Median": "566.4 ms" + "Mean": "576.3 ms", + "Error": "6.27 ms", + "StdDev": "5.87 ms", + "Median": "576.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "688.2 ms", - "Error": "13.26 ms", - "StdDev": "13.62 ms", - "Median": "683.1 ms" + "Mean": "689.7 ms", + "Error": "7.79 ms", + "StdDev": "7.29 ms", + "Median": "688.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "658.5 ms", - "Error": "12.82 ms", - "StdDev": "10.71 ms", - "Median": "659.6 ms" + "Mean": "644.4 ms", + "Error": "10.64 ms", + "StdDev": "9.95 ms", + "Median": "643.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "736.1 ms", - "Error": "14.47 ms", - "StdDev": "13.54 ms", - "Median": "733.4 ms" + "Mean": "734.3 ms", + "Error": "11.92 ms", + "StdDev": "10.57 ms", + "Median": "729.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.7 ms", - "Error": "0.45 ms", - "StdDev": "0.42 ms", - "Median": "124.8 ms" + "Mean": "124.6 ms", + "Error": "0.53 ms", + "StdDev": "0.44 ms", + "Median": "124.6 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index c71476e2e7..cb7377955e 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.447Z", + "timestamp": "2025-11-28T00:29:30.394Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.043 s", - "Error": "0.0210 s", - "StdDev": "0.0196 s", - "Median": "2.035 s" + "Mean": "2.206 s", + "Error": "0.0434 s", + "StdDev": "0.0426 s", + "Median": "2.201 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.639 s", - "Error": "0.0094 s", - "StdDev": "0.0088 s", - "Median": "1.639 s" + "Mean": "1.761 s", + "Error": "0.0342 s", + "StdDev": "0.0320 s", + "Median": "1.762 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.715 s", - "Error": "0.0184 s", - "StdDev": "0.0172 s", - "Median": "1.712 s" + "Mean": "1.828 s", + "Error": "0.0357 s", + "StdDev": "0.0351 s", + "Median": "1.830 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.616 s", - "Error": "0.0302 s", - "StdDev": "0.0283 s", - "Median": "1.621 s" + "Mean": "1.709 s", + "Error": "0.0326 s", + "StdDev": "0.0388 s", + "Median": "1.702 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index cf5ab9e10b..03555befdf 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-11-28T00:29:30.392Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "497.25 ms", - "Error": "4.213 ms", - "StdDev": "3.518 ms", - "Median": "497.97 ms" + "Mean": "482.09 ms", + "Error": "4.791 ms", + "StdDev": "4.482 ms", + "Median": "480.78 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "526.05 ms", - "Error": "7.107 ms", - "StdDev": "6.301 ms", - "Median": "524.98 ms" + "Mean": "675.54 ms", + "Error": "13.259 ms", + "StdDev": "18.149 ms", + "Median": "671.70 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "482.94 ms", - "Error": "9.302 ms", - "StdDev": "10.339 ms", - "Median": "483.13 ms" + "Mean": "662.49 ms", + "Error": "6.150 ms", + "StdDev": "5.452 ms", + "Median": "662.42 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "573.56 ms", - "Error": "10.737 ms", - "StdDev": "10.043 ms", - "Median": "576.44 ms" + "Mean": "675.22 ms", + "Error": "10.234 ms", + "StdDev": "9.573 ms", + "Median": "672.45 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.70 ms", - "Error": "0.194 ms", - "StdDev": "0.182 ms", - "Median": "24.72 ms" + "Mean": "24.02 ms", + "Error": "0.204 ms", + "StdDev": "0.159 ms", + "Median": "24.07 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 3bbbbc8549..dab0cbdcbc 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-11-28T00:29:30.393Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "623.3 ms", - "Error": "4.42 ms", - "StdDev": "4.14 ms", - "Median": "624.8 ms" + "Mean": "599.1 ms", + "Error": "5.85 ms", + "StdDev": "5.47 ms", + "Median": "597.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,212.4 ms", - "Error": "10.13 ms", - "StdDev": "9.48 ms", - "Median": "1,210.2 ms" + "Mean": "1,205.9 ms", + "Error": "5.68 ms", + "StdDev": "4.44 ms", + "Median": "1,207.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,001.4 ms", - "Error": "12.87 ms", - "StdDev": "10.05 ms", - "Median": "2,999.8 ms" + "Mean": "2,989.7 ms", + "Error": "10.61 ms", + "StdDev": "9.41 ms", + "Median": "2,990.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,086.1 ms", - "Error": "9.06 ms", - "StdDev": "7.57 ms", - "Median": "3,086.8 ms" + "Mean": "3,076.8 ms", + "Error": "10.56 ms", + "StdDev": "9.36 ms", + "Median": "3,076.2 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "132.7 ms", - "Error": "0.58 ms", - "StdDev": "0.54 ms", - "Median": "132.6 ms" + "Mean": "131.0 ms", + "Error": "0.57 ms", + "StdDev": "0.47 ms", + "Median": "131.0 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 8d10cf0aa4..48ce72d043 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-11-28T00:29:30.393Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "566.13 ms", - "Error": "6.468 ms", - "StdDev": "6.050 ms", - "Median": "565.43 ms" + "Mean": "563.40 ms", + "Error": "4.448 ms", + "StdDev": "4.161 ms", + "Median": "563.35 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,578.62 ms", - "Error": "7.240 ms", - "StdDev": "6.773 ms", - "Median": "1,578.58 ms" + "Mean": "1,537.43 ms", + "Error": "9.709 ms", + "StdDev": "8.606 ms", + "Median": "1,536.67 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,539.67 ms", - "Error": "4.489 ms", - "StdDev": "3.979 ms", - "Median": "1,540.17 ms" + "Mean": "1,490.73 ms", + "Error": "6.760 ms", + "StdDev": "5.278 ms", + "Median": "1,491.63 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,625.28 ms", - "Error": "13.608 ms", - "StdDev": "11.364 ms", - "Median": "1,624.99 ms" + "Mean": "1,582.33 ms", + "Error": "9.459 ms", + "StdDev": "8.848 ms", + "Median": "1,582.19 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.52 ms", - "Error": "0.365 ms", - "StdDev": "0.341 ms", - "Median": "79.55 ms" + "Mean": "79.14 ms", + "Error": "0.422 ms", + "StdDev": "0.395 ms", + "Median": "78.95 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 7cd77e77f9..cf0e543d7f 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-11-28T00:29:30.394Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "522.37 ms", - "Error": "5.373 ms", - "StdDev": "5.026 ms", - "Median": "521.16 ms" + "Mean": "532.88 ms", + "Error": "4.048 ms", + "StdDev": "3.588 ms", + "Median": "531.46 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "611.57 ms", - "Error": "9.860 ms", - "StdDev": "8.234 ms", - "Median": "612.00 ms" + "Mean": "582.78 ms", + "Error": "6.489 ms", + "StdDev": "6.070 ms", + "Median": "583.36 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.51 ms", - "Error": "10.914 ms", - "StdDev": "9.675 ms", - "Median": "617.04 ms" + "Mean": "500.42 ms", + "Error": "8.063 ms", + "StdDev": "6.733 ms", + "Median": "498.63 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "614.63 ms", - "Error": "8.361 ms", - "StdDev": "7.412 ms", - "Median": "610.65 ms" + "Mean": "593.09 ms", + "Error": "7.391 ms", + "StdDev": "6.914 ms", + "Median": "591.89 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "43.96 ms", - "Error": "1.151 ms", - "StdDev": "3.394 ms", - "Median": "44.10 ms" + "Mean": "45.31 ms", + "Error": "1.083 ms", + "StdDev": "3.177 ms", + "Median": "45.54 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index d3f8eaa939..6e51c813d1 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.447Z", + "timestamp": "2025-11-28T00:29:30.394Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "575.6 ms", - "Error": "4.96 ms", - "StdDev": "4.64 ms", - "Median": "575.7 ms" + "Mean": "571.6 ms", + "Error": "3.90 ms", + "StdDev": "3.64 ms", + "Median": "571.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,194.3 ms", - "Error": "7.33 ms", - "StdDev": "6.50 ms", - "Median": "1,195.1 ms" + "Mean": "1,159.0 ms", + "Error": "8.78 ms", + "StdDev": "8.21 ms", + "Median": "1,158.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,165.8 ms", - "Error": "10.55 ms", - "StdDev": "9.87 ms", - "Median": "1,164.6 ms" + "Mean": "1,138.2 ms", + "Error": "14.90 ms", + "StdDev": "12.44 ms", + "Median": "1,134.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,258.5 ms", - "Error": "8.37 ms", - "StdDev": "7.83 ms", - "Median": "1,258.8 ms" + "Mean": "1,210.7 ms", + "Error": "13.21 ms", + "StdDev": "11.71 ms", + "Median": "1,208.0 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 943a897347..7e87f525fb 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -82,5 +82,9 @@ { "date": "2025-11-27", "environment": "Ubuntu" + }, + { + "date": "2025-11-28", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 45e79f39d6..3873d462f2 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-27T00:28:35.447Z", + "timestamp": "2025-11-28T00:29:30.395Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "567.1 ms", - "Error": "3.08 ms", - "StdDev": "2.57 ms", - "Median": "566.4 ms" + "Mean": "576.3 ms", + "Error": "6.27 ms", + "StdDev": "5.87 ms", + "Median": "576.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "688.2 ms", - "Error": "13.26 ms", - "StdDev": "13.62 ms", - "Median": "683.1 ms" + "Mean": "689.7 ms", + "Error": "7.79 ms", + "StdDev": "7.29 ms", + "Median": "688.0 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "658.5 ms", - "Error": "12.82 ms", - "StdDev": "10.71 ms", - "Median": "659.6 ms" + "Mean": "644.4 ms", + "Error": "10.64 ms", + "StdDev": "9.95 ms", + "Median": "643.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "736.1 ms", - "Error": "14.47 ms", - "StdDev": "13.54 ms", - "Median": "733.4 ms" + "Mean": "734.3 ms", + "Error": "11.92 ms", + "StdDev": "10.57 ms", + "Median": "729.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.7 ms", - "Error": "0.45 ms", - "StdDev": "0.42 ms", - "Median": "124.8 ms" + "Mean": "124.6 ms", + "Error": "0.53 ms", + "StdDev": "0.44 ms", + "Median": "124.6 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "497.25 ms", - "Error": "4.213 ms", - "StdDev": "3.518 ms", - "Median": "497.97 ms" + "Mean": "482.09 ms", + "Error": "4.791 ms", + "StdDev": "4.482 ms", + "Median": "480.78 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "526.05 ms", - "Error": "7.107 ms", - "StdDev": "6.301 ms", - "Median": "524.98 ms" + "Mean": "675.54 ms", + "Error": "13.259 ms", + "StdDev": "18.149 ms", + "Median": "671.70 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "482.94 ms", - "Error": "9.302 ms", - "StdDev": "10.339 ms", - "Median": "483.13 ms" + "Mean": "662.49 ms", + "Error": "6.150 ms", + "StdDev": "5.452 ms", + "Median": "662.42 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "573.56 ms", - "Error": "10.737 ms", - "StdDev": "10.043 ms", - "Median": "576.44 ms" + "Mean": "675.22 ms", + "Error": "10.234 ms", + "StdDev": "9.573 ms", + "Median": "672.45 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.70 ms", - "Error": "0.194 ms", - "StdDev": "0.182 ms", - "Median": "24.72 ms" + "Mean": "24.02 ms", + "Error": "0.204 ms", + "StdDev": "0.159 ms", + "Median": "24.07 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "623.3 ms", - "Error": "4.42 ms", - "StdDev": "4.14 ms", - "Median": "624.8 ms" + "Mean": "599.1 ms", + "Error": "5.85 ms", + "StdDev": "5.47 ms", + "Median": "597.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,212.4 ms", - "Error": "10.13 ms", - "StdDev": "9.48 ms", - "Median": "1,210.2 ms" + "Mean": "1,205.9 ms", + "Error": "5.68 ms", + "StdDev": "4.44 ms", + "Median": "1,207.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,001.4 ms", - "Error": "12.87 ms", - "StdDev": "10.05 ms", - "Median": "2,999.8 ms" + "Mean": "2,989.7 ms", + "Error": "10.61 ms", + "StdDev": "9.41 ms", + "Median": "2,990.1 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,086.1 ms", - "Error": "9.06 ms", - "StdDev": "7.57 ms", - "Median": "3,086.8 ms" + "Mean": "3,076.8 ms", + "Error": "10.56 ms", + "StdDev": "9.36 ms", + "Median": "3,076.2 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "132.7 ms", - "Error": "0.58 ms", - "StdDev": "0.54 ms", - "Median": "132.6 ms" + "Mean": "131.0 ms", + "Error": "0.57 ms", + "StdDev": "0.47 ms", + "Median": "131.0 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "566.13 ms", - "Error": "6.468 ms", - "StdDev": "6.050 ms", - "Median": "565.43 ms" + "Mean": "563.40 ms", + "Error": "4.448 ms", + "StdDev": "4.161 ms", + "Median": "563.35 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,578.62 ms", - "Error": "7.240 ms", - "StdDev": "6.773 ms", - "Median": "1,578.58 ms" + "Mean": "1,537.43 ms", + "Error": "9.709 ms", + "StdDev": "8.606 ms", + "Median": "1,536.67 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,539.67 ms", - "Error": "4.489 ms", - "StdDev": "3.979 ms", - "Median": "1,540.17 ms" + "Mean": "1,490.73 ms", + "Error": "6.760 ms", + "StdDev": "5.278 ms", + "Median": "1,491.63 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,625.28 ms", - "Error": "13.608 ms", - "StdDev": "11.364 ms", - "Median": "1,624.99 ms" + "Mean": "1,582.33 ms", + "Error": "9.459 ms", + "StdDev": "8.848 ms", + "Median": "1,582.19 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.52 ms", - "Error": "0.365 ms", - "StdDev": "0.341 ms", - "Median": "79.55 ms" + "Mean": "79.14 ms", + "Error": "0.422 ms", + "StdDev": "0.395 ms", + "Median": "78.95 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "522.37 ms", - "Error": "5.373 ms", - "StdDev": "5.026 ms", - "Median": "521.16 ms" + "Mean": "532.88 ms", + "Error": "4.048 ms", + "StdDev": "3.588 ms", + "Median": "531.46 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "611.57 ms", - "Error": "9.860 ms", - "StdDev": "8.234 ms", - "Median": "612.00 ms" + "Mean": "582.78 ms", + "Error": "6.489 ms", + "StdDev": "6.070 ms", + "Median": "583.36 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.51 ms", - "Error": "10.914 ms", - "StdDev": "9.675 ms", - "Median": "617.04 ms" + "Mean": "500.42 ms", + "Error": "8.063 ms", + "StdDev": "6.733 ms", + "Median": "498.63 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "614.63 ms", - "Error": "8.361 ms", - "StdDev": "7.412 ms", - "Median": "610.65 ms" + "Mean": "593.09 ms", + "Error": "7.391 ms", + "StdDev": "6.914 ms", + "Median": "591.89 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "43.96 ms", - "Error": "1.151 ms", - "StdDev": "3.394 ms", - "Median": "44.10 ms" + "Mean": "45.31 ms", + "Error": "1.083 ms", + "StdDev": "3.177 ms", + "Median": "45.54 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "575.6 ms", - "Error": "4.96 ms", - "StdDev": "4.64 ms", - "Median": "575.7 ms" + "Mean": "571.6 ms", + "Error": "3.90 ms", + "StdDev": "3.64 ms", + "Median": "571.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,194.3 ms", - "Error": "7.33 ms", - "StdDev": "6.50 ms", - "Median": "1,195.1 ms" + "Mean": "1,159.0 ms", + "Error": "8.78 ms", + "StdDev": "8.21 ms", + "Median": "1,158.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,165.8 ms", - "Error": "10.55 ms", - "StdDev": "9.87 ms", - "Median": "1,164.6 ms" + "Mean": "1,138.2 ms", + "Error": "14.90 ms", + "StdDev": "12.44 ms", + "Median": "1,134.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,258.5 ms", - "Error": "8.37 ms", - "StdDev": "7.83 ms", - "Median": "1,258.8 ms" + "Mean": "1,210.7 ms", + "Error": "13.21 ms", + "StdDev": "11.71 ms", + "Median": "1,208.0 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.043 s", - "Error": "0.0210 s", - "StdDev": "0.0196 s", - "Median": "2.035 s" + "Mean": "2.206 s", + "Error": "0.0434 s", + "StdDev": "0.0426 s", + "Median": "2.201 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.639 s", - "Error": "0.0094 s", - "StdDev": "0.0088 s", - "Median": "1.639 s" + "Mean": "1.761 s", + "Error": "0.0342 s", + "StdDev": "0.0320 s", + "Median": "1.762 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.715 s", - "Error": "0.0184 s", - "StdDev": "0.0172 s", - "Median": "1.712 s" + "Mean": "1.828 s", + "Error": "0.0357 s", + "StdDev": "0.0351 s", + "Median": "1.830 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.616 s", - "Error": "0.0302 s", - "StdDev": "0.0283 s", - "Median": "1.621 s" + "Mean": "1.709 s", + "Error": "0.0326 s", + "StdDev": "0.0388 s", + "Median": "1.702 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-27T00:28:35.445Z" + "lastUpdated": "2025-11-28T00:29:30.391Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index ff4e003094..376ac0004a 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-27", + "timestamp": "2025-11-28", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 1c7af320c6ccd9df72d915095327c6fc70203a20 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 28 Nov 2025 22:59:36 +0000 Subject: [PATCH 103/192] chore(deps): update dependency xunit.v3.assert to 3.2.1 (#3932) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1052b3a500..bbcca68dfc 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -92,7 +92,7 @@ - + \ No newline at end of file From 529acffe9afb5ef3e031171cafb63b13e30c7578 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 28 Nov 2025 23:31:02 +0000 Subject: [PATCH 104/192] chore(deps): update dependency xunit.v3.extensibility.core to 3.2.1 (#3933) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index bbcca68dfc..cfa1431af8 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -93,6 +93,6 @@ - + \ No newline at end of file From 2abcffc91c4e7a709728193cfd718b3d17dd5ff6 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 28 Nov 2025 23:33:34 +0000 Subject: [PATCH 105/192] chore(deps): update dependency xunit.v3 to 3.2.1 (#3931) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index cfa1431af8..0af97060c6 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -91,7 +91,7 @@ - + From dc0752cdecb43449dd6ee76b3745c2e7ddffa57b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 29 Nov 2025 00:27:33 +0000 Subject: [PATCH 106/192] chore: update benchmark results (#3934) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 44 +-- .../benchmarks/MassiveParallelTests.json | 44 +-- docs/static/benchmarks/MatrixTests.json | 44 +-- docs/static/benchmarks/ScaleTests.json | 44 +-- .../static/benchmarks/SetupTeardownTests.json | 36 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 282 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 355 insertions(+), 351 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index f724f6c0e5..06a025db9c 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 576.3 ms | 576.2 ms | 5.87 ms | -| NUnit | 4.4.0 | 689.7 ms | 688.0 ms | 7.29 ms | -| MSTest | 4.0.2 | 644.4 ms | 643.1 ms | 9.95 ms | -| xUnit3 | 3.2.0 | 734.3 ms | 729.7 ms | 10.57 ms | -| **TUnit (AOT)** | 1.2.11 | 124.6 ms | 124.6 ms | 0.44 ms | +| **TUnit** | 1.2.11 | 573.3 ms | 573.7 ms | 4.43 ms | +| NUnit | 4.4.0 | 658.8 ms | 660.6 ms | 4.99 ms | +| MSTest | 4.0.2 | 631.5 ms | 631.2 ms | 8.74 ms | +| xUnit3 | 3.2.1 | 716.2 ms | 715.4 ms | 6.28 ms | +| **TUnit (AOT)** | 1.2.11 | 124.1 ms | 124.2 ms | 0.20 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 882 - bar [576.3, 689.7, 644.4, 734.3, 124.6] + y-axis "Time (ms)" 0 --> 860 + bar [573.3, 658.8, 631.5, 716.2, 124.1] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.392Z* +*Last generated: 2025-11-29T00:27:17.985Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 158719761e..54a0ea8d23 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.206 s | 2.201 s | 0.0426 s | -| Build_NUnit | 4.4.0 | 1.761 s | 1.762 s | 0.0320 s | -| Build_MSTest | 4.0.2 | 1.828 s | 1.830 s | 0.0351 s | -| Build_xUnit3 | 3.2.0 | 1.709 s | 1.702 s | 0.0388 s | +| **TUnit** | 1.2.11 | 2.050 s | 2.047 s | 0.0253 s | +| Build_NUnit | 4.4.0 | 1.644 s | 1.646 s | 0.0243 s | +| Build_MSTest | 4.0.2 | 1.714 s | 1.709 s | 0.0303 s | +| Build_xUnit3 | 3.2.1 | 1.639 s | 1.639 s | 0.0300 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.206, 1.761, 1.828, 1.709] + bar [2.05, 1.644, 1.714, 1.639] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.394Z* +*Last generated: 2025-11-29T00:27:17.987Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 011a6413ee..55089d1f10 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 482.09 ms | 480.78 ms | 4.482 ms | -| NUnit | 4.4.0 | 675.54 ms | 671.70 ms | 18.149 ms | -| MSTest | 4.0.2 | 662.49 ms | 662.42 ms | 5.452 ms | -| xUnit3 | 3.2.0 | 675.22 ms | 672.45 ms | 9.573 ms | -| **TUnit (AOT)** | 1.2.11 | 24.02 ms | 24.07 ms | 0.159 ms | +| **TUnit** | 1.2.11 | 501.86 ms | 501.49 ms | 4.693 ms | +| NUnit | 4.4.0 | 535.87 ms | 534.70 ms | 12.790 ms | +| MSTest | 4.0.2 | 502.71 ms | 503.69 ms | 12.277 ms | +| xUnit3 | 3.2.1 | 579.28 ms | 578.02 ms | 8.138 ms | +| **TUnit (AOT)** | 1.2.11 | 24.82 ms | 24.80 ms | 0.166 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 811 - bar [482.09, 675.54, 662.49, 675.22, 24.02] + y-axis "Time (ms)" 0 --> 696 + bar [501.86, 535.87, 502.71, 579.28, 24.82] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.392Z* +*Last generated: 2025-11-29T00:27:17.985Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 40c75035ab..726200db85 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 599.1 ms | 597.3 ms | 5.47 ms | -| NUnit | 4.4.0 | 1,205.9 ms | 1,207.4 ms | 4.44 ms | -| MSTest | 4.0.2 | 2,989.7 ms | 2,990.1 ms | 9.41 ms | -| xUnit3 | 3.2.0 | 3,076.8 ms | 3,076.2 ms | 9.36 ms | -| **TUnit (AOT)** | 1.2.11 | 131.0 ms | 131.0 ms | 0.47 ms | +| **TUnit** | 1.2.11 | 597.5 ms | 597.8 ms | 3.59 ms | +| NUnit | 4.4.0 | 1,183.2 ms | 1,182.1 ms | 4.90 ms | +| MSTest | 4.0.2 | 2,966.5 ms | 2,968.0 ms | 5.16 ms | +| xUnit3 | 3.2.1 | 3,066.1 ms | 3,065.1 ms | 15.64 ms | +| **TUnit (AOT)** | 1.2.11 | 132.2 ms | 132.3 ms | 0.51 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3693 - bar [599.1, 1205.9, 2989.7, 3076.8, 131] + y-axis "Time (ms)" 0 --> 3680 + bar [597.5, 1183.2, 2966.5, 3066.1, 132.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.393Z* +*Last generated: 2025-11-29T00:27:17.986Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 69998c8c9f..8e74222e9c 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 563.40 ms | 563.35 ms | 4.161 ms | -| NUnit | 4.4.0 | 1,537.43 ms | 1,536.67 ms | 8.606 ms | -| MSTest | 4.0.2 | 1,490.73 ms | 1,491.63 ms | 5.278 ms | -| xUnit3 | 3.2.0 | 1,582.33 ms | 1,582.19 ms | 8.848 ms | -| **TUnit (AOT)** | 1.2.11 | 79.14 ms | 78.95 ms | 0.395 ms | +| **TUnit** | 1.2.11 | 574.81 ms | 575.40 ms | 5.417 ms | +| NUnit | 4.4.0 | 1,582.59 ms | 1,581.77 ms | 6.462 ms | +| MSTest | 4.0.2 | 1,540.42 ms | 1,540.75 ms | 5.446 ms | +| xUnit3 | 3.2.1 | 1,630.94 ms | 1,627.40 ms | 11.609 ms | +| **TUnit (AOT)** | 1.2.11 | 79.00 ms | 79.08 ms | 0.235 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1899 - bar [563.4, 1537.43, 1490.73, 1582.33, 79.14] + y-axis "Time (ms)" 0 --> 1958 + bar [574.81, 1582.59, 1540.42, 1630.94, 79] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.393Z* +*Last generated: 2025-11-29T00:27:17.986Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index bc4a26f2fd..4a084a622a 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 532.88 ms | 531.46 ms | 3.588 ms | -| NUnit | 4.4.0 | 582.78 ms | 583.36 ms | 6.070 ms | -| MSTest | 4.0.2 | 500.42 ms | 498.63 ms | 6.733 ms | -| xUnit3 | 3.2.0 | 593.09 ms | 591.89 ms | 6.914 ms | -| **TUnit (AOT)** | 1.2.11 | 45.31 ms | 45.54 ms | 3.177 ms | +| **TUnit** | 1.2.11 | 535.07 ms | 534.68 ms | 4.870 ms | +| NUnit | 4.4.0 | 585.44 ms | 584.11 ms | 12.531 ms | +| MSTest | 4.0.2 | 509.11 ms | 505.09 ms | 11.032 ms | +| xUnit3 | 3.2.1 | 594.97 ms | 593.95 ms | 6.401 ms | +| **TUnit (AOT)** | 1.2.11 | 46.00 ms | 46.41 ms | 3.968 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 712 - bar [532.88, 582.78, 500.42, 593.09, 45.31] + y-axis "Time (ms)" 0 --> 714 + bar [535.07, 585.44, 509.11, 594.97, 46] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.393Z* +*Last generated: 2025-11-29T00:27:17.986Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 45ed94ac63..9ebe377bbf 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-28** from the latest CI run. +This benchmark was automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 571.6 ms | 571.4 ms | 3.64 ms | -| NUnit | 4.4.0 | 1,159.0 ms | 1,158.6 ms | 8.21 ms | -| MSTest | 4.0.2 | 1,138.2 ms | 1,134.9 ms | 12.44 ms | -| xUnit3 | 3.2.0 | 1,210.7 ms | 1,208.0 ms | 11.71 ms | +| **TUnit** | 1.2.11 | 558.0 ms | 557.6 ms | 3.82 ms | +| NUnit | 4.4.0 | 1,148.5 ms | 1,146.8 ms | 8.24 ms | +| MSTest | 4.0.2 | 1,120.1 ms | 1,121.5 ms | 6.42 ms | +| xUnit3 | 3.2.1 | 1,198.8 ms | 1,197.8 ms | 9.10 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-28** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1453 - bar [571.6, 1159, 1138.2, 1210.7, 0] + y-axis "Time (ms)" 0 --> 1439 + bar [558, 1148.5, 1120.1, 1198.8, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-28T00:29:30.394Z* +*Last generated: 2025-11-29T00:27:17.987Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 96007a9dd5..e5bccf4190 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-28** from the latest CI run. +These benchmarks were automatically generated on **2025-11-29** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -38,7 +38,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| | **TUnit** | 1.2.11 | -| **xUnit v3** | 3.2.0 | +| **xUnit v3** | 3.2.1 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-28T00:29:30.395Z* +*Last generated: 2025-11-29T00:27:17.987Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 384f49b3ff..6ea3ffc595 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.392Z", + "timestamp": "2025-11-29T00:27:17.985Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "576.3 ms", - "Error": "6.27 ms", - "StdDev": "5.87 ms", - "Median": "576.2 ms" + "Mean": "573.3 ms", + "Error": "4.73 ms", + "StdDev": "4.43 ms", + "Median": "573.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "689.7 ms", - "Error": "7.79 ms", - "StdDev": "7.29 ms", - "Median": "688.0 ms" + "Mean": "658.8 ms", + "Error": "5.97 ms", + "StdDev": "4.99 ms", + "Median": "660.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "644.4 ms", - "Error": "10.64 ms", - "StdDev": "9.95 ms", - "Median": "643.1 ms" + "Mean": "631.5 ms", + "Error": "9.34 ms", + "StdDev": "8.74 ms", + "Median": "631.2 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "734.3 ms", - "Error": "11.92 ms", - "StdDev": "10.57 ms", - "Median": "729.7 ms" + "Version": "3.2.1", + "Mean": "716.2 ms", + "Error": "7.08 ms", + "StdDev": "6.28 ms", + "Median": "715.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.6 ms", - "Error": "0.53 ms", - "StdDev": "0.44 ms", - "Median": "124.6 ms" + "Mean": "124.1 ms", + "Error": "0.23 ms", + "StdDev": "0.20 ms", + "Median": "124.2 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index cb7377955e..747f5ae6e2 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.394Z", + "timestamp": "2025-11-29T00:27:17.987Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.206 s", - "Error": "0.0434 s", - "StdDev": "0.0426 s", - "Median": "2.201 s" + "Mean": "2.050 s", + "Error": "0.0285 s", + "StdDev": "0.0253 s", + "Median": "2.047 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.761 s", - "Error": "0.0342 s", - "StdDev": "0.0320 s", - "Median": "1.762 s" + "Mean": "1.644 s", + "Error": "0.0260 s", + "StdDev": "0.0243 s", + "Median": "1.646 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.828 s", - "Error": "0.0357 s", - "StdDev": "0.0351 s", - "Median": "1.830 s" + "Mean": "1.714 s", + "Error": "0.0324 s", + "StdDev": "0.0303 s", + "Median": "1.709 s" }, { "Method": "Build_xUnit3", - "Version": "3.2.0", - "Mean": "1.709 s", - "Error": "0.0326 s", - "StdDev": "0.0388 s", - "Median": "1.702 s" + "Version": "3.2.1", + "Mean": "1.639 s", + "Error": "0.0321 s", + "StdDev": "0.0300 s", + "Median": "1.639 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 03555befdf..a903f638a7 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.392Z", + "timestamp": "2025-11-29T00:27:17.985Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "482.09 ms", - "Error": "4.791 ms", - "StdDev": "4.482 ms", - "Median": "480.78 ms" + "Mean": "501.86 ms", + "Error": "5.017 ms", + "StdDev": "4.693 ms", + "Median": "501.49 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "675.54 ms", - "Error": "13.259 ms", - "StdDev": "18.149 ms", - "Median": "671.70 ms" + "Mean": "535.87 ms", + "Error": "10.415 ms", + "StdDev": "12.790 ms", + "Median": "534.70 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "662.49 ms", - "Error": "6.150 ms", - "StdDev": "5.452 ms", - "Median": "662.42 ms" + "Mean": "502.71 ms", + "Error": "9.708 ms", + "StdDev": "12.277 ms", + "Median": "503.69 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "675.22 ms", - "Error": "10.234 ms", - "StdDev": "9.573 ms", - "Median": "672.45 ms" + "Version": "3.2.1", + "Mean": "579.28 ms", + "Error": "9.180 ms", + "StdDev": "8.138 ms", + "Median": "578.02 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.02 ms", - "Error": "0.204 ms", - "StdDev": "0.159 ms", - "Median": "24.07 ms" + "Mean": "24.82 ms", + "Error": "0.187 ms", + "StdDev": "0.166 ms", + "Median": "24.80 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index dab0cbdcbc..b01106537b 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.393Z", + "timestamp": "2025-11-29T00:27:17.986Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "599.1 ms", - "Error": "5.85 ms", - "StdDev": "5.47 ms", - "Median": "597.3 ms" + "Mean": "597.5 ms", + "Error": "4.05 ms", + "StdDev": "3.59 ms", + "Median": "597.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,205.9 ms", - "Error": "5.68 ms", - "StdDev": "4.44 ms", - "Median": "1,207.4 ms" + "Mean": "1,183.2 ms", + "Error": "6.27 ms", + "StdDev": "4.90 ms", + "Median": "1,182.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,989.7 ms", - "Error": "10.61 ms", - "StdDev": "9.41 ms", - "Median": "2,990.1 ms" + "Mean": "2,966.5 ms", + "Error": "6.60 ms", + "StdDev": "5.16 ms", + "Median": "2,968.0 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "3,076.8 ms", - "Error": "10.56 ms", - "StdDev": "9.36 ms", - "Median": "3,076.2 ms" + "Version": "3.2.1", + "Mean": "3,066.1 ms", + "Error": "17.64 ms", + "StdDev": "15.64 ms", + "Median": "3,065.1 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.0 ms", - "Error": "0.57 ms", - "StdDev": "0.47 ms", - "Median": "131.0 ms" + "Mean": "132.2 ms", + "Error": "0.55 ms", + "StdDev": "0.51 ms", + "Median": "132.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 48ce72d043..578206c245 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.393Z", + "timestamp": "2025-11-29T00:27:17.986Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "563.40 ms", - "Error": "4.448 ms", - "StdDev": "4.161 ms", - "Median": "563.35 ms" + "Mean": "574.81 ms", + "Error": "5.792 ms", + "StdDev": "5.417 ms", + "Median": "575.40 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,537.43 ms", - "Error": "9.709 ms", - "StdDev": "8.606 ms", - "Median": "1,536.67 ms" + "Mean": "1,582.59 ms", + "Error": "7.738 ms", + "StdDev": "6.462 ms", + "Median": "1,581.77 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,490.73 ms", - "Error": "6.760 ms", - "StdDev": "5.278 ms", - "Median": "1,491.63 ms" + "Mean": "1,540.42 ms", + "Error": "5.822 ms", + "StdDev": "5.446 ms", + "Median": "1,540.75 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,582.33 ms", - "Error": "9.459 ms", - "StdDev": "8.848 ms", - "Median": "1,582.19 ms" + "Version": "3.2.1", + "Mean": "1,630.94 ms", + "Error": "12.411 ms", + "StdDev": "11.609 ms", + "Median": "1,627.40 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.14 ms", - "Error": "0.422 ms", - "StdDev": "0.395 ms", - "Median": "78.95 ms" + "Mean": "79.00 ms", + "Error": "0.251 ms", + "StdDev": "0.235 ms", + "Median": "79.08 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index cf0e543d7f..2786b68df5 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.394Z", + "timestamp": "2025-11-29T00:27:17.986Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "532.88 ms", - "Error": "4.048 ms", - "StdDev": "3.588 ms", - "Median": "531.46 ms" + "Mean": "535.07 ms", + "Error": "5.832 ms", + "StdDev": "4.870 ms", + "Median": "534.68 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "582.78 ms", - "Error": "6.489 ms", - "StdDev": "6.070 ms", - "Median": "583.36 ms" + "Mean": "585.44 ms", + "Error": "11.274 ms", + "StdDev": "12.531 ms", + "Median": "584.11 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "500.42 ms", - "Error": "8.063 ms", - "StdDev": "6.733 ms", - "Median": "498.63 ms" + "Mean": "509.11 ms", + "Error": "9.925 ms", + "StdDev": "11.032 ms", + "Median": "505.09 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "593.09 ms", - "Error": "7.391 ms", - "StdDev": "6.914 ms", - "Median": "591.89 ms" + "Version": "3.2.1", + "Mean": "594.97 ms", + "Error": "7.221 ms", + "StdDev": "6.401 ms", + "Median": "593.95 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "45.31 ms", - "Error": "1.083 ms", - "StdDev": "3.177 ms", - "Median": "45.54 ms" + "Mean": "46.00 ms", + "Error": "1.346 ms", + "StdDev": "3.968 ms", + "Median": "46.41 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 6e51c813d1..be6ddf85ba 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.394Z", + "timestamp": "2025-11-29T00:27:17.987Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "571.6 ms", - "Error": "3.90 ms", - "StdDev": "3.64 ms", - "Median": "571.4 ms" + "Mean": "558.0 ms", + "Error": "4.08 ms", + "StdDev": "3.82 ms", + "Median": "557.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,159.0 ms", - "Error": "8.78 ms", - "StdDev": "8.21 ms", - "Median": "1,158.6 ms" + "Mean": "1,148.5 ms", + "Error": "8.81 ms", + "StdDev": "8.24 ms", + "Median": "1,146.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,138.2 ms", - "Error": "14.90 ms", - "StdDev": "12.44 ms", - "Median": "1,134.9 ms" + "Mean": "1,120.1 ms", + "Error": "7.69 ms", + "StdDev": "6.42 ms", + "Median": "1,121.5 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,210.7 ms", - "Error": "13.21 ms", - "StdDev": "11.71 ms", - "Median": "1,208.0 ms" + "Version": "3.2.1", + "Mean": "1,198.8 ms", + "Error": "9.73 ms", + "StdDev": "9.10 ms", + "Median": "1,197.8 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 7e87f525fb..2ca74d50fc 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -86,5 +86,9 @@ { "date": "2025-11-28", "environment": "Ubuntu" + }, + { + "date": "2025-11-29", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 3873d462f2..ebc2bb3f26 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-28T00:29:30.395Z", + "timestamp": "2025-11-29T00:27:17.988Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "576.3 ms", - "Error": "6.27 ms", - "StdDev": "5.87 ms", - "Median": "576.2 ms" + "Mean": "573.3 ms", + "Error": "4.73 ms", + "StdDev": "4.43 ms", + "Median": "573.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "689.7 ms", - "Error": "7.79 ms", - "StdDev": "7.29 ms", - "Median": "688.0 ms" + "Mean": "658.8 ms", + "Error": "5.97 ms", + "StdDev": "4.99 ms", + "Median": "660.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "644.4 ms", - "Error": "10.64 ms", - "StdDev": "9.95 ms", - "Median": "643.1 ms" + "Mean": "631.5 ms", + "Error": "9.34 ms", + "StdDev": "8.74 ms", + "Median": "631.2 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "734.3 ms", - "Error": "11.92 ms", - "StdDev": "10.57 ms", - "Median": "729.7 ms" + "Version": "3.2.1", + "Mean": "716.2 ms", + "Error": "7.08 ms", + "StdDev": "6.28 ms", + "Median": "715.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.6 ms", - "Error": "0.53 ms", - "StdDev": "0.44 ms", - "Median": "124.6 ms" + "Mean": "124.1 ms", + "Error": "0.23 ms", + "StdDev": "0.20 ms", + "Median": "124.2 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "482.09 ms", - "Error": "4.791 ms", - "StdDev": "4.482 ms", - "Median": "480.78 ms" + "Mean": "501.86 ms", + "Error": "5.017 ms", + "StdDev": "4.693 ms", + "Median": "501.49 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "675.54 ms", - "Error": "13.259 ms", - "StdDev": "18.149 ms", - "Median": "671.70 ms" + "Mean": "535.87 ms", + "Error": "10.415 ms", + "StdDev": "12.790 ms", + "Median": "534.70 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "662.49 ms", - "Error": "6.150 ms", - "StdDev": "5.452 ms", - "Median": "662.42 ms" + "Mean": "502.71 ms", + "Error": "9.708 ms", + "StdDev": "12.277 ms", + "Median": "503.69 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "675.22 ms", - "Error": "10.234 ms", - "StdDev": "9.573 ms", - "Median": "672.45 ms" + "Version": "3.2.1", + "Mean": "579.28 ms", + "Error": "9.180 ms", + "StdDev": "8.138 ms", + "Median": "578.02 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.02 ms", - "Error": "0.204 ms", - "StdDev": "0.159 ms", - "Median": "24.07 ms" + "Mean": "24.82 ms", + "Error": "0.187 ms", + "StdDev": "0.166 ms", + "Median": "24.80 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "599.1 ms", - "Error": "5.85 ms", - "StdDev": "5.47 ms", - "Median": "597.3 ms" + "Mean": "597.5 ms", + "Error": "4.05 ms", + "StdDev": "3.59 ms", + "Median": "597.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,205.9 ms", - "Error": "5.68 ms", - "StdDev": "4.44 ms", - "Median": "1,207.4 ms" + "Mean": "1,183.2 ms", + "Error": "6.27 ms", + "StdDev": "4.90 ms", + "Median": "1,182.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,989.7 ms", - "Error": "10.61 ms", - "StdDev": "9.41 ms", - "Median": "2,990.1 ms" + "Mean": "2,966.5 ms", + "Error": "6.60 ms", + "StdDev": "5.16 ms", + "Median": "2,968.0 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "3,076.8 ms", - "Error": "10.56 ms", - "StdDev": "9.36 ms", - "Median": "3,076.2 ms" + "Version": "3.2.1", + "Mean": "3,066.1 ms", + "Error": "17.64 ms", + "StdDev": "15.64 ms", + "Median": "3,065.1 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "131.0 ms", - "Error": "0.57 ms", - "StdDev": "0.47 ms", - "Median": "131.0 ms" + "Mean": "132.2 ms", + "Error": "0.55 ms", + "StdDev": "0.51 ms", + "Median": "132.3 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "563.40 ms", - "Error": "4.448 ms", - "StdDev": "4.161 ms", - "Median": "563.35 ms" + "Mean": "574.81 ms", + "Error": "5.792 ms", + "StdDev": "5.417 ms", + "Median": "575.40 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,537.43 ms", - "Error": "9.709 ms", - "StdDev": "8.606 ms", - "Median": "1,536.67 ms" + "Mean": "1,582.59 ms", + "Error": "7.738 ms", + "StdDev": "6.462 ms", + "Median": "1,581.77 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,490.73 ms", - "Error": "6.760 ms", - "StdDev": "5.278 ms", - "Median": "1,491.63 ms" + "Mean": "1,540.42 ms", + "Error": "5.822 ms", + "StdDev": "5.446 ms", + "Median": "1,540.75 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,582.33 ms", - "Error": "9.459 ms", - "StdDev": "8.848 ms", - "Median": "1,582.19 ms" + "Version": "3.2.1", + "Mean": "1,630.94 ms", + "Error": "12.411 ms", + "StdDev": "11.609 ms", + "Median": "1,627.40 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.14 ms", - "Error": "0.422 ms", - "StdDev": "0.395 ms", - "Median": "78.95 ms" + "Mean": "79.00 ms", + "Error": "0.251 ms", + "StdDev": "0.235 ms", + "Median": "79.08 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "532.88 ms", - "Error": "4.048 ms", - "StdDev": "3.588 ms", - "Median": "531.46 ms" + "Mean": "535.07 ms", + "Error": "5.832 ms", + "StdDev": "4.870 ms", + "Median": "534.68 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "582.78 ms", - "Error": "6.489 ms", - "StdDev": "6.070 ms", - "Median": "583.36 ms" + "Mean": "585.44 ms", + "Error": "11.274 ms", + "StdDev": "12.531 ms", + "Median": "584.11 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "500.42 ms", - "Error": "8.063 ms", - "StdDev": "6.733 ms", - "Median": "498.63 ms" + "Mean": "509.11 ms", + "Error": "9.925 ms", + "StdDev": "11.032 ms", + "Median": "505.09 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "593.09 ms", - "Error": "7.391 ms", - "StdDev": "6.914 ms", - "Median": "591.89 ms" + "Version": "3.2.1", + "Mean": "594.97 ms", + "Error": "7.221 ms", + "StdDev": "6.401 ms", + "Median": "593.95 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "45.31 ms", - "Error": "1.083 ms", - "StdDev": "3.177 ms", - "Median": "45.54 ms" + "Mean": "46.00 ms", + "Error": "1.346 ms", + "StdDev": "3.968 ms", + "Median": "46.41 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "571.6 ms", - "Error": "3.90 ms", - "StdDev": "3.64 ms", - "Median": "571.4 ms" + "Mean": "558.0 ms", + "Error": "4.08 ms", + "StdDev": "3.82 ms", + "Median": "557.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,159.0 ms", - "Error": "8.78 ms", - "StdDev": "8.21 ms", - "Median": "1,158.6 ms" + "Mean": "1,148.5 ms", + "Error": "8.81 ms", + "StdDev": "8.24 ms", + "Median": "1,146.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,138.2 ms", - "Error": "14.90 ms", - "StdDev": "12.44 ms", - "Median": "1,134.9 ms" + "Mean": "1,120.1 ms", + "Error": "7.69 ms", + "StdDev": "6.42 ms", + "Median": "1,121.5 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,210.7 ms", - "Error": "13.21 ms", - "StdDev": "11.71 ms", - "Median": "1,208.0 ms" + "Version": "3.2.1", + "Mean": "1,198.8 ms", + "Error": "9.73 ms", + "StdDev": "9.10 ms", + "Median": "1,197.8 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.206 s", - "Error": "0.0434 s", - "StdDev": "0.0426 s", - "Median": "2.201 s" + "Mean": "2.050 s", + "Error": "0.0285 s", + "StdDev": "0.0253 s", + "Median": "2.047 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.761 s", - "Error": "0.0342 s", - "StdDev": "0.0320 s", - "Median": "1.762 s" + "Mean": "1.644 s", + "Error": "0.0260 s", + "StdDev": "0.0243 s", + "Median": "1.646 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.828 s", - "Error": "0.0357 s", - "StdDev": "0.0351 s", - "Median": "1.830 s" + "Mean": "1.714 s", + "Error": "0.0324 s", + "StdDev": "0.0303 s", + "Median": "1.709 s" }, { "Method": "Build_xUnit3", - "Version": "3.2.0", - "Mean": "1.709 s", - "Error": "0.0326 s", - "StdDev": "0.0388 s", - "Median": "1.702 s" + "Version": "3.2.1", + "Mean": "1.639 s", + "Error": "0.0321 s", + "StdDev": "0.0300 s", + "Median": "1.639 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-28T00:29:30.391Z" + "lastUpdated": "2025-11-29T00:27:17.984Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 376ac0004a..78d36d0b54 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-28", + "timestamp": "2025-11-29", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From fe8b799d67ab2235157c86bb9ffaf815934df94e Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sat, 29 Nov 2025 10:19:26 +0000 Subject: [PATCH 107/192] Fix docs stating incorrect default for coverage output format (#3936) * Initial plan * Fix docs stating incorrect default for coverage output format The documentation incorrectly stated that Cobertura is the default coverage output format. However, .NET 10 produces binary .coverage files by default if the --coverage-output-format flag is not supplied. Fixes documentation in migration guides (xunit, nunit, mstest), extensions, and troubleshooting files. Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- docs/docs/extensions/extensions.md | 2 +- docs/docs/migration/mstest.md | 4 ++-- docs/docs/migration/nunit.md | 4 ++-- docs/docs/migration/xunit.md | 4 ++-- docs/docs/troubleshooting.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/docs/extensions/extensions.md b/docs/docs/extensions/extensions.md index f8869d3589..1aad0ec492 100644 --- a/docs/docs/extensions/extensions.md +++ b/docs/docs/extensions/extensions.md @@ -22,7 +22,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify output format (cobertura is default) +# Specify output format (default is binary .coverage file) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats diff --git a/docs/docs/migration/mstest.md b/docs/docs/migration/mstest.md index 05ef1b9e45..eaa77fb76b 100644 --- a/docs/docs/migration/mstest.md +++ b/docs/docs/migration/mstest.md @@ -1013,7 +1013,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify coverage format (default is cobertura) +# Specify coverage format (default is binary .coverage file) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats @@ -1055,7 +1055,7 @@ If you have CI/CD pipelines that reference Coverlet, update them to use the new The Microsoft coverage tool supports multiple output formats: ```bash -# Cobertura (default, widely supported) +# Cobertura (widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # XML (Visual Studio format) diff --git a/docs/docs/migration/nunit.md b/docs/docs/migration/nunit.md index 1e996268a1..63933fc045 100644 --- a/docs/docs/migration/nunit.md +++ b/docs/docs/migration/nunit.md @@ -746,7 +746,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify coverage format (default is cobertura) +# Specify coverage format (default is binary .coverage file) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats @@ -788,7 +788,7 @@ If you have CI/CD pipelines that reference Coverlet, update them to use the new The Microsoft coverage tool supports multiple output formats: ```bash -# Cobertura (default, widely supported) +# Cobertura (widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # XML (Visual Studio format) diff --git a/docs/docs/migration/xunit.md b/docs/docs/migration/xunit.md index f452d62eb7..32c1ed15ec 100644 --- a/docs/docs/migration/xunit.md +++ b/docs/docs/migration/xunit.md @@ -1054,7 +1054,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify coverage format (default is cobertura) +# Specify coverage format (default is binary .coverage file) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats @@ -1096,7 +1096,7 @@ If you have CI/CD pipelines that reference Coverlet, update them to use the new The Microsoft coverage tool supports multiple output formats: ```bash -# Cobertura (default, widely supported) +# Cobertura (widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # XML (Visual Studio format) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 4dfa0bb1ab..300dd182bb 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -2240,7 +2240,7 @@ dotnet run --configuration Release --coverage --coverage-settings coverage.runse #### 1. Check Output Format ```bash -# Default is Cobertura (widely supported) +# Cobertura (widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # For Visual Studio From 4ae1b5282aa0a9730d11efa6823a2d88b0761780 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 29 Nov 2025 11:28:45 +0000 Subject: [PATCH 108/192] chore(deps): update verify to 31.7.3 (#3937) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 0af97060c6..95fa47b2f0 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From 4018f9f48fc172503e65a8a930410a5836d83491 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 29 Nov 2025 19:19:07 +0000 Subject: [PATCH 109/192] fix: adjust overload resolution priorities for member assertions (#3940) --- TUnit.Assertions/Extensions/AssertionExtensions.cs | 6 ++++-- ...tions_Library_Has_No_API_Changes.DotNet10_0.verified.txt | 6 ++++-- ...rtions_Library_Has_No_API_Changes.DotNet9_0.verified.txt | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/TUnit.Assertions/Extensions/AssertionExtensions.cs b/TUnit.Assertions/Extensions/AssertionExtensions.cs index d065942ad1..95aee50a34 100644 --- a/TUnit.Assertions/Extensions/AssertionExtensions.cs +++ b/TUnit.Assertions/Extensions/AssertionExtensions.cs @@ -262,7 +262,7 @@ public static MemberAssertionResult Member( /// Example: await Assert.That(myObject).Member(x => x.Attributes, attrs => attrs.ContainsKey("status").And.IsNotEmpty()); /// Note: This overload exists for backward compatibility. For AOT compatibility, use the TTransformed overload instead. /// - [OverloadResolutionPriority(2)] + [OverloadResolutionPriority(1)] [RequiresDynamicCode("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] public static MemberAssertionResult Member( this IAssertionSource source, @@ -421,7 +421,7 @@ public static MemberAssertionResult Member( /// Example: await Assert.That(myObject).Member(x => x.Tags, tags => tags.HasCount(1).And.Contains("value")); /// Note: This overload exists for backward compatibility. For AOT compatibility, use the TTransformed overload instead. /// - [OverloadResolutionPriority(1)] + [OverloadResolutionPriority(0)] [RequiresDynamicCode("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] public static MemberAssertionResult Member( this IAssertionSource source, @@ -527,6 +527,7 @@ public static MemberAssertionResult Member x.PropertyName, value => value.IsEqualTo(expectedValue)); /// + [OverloadResolutionPriority(0)] public static MemberAssertionResult Member( this IAssertionSource source, Expression> memberSelector, @@ -579,6 +580,7 @@ public static MemberAssertionResult Member( /// Example: await Assert.That(myObject).Member(x => x.PropertyName, value => value.IsEqualTo(expectedValue)); /// Note: This overload exists for backward compatibility. For AOT compatibility, use the TTransformed overload instead. /// + [OverloadResolutionPriority(-1)] [RequiresDynamicCode("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] public static MemberAssertionResult Member( this IAssertionSource source, diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index e1e5f6bbf0..e67b9f26b0 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1649,11 +1649,13 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(1)] + [.(0)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, object> assertions) { } + [.(0)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] + [.(-1)] public static . Member(this . source, .<> memberSelector, <., object> assertions) { } [.(2)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .> assertions) { } @@ -1661,7 +1663,7 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(2)] + [.(1)] public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, object> assertions) { } [.(1)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index a6c9c27621..9a12c7e10b 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1649,11 +1649,13 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(1)] + [.(0)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, object> assertions) { } + [.(0)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] + [.(-1)] public static . Member(this . source, .<> memberSelector, <., object> assertions) { } [.(2)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .> assertions) { } @@ -1661,7 +1663,7 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(2)] + [.(1)] public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, object> assertions) { } [.(1)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } From 3b0857dbcb93daf9490a81a10df0cdc92c4bfe68 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 29 Nov 2025 21:09:47 +0000 Subject: [PATCH 110/192] fix: ensure IClassConstructor and ITestEndEventReceiver share the same instance for state management (#3941) --- TUnit.Core/Helpers/ClassConstructorHelper.cs | 6 +-- TUnit.Core/TestBuilderContext.cs | 6 ++- TUnit.Engine/Building/TestBuilder.cs | 3 +- TUnit.TestProject/Bugs/3939/Tests.cs | 53 ++++++++++++++++++++ 4 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3939/Tests.cs diff --git a/TUnit.Core/Helpers/ClassConstructorHelper.cs b/TUnit.Core/Helpers/ClassConstructorHelper.cs index 136a6132b1..8430cfb63b 100644 --- a/TUnit.Core/Helpers/ClassConstructorHelper.cs +++ b/TUnit.Core/Helpers/ClassConstructorHelper.cs @@ -50,9 +50,9 @@ public static class ClassConstructorHelper return null; } - // Use the ClassConstructor to create the instance - var classConstructorType = classConstructorAttribute.ClassConstructorType; - var classConstructor = (IClassConstructor)Activator.CreateInstance(classConstructorType)!; + // Reuse existing ClassConstructor if already set, otherwise create new instance + var classConstructor = testBuilderContext.ClassConstructor + ?? (IClassConstructor)Activator.CreateInstance(classConstructorAttribute.ClassConstructorType)!; testBuilderContext.ClassConstructor = classConstructor; diff --git a/TUnit.Core/TestBuilderContext.cs b/TUnit.Core/TestBuilderContext.cs index cac0481205..25b20c65d4 100644 --- a/TUnit.Core/TestBuilderContext.cs +++ b/TUnit.Core/TestBuilderContext.cs @@ -57,7 +57,11 @@ internal static TestBuilderContext FromTestContext(TestContext testContext, IDat { return new TestBuilderContext { - Events = testContext.InternalEvents, TestMetadata = testContext.Metadata.TestDetails.MethodMetadata, DataSourceAttribute = dataSourceAttribute, StateBag = testContext.StateBag.Items, + Events = testContext.InternalEvents, + TestMetadata = testContext.Metadata.TestDetails.MethodMetadata, + DataSourceAttribute = dataSourceAttribute, + StateBag = testContext.StateBag.Items, + ClassConstructor = testContext.ClassConstructor, }; } } diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index a854f4e2df..cc6da989b9 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -290,7 +290,8 @@ public async Task> BuildTestsFromMetadataAsy Events = new TestContextEvents(), StateBag = new ConcurrentDictionary(), DataSourceAttribute = methodDataSource, - InitializedAttributes = testBuilderContext.InitializedAttributes // Preserve attributes from parent context + InitializedAttributes = testBuilderContext.InitializedAttributes, // Preserve attributes from parent context + ClassConstructor = testBuilderContext.ClassConstructor // Preserve ClassConstructor for instance creation }; classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); diff --git a/TUnit.TestProject/Bugs/3939/Tests.cs b/TUnit.TestProject/Bugs/3939/Tests.cs new file mode 100644 index 0000000000..215a5be18c --- /dev/null +++ b/TUnit.TestProject/Bugs/3939/Tests.cs @@ -0,0 +1,53 @@ +using System.Diagnostics.CodeAnalysis; +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3939; + +/// +/// Regression test for issue #3939: IClassConstructor and ITestEndEventReceiver +/// should use the same instance so that state can be shared (e.g., DI scope disposal). +/// +public sealed class ScopedClassConstructor : IClassConstructor, ITestEndEventReceiver +{ + private object? _scope; + + public Task Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type, ClassConstructorMetadata classConstructorMetadata) + { + // Simulate creating a DI scope - this should be available in OnTestEnd + _scope = new object(); + return Task.FromResult(new Tests()); + } + + public ValueTask OnTestEnd(TestContext context) + { + // This should be called on the SAME instance that Create() was called on + // If _scope is null, it means a different instance was used - this is the bug! + if (_scope == null) + { + throw new InvalidOperationException( + "Issue #3939: _scope was null in OnTestEnd(), indicating a different IClassConstructor " + + "instance was used than the one where Create() was called. " + + "IClassConstructor and ITestEndEventReceiver must use the same instance."); + } + + // Simulate disposing the scope + _scope = null; + return default; + } + + public int Order => 0; +} + +[EngineTest(ExpectedResult.Pass)] +[ClassConstructor] +public sealed class Tests +{ + [Test] + public Task TestMethod() + { + // The actual test - just verifies the test runs + // The real assertion is in OnTestEnd - it will throw if different instances are used + return Task.CompletedTask; + } +} From 683069cbbda20e7dc4dedee1b38984a12591050d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 29 Nov 2025 21:23:07 +0000 Subject: [PATCH 111/192] +semver:minor - feat: implement After hooks execution on cancellation for tests and enhance hook tracking (#3883) * feat: implement After hooks execution on cancellation for tests and enhance hook tracking * fix: enhance After hooks to ensure execution and logging on cancellation * feat: add external cancellation tests to validate After hooks execution * fix: refactor cancellation tests to improve process handling and cleanup * fix: enhance cross-platform executable detection in external cancellation tests * feat: implement After hooks execution on cancellation for tests and enhance hook tracking * fix: enhance After hooks to ensure execution and logging on cancellation * feat: add external cancellation tests to validate After hooks execution * fix: refactor cancellation tests to improve process handling and cleanup * fix: enhance cross-platform executable detection in external cancellation tests * refactor: streamline After and Before hook task registration and execution * fix: normalize line endings in string sequence comparisons and add EditorConfig for LF consistency --------- Co-authored-by: Claude --- Directory.Packages.props | 12 +- .../Verifiers/CSharpCodeFixVerifier.cs | 7 + .../LineEndingNormalizingVerifier.cs | 12 +- TUnit.Assertions/Chaining/AndAssertion.cs | 4 +- TUnit.Assertions/Chaining/OrAssertion.cs | 4 +- .../Extensions/AssertionExtensions.cs | 6 +- TUnit.Core/EngineCancellationToken.cs | 17 ++ .../Executors/GenericAbstractExecutor.cs | 5 - TUnit.Core/Interfaces/IHookExecutor.cs | 7 - .../CancellationAfterHooksTests.cs | 122 ++++++++ .../ExternalCancellationTests.cs | 147 +++++++++ .../ReflectionHookDiscoveryService.cs | 3 - .../Framework/TUnitServiceProvider.cs | 3 +- TUnit.Engine/Services/AfterHookPairTracker.cs | 155 ++++++++++ TUnit.Engine/Services/BeforeHookTaskCache.cs | 34 ++- .../Services/TestExecution/TestCoordinator.cs | 6 +- TUnit.Engine/TestExecutor.cs | 76 +++-- ...Has_No_API_Changes.DotNet10_0.verified.txt | 6 +- ..._Has_No_API_Changes.DotNet9_0.verified.txt | 6 +- ...Has_No_API_Changes.DotNet10_0.verified.txt | 2 - ..._Has_No_API_Changes.DotNet8_0.verified.txt | 2 - ..._Has_No_API_Changes.DotNet9_0.verified.txt | 2 - ...ary_Has_No_API_Changes.Net4_7.verified.txt | 2 - .../Bugs/_3882/CancellationAfterHooksTests.cs | 174 +++++++++++ .../Bugs/_3882/ExternalCancellationTests.cs | 167 +++++++++++ TUnit.TestProject/SetHookExecutorTests.cs | 33 -- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 6 +- docs/docs/extensions/extensions.md | 2 +- docs/docs/migration/mstest.md | 4 +- docs/docs/migration/nunit.md | 4 +- docs/docs/migration/xunit.md | 4 +- docs/docs/troubleshooting.md | 2 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 44 +-- .../benchmarks/MassiveParallelTests.json | 44 +-- docs/static/benchmarks/MatrixTests.json | 44 +-- docs/static/benchmarks/ScaleTests.json | 44 +-- .../static/benchmarks/SetupTeardownTests.json | 36 +-- docs/static/benchmarks/historical.json | 8 - docs/static/benchmarks/latest.json | 282 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 49 files changed, 1253 insertions(+), 487 deletions(-) create mode 100644 TUnit.Engine.Tests/CancellationAfterHooksTests.cs create mode 100644 TUnit.Engine.Tests/ExternalCancellationTests.cs create mode 100644 TUnit.Engine/Services/AfterHookPairTracker.cs create mode 100644 TUnit.TestProject/Bugs/_3882/CancellationAfterHooksTests.cs create mode 100644 TUnit.TestProject/Bugs/_3882/ExternalCancellationTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 95fa47b2f0..1052b3a500 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,18 +81,18 @@ - - + + - + - - - + + + \ No newline at end of file diff --git a/TUnit.Analyzers.Tests/Verifiers/CSharpCodeFixVerifier.cs b/TUnit.Analyzers.Tests/Verifiers/CSharpCodeFixVerifier.cs index 3683793e41..e28299d735 100644 --- a/TUnit.Analyzers.Tests/Verifiers/CSharpCodeFixVerifier.cs +++ b/TUnit.Analyzers.Tests/Verifiers/CSharpCodeFixVerifier.cs @@ -5,6 +5,7 @@ using Microsoft.CodeAnalysis.CSharp.Testing; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Text; namespace TUnit.Analyzers.Tests.Verifiers; @@ -16,6 +17,12 @@ public class Test : CSharpCodeFixTest { var project = solution.GetProject(projectId); diff --git a/TUnit.Analyzers.Tests/Verifiers/LineEndingNormalizingVerifier.cs b/TUnit.Analyzers.Tests/Verifiers/LineEndingNormalizingVerifier.cs index e12d6722ca..cecbb774c4 100644 --- a/TUnit.Analyzers.Tests/Verifiers/LineEndingNormalizingVerifier.cs +++ b/TUnit.Analyzers.Tests/Verifiers/LineEndingNormalizingVerifier.cs @@ -60,7 +60,17 @@ public void NotEmpty(string collectionName, IEnumerable collection) public void SequenceEqual(IEnumerable expected, IEnumerable actual, IEqualityComparer? equalityComparer = null, string? message = null) { - _defaultVerifier.SequenceEqual(expected, actual, equalityComparer, message); + // Normalize line endings for string sequence comparisons + if (typeof(T) == typeof(string)) + { + var normalizedExpected = expected.Cast().Select(NormalizeLineEndings).Cast(); + var normalizedActual = actual.Cast().Select(NormalizeLineEndings).Cast(); + _defaultVerifier.SequenceEqual(normalizedExpected, normalizedActual, equalityComparer, message); + } + else + { + _defaultVerifier.SequenceEqual(expected, actual, equalityComparer, message); + } } public IVerifier PushContext(string context) diff --git a/TUnit.Assertions/Chaining/AndAssertion.cs b/TUnit.Assertions/Chaining/AndAssertion.cs index b9186e64ee..486c947b73 100644 --- a/TUnit.Assertions/Chaining/AndAssertion.cs +++ b/TUnit.Assertions/Chaining/AndAssertion.cs @@ -139,10 +139,10 @@ private string BuildCombinedExpectation() var becausePrefix = firstBecause.StartsWith("because ", StringComparison.OrdinalIgnoreCase) ? firstBecause : $"because {firstBecause}"; - return $"{firstExpectation}, {becausePrefix}{Environment.NewLine}and {secondExpectation}"; + return $"{firstExpectation}, {becausePrefix}\nand {secondExpectation}"; } - return $"{firstExpectation}{Environment.NewLine}and {secondExpectation}"; + return $"{firstExpectation}\nand {secondExpectation}"; } protected override string GetExpectation() => "both conditions"; diff --git a/TUnit.Assertions/Chaining/OrAssertion.cs b/TUnit.Assertions/Chaining/OrAssertion.cs index 47aa2e87c2..15b042a531 100644 --- a/TUnit.Assertions/Chaining/OrAssertion.cs +++ b/TUnit.Assertions/Chaining/OrAssertion.cs @@ -140,10 +140,10 @@ private string BuildCombinedExpectation() var becausePrefix = firstBecause.StartsWith("because ", StringComparison.OrdinalIgnoreCase) ? firstBecause : $"because {firstBecause}"; - return $"{firstExpectation}, {becausePrefix}{Environment.NewLine}or {secondExpectation}"; + return $"{firstExpectation}, {becausePrefix}\nor {secondExpectation}"; } - return $"{firstExpectation}{Environment.NewLine}or {secondExpectation}"; + return $"{firstExpectation}\nor {secondExpectation}"; } protected override string GetExpectation() => "either condition"; diff --git a/TUnit.Assertions/Extensions/AssertionExtensions.cs b/TUnit.Assertions/Extensions/AssertionExtensions.cs index 95aee50a34..d065942ad1 100644 --- a/TUnit.Assertions/Extensions/AssertionExtensions.cs +++ b/TUnit.Assertions/Extensions/AssertionExtensions.cs @@ -262,7 +262,7 @@ public static MemberAssertionResult Member( /// Example: await Assert.That(myObject).Member(x => x.Attributes, attrs => attrs.ContainsKey("status").And.IsNotEmpty()); /// Note: This overload exists for backward compatibility. For AOT compatibility, use the TTransformed overload instead. /// - [OverloadResolutionPriority(1)] + [OverloadResolutionPriority(2)] [RequiresDynamicCode("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] public static MemberAssertionResult Member( this IAssertionSource source, @@ -421,7 +421,7 @@ public static MemberAssertionResult Member( /// Example: await Assert.That(myObject).Member(x => x.Tags, tags => tags.HasCount(1).And.Contains("value")); /// Note: This overload exists for backward compatibility. For AOT compatibility, use the TTransformed overload instead. /// - [OverloadResolutionPriority(0)] + [OverloadResolutionPriority(1)] [RequiresDynamicCode("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] public static MemberAssertionResult Member( this IAssertionSource source, @@ -527,7 +527,6 @@ public static MemberAssertionResult Member x.PropertyName, value => value.IsEqualTo(expectedValue)); /// - [OverloadResolutionPriority(0)] public static MemberAssertionResult Member( this IAssertionSource source, Expression> memberSelector, @@ -580,7 +579,6 @@ public static MemberAssertionResult Member( /// Example: await Assert.That(myObject).Member(x => x.PropertyName, value => value.IsEqualTo(expectedValue)); /// Note: This overload exists for backward compatibility. For AOT compatibility, use the TTransformed overload instead. /// - [OverloadResolutionPriority(-1)] [RequiresDynamicCode("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] public static MemberAssertionResult Member( this IAssertionSource source, diff --git a/TUnit.Core/EngineCancellationToken.cs b/TUnit.Core/EngineCancellationToken.cs index 3ed56c20b1..395cc7c5dd 100644 --- a/TUnit.Core/EngineCancellationToken.cs +++ b/TUnit.Core/EngineCancellationToken.cs @@ -33,6 +33,7 @@ internal void Initialise(CancellationToken cancellationToken) { #endif Console.CancelKeyPress += OnCancelKeyPress; + AppDomain.CurrentDomain.ProcessExit += OnProcessExit; #if NET5_0_OR_GREATER } #endif @@ -71,6 +72,21 @@ private void OnCancelKeyPress(object? sender, ConsoleCancelEventArgs e) e.Cancel = true; } + private void OnProcessExit(object? sender, EventArgs e) + { + // Process is exiting (SIGTERM, kill, etc.) - trigger cancellation to execute After hooks + // Note: ProcessExit runs on a background thread with limited time (~3 seconds on Windows) + // The After hooks registered via CancellationToken.Register() will execute when we cancel + if (!CancellationTokenSource.IsCancellationRequested) + { + CancellationTokenSource.Cancel(); + + // Give After hooks a brief moment to execute via registered callbacks + // ProcessExit has limited time, so we can only wait briefly + Task.Delay(TimeSpan.FromMilliseconds(500)).GetAwaiter().GetResult(); + } + } + /// /// Disposes the cancellation token source. /// @@ -82,6 +98,7 @@ public void Dispose() { #endif Console.CancelKeyPress -= OnCancelKeyPress; + AppDomain.CurrentDomain.ProcessExit -= OnProcessExit; #if NET5_0_OR_GREATER } #endif diff --git a/TUnit.Core/Executors/GenericAbstractExecutor.cs b/TUnit.Core/Executors/GenericAbstractExecutor.cs index 8be73248ba..8631771b9e 100644 --- a/TUnit.Core/Executors/GenericAbstractExecutor.cs +++ b/TUnit.Core/Executors/GenericAbstractExecutor.cs @@ -57,11 +57,6 @@ public ValueTask ExecuteAfterTestHook(MethodMetadata hookMethodInfo, TestContext return ExecuteAsync(action); } - public ValueTask ExecuteDisposal(TestContext context, Func action) - { - return ExecuteAsync(action); - } - public ValueTask ExecuteTest(TestContext context, Func action) { return ExecuteAsync(action); diff --git a/TUnit.Core/Interfaces/IHookExecutor.cs b/TUnit.Core/Interfaces/IHookExecutor.cs index 13ec72d8fd..6d3d1c8e81 100644 --- a/TUnit.Core/Interfaces/IHookExecutor.cs +++ b/TUnit.Core/Interfaces/IHookExecutor.cs @@ -13,11 +13,4 @@ public interface IHookExecutor ValueTask ExecuteAfterAssemblyHook(MethodMetadata hookMethodInfo, AssemblyHookContext context, Func action); ValueTask ExecuteAfterClassHook(MethodMetadata hookMethodInfo, ClassHookContext context, Func action); ValueTask ExecuteAfterTestHook(MethodMetadata hookMethodInfo, TestContext context, Func action); - -#if NETSTANDARD2_0 - ValueTask ExecuteDisposal(TestContext context, Func action); -#else - ValueTask ExecuteDisposal(TestContext context, Func action) - => action(); -#endif } diff --git a/TUnit.Engine.Tests/CancellationAfterHooksTests.cs b/TUnit.Engine.Tests/CancellationAfterHooksTests.cs new file mode 100644 index 0000000000..750bb9ef38 --- /dev/null +++ b/TUnit.Engine.Tests/CancellationAfterHooksTests.cs @@ -0,0 +1,122 @@ +using Shouldly; +using TUnit.Engine.Tests.Enums; +using TUnit.Engine.Tests.Extensions; + +namespace TUnit.Engine.Tests; + +/// +/// Validates that After hooks execute even when tests are cancelled (Issue #3882). +/// These tests run the cancellation test scenarios and verify that After hooks created marker files. +/// +public class CancellationAfterHooksTests(TestMode testMode) : InvokableTestBase(testMode) +{ + private static readonly string TempPath = Path.GetTempPath(); + + [Test] + public async Task TestLevel_AfterHook_Runs_OnCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_Tests", "after_Test_ThatGets_Cancelled.txt"); + + // Clean up any existing marker files + if (File.Exists(afterMarkerFile)) + { + File.Delete(afterMarkerFile); + } + + await RunTestsWithFilter( + "/*/*/CancellationAfterHooksTests/*", + [ + // Test run completes even though the test itself fails (timeout is expected) + result => result.ResultSummary.Counters.Total.ShouldBe(1), + // Test should fail due to timeout + result => result.ResultSummary.Counters.Failed.ShouldBe(1), + // After hook should have created the marker file - this proves After hooks ran on cancellation + _ => File.Exists(afterMarkerFile).ShouldBeTrue($"After hook marker file should exist at {afterMarkerFile}") + ]); + + // Verify marker file content + if (File.Exists(afterMarkerFile)) + { + var content = await File.ReadAllTextAsync(afterMarkerFile); + content.ShouldContain("After hook executed"); + } + } + + [Test] + public async Task SessionLevel_AfterHook_Runs_OnCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_Session_After.txt"); + + // Clean up any existing marker files + if (File.Exists(afterMarkerFile)) + { + File.Delete(afterMarkerFile); + } + + await RunTestsWithFilter( + "/*/*/SessionLevelCancellationTests/*", + [ + // After Session hook should have created the marker file - this proves Session After hooks ran on cancellation + _ => File.Exists(afterMarkerFile).ShouldBeTrue($"Session After hook marker file should exist at {afterMarkerFile}") + ]); + + // Verify marker file content + if (File.Exists(afterMarkerFile)) + { + var content = await File.ReadAllTextAsync(afterMarkerFile); + content.ShouldContain("Session After hook executed"); + } + } + + [Test] + public async Task AssemblyLevel_AfterHook_Runs_OnCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_Assembly_After.txt"); + + // Clean up any existing marker files + if (File.Exists(afterMarkerFile)) + { + File.Delete(afterMarkerFile); + } + + await RunTestsWithFilter( + "/*/*/AssemblyLevelCancellationTests/*", + [ + // After Assembly hook should have created the marker file - this proves Assembly After hooks ran on cancellation + _ => File.Exists(afterMarkerFile).ShouldBeTrue($"Assembly After hook marker file should exist at {afterMarkerFile}") + ]); + + // Verify marker file content + if (File.Exists(afterMarkerFile)) + { + var content = await File.ReadAllTextAsync(afterMarkerFile); + content.ShouldContain("Assembly After hook executed"); + } + } + + [Test] + public async Task ClassLevel_AfterHook_Runs_OnCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_Class_After.txt"); + + // Clean up any existing marker files + if (File.Exists(afterMarkerFile)) + { + File.Delete(afterMarkerFile); + } + + await RunTestsWithFilter( + "/*/*/ClassLevelCancellationTests/*", + [ + // After Class hook should have created the marker file - this proves Class After hooks ran on cancellation + _ => File.Exists(afterMarkerFile).ShouldBeTrue($"Class After hook marker file should exist at {afterMarkerFile}") + ]); + + // Verify marker file content + if (File.Exists(afterMarkerFile)) + { + var content = await File.ReadAllTextAsync(afterMarkerFile); + content.ShouldContain("Class After hook executed"); + } + } +} diff --git a/TUnit.Engine.Tests/ExternalCancellationTests.cs b/TUnit.Engine.Tests/ExternalCancellationTests.cs new file mode 100644 index 0000000000..88dce62572 --- /dev/null +++ b/TUnit.Engine.Tests/ExternalCancellationTests.cs @@ -0,0 +1,147 @@ +using System.Diagnostics; +using CliWrap; +using Shouldly; +using TUnit.Engine.Tests.Enums; + +namespace TUnit.Engine.Tests; + +/// +/// Validates that After hooks execute even when tests are cancelled EXTERNALLY (Issue #3882). +/// These tests start the test process asynchronously, cancel it mid-execution (simulating Ctrl+C or Stop button), +/// and verify that After hooks still execute by checking for marker files. +/// +public class ExternalCancellationTests(TestMode testMode) : InvokableTestBase(testMode) +{ + private static readonly string TempPath = Path.GetTempPath(); + private static readonly string GetEnvironmentVariable = Environment.GetEnvironmentVariable("NET_VERSION") ?? "net10.0"; + + /// + /// Runs a test with external cancellation (simulates Ctrl+C, VS Test Explorer Stop button). + /// + /// Test filter pattern + /// Path to the marker file that proves After hook executed + /// Expected content in the marker file + private async Task RunTestWithExternalCancellation(string filter, string markerFile, string expectedMarkerContent) + { + // Clean up any existing marker files + if (File.Exists(markerFile)) + { + File.Delete(markerFile); + } + + var testProject = Sourcy.DotNet.Projects.TUnit_TestProject; + var guid = Guid.NewGuid().ToString("N"); + var trxFilename = guid + ".trx"; + + using var gracefulCancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + using var forcefulCancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(25)); + + // Use cross-platform executable detection (Linux: no extension, Windows: .exe) + var binDir = new DirectoryInfo(Path.Combine(testProject.DirectoryName!, "bin", "Release", GetEnvironmentVariable)); + var file = binDir.GetFiles("TUnit.TestProject").FirstOrDefault()?.FullName + ?? binDir.GetFiles("TUnit.TestProject.exe").First().FullName; + + var command = testMode switch + { + TestMode.SourceGenerated => Cli.Wrap(file) + .WithArguments( + [ + "--treenode-filter", filter, + "--report-trx", "--report-trx-filename", trxFilename, + "--diagnostic-verbosity", "Debug", + "--diagnostic", "--diagnostic-file-prefix", $"log_ExternalCancellation_{GetType().Name}_", + ]) + .WithWorkingDirectory(testProject.DirectoryName!) + .WithValidation(CommandResultValidation.None), + + TestMode.Reflection => Cli.Wrap(file) + .WithArguments( + [ + "--treenode-filter", filter, + "--report-trx", "--report-trx-filename", trxFilename, + "--diagnostic-verbosity", "Debug", + "--diagnostic", "--diagnostic-file-prefix", $"log_ExternalCancellation_{GetType().Name}_", + "--reflection" + ]) + .WithWorkingDirectory(testProject.DirectoryName!) + .WithValidation(CommandResultValidation.None), + + // Skip AOT and SingleFile modes for external cancellation (only test in CI) + TestMode.AOT => null, + TestMode.SingleFileApplication => null, + _ => throw new ArgumentOutOfRangeException(nameof(testMode), testMode, null) + }; + + // Skip AOT and SingleFile modes + if (command == null) + { + return; + } + + try + { + await command.ExecuteAsync(forcefulCancellationTokenSource.Token, gracefulCancellationTokenSource.Token); + } + catch (OperationCanceledException) + { + // Expected: Process was cancelled via CancellationToken + Console.WriteLine("[ExternalCancellation] Process cancelled successfully (expected)"); + } + catch (Exception ex) + { + // Log unexpected exceptions but don't fail - After hooks might still execute + Console.WriteLine($"[ExternalCancellation] Unexpected exception: {ex.Message}"); + } + + // Verify marker file exists - this proves After hook executed even on external cancellation + File.Exists(markerFile).ShouldBeTrue($"After hook marker file should exist at {markerFile}"); + + // Verify marker file content + var content = await File.ReadAllTextAsync(markerFile); + content.ShouldContain(expectedMarkerContent); + } + + [Test] + public async Task TestLevel_AfterHook_Runs_OnExternalCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_External", "after_Test_ThatGets_Cancelled_Externally.txt"); + + await RunTestWithExternalCancellation( + "/*/*/ExternalCancellationTests/*", + afterMarkerFile, + "After hook executed"); + } + + [Test] + public async Task SessionLevel_AfterHook_Runs_OnExternalCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_External_Session_After.txt"); + + await RunTestWithExternalCancellation( + "/*/*/ExternalSessionLevelCancellationTests/*", + afterMarkerFile, + "Session After hook executed"); + } + + [Test] + public async Task AssemblyLevel_AfterHook_Runs_OnExternalCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_External_Assembly_After.txt"); + + await RunTestWithExternalCancellation( + "/*/*/ExternalAssemblyLevelCancellationTests/*", + afterMarkerFile, + "Assembly After hook executed"); + } + + [Test] + public async Task ClassLevel_AfterHook_Runs_OnExternalCancellation() + { + var afterMarkerFile = Path.Combine(TempPath, "TUnit_3882_External_Class_After.txt"); + + await RunTestWithExternalCancellation( + "/*/*/ExternalClassLevelCancellationTests/*", + afterMarkerFile, + "Class After hook executed"); + } +} diff --git a/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs b/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs index de062bd768..cc3954b121 100644 --- a/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs +++ b/TUnit.Engine/Discovery/ReflectionHookDiscoveryService.cs @@ -1029,7 +1029,4 @@ public ValueTask ExecuteBeforeTestSessionHook(MethodMetadata testMethod, TestSes public ValueTask ExecuteAfterTestSessionHook(MethodMetadata testMethod, TestSessionContext context, Func action) => action(); - - public ValueTask ExecuteDisposal(TestContext context, Func action) - => action(); } diff --git a/TUnit.Engine/Framework/TUnitServiceProvider.cs b/TUnit.Engine/Framework/TUnitServiceProvider.cs index 823d643784..dd6896971d 100644 --- a/TUnit.Engine/Framework/TUnitServiceProvider.cs +++ b/TUnit.Engine/Framework/TUnitServiceProvider.cs @@ -145,8 +145,9 @@ public TUnitServiceProvider(IExtension extension, var hookExecutor = Register(new HookExecutor(HookCollectionService, ContextProvider, EventReceiverOrchestrator)); var lifecycleCoordinator = Register(new TestLifecycleCoordinator()); var beforeHookTaskCache = Register(new BeforeHookTaskCache()); + var afterHookPairTracker = Register(new AfterHookPairTracker()); - TestExecutor = Register(new TestExecutor(hookExecutor, lifecycleCoordinator, beforeHookTaskCache, ContextProvider, EventReceiverOrchestrator)); + TestExecutor = Register(new TestExecutor(hookExecutor, lifecycleCoordinator, beforeHookTaskCache, afterHookPairTracker, ContextProvider, EventReceiverOrchestrator)); var testExecutionGuard = Register(new TestExecutionGuard()); var testStateManager = Register(new TestStateManager()); diff --git a/TUnit.Engine/Services/AfterHookPairTracker.cs b/TUnit.Engine/Services/AfterHookPairTracker.cs new file mode 100644 index 0000000000..5e6e12deb5 --- /dev/null +++ b/TUnit.Engine/Services/AfterHookPairTracker.cs @@ -0,0 +1,155 @@ +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using TUnit.Core.Data; + +namespace TUnit.Engine.Services; + +/// +/// Responsible for ensuring After hooks run even when tests are cancelled. +/// When a Before hook completes, this tracker registers the corresponding After hook +/// to run on cancellation, guaranteeing cleanup even if the test is aborted. +/// Follows Single Responsibility Principle - only handles After hook pairing and cancellation registration. +/// +internal sealed class AfterHookPairTracker +{ + // Cached After hook tasks to ensure they run only once (prevent double execution) + private readonly ThreadSafeDictionary>> _afterClassTasks = new(); + private readonly ThreadSafeDictionary>> _afterAssemblyTasks = new(); + private Task>? _afterTestSessionTask; + private readonly object _testSessionLock = new(); + private readonly object _classLock = new(); + + // Track cancellation registrations for cleanup + private readonly ConcurrentBag _registrations = []; + + /// + /// Registers Session After hooks to run on cancellation or normal completion. + /// Ensures After hooks run exactly once even if called both ways. + /// + public void RegisterAfterTestSessionHook( + CancellationToken cancellationToken, + Func>> afterHookExecutor) + { + // Register callback to run After hook on cancellation + var registration = cancellationToken.Register(() => + { + // Use sync-over-async here because CancellationToken.Register requires Action (not Func) + // Fire-and-forget is acceptable here - exceptions will be collected when hooks run normally + _ = GetOrCreateAfterTestSessionTask(afterHookExecutor); + }); + + _registrations.Add(registration); + } + + /// + /// Registers Assembly After hooks to run on cancellation or normal completion. + /// Ensures After hooks run exactly once even if called both ways. + /// + public void RegisterAfterAssemblyHook( + Assembly assembly, + CancellationToken cancellationToken, + Func>> afterHookExecutor) + { + var registration = cancellationToken.Register(() => + { + _ = GetOrCreateAfterAssemblyTask(assembly, afterHookExecutor); + }); + + _registrations.Add(registration); + } + + /// + /// Registers Class After hooks to run on cancellation or normal completion. + /// Ensures After hooks run exactly once even if called both ways. + /// + public void RegisterAfterClassHook( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicMethods)] + Type testClass, + HookExecutor hookExecutor, + CancellationToken cancellationToken) + { + var registration = cancellationToken.Register(() => + { + _ = GetOrCreateAfterClassTask(testClass, hookExecutor, CancellationToken.None); + }); + + _registrations.Add(registration); + } + + /// + /// Gets or creates the After Test Session task, ensuring it runs only once. + /// Thread-safe using double-checked locking. + /// Returns the exceptions from hook execution. + /// + public ValueTask> GetOrCreateAfterTestSessionTask(Func>> taskFactory) + { + if (_afterTestSessionTask != null) + { + return new ValueTask>(_afterTestSessionTask); + } + + lock (_testSessionLock) + { + if (_afterTestSessionTask == null) + { + _afterTestSessionTask = taskFactory().AsTask(); + } + return new ValueTask>(_afterTestSessionTask); + } + } + + /// + /// Gets or creates the After Assembly task for the specified assembly. + /// Thread-safe using ThreadSafeDictionary. + /// Returns the exceptions from hook execution. + /// + public ValueTask> GetOrCreateAfterAssemblyTask(Assembly assembly, Func>> taskFactory) + { + var task = _afterAssemblyTasks.GetOrAdd(assembly, a => taskFactory(a).AsTask()); + return new ValueTask>(task); + } + + /// + /// Gets or creates the After Class task for the specified test class. + /// Thread-safe using double-checked locking. + /// Returns the exceptions from hook execution. + /// + public ValueTask> GetOrCreateAfterClassTask( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicMethods)] + Type testClass, + HookExecutor hookExecutor, + CancellationToken cancellationToken) + { + if (_afterClassTasks.TryGetValue(testClass, out var existingTask)) + { + return new ValueTask>(existingTask); + } + + lock (_classLock) + { + if (_afterClassTasks.TryGetValue(testClass, out existingTask)) + { + return new ValueTask>(existingTask); + } + + // Call ExecuteAfterClassHooksAsync directly with the annotated testClass + // The factory ignores the key since we've already created the task with the annotated type + var newTask = hookExecutor.ExecuteAfterClassHooksAsync(testClass, cancellationToken).AsTask(); + _afterClassTasks.GetOrAdd(testClass, _ => newTask); + return new ValueTask>(newTask); + } + } + + /// + /// Disposes all cancellation token registrations. + /// Should be called at the end of test execution to clean up resources. + /// + public void Dispose() + { + foreach (var registration in _registrations) + { + registration.Dispose(); + } + } +} diff --git a/TUnit.Engine/Services/BeforeHookTaskCache.cs b/TUnit.Engine/Services/BeforeHookTaskCache.cs index 3b76326dac..1a23fe93af 100644 --- a/TUnit.Engine/Services/BeforeHookTaskCache.cs +++ b/TUnit.Engine/Services/BeforeHookTaskCache.cs @@ -1,4 +1,3 @@ -using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Reflection; using TUnit.Core.Data; @@ -16,8 +15,9 @@ internal sealed class BeforeHookTaskCache private readonly ThreadSafeDictionary _beforeAssemblyTasks = new(); private Task? _beforeTestSessionTask; private readonly object _testSessionLock = new(); + private readonly object _classLock = new(); - public ValueTask GetOrCreateBeforeTestSessionTask(Func taskFactory) + public ValueTask GetOrCreateBeforeTestSessionTask(Func taskFactory, CancellationToken cancellationToken) { if (_beforeTestSessionTask != null) { @@ -28,23 +28,41 @@ public ValueTask GetOrCreateBeforeTestSessionTask(Func taskFactory) { if (_beforeTestSessionTask == null) { - _beforeTestSessionTask = taskFactory().AsTask(); + _beforeTestSessionTask = taskFactory(cancellationToken).AsTask(); } return new ValueTask(_beforeTestSessionTask); } } - public ValueTask GetOrCreateBeforeAssemblyTask(Assembly assembly, Func taskFactory) + public ValueTask GetOrCreateBeforeAssemblyTask(Assembly assembly, Func taskFactory, CancellationToken cancellationToken) { - var task = _beforeAssemblyTasks.GetOrAdd(assembly, a => taskFactory(a).AsTask()); + var task = _beforeAssemblyTasks.GetOrAdd(assembly, a => taskFactory(a, cancellationToken).AsTask()); return new ValueTask(task); } public ValueTask GetOrCreateBeforeClassTask( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicMethods)] - Type testClass, Func taskFactory) + Type testClass, + HookExecutor hookExecutor, + CancellationToken cancellationToken) { - var task = _beforeClassTasks.GetOrAdd(testClass, t => taskFactory(t).AsTask()); - return new ValueTask(task); + if (_beforeClassTasks.TryGetValue(testClass, out var existingTask)) + { + return new ValueTask(existingTask); + } + + lock (_classLock) + { + if (_beforeClassTasks.TryGetValue(testClass, out existingTask)) + { + return new ValueTask(existingTask); + } + + // Call ExecuteBeforeClassHooksAsync directly with the annotated testClass + // The factory ignores the key since we've already created the task with the annotated type + var newTask = hookExecutor.ExecuteBeforeClassHooksAsync(testClass, cancellationToken).AsTask(); + _beforeClassTasks.GetOrAdd(testClass, _ => newTask); + return new ValueTask(newTask); + } } } diff --git a/TUnit.Engine/Services/TestExecution/TestCoordinator.cs b/TUnit.Engine/Services/TestExecution/TestCoordinator.cs index 928f603df0..b448e459e6 100644 --- a/TUnit.Engine/Services/TestExecution/TestCoordinator.cs +++ b/TUnit.Engine/Services/TestExecution/TestCoordinator.cs @@ -1,7 +1,6 @@ using System.Linq; using TUnit.Core; using TUnit.Core.Exceptions; -using TUnit.Core.Interfaces; using TUnit.Core.Logging; using TUnit.Core.Tracking; using TUnit.Engine.Helpers; @@ -91,7 +90,7 @@ private async ValueTask ExecuteTestInternalAsync(AbstractExecutableTest test, Ca } // Ensure TestSession hooks run before creating test instances - await _testExecutor.EnsureTestSessionHooksExecutedAsync().ConfigureAwait(false); + await _testExecutor.EnsureTestSessionHooksExecutedAsync(cancellationToken).ConfigureAwait(false); // Execute test with retry logic - each retry gets a fresh instance // Timeout is applied per retry attempt, not across all retries @@ -153,8 +152,7 @@ await TimeoutHelper.ExecuteWithTimeoutAsync( try { - var hookExecutor = test.Context.CustomHookExecutor; - await TestExecutor.DisposeTestInstance(test, hookExecutor).ConfigureAwait(false); + await TestExecutor.DisposeTestInstance(test).ConfigureAwait(false); } catch (Exception disposeEx) { diff --git a/TUnit.Engine/TestExecutor.cs b/TUnit.Engine/TestExecutor.cs index 8418bcb322..e7d65b92f0 100644 --- a/TUnit.Engine/TestExecutor.cs +++ b/TUnit.Engine/TestExecutor.cs @@ -19,6 +19,7 @@ internal class TestExecutor private readonly HookExecutor _hookExecutor; private readonly TestLifecycleCoordinator _lifecycleCoordinator; private readonly BeforeHookTaskCache _beforeHookTaskCache; + private readonly AfterHookPairTracker _afterHookPairTracker; private readonly IContextProvider _contextProvider; private readonly EventReceiverOrchestrator _eventReceiverOrchestrator; @@ -26,12 +27,14 @@ public TestExecutor( HookExecutor hookExecutor, TestLifecycleCoordinator lifecycleCoordinator, BeforeHookTaskCache beforeHookTaskCache, + AfterHookPairTracker afterHookPairTracker, IContextProvider contextProvider, EventReceiverOrchestrator eventReceiverOrchestrator) { _hookExecutor = hookExecutor; _lifecycleCoordinator = lifecycleCoordinator; _beforeHookTaskCache = beforeHookTaskCache; + _afterHookPairTracker = afterHookPairTracker; _contextProvider = contextProvider; _eventReceiverOrchestrator = eventReceiverOrchestrator; } @@ -40,12 +43,19 @@ public TestExecutor( /// /// Ensures that Before(TestSession) hooks have been executed. /// This is called before creating test instances to ensure resources are available. + /// Registers the corresponding After(TestSession) hook to run on cancellation. /// - public async Task EnsureTestSessionHooksExecutedAsync() + public async Task EnsureTestSessionHooksExecutedAsync(CancellationToken cancellationToken) { // Get or create and cache Before hooks - these run only once - await _beforeHookTaskCache.GetOrCreateBeforeTestSessionTask(() => - _hookExecutor.ExecuteBeforeTestSessionHooksAsync(CancellationToken.None)).ConfigureAwait(false); + await _beforeHookTaskCache.GetOrCreateBeforeTestSessionTask( + ct => _hookExecutor.ExecuteBeforeTestSessionHooksAsync(ct), + cancellationToken).ConfigureAwait(false); + + // Register After Session hook to run on cancellation (guarantees cleanup) + _afterHookPairTracker.RegisterAfterTestSessionHook( + cancellationToken, + () => new ValueTask>(_hookExecutor.ExecuteAfterTestSessionHooksAsync(CancellationToken.None).AsTask())); } /// @@ -63,7 +73,7 @@ public async ValueTask ExecuteAsync(AbstractExecutableTest executableTest, Cance try { - await EnsureTestSessionHooksExecutedAsync().ConfigureAwait(false); + await EnsureTestSessionHooksExecutedAsync(cancellationToken).ConfigureAwait(false); await _eventReceiverOrchestrator.InvokeFirstTestInSessionEventReceiversAsync( executableTest.Context, @@ -72,8 +82,16 @@ await _eventReceiverOrchestrator.InvokeFirstTestInSessionEventReceiversAsync( executableTest.Context.ClassContext.AssemblyContext.TestSessionContext.RestoreExecutionContext(); - await _beforeHookTaskCache.GetOrCreateBeforeAssemblyTask(testAssembly, assembly => _hookExecutor.ExecuteBeforeAssemblyHooksAsync(assembly, CancellationToken.None)) - .ConfigureAwait(false); + await _beforeHookTaskCache.GetOrCreateBeforeAssemblyTask( + testAssembly, + (assembly, ct) => _hookExecutor.ExecuteBeforeAssemblyHooksAsync(assembly, ct), + cancellationToken).ConfigureAwait(false); + + // Register After Assembly hook to run on cancellation (guarantees cleanup) + _afterHookPairTracker.RegisterAfterAssemblyHook( + testAssembly, + cancellationToken, + (assembly) => new ValueTask>(_hookExecutor.ExecuteAfterAssemblyHooksAsync(assembly, CancellationToken.None).AsTask())); await _eventReceiverOrchestrator.InvokeFirstTestInAssemblyEventReceiversAsync( executableTest.Context, @@ -82,8 +100,10 @@ await _eventReceiverOrchestrator.InvokeFirstTestInAssemblyEventReceiversAsync( executableTest.Context.ClassContext.AssemblyContext.RestoreExecutionContext(); - await _beforeHookTaskCache.GetOrCreateBeforeClassTask(testClass, _ => _hookExecutor.ExecuteBeforeClassHooksAsync(testClass, CancellationToken.None)) - .ConfigureAwait(false); + await _beforeHookTaskCache.GetOrCreateBeforeClassTask(testClass, _hookExecutor, cancellationToken).ConfigureAwait(false); + + // Register After Class hook to run on cancellation (guarantees cleanup) + _afterHookPairTracker.RegisterAfterClassHook(testClass, _hookExecutor, cancellationToken); await _eventReceiverOrchestrator.InvokeFirstTestInClassEventReceiversAsync( executableTest.Context, @@ -121,13 +141,16 @@ await _eventReceiverOrchestrator.InvokeFirstTestInClassEventReceiversAsync( } finally { + // After hooks must use CancellationToken.None to ensure cleanup runs even when cancelled + // This matches the pattern used for After Class/Assembly hooks in TestCoordinator + // Early stage test end receivers run before instance-level hooks - var earlyStageExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Early).ConfigureAwait(false); + var earlyStageExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, CancellationToken.None, EventReceiverStage.Early).ConfigureAwait(false); - var hookExceptions = await _hookExecutor.ExecuteAfterTestHooksAsync(executableTest, cancellationToken).ConfigureAwait(false); + var hookExceptions = await _hookExecutor.ExecuteAfterTestHooksAsync(executableTest, CancellationToken.None).ConfigureAwait(false); // Late stage test end receivers run after instance-level hooks (default behavior) - var lateStageExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Late).ConfigureAwait(false); + var lateStageExceptions = await _eventReceiverOrchestrator.InvokeTestEndEventReceiversAsync(executableTest.Context, CancellationToken.None, EventReceiverStage.Late).ConfigureAwait(false); // Combine all exceptions from event receivers var eventReceiverExceptions = new List(earlyStageExceptions.Count + lateStageExceptions.Count); @@ -201,13 +224,17 @@ internal async Task> ExecuteAfterClassAssemblyHooks(AbstractExec if (flags.ShouldExecuteAfterClass) { - var classExceptions = await _hookExecutor.ExecuteAfterClassHooksAsync(testClass, cancellationToken).ConfigureAwait(false); + // Use AfterHookPairTracker to prevent double execution if already triggered by cancellation + var classExceptions = await _afterHookPairTracker.GetOrCreateAfterClassTask(testClass, _hookExecutor, cancellationToken).ConfigureAwait(false); exceptions.AddRange(classExceptions); } if (flags.ShouldExecuteAfterAssembly) { - var assemblyExceptions = await _hookExecutor.ExecuteAfterAssemblyHooksAsync(testAssembly, cancellationToken).ConfigureAwait(false); + // Use AfterHookPairTracker to prevent double execution if already triggered by cancellation + var assemblyExceptions = await _afterHookPairTracker.GetOrCreateAfterAssemblyTask( + testAssembly, + (assembly) => new ValueTask>(_hookExecutor.ExecuteAfterAssemblyHooksAsync(assembly, cancellationToken).AsTask())).ConfigureAwait(false); exceptions.AddRange(assemblyExceptions); } @@ -217,10 +244,15 @@ internal async Task> ExecuteAfterClassAssemblyHooks(AbstractExec /// /// Execute session-level after hooks once at the end of test execution. /// Returns any exceptions that occurred during hook execution. + /// Uses AfterHookPairTracker to prevent double execution if already triggered by cancellation. /// public async Task> ExecuteAfterTestSessionHooksAsync(CancellationToken cancellationToken) { - return await _hookExecutor.ExecuteAfterTestSessionHooksAsync(cancellationToken).ConfigureAwait(false); + // Use AfterHookPairTracker to prevent double execution if already triggered by cancellation + var exceptions = await _afterHookPairTracker.GetOrCreateAfterTestSessionTask( + () => new ValueTask>(_hookExecutor.ExecuteAfterTestSessionHooksAsync(cancellationToken).AsTask())).ConfigureAwait(false); + + return exceptions; } /// @@ -247,12 +279,12 @@ public IContextProvider GetContextProvider() return _contextProvider; } - internal static async Task DisposeTestInstance(AbstractExecutableTest test, IHookExecutor? hookExecutor = null) + internal static async Task DisposeTestInstance(AbstractExecutableTest test) { // Dispose the test instance if it's disposable if (test.Context.Metadata.TestDetails.ClassInstance is not SkippedTestInstance) { - async ValueTask DisposeAsync() + try { var instance = test.Context.Metadata.TestDetails.ClassInstance; @@ -266,18 +298,6 @@ async ValueTask DisposeAsync() break; } } - - try - { - if (hookExecutor != null) - { - await hookExecutor.ExecuteDisposal(test.Context, DisposeAsync).ConfigureAwait(false); - } - else - { - await DisposeAsync().ConfigureAwait(false); - } - } catch { // Swallow disposal errors - they shouldn't fail the test diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index e67b9f26b0..e1e5f6bbf0 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1649,13 +1649,11 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(0)] + [.(1)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, object> assertions) { } - [.(0)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(-1)] public static . Member(this . source, .<> memberSelector, <., object> assertions) { } [.(2)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .> assertions) { } @@ -1663,7 +1661,7 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(1)] + [.(2)] public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, object> assertions) { } [.(1)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 9a12c7e10b..a6c9c27621 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1649,13 +1649,11 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(0)] + [.(1)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, object> assertions) { } - [.(0)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(-1)] public static . Member(this . source, .<> memberSelector, <., object> assertions) { } [.(2)] public static . Member(this . source, .<>> memberSelector, <.<., TItem>, .> assertions) { } @@ -1663,7 +1661,7 @@ namespace .Extensions public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, .<.>> assertions) { } [.("Uses reflection for legacy compatibility. For AOT compatibility, use the Member overload with strongly-typed assertions.")] - [.(1)] + [.(2)] public static . Member(this . source, .<>> memberSelector, <.<., TKey, TValue>, object> assertions) { } [.(1)] public static . Member(this . source, .<> memberSelector, <., .> assertions) { } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 8dd30a5468..556486d6e4 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -749,7 +749,6 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } - public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2270,7 +2269,6 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); - . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 917f3ce1f2..8bbca55ff3 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -749,7 +749,6 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } - public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2270,7 +2269,6 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); - . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index dc18aa6f69..e7945a9846 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -749,7 +749,6 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } - public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2270,7 +2269,6 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); - . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 7cfcb2a8fc..dd3923472e 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -726,7 +726,6 @@ namespace public . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action) { } public . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action) { } public . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action) { } - public . ExecuteDisposal(.TestContext context, <.> action) { } public . ExecuteTest(.TestContext context, <.> action) { } } public sealed class GenericMethodInfo @@ -2202,7 +2201,6 @@ namespace .Interfaces . ExecuteBeforeTestDiscoveryHook(.MethodMetadata hookMethodInfo, .BeforeTestDiscoveryContext context, <.> action); . ExecuteBeforeTestHook(.MethodMetadata hookMethodInfo, .TestContext context, <.> action); . ExecuteBeforeTestSessionHook(.MethodMetadata hookMethodInfo, .TestSessionContext context, <.> action); - . ExecuteDisposal(.TestContext context, <.> action); } public interface IHookRegisteredEventReceiver : . { diff --git a/TUnit.TestProject/Bugs/_3882/CancellationAfterHooksTests.cs b/TUnit.TestProject/Bugs/_3882/CancellationAfterHooksTests.cs new file mode 100644 index 0000000000..1f1b19030b --- /dev/null +++ b/TUnit.TestProject/Bugs/_3882/CancellationAfterHooksTests.cs @@ -0,0 +1,174 @@ +using System.Diagnostics; + +namespace TUnit.TestProject.Bugs._3882; + +/// +/// Tests for issue #3882: After Test hook is not run when test is cancelled +/// https://github.com/thomhurst/TUnit/issues/3882 +/// +/// This test demonstrates that After hooks now execute even when tests are cancelled. +/// The Before hook starts a process, the test delays, and the After hook cleans up the process. +/// When cancelled via Test Explorer or timeout, the After hook should still execute. +/// +public class CancellationAfterHooksTests +{ + private static readonly string MarkerFileDirectory = Path.Combine(Path.GetTempPath(), "TUnit_3882_Tests"); + + [Before(Test)] + public async Task StartProcess(TestContext context) + { + // Create marker directory + Directory.CreateDirectory(MarkerFileDirectory); + + // Write marker to prove Before hook ran + var beforeMarker = Path.Combine(MarkerFileDirectory, $"before_{context.Metadata.TestName}.txt"); + await File.WriteAllTextAsync(beforeMarker, $"Before hook executed at {DateTime.Now:O}"); + } + + [Test] + [Timeout(2000)] // 2 second timeout to force cancellation + public async Task Test_ThatGets_Cancelled(CancellationToken cancellationToken) + { + // This test delays longer than the timeout, causing cancellation + await Task.Delay(10000, cancellationToken); + } + + [After(Test)] + public async Task StopProcess(TestContext context) + { + try + { + // Write marker to prove After hook ran EVEN ON CANCELLATION + var afterMarker = Path.Combine(MarkerFileDirectory, $"after_{context.Metadata.TestName}.txt"); + await File.WriteAllTextAsync(afterMarker, $"After hook executed at {DateTime.Now:O} - Outcome: {context.Execution.Result?.State}"); + } + catch (Exception ex) + { + // Don't let marker file creation failure prevent process cleanup + Console.WriteLine($"[AfterTest] Failed to write marker file: {ex.Message}"); + } + } +} + +/// +/// Tests for Session-level After hooks with cancellation +/// +public class SessionLevelCancellationTests +{ + private static readonly string SessionMarkerFile = Path.Combine(Path.GetTempPath(), "TUnit_3882_Session_After.txt"); + + [Before(TestSession)] + public static async Task SessionSetup(TestSessionContext context) + { + await File.WriteAllTextAsync( + Path.Combine(Path.GetTempPath(), "TUnit_3882_Session_Before.txt"), + $"Session Before hook executed at {DateTime.Now:O}"); + } + + [After(TestSession)] + public static async Task SessionCleanup(TestSessionContext context) + { + // This should run even if tests are cancelled + try + { + await File.WriteAllTextAsync( + SessionMarkerFile, + $"Session After hook executed at {DateTime.Now:O}"); + Console.WriteLine($"[AfterTestSession] Session After hook completed successfully"); + } + catch (Exception ex) + { + Console.WriteLine($"[AfterTestSession] Failed to write marker file: {ex.Message}"); + throw; // Re-throw to signal failure, but after logging + } + } + + [Test] + [Timeout(1000)] + public async Task SessionTest_ThatGets_Cancelled(CancellationToken cancellationToken) + { + await Task.Delay(5000, cancellationToken); + } +} + +/// +/// Tests for Assembly-level After hooks with cancellation +/// +public class AssemblyLevelCancellationTests +{ + private static readonly string AssemblyMarkerFile = Path.Combine(Path.GetTempPath(), "TUnit_3882_Assembly_After.txt"); + + [Before(Assembly)] + public static async Task AssemblySetup(AssemblyHookContext context) + { + await File.WriteAllTextAsync( + Path.Combine(Path.GetTempPath(), "TUnit_3882_Assembly_Before.txt"), + $"Assembly Before hook executed at {DateTime.Now:O}"); + } + + [After(Assembly)] + public static async Task AssemblyCleanup(AssemblyHookContext context) + { + // This should run even if tests are cancelled + try + { + await File.WriteAllTextAsync( + AssemblyMarkerFile, + $"Assembly After hook executed at {DateTime.Now:O}"); + Console.WriteLine($"[AfterAssembly] Assembly After hook completed successfully"); + } + catch (Exception ex) + { + Console.WriteLine($"[AfterAssembly] Failed to write marker file: {ex.Message}"); + throw; // Re-throw to signal failure, but after logging + } + } + + [Test] + [Timeout(1000)] + public async Task AssemblyTest_ThatGets_Cancelled(CancellationToken cancellationToken) + { + await Task.Delay(5000, cancellationToken); + } +} + +/// +/// Tests for Class-level After hooks with cancellation +/// +public class ClassLevelCancellationTests +{ + private static readonly string ClassMarkerFile = Path.Combine(Path.GetTempPath(), "TUnit_3882_Class_After.txt"); + + [Before(Class)] + public static async Task ClassSetup(ClassHookContext context) + { + await File.WriteAllTextAsync( + Path.Combine(Path.GetTempPath(), "TUnit_3882_Class_Before.txt"), + $"Class Before hook executed at {DateTime.Now:O}"); + } + + [After(Class)] + public static async Task ClassCleanup(ClassHookContext context) + { + // This should run even if tests are cancelled + try + { + await File.WriteAllTextAsync( + ClassMarkerFile, + $"Class After hook executed at {DateTime.Now:O}"); + Console.WriteLine($"[AfterClass] Class After hook completed successfully"); + } + catch (Exception ex) + { + Console.WriteLine($"[AfterClass] Failed to write marker file: {ex.Message}"); + throw; // Re-throw to signal failure, but after logging + } + } + + [Test] + [Timeout(1000)] + public async Task ClassTest_ThatGets_Cancelled(CancellationToken cancellationToken) + { + await Task.Delay(5000, cancellationToken); + } +} diff --git a/TUnit.TestProject/Bugs/_3882/ExternalCancellationTests.cs b/TUnit.TestProject/Bugs/_3882/ExternalCancellationTests.cs new file mode 100644 index 0000000000..509a8326aa --- /dev/null +++ b/TUnit.TestProject/Bugs/_3882/ExternalCancellationTests.cs @@ -0,0 +1,167 @@ +using System.Diagnostics; + +namespace TUnit.TestProject.Bugs._3882; + +[Timeout(300_000)] // Overall timeout for the test class to prevent indefinite hangs +public class ExternalCancellationTests +{ + private static readonly string MarkerFileDirectory = Path.Combine(Path.GetTempPath(), "TUnit_3882_External"); + + [Before(Test)] + public async Task StartProcess(TestContext context, CancellationToken cancellationToken) + { + // Create marker directory + Directory.CreateDirectory(MarkerFileDirectory); + + // Write marker to prove Before hook ran + var beforeMarker = Path.Combine(MarkerFileDirectory, $"before_{context.Metadata.TestName}.txt"); + await File.WriteAllTextAsync(beforeMarker, $"Before hook executed at {DateTime.Now:O}"); + } + + [Test] + // NO [Timeout] attribute - test runs indefinitely until cancelled externally + public async Task Test_ThatGets_Cancelled_Externally(CancellationToken cancellationToken) + { + // This test delays indefinitely, only stops via external cancellation + await Task.Delay(TimeSpan.FromHours(1), cancellationToken); + } + + [After(Test)] + public async Task StopProcess(TestContext context, CancellationToken cancellationToken) + { + try + { + // Write marker to prove After hook ran EVEN ON EXTERNAL CANCELLATION + var afterMarker = Path.Combine(MarkerFileDirectory, $"after_{context.Metadata.TestName}.txt"); + await File.WriteAllTextAsync(afterMarker, $"After hook executed at {DateTime.Now:O} - Outcome: {context.Execution.Result?.State}"); + } + catch (Exception ex) + { + // Don't let marker file creation failure prevent process cleanup + Console.WriteLine($"[AfterTest] Failed to write marker file: {ex.Message}"); + } + } +} + +/// +/// Tests for Session-level After hooks with external cancellation +/// +public class ExternalSessionLevelCancellationTests +{ + private static readonly string SessionMarkerFile = Path.Combine(Path.GetTempPath(), "TUnit_3882_External_Session_After.txt"); + + [Before(TestSession)] + public static async Task SessionSetup(TestSessionContext context) + { + await File.WriteAllTextAsync( + Path.Combine(Path.GetTempPath(), "TUnit_3882_External_Session_Before.txt"), + $"Session Before hook executed at {DateTime.Now:O}"); + } + + [After(TestSession)] + public static async Task SessionCleanup(TestSessionContext context) + { + // This should run even if tests are cancelled externally + try + { + await File.WriteAllTextAsync( + SessionMarkerFile, + $"Session After hook executed at {DateTime.Now:O}"); + Console.WriteLine($"[AfterTestSession] Session After hook completed successfully"); + } + catch (Exception ex) + { + Console.WriteLine($"[AfterTestSession] Failed to write marker file: {ex.Message}"); + throw; // Re-throw to signal failure, but after logging + } + } + + [Test] + // NO [Timeout] attribute - test runs indefinitely until cancelled externally + public async Task SessionTest_ThatGets_Cancelled_Externally(CancellationToken cancellationToken) + { + await Task.Delay(TimeSpan.FromHours(1), cancellationToken); + } +} + +/// +/// Tests for Assembly-level After hooks with external cancellation +/// +public class ExternalAssemblyLevelCancellationTests +{ + private static readonly string AssemblyMarkerFile = Path.Combine(Path.GetTempPath(), "TUnit_3882_External_Assembly_After.txt"); + + [Before(Assembly)] + public static async Task AssemblySetup(AssemblyHookContext context) + { + await File.WriteAllTextAsync( + Path.Combine(Path.GetTempPath(), "TUnit_3882_External_Assembly_Before.txt"), + $"Assembly Before hook executed at {DateTime.Now:O}"); + } + + [After(Assembly)] + public static async Task AssemblyCleanup(AssemblyHookContext context) + { + // This should run even if tests are cancelled externally + try + { + await File.WriteAllTextAsync( + AssemblyMarkerFile, + $"Assembly After hook executed at {DateTime.Now:O}"); + Console.WriteLine($"[AfterAssembly] Assembly After hook completed successfully"); + } + catch (Exception ex) + { + Console.WriteLine($"[AfterAssembly] Failed to write marker file: {ex.Message}"); + throw; // Re-throw to signal failure, but after logging + } + } + + [Test] + // NO [Timeout] attribute - test runs indefinitely until cancelled externally + public async Task AssemblyTest_ThatGets_Cancelled_Externally(CancellationToken cancellationToken) + { + await Task.Delay(TimeSpan.FromHours(1), cancellationToken); + } +} + +/// +/// Tests for Class-level After hooks with external cancellation +/// +public class ExternalClassLevelCancellationTests +{ + private static readonly string ClassMarkerFile = Path.Combine(Path.GetTempPath(), "TUnit_3882_External_Class_After.txt"); + + [Before(Class)] + public static async Task ClassSetup(ClassHookContext context) + { + await File.WriteAllTextAsync( + Path.Combine(Path.GetTempPath(), "TUnit_3882_External_Class_Before.txt"), + $"Class Before hook executed at {DateTime.Now:O}"); + } + + [After(Class)] + public static async Task ClassCleanup(ClassHookContext context) + { + // This should run even if tests are cancelled externally + try + { + await File.WriteAllTextAsync( + ClassMarkerFile, + $"Class After hook executed at {DateTime.Now:O}"); + Console.WriteLine($"[AfterClass] Class After hook completed successfully"); + } + catch (Exception ex) + { + Console.WriteLine($"[AfterClass] Failed to write marker file: {ex.Message}"); + throw; // Re-throw to signal failure, but after logging + } + } + + [Test] + // NO [Timeout] attribute - test runs indefinitely until cancelled externally + public async Task ClassTest_ThatGets_Cancelled_Externally(CancellationToken cancellationToken) + { + await Task.Delay(TimeSpan.FromHours(1), cancellationToken); + } +} diff --git a/TUnit.TestProject/SetHookExecutorTests.cs b/TUnit.TestProject/SetHookExecutorTests.cs index dc2427011b..5d11036a32 100644 --- a/TUnit.TestProject/SetHookExecutorTests.cs +++ b/TUnit.TestProject/SetHookExecutorTests.cs @@ -117,36 +117,3 @@ public async Task Test_StaticHooksExecuteInCustomExecutor() await Assert.That(Thread.CurrentThread.Name).IsEqualTo("CrossPlatformTestExecutor"); } } - -/// -/// Tests demonstrating SetHookExecutor affects disposal execution - Issue #3918 -/// -[EngineTest(ExpectedResult.Pass)] -[SetBothExecutors] // This attribute sets both executors -public class DisposalWithHookExecutorTests : IAsyncDisposable -{ - private static bool _disposalExecutedInCustomExecutor; - - [Test] - public async Task Test_ExecutesInCustomExecutor() - { - // Test should execute in custom executor - await Assert.That(Thread.CurrentThread.Name).IsEqualTo("CrossPlatformTestExecutor"); - await Assert.That(CrossPlatformTestExecutor.IsRunningInTestExecutor.Value).IsTrue(); - } - - public ValueTask DisposeAsync() - { - // Verify disposal runs in the custom executor - _disposalExecutedInCustomExecutor = - Thread.CurrentThread.Name == "CrossPlatformTestExecutor" && - CrossPlatformTestExecutor.IsRunningInTestExecutor.Value; - return default; - } - - [After(Class)] - public static async Task VerifyDisposalRanInCustomExecutor(ClassHookContext context) - { - await Assert.That(_disposalExecutedInCustomExecutor).IsTrue(); - } -} diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 06a025db9c..98eed244c2 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 573.3 ms | 573.7 ms | 4.43 ms | -| NUnit | 4.4.0 | 658.8 ms | 660.6 ms | 4.99 ms | -| MSTest | 4.0.2 | 631.5 ms | 631.2 ms | 8.74 ms | -| xUnit3 | 3.2.1 | 716.2 ms | 715.4 ms | 6.28 ms | -| **TUnit (AOT)** | 1.2.11 | 124.1 ms | 124.2 ms | 0.20 ms | +| **TUnit** | 1.2.11 | 567.1 ms | 566.4 ms | 2.57 ms | +| NUnit | 4.4.0 | 688.2 ms | 683.1 ms | 13.62 ms | +| MSTest | 4.0.2 | 658.5 ms | 659.6 ms | 10.71 ms | +| xUnit3 | 3.2.0 | 736.1 ms | 733.4 ms | 13.54 ms | +| **TUnit (AOT)** | 1.2.11 | 124.7 ms | 124.8 ms | 0.42 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 860 - bar [573.3, 658.8, 631.5, 716.2, 124.1] + y-axis "Time (ms)" 0 --> 884 + bar [567.1, 688.2, 658.5, 736.1, 124.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.985Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 54a0ea8d23..0e293d83f3 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.050 s | 2.047 s | 0.0253 s | -| Build_NUnit | 4.4.0 | 1.644 s | 1.646 s | 0.0243 s | -| Build_MSTest | 4.0.2 | 1.714 s | 1.709 s | 0.0303 s | -| Build_xUnit3 | 3.2.1 | 1.639 s | 1.639 s | 0.0300 s | +| **TUnit** | 1.2.11 | 2.043 s | 2.035 s | 0.0196 s | +| Build_NUnit | 4.4.0 | 1.639 s | 1.639 s | 0.0088 s | +| Build_MSTest | 4.0.2 | 1.715 s | 1.712 s | 0.0172 s | +| Build_xUnit3 | 3.2.0 | 1.616 s | 1.621 s | 0.0283 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.05, 1.644, 1.714, 1.639] + bar [2.043, 1.639, 1.715, 1.616] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.987Z* +*Last generated: 2025-11-27T00:28:35.447Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 55089d1f10..3c58c40c9d 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 501.86 ms | 501.49 ms | 4.693 ms | -| NUnit | 4.4.0 | 535.87 ms | 534.70 ms | 12.790 ms | -| MSTest | 4.0.2 | 502.71 ms | 503.69 ms | 12.277 ms | -| xUnit3 | 3.2.1 | 579.28 ms | 578.02 ms | 8.138 ms | -| **TUnit (AOT)** | 1.2.11 | 24.82 ms | 24.80 ms | 0.166 ms | +| **TUnit** | 1.2.11 | 497.25 ms | 497.97 ms | 3.518 ms | +| NUnit | 4.4.0 | 526.05 ms | 524.98 ms | 6.301 ms | +| MSTest | 4.0.2 | 482.94 ms | 483.13 ms | 10.339 ms | +| xUnit3 | 3.2.0 | 573.56 ms | 576.44 ms | 10.043 ms | +| **TUnit (AOT)** | 1.2.11 | 24.70 ms | 24.72 ms | 0.182 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 696 - bar [501.86, 535.87, 502.71, 579.28, 24.82] + y-axis "Time (ms)" 0 --> 689 + bar [497.25, 526.05, 482.94, 573.56, 24.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.985Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 726200db85..9136b82712 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 597.5 ms | 597.8 ms | 3.59 ms | -| NUnit | 4.4.0 | 1,183.2 ms | 1,182.1 ms | 4.90 ms | -| MSTest | 4.0.2 | 2,966.5 ms | 2,968.0 ms | 5.16 ms | -| xUnit3 | 3.2.1 | 3,066.1 ms | 3,065.1 ms | 15.64 ms | -| **TUnit (AOT)** | 1.2.11 | 132.2 ms | 132.3 ms | 0.51 ms | +| **TUnit** | 1.2.11 | 623.3 ms | 624.8 ms | 4.14 ms | +| NUnit | 4.4.0 | 1,212.4 ms | 1,210.2 ms | 9.48 ms | +| MSTest | 4.0.2 | 3,001.4 ms | 2,999.8 ms | 10.05 ms | +| xUnit3 | 3.2.0 | 3,086.1 ms | 3,086.8 ms | 7.57 ms | +| **TUnit (AOT)** | 1.2.11 | 132.7 ms | 132.6 ms | 0.54 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3680 - bar [597.5, 1183.2, 2966.5, 3066.1, 132.2] + y-axis "Time (ms)" 0 --> 3704 + bar [623.3, 1212.4, 3001.4, 3086.1, 132.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.986Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 8e74222e9c..7b17a6c761 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 574.81 ms | 575.40 ms | 5.417 ms | -| NUnit | 4.4.0 | 1,582.59 ms | 1,581.77 ms | 6.462 ms | -| MSTest | 4.0.2 | 1,540.42 ms | 1,540.75 ms | 5.446 ms | -| xUnit3 | 3.2.1 | 1,630.94 ms | 1,627.40 ms | 11.609 ms | -| **TUnit (AOT)** | 1.2.11 | 79.00 ms | 79.08 ms | 0.235 ms | +| **TUnit** | 1.2.11 | 566.13 ms | 565.43 ms | 6.050 ms | +| NUnit | 4.4.0 | 1,578.62 ms | 1,578.58 ms | 6.773 ms | +| MSTest | 4.0.2 | 1,539.67 ms | 1,540.17 ms | 3.979 ms | +| xUnit3 | 3.2.0 | 1,625.28 ms | 1,624.99 ms | 11.364 ms | +| **TUnit (AOT)** | 1.2.11 | 79.52 ms | 79.55 ms | 0.341 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1958 - bar [574.81, 1582.59, 1540.42, 1630.94, 79] + y-axis "Time (ms)" 0 --> 1951 + bar [566.13, 1578.62, 1539.67, 1625.28, 79.52] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.986Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 4a084a622a..c459176451 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 535.07 ms | 534.68 ms | 4.870 ms | -| NUnit | 4.4.0 | 585.44 ms | 584.11 ms | 12.531 ms | -| MSTest | 4.0.2 | 509.11 ms | 505.09 ms | 11.032 ms | -| xUnit3 | 3.2.1 | 594.97 ms | 593.95 ms | 6.401 ms | -| **TUnit (AOT)** | 1.2.11 | 46.00 ms | 46.41 ms | 3.968 ms | +| **TUnit** | 1.2.11 | 522.37 ms | 521.16 ms | 5.026 ms | +| NUnit | 4.4.0 | 611.57 ms | 612.00 ms | 8.234 ms | +| MSTest | 4.0.2 | 615.51 ms | 617.04 ms | 9.675 ms | +| xUnit3 | 3.2.0 | 614.63 ms | 610.65 ms | 7.412 ms | +| **TUnit (AOT)** | 1.2.11 | 43.96 ms | 44.10 ms | 3.394 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 714 - bar [535.07, 585.44, 509.11, 594.97, 46] + y-axis "Time (ms)" 0 --> 739 + bar [522.37, 611.57, 615.51, 614.63, 43.96] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.986Z* +*Last generated: 2025-11-27T00:28:35.446Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 9ebe377bbf..348cafc187 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-29** from the latest CI run. +This benchmark was automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 558.0 ms | 557.6 ms | 3.82 ms | -| NUnit | 4.4.0 | 1,148.5 ms | 1,146.8 ms | 8.24 ms | -| MSTest | 4.0.2 | 1,120.1 ms | 1,121.5 ms | 6.42 ms | -| xUnit3 | 3.2.1 | 1,198.8 ms | 1,197.8 ms | 9.10 ms | +| **TUnit** | 1.2.11 | 575.6 ms | 575.7 ms | 4.64 ms | +| NUnit | 4.4.0 | 1,194.3 ms | 1,195.1 ms | 6.50 ms | +| MSTest | 4.0.2 | 1,165.8 ms | 1,164.6 ms | 9.87 ms | +| xUnit3 | 3.2.0 | 1,258.5 ms | 1,258.8 ms | 7.83 ms | | **TUnit (AOT)** | 1.2.11 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-29** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1439 - bar [558, 1148.5, 1120.1, 1198.8, 0] + y-axis "Time (ms)" 0 --> 1511 + bar [575.6, 1194.3, 1165.8, 1258.5, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-29T00:27:17.987Z* +*Last generated: 2025-11-27T00:28:35.447Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index e5bccf4190..871d642265 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-29** from the latest CI run. +These benchmarks were automatically generated on **2025-11-27** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -38,7 +38,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| | **TUnit** | 1.2.11 | -| **xUnit v3** | 3.2.1 | +| **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-29T00:27:17.987Z* +*Last generated: 2025-11-27T00:28:35.447Z* diff --git a/docs/docs/extensions/extensions.md b/docs/docs/extensions/extensions.md index 1aad0ec492..f8869d3589 100644 --- a/docs/docs/extensions/extensions.md +++ b/docs/docs/extensions/extensions.md @@ -22,7 +22,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify output format (default is binary .coverage file) +# Specify output format (cobertura is default) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats diff --git a/docs/docs/migration/mstest.md b/docs/docs/migration/mstest.md index eaa77fb76b..05ef1b9e45 100644 --- a/docs/docs/migration/mstest.md +++ b/docs/docs/migration/mstest.md @@ -1013,7 +1013,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify coverage format (default is binary .coverage file) +# Specify coverage format (default is cobertura) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats @@ -1055,7 +1055,7 @@ If you have CI/CD pipelines that reference Coverlet, update them to use the new The Microsoft coverage tool supports multiple output formats: ```bash -# Cobertura (widely supported) +# Cobertura (default, widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # XML (Visual Studio format) diff --git a/docs/docs/migration/nunit.md b/docs/docs/migration/nunit.md index 63933fc045..1e996268a1 100644 --- a/docs/docs/migration/nunit.md +++ b/docs/docs/migration/nunit.md @@ -746,7 +746,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify coverage format (default is binary .coverage file) +# Specify coverage format (default is cobertura) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats @@ -788,7 +788,7 @@ If you have CI/CD pipelines that reference Coverlet, update them to use the new The Microsoft coverage tool supports multiple output formats: ```bash -# Cobertura (widely supported) +# Cobertura (default, widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # XML (Visual Studio format) diff --git a/docs/docs/migration/xunit.md b/docs/docs/migration/xunit.md index 32c1ed15ec..f452d62eb7 100644 --- a/docs/docs/migration/xunit.md +++ b/docs/docs/migration/xunit.md @@ -1054,7 +1054,7 @@ dotnet run --configuration Release --coverage # Specify output location dotnet run --configuration Release --coverage --coverage-output ./coverage/ -# Specify coverage format (default is binary .coverage file) +# Specify coverage format (default is cobertura) dotnet run --configuration Release --coverage --coverage-output-format cobertura # Multiple formats @@ -1096,7 +1096,7 @@ If you have CI/CD pipelines that reference Coverlet, update them to use the new The Microsoft coverage tool supports multiple output formats: ```bash -# Cobertura (widely supported) +# Cobertura (default, widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # XML (Visual Studio format) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 300dd182bb..4dfa0bb1ab 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -2240,7 +2240,7 @@ dotnet run --configuration Release --coverage --coverage-settings coverage.runse #### 1. Check Output Format ```bash -# Cobertura (widely supported) +# Default is Cobertura (widely supported) dotnet run --configuration Release --coverage --coverage-output-format cobertura # For Visual Studio diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 6ea3ffc595..d31c3d85de 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.985Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "573.3 ms", - "Error": "4.73 ms", - "StdDev": "4.43 ms", - "Median": "573.7 ms" + "Mean": "567.1 ms", + "Error": "3.08 ms", + "StdDev": "2.57 ms", + "Median": "566.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "658.8 ms", - "Error": "5.97 ms", - "StdDev": "4.99 ms", - "Median": "660.6 ms" + "Mean": "688.2 ms", + "Error": "13.26 ms", + "StdDev": "13.62 ms", + "Median": "683.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "631.5 ms", - "Error": "9.34 ms", - "StdDev": "8.74 ms", - "Median": "631.2 ms" + "Mean": "658.5 ms", + "Error": "12.82 ms", + "StdDev": "10.71 ms", + "Median": "659.6 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "716.2 ms", - "Error": "7.08 ms", - "StdDev": "6.28 ms", - "Median": "715.4 ms" + "Version": "3.2.0", + "Mean": "736.1 ms", + "Error": "14.47 ms", + "StdDev": "13.54 ms", + "Median": "733.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.1 ms", - "Error": "0.23 ms", - "StdDev": "0.20 ms", - "Median": "124.2 ms" + "Mean": "124.7 ms", + "Error": "0.45 ms", + "StdDev": "0.42 ms", + "Median": "124.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 747f5ae6e2..c71476e2e7 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.987Z", + "timestamp": "2025-11-27T00:28:35.447Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.050 s", - "Error": "0.0285 s", - "StdDev": "0.0253 s", - "Median": "2.047 s" + "Mean": "2.043 s", + "Error": "0.0210 s", + "StdDev": "0.0196 s", + "Median": "2.035 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.644 s", - "Error": "0.0260 s", - "StdDev": "0.0243 s", - "Median": "1.646 s" + "Mean": "1.639 s", + "Error": "0.0094 s", + "StdDev": "0.0088 s", + "Median": "1.639 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.714 s", - "Error": "0.0324 s", - "StdDev": "0.0303 s", - "Median": "1.709 s" + "Mean": "1.715 s", + "Error": "0.0184 s", + "StdDev": "0.0172 s", + "Median": "1.712 s" }, { "Method": "Build_xUnit3", - "Version": "3.2.1", - "Mean": "1.639 s", - "Error": "0.0321 s", - "StdDev": "0.0300 s", - "Median": "1.639 s" + "Version": "3.2.0", + "Mean": "1.616 s", + "Error": "0.0302 s", + "StdDev": "0.0283 s", + "Median": "1.621 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index a903f638a7..cf5ab9e10b 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.985Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "501.86 ms", - "Error": "5.017 ms", - "StdDev": "4.693 ms", - "Median": "501.49 ms" + "Mean": "497.25 ms", + "Error": "4.213 ms", + "StdDev": "3.518 ms", + "Median": "497.97 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "535.87 ms", - "Error": "10.415 ms", - "StdDev": "12.790 ms", - "Median": "534.70 ms" + "Mean": "526.05 ms", + "Error": "7.107 ms", + "StdDev": "6.301 ms", + "Median": "524.98 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "502.71 ms", - "Error": "9.708 ms", - "StdDev": "12.277 ms", - "Median": "503.69 ms" + "Mean": "482.94 ms", + "Error": "9.302 ms", + "StdDev": "10.339 ms", + "Median": "483.13 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "579.28 ms", - "Error": "9.180 ms", - "StdDev": "8.138 ms", - "Median": "578.02 ms" + "Version": "3.2.0", + "Mean": "573.56 ms", + "Error": "10.737 ms", + "StdDev": "10.043 ms", + "Median": "576.44 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.82 ms", - "Error": "0.187 ms", - "StdDev": "0.166 ms", - "Median": "24.80 ms" + "Mean": "24.70 ms", + "Error": "0.194 ms", + "StdDev": "0.182 ms", + "Median": "24.72 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index b01106537b..3bbbbc8549 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.986Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "597.5 ms", - "Error": "4.05 ms", - "StdDev": "3.59 ms", - "Median": "597.8 ms" + "Mean": "623.3 ms", + "Error": "4.42 ms", + "StdDev": "4.14 ms", + "Median": "624.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,183.2 ms", - "Error": "6.27 ms", - "StdDev": "4.90 ms", - "Median": "1,182.1 ms" + "Mean": "1,212.4 ms", + "Error": "10.13 ms", + "StdDev": "9.48 ms", + "Median": "1,210.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,966.5 ms", - "Error": "6.60 ms", - "StdDev": "5.16 ms", - "Median": "2,968.0 ms" + "Mean": "3,001.4 ms", + "Error": "12.87 ms", + "StdDev": "10.05 ms", + "Median": "2,999.8 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "3,066.1 ms", - "Error": "17.64 ms", - "StdDev": "15.64 ms", - "Median": "3,065.1 ms" + "Version": "3.2.0", + "Mean": "3,086.1 ms", + "Error": "9.06 ms", + "StdDev": "7.57 ms", + "Median": "3,086.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "132.2 ms", - "Error": "0.55 ms", - "StdDev": "0.51 ms", - "Median": "132.3 ms" + "Mean": "132.7 ms", + "Error": "0.58 ms", + "StdDev": "0.54 ms", + "Median": "132.6 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 578206c245..8d10cf0aa4 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.986Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "574.81 ms", - "Error": "5.792 ms", - "StdDev": "5.417 ms", - "Median": "575.40 ms" + "Mean": "566.13 ms", + "Error": "6.468 ms", + "StdDev": "6.050 ms", + "Median": "565.43 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,582.59 ms", - "Error": "7.738 ms", - "StdDev": "6.462 ms", - "Median": "1,581.77 ms" + "Mean": "1,578.62 ms", + "Error": "7.240 ms", + "StdDev": "6.773 ms", + "Median": "1,578.58 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,540.42 ms", - "Error": "5.822 ms", - "StdDev": "5.446 ms", - "Median": "1,540.75 ms" + "Mean": "1,539.67 ms", + "Error": "4.489 ms", + "StdDev": "3.979 ms", + "Median": "1,540.17 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "1,630.94 ms", - "Error": "12.411 ms", - "StdDev": "11.609 ms", - "Median": "1,627.40 ms" + "Version": "3.2.0", + "Mean": "1,625.28 ms", + "Error": "13.608 ms", + "StdDev": "11.364 ms", + "Median": "1,624.99 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.00 ms", - "Error": "0.251 ms", - "StdDev": "0.235 ms", - "Median": "79.08 ms" + "Mean": "79.52 ms", + "Error": "0.365 ms", + "StdDev": "0.341 ms", + "Median": "79.55 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 2786b68df5..7cd77e77f9 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.986Z", + "timestamp": "2025-11-27T00:28:35.446Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "535.07 ms", - "Error": "5.832 ms", - "StdDev": "4.870 ms", - "Median": "534.68 ms" + "Mean": "522.37 ms", + "Error": "5.373 ms", + "StdDev": "5.026 ms", + "Median": "521.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "585.44 ms", - "Error": "11.274 ms", - "StdDev": "12.531 ms", - "Median": "584.11 ms" + "Mean": "611.57 ms", + "Error": "9.860 ms", + "StdDev": "8.234 ms", + "Median": "612.00 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "509.11 ms", - "Error": "9.925 ms", - "StdDev": "11.032 ms", - "Median": "505.09 ms" + "Mean": "615.51 ms", + "Error": "10.914 ms", + "StdDev": "9.675 ms", + "Median": "617.04 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "594.97 ms", - "Error": "7.221 ms", - "StdDev": "6.401 ms", - "Median": "593.95 ms" + "Version": "3.2.0", + "Mean": "614.63 ms", + "Error": "8.361 ms", + "StdDev": "7.412 ms", + "Median": "610.65 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.00 ms", - "Error": "1.346 ms", - "StdDev": "3.968 ms", - "Median": "46.41 ms" + "Mean": "43.96 ms", + "Error": "1.151 ms", + "StdDev": "3.394 ms", + "Median": "44.10 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index be6ddf85ba..d3f8eaa939 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.987Z", + "timestamp": "2025-11-27T00:28:35.447Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "558.0 ms", - "Error": "4.08 ms", - "StdDev": "3.82 ms", - "Median": "557.6 ms" + "Mean": "575.6 ms", + "Error": "4.96 ms", + "StdDev": "4.64 ms", + "Median": "575.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,148.5 ms", - "Error": "8.81 ms", - "StdDev": "8.24 ms", - "Median": "1,146.8 ms" + "Mean": "1,194.3 ms", + "Error": "7.33 ms", + "StdDev": "6.50 ms", + "Median": "1,195.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,120.1 ms", - "Error": "7.69 ms", - "StdDev": "6.42 ms", - "Median": "1,121.5 ms" + "Mean": "1,165.8 ms", + "Error": "10.55 ms", + "StdDev": "9.87 ms", + "Median": "1,164.6 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "1,198.8 ms", - "Error": "9.73 ms", - "StdDev": "9.10 ms", - "Median": "1,197.8 ms" + "Version": "3.2.0", + "Mean": "1,258.5 ms", + "Error": "8.37 ms", + "StdDev": "7.83 ms", + "Median": "1,258.8 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 2ca74d50fc..943a897347 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -82,13 +82,5 @@ { "date": "2025-11-27", "environment": "Ubuntu" - }, - { - "date": "2025-11-28", - "environment": "Ubuntu" - }, - { - "date": "2025-11-29", - "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index ebc2bb3f26..45e79f39d6 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-29T00:27:17.988Z", + "timestamp": "2025-11-27T00:28:35.447Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "573.3 ms", - "Error": "4.73 ms", - "StdDev": "4.43 ms", - "Median": "573.7 ms" + "Mean": "567.1 ms", + "Error": "3.08 ms", + "StdDev": "2.57 ms", + "Median": "566.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "658.8 ms", - "Error": "5.97 ms", - "StdDev": "4.99 ms", - "Median": "660.6 ms" + "Mean": "688.2 ms", + "Error": "13.26 ms", + "StdDev": "13.62 ms", + "Median": "683.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "631.5 ms", - "Error": "9.34 ms", - "StdDev": "8.74 ms", - "Median": "631.2 ms" + "Mean": "658.5 ms", + "Error": "12.82 ms", + "StdDev": "10.71 ms", + "Median": "659.6 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "716.2 ms", - "Error": "7.08 ms", - "StdDev": "6.28 ms", - "Median": "715.4 ms" + "Version": "3.2.0", + "Mean": "736.1 ms", + "Error": "14.47 ms", + "StdDev": "13.54 ms", + "Median": "733.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "124.1 ms", - "Error": "0.23 ms", - "StdDev": "0.20 ms", - "Median": "124.2 ms" + "Mean": "124.7 ms", + "Error": "0.45 ms", + "StdDev": "0.42 ms", + "Median": "124.8 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "501.86 ms", - "Error": "5.017 ms", - "StdDev": "4.693 ms", - "Median": "501.49 ms" + "Mean": "497.25 ms", + "Error": "4.213 ms", + "StdDev": "3.518 ms", + "Median": "497.97 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "535.87 ms", - "Error": "10.415 ms", - "StdDev": "12.790 ms", - "Median": "534.70 ms" + "Mean": "526.05 ms", + "Error": "7.107 ms", + "StdDev": "6.301 ms", + "Median": "524.98 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "502.71 ms", - "Error": "9.708 ms", - "StdDev": "12.277 ms", - "Median": "503.69 ms" + "Mean": "482.94 ms", + "Error": "9.302 ms", + "StdDev": "10.339 ms", + "Median": "483.13 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "579.28 ms", - "Error": "9.180 ms", - "StdDev": "8.138 ms", - "Median": "578.02 ms" + "Version": "3.2.0", + "Mean": "573.56 ms", + "Error": "10.737 ms", + "StdDev": "10.043 ms", + "Median": "576.44 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "24.82 ms", - "Error": "0.187 ms", - "StdDev": "0.166 ms", - "Median": "24.80 ms" + "Mean": "24.70 ms", + "Error": "0.194 ms", + "StdDev": "0.182 ms", + "Median": "24.72 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "597.5 ms", - "Error": "4.05 ms", - "StdDev": "3.59 ms", - "Median": "597.8 ms" + "Mean": "623.3 ms", + "Error": "4.42 ms", + "StdDev": "4.14 ms", + "Median": "624.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,183.2 ms", - "Error": "6.27 ms", - "StdDev": "4.90 ms", - "Median": "1,182.1 ms" + "Mean": "1,212.4 ms", + "Error": "10.13 ms", + "StdDev": "9.48 ms", + "Median": "1,210.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,966.5 ms", - "Error": "6.60 ms", - "StdDev": "5.16 ms", - "Median": "2,968.0 ms" + "Mean": "3,001.4 ms", + "Error": "12.87 ms", + "StdDev": "10.05 ms", + "Median": "2,999.8 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "3,066.1 ms", - "Error": "17.64 ms", - "StdDev": "15.64 ms", - "Median": "3,065.1 ms" + "Version": "3.2.0", + "Mean": "3,086.1 ms", + "Error": "9.06 ms", + "StdDev": "7.57 ms", + "Median": "3,086.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "132.2 ms", - "Error": "0.55 ms", - "StdDev": "0.51 ms", - "Median": "132.3 ms" + "Mean": "132.7 ms", + "Error": "0.58 ms", + "StdDev": "0.54 ms", + "Median": "132.6 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "574.81 ms", - "Error": "5.792 ms", - "StdDev": "5.417 ms", - "Median": "575.40 ms" + "Mean": "566.13 ms", + "Error": "6.468 ms", + "StdDev": "6.050 ms", + "Median": "565.43 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,582.59 ms", - "Error": "7.738 ms", - "StdDev": "6.462 ms", - "Median": "1,581.77 ms" + "Mean": "1,578.62 ms", + "Error": "7.240 ms", + "StdDev": "6.773 ms", + "Median": "1,578.58 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,540.42 ms", - "Error": "5.822 ms", - "StdDev": "5.446 ms", - "Median": "1,540.75 ms" + "Mean": "1,539.67 ms", + "Error": "4.489 ms", + "StdDev": "3.979 ms", + "Median": "1,540.17 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "1,630.94 ms", - "Error": "12.411 ms", - "StdDev": "11.609 ms", - "Median": "1,627.40 ms" + "Version": "3.2.0", + "Mean": "1,625.28 ms", + "Error": "13.608 ms", + "StdDev": "11.364 ms", + "Median": "1,624.99 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "79.00 ms", - "Error": "0.251 ms", - "StdDev": "0.235 ms", - "Median": "79.08 ms" + "Mean": "79.52 ms", + "Error": "0.365 ms", + "StdDev": "0.341 ms", + "Median": "79.55 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "535.07 ms", - "Error": "5.832 ms", - "StdDev": "4.870 ms", - "Median": "534.68 ms" + "Mean": "522.37 ms", + "Error": "5.373 ms", + "StdDev": "5.026 ms", + "Median": "521.16 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "585.44 ms", - "Error": "11.274 ms", - "StdDev": "12.531 ms", - "Median": "584.11 ms" + "Mean": "611.57 ms", + "Error": "9.860 ms", + "StdDev": "8.234 ms", + "Median": "612.00 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "509.11 ms", - "Error": "9.925 ms", - "StdDev": "11.032 ms", - "Median": "505.09 ms" + "Mean": "615.51 ms", + "Error": "10.914 ms", + "StdDev": "9.675 ms", + "Median": "617.04 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "594.97 ms", - "Error": "7.221 ms", - "StdDev": "6.401 ms", - "Median": "593.95 ms" + "Version": "3.2.0", + "Mean": "614.63 ms", + "Error": "8.361 ms", + "StdDev": "7.412 ms", + "Median": "610.65 ms" }, { "Method": "TUnit_AOT", "Version": "1.2.11", - "Mean": "46.00 ms", - "Error": "1.346 ms", - "StdDev": "3.968 ms", - "Median": "46.41 ms" + "Mean": "43.96 ms", + "Error": "1.151 ms", + "StdDev": "3.394 ms", + "Median": "44.10 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.2.11", - "Mean": "558.0 ms", - "Error": "4.08 ms", - "StdDev": "3.82 ms", - "Median": "557.6 ms" + "Mean": "575.6 ms", + "Error": "4.96 ms", + "StdDev": "4.64 ms", + "Median": "575.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,148.5 ms", - "Error": "8.81 ms", - "StdDev": "8.24 ms", - "Median": "1,146.8 ms" + "Mean": "1,194.3 ms", + "Error": "7.33 ms", + "StdDev": "6.50 ms", + "Median": "1,195.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,120.1 ms", - "Error": "7.69 ms", - "StdDev": "6.42 ms", - "Median": "1,121.5 ms" + "Mean": "1,165.8 ms", + "Error": "10.55 ms", + "StdDev": "9.87 ms", + "Median": "1,164.6 ms" }, { "Method": "xUnit3", - "Version": "3.2.1", - "Mean": "1,198.8 ms", - "Error": "9.73 ms", - "StdDev": "9.10 ms", - "Median": "1,197.8 ms" + "Version": "3.2.0", + "Mean": "1,258.5 ms", + "Error": "8.37 ms", + "StdDev": "7.83 ms", + "Median": "1,258.8 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.2.11", - "Mean": "2.050 s", - "Error": "0.0285 s", - "StdDev": "0.0253 s", - "Median": "2.047 s" + "Mean": "2.043 s", + "Error": "0.0210 s", + "StdDev": "0.0196 s", + "Median": "2.035 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.644 s", - "Error": "0.0260 s", - "StdDev": "0.0243 s", - "Median": "1.646 s" + "Mean": "1.639 s", + "Error": "0.0094 s", + "StdDev": "0.0088 s", + "Median": "1.639 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.714 s", - "Error": "0.0324 s", - "StdDev": "0.0303 s", - "Median": "1.709 s" + "Mean": "1.715 s", + "Error": "0.0184 s", + "StdDev": "0.0172 s", + "Median": "1.712 s" }, { "Method": "Build_xUnit3", - "Version": "3.2.1", - "Mean": "1.639 s", - "Error": "0.0321 s", - "StdDev": "0.0300 s", - "Median": "1.639 s" + "Version": "3.2.0", + "Mean": "1.616 s", + "Error": "0.0302 s", + "StdDev": "0.0283 s", + "Median": "1.621 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-29T00:27:17.984Z" + "lastUpdated": "2025-11-27T00:28:35.445Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 78d36d0b54..ff4e003094 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-29", + "timestamp": "2025-11-27", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From a233324ca9d60f711af549f44383de030d26146b Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sat, 29 Nov 2025 21:45:27 +0000 Subject: [PATCH 112/192] Fix MethodDataSource example in property injection documentation (#3942) * Initial plan * Fix MethodDataSource example in property injection docs to return single value Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- docs/docs/test-lifecycle/property-injection.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/docs/test-lifecycle/property-injection.md b/docs/docs/test-lifecycle/property-injection.md index e770ab1fc1..5f276dd4bb 100644 --- a/docs/docs/test-lifecycle/property-injection.md +++ b/docs/docs/test-lifecycle/property-injection.md @@ -94,12 +94,8 @@ public class PropertySetterTests Console.WriteLine($"Property7: {Property7}"); } - // Static data source method for Property2 - public static IEnumerable GetMethodData() - { - yield return "method_data_1"; - yield return "method_data_2"; - } + // Static data source method for Property2 - returns a single value for property injection + public static string GetMethodData() => "method_data_value"; } // Example model for ClassDataSource From a5b70465f7dd7a7c8f6662ccd44596dfad751ae2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 29 Nov 2025 23:29:57 +0000 Subject: [PATCH 113/192] chore(deps): update tunit to 1.3.0 (#3947) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1052b3a500..7d3100d505 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index c0ebc448b7..ba2ae97367 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index afdec0e907..12e9ae80f0 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 6e6da7a8ab..ebbf8360c9 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 61108ed7e0..99f111286e 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 0350fa763c..19e93232af 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 01a2c3a050..cb1993411e 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index d616c36161..d6751ba669 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index 1f9eb15ef5..be846bb414 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From b353f025cd92c9280c4f4b3dd40e2676bbfef533 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 00:32:01 +0000 Subject: [PATCH 114/192] fix: upgrade react from 19.1.1 to 19.2.0 (#3903) Snyk has created this PR to upgrade react from 19.1.1 to 19.2.0. See this package in yarn: react See this project in Snyk: https://app.snyk.io/org/thomhurst/project/1c57910f-773a-4f83-bc3f-c863967b35af?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot --- docs/package.json | 2 +- docs/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/package.json b/docs/package.json index 592ddaeb7c..3b156003a5 100644 --- a/docs/package.json +++ b/docs/package.json @@ -21,7 +21,7 @@ "@mdx-js/react": "^3.0.0", "clsx": "^2.1.1", "prism-react-renderer": "^2.4.0", - "react": "^19.0.0", + "react": "^19.2.0", "react-dom": "^19.0.0" }, "devDependencies": { diff --git a/docs/yarn.lock b/docs/yarn.lock index 43d13a5c4a..4fe575201c 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -8349,10 +8349,10 @@ react-router@5.3.4, react-router@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@^19.0.0: - version "19.1.1" - resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz" - integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== +react@^19.2.0: + version "19.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.0.tgz#d33dd1721698f4376ae57a54098cb47fc75d93a5" + integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== readable-stream@^2.0.1: version "2.3.8" From 7f3c44ec32d3f4448b1d4ed1fe3c2b79897b915d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 00:32:36 +0000 Subject: [PATCH 115/192] fix: upgrade @mdx-js/react from 3.1.0 to 3.1.1 (#3905) Snyk has created this PR to upgrade @mdx-js/react from 3.1.0 to 3.1.1. See this package in yarn: @mdx-js/react See this project in Snyk: https://app.snyk.io/org/thomhurst/project/1c57910f-773a-4f83-bc3f-c863967b35af?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot --- docs/package.json | 2 +- docs/yarn.lock | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/package.json b/docs/package.json index 3b156003a5..ae51cac527 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,7 +18,7 @@ "@docusaurus/core": "3.9.2", "@docusaurus/preset-classic": "3.9.2", "@docusaurus/theme-mermaid": "^3.9.2", - "@mdx-js/react": "^3.0.0", + "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", "prism-react-renderer": "^2.4.0", "react": "^19.2.0", diff --git a/docs/yarn.lock b/docs/yarn.lock index 4fe575201c..080ed7ad18 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2209,6 +2209,13 @@ dependencies: "@types/mdx" "^2.0.0" +"@mdx-js/react@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz#24bda7fffceb2fe256f954482123cda1be5f5fef" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + "@mermaid-js/parser@^0.6.3": version "0.6.3" resolved "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz" From 40d53b28d7251f83210c5e17f9a1ab31c90b0e37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 Nov 2025 00:33:01 +0000 Subject: [PATCH 116/192] chore(deps): bump node-forge from 1.3.1 to 1.3.2 in /docs (#3923) Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2. - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2) --- updated-dependencies: - dependency-name: node-forge dependency-version: 1.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 080ed7ad18..e453d52f8b 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -7205,9 +7205,9 @@ node-emoji@^2.1.0: skin-tone "^2.0.0" node-forge@^1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.2.tgz#d0d2659a26eef778bf84d73e7f55c08144ee7750" + integrity sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw== node-releases@^2.0.27: version "2.0.27" From c5a9778fe16ac2c114b66fae688b8de902d5b2b1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 01:29:19 +0000 Subject: [PATCH 117/192] chore(deps): update verify to 31.7.3 (#3946) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7d3100d505..f66f8dbba5 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From 789c39b4d3e289896bc2c06a3b74531db0d2766c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 03:57:41 +0000 Subject: [PATCH 118/192] chore(deps): update dependency benchmarkdotnet.annotations to 0.15.8 (#3950) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f66f8dbba5..cc78e28a2f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -8,7 +8,7 @@ - + From 816d0bc92c2092a43c9b387b197dc87f57adafba Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 04:40:46 +0000 Subject: [PATCH 119/192] chore(deps): update dependency benchmarkdotnet to 0.15.8 (#3949) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index cc78e28a2f..1d0dcb68bb 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,7 +7,7 @@ - + From 37ba9f7b32a1fd15470c1440e242f8677670ed11 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 12:11:03 +0000 Subject: [PATCH 120/192] feat: implement instance creation with required property handling (#3952) --- .../Helpers/InstanceFactoryGenerator.cs | 31 ++++++++++++ .../Generators/TestMetadataGenerator.cs | 16 +++---- TUnit.TestProject/Bugs/3951/Tests.cs | 48 +++++++++++++++++++ 3 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3951/Tests.cs diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/InstanceFactoryGenerator.cs b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/InstanceFactoryGenerator.cs index 38fb99fadc..1d6e6cc0bb 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/InstanceFactoryGenerator.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/InstanceFactoryGenerator.cs @@ -6,6 +6,37 @@ namespace TUnit.Core.SourceGenerator.CodeGenerators.Helpers; public static class InstanceFactoryGenerator { + /// + /// Generates code to create an instance of a type with proper required property handling. + /// This handles required properties that don't have data sources by initializing them with defaults. + /// + public static void GenerateInstanceCreation(CodeWriter writer, ITypeSymbol typeSymbol, string variableName) + { + var className = typeSymbol.GloballyQualified(); + // Use GetAllRequiredProperties because even properties with data sources need to be + // initialized in the object initializer to satisfy C#'s required modifier constraint. + // The actual values will be populated by the data sources at runtime. + var requiredProperties = RequiredPropertyHelper.GetAllRequiredProperties(typeSymbol).ToArray(); + + if (requiredProperties.Length == 0) + { + writer.AppendLine($"{variableName} = new {className}();"); + } + else + { + writer.AppendLine($"{variableName} = new {className}()"); + writer.AppendLine("{"); + writer.Indent(); + foreach (var property in requiredProperties) + { + var defaultValue = RequiredPropertyHelper.GetDefaultValueForType(property.Type); + writer.AppendLine($"{property.Name} = {defaultValue},"); + } + writer.Unindent(); + writer.AppendLine("};"); + } + } + public static void GenerateInstanceFactory(CodeWriter writer, ITypeSymbol typeSymbol) { GenerateInstanceFactory(writer, typeSymbol, null); diff --git a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs index 0f232f71d3..8c5f623eb9 100644 --- a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs +++ b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs @@ -1048,7 +1048,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1080,7 +1080,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1124,7 +1124,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1167,7 +1167,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1217,7 +1217,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); @@ -1249,7 +1249,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); @@ -1293,7 +1293,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); @@ -1336,7 +1336,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - writer.AppendLine($"instance = new {fullyQualifiedType}();"); + InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); diff --git a/TUnit.TestProject/Bugs/3951/Tests.cs b/TUnit.TestProject/Bugs/3951/Tests.cs new file mode 100644 index 0000000000..8527375a81 --- /dev/null +++ b/TUnit.TestProject/Bugs/3951/Tests.cs @@ -0,0 +1,48 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3951; + + +public sealed class MyTestGeneratorAttribute : DataSourceGeneratorAttribute where T : MyType, new() +{ + protected override IEnumerable> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata) => [() => new T()]; +} + +public class MyType; + +public class ErrContext: IAsyncInitializer, IAsyncDisposable +{ + public ValueTask DisposeAsync() => default; + public Task InitializeAsync() => Task.CompletedTask; +} + +public class ErrFixture : IAsyncDisposable, IAsyncInitializer +{ + public required ErrContext Fixture { get; set; } + public ValueTask DisposeAsync() => default; + public Task InitializeAsync() => Task.CompletedTask; +} + +public class ErrTest +{ + [ClassDataSource>(Shared = SharedType.PerClass)] + public required ErrFixture Fixture { get; init; } + + public IEnumerable> TestExecutions => [() => Fixture.Fixture]; + + [MethodDataSource("TestExecutions")] + + [Test] + public async Task MyTest(ErrContext context) + { + await Assert.That(context.GetType()).IsNotAssignableTo(); + } + + [MyTestGeneratorAttribute] + [Test] + public async Task MyTest2(MyType t) + { + await Assert.That(t.GetType()).IsAssignableTo(); + } +} From 06dcd3671c013d51b6cd5c65a375c5d9be2e5147 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 12:28:27 +0000 Subject: [PATCH 121/192] chore(deps): update dependency react-dom to v19.2.0 (#3953) Co-authored-by: Renovate Bot --- docs/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index e453d52f8b..9c425ab1e4 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -8275,11 +8275,11 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-dom@^19.0.0: - version "19.1.1" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz" - integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== + version "19.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.0.tgz#00ed1e959c365e9a9d48f8918377465466ec3af8" + integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== dependencies: - scheduler "^0.26.0" + scheduler "^0.27.0" react-fast-compare@^3.2.0: version "3.2.2" @@ -8723,10 +8723,10 @@ sax@^1.2.4: resolved "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz" integrity sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ== -scheduler@^0.26.0: - version "0.26.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" - integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== schema-dts@^1.1.2: version "1.1.5" From 4ed5cbafaa762a3ef74b007858a18c3d55c2f04a Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 12:55:51 +0000 Subject: [PATCH 122/192] chore(deps): update xunit to 3.2.1 (#3954) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1d0dcb68bb..464b20e7ef 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -91,8 +91,8 @@ - - - + + + \ No newline at end of file From 40278af292be02068b62461ca396c1aeb5693211 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:33:57 +0000 Subject: [PATCH 123/192] chore(deps): update tunit to 1.3.9 (#3955) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 464b20e7ef..1b99800122 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index ba2ae97367..0d0287b63c 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 12e9ae80f0..12a6883b3a 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index ebbf8360c9..32c3d112bd 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 99f111286e..a3c5375825 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 19e93232af..103b19fc7d 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index cb1993411e..eeeb221993 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index d6751ba669..969a69127d 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index be846bb414..76ce9ddde2 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 615f74888197c2eacca81e3e728f65ba9ddf0160 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 15:35:45 +0000 Subject: [PATCH 124/192] feat: enhance property injection and instance method data source handling (#3956) --- .../PropertyInjectionSourceGenerator.cs | 146 +++++++++++++ .../Generators/TestMetadataGenerator.cs | 30 ++- .../Attributes/TestData/ClassDataSources.cs | 204 +++++++++++++++++- ...InstanceMethodDataSourceSourceAttribute.cs | 25 ++- .../PropertyInjectionPlanBuilder.cs | 26 ++- TUnit.Engine/Building/TestBuilder.cs | 29 +++ ...Has_No_API_Changes.DotNet10_0.verified.txt | 1 + ..._Has_No_API_Changes.DotNet8_0.verified.txt | 1 + ..._Has_No_API_Changes.DotNet9_0.verified.txt | 1 + ...ary_Has_No_API_Changes.Net4_7.verified.txt | 1 + TUnit.TestProject/Bugs/3951/Tests.cs | 3 +- 11 files changed, 448 insertions(+), 19 deletions(-) diff --git a/TUnit.Core.SourceGenerator/Generators/PropertyInjectionSourceGenerator.cs b/TUnit.Core.SourceGenerator/Generators/PropertyInjectionSourceGenerator.cs index 6a20095a97..29e833e178 100644 --- a/TUnit.Core.SourceGenerator/Generators/PropertyInjectionSourceGenerator.cs +++ b/TUnit.Core.SourceGenerator/Generators/PropertyInjectionSourceGenerator.cs @@ -38,6 +38,28 @@ public void Initialize(IncrementalGeneratorInitializationContext context) } GenerateIndividualPropertyInjectionSource(context, classData); }); + + // Also generate property sources for closed generic types used in data source attributes + // This ensures AOT compatibility for types like ErrFixture + var closedGenericTypesFromDataSources = context.SyntaxProvider + .CreateSyntaxProvider( + predicate: (node, _) => IsClassWithDataSourceProperties(node), + transform: (ctx, _) => GetClosedGenericTypesFromDataSources(ctx)) + .Where(x => x != null) + .SelectMany((types, _) => types ?? []) + .Collect() + .SelectMany((classes, _) => classes.DistinctBy(c => c.ClassSymbol, SymbolEqualityComparer.Default)) + .Combine(enabledProvider); + + context.RegisterSourceOutput(closedGenericTypesFromDataSources, (context, data) => + { + var (classData, isEnabled) = data; + if (!isEnabled) + { + return; + } + GenerateIndividualPropertyInjectionSource(context, classData); + }); } private static bool IsClassWithDataSourceProperties(SyntaxNode node) @@ -45,6 +67,130 @@ private static bool IsClassWithDataSourceProperties(SyntaxNode node) return node is TypeDeclarationSyntax; } + /// + /// Extracts closed generic types from data source attributes (like ClassDataSource<ErrFixture<MyType>>) + /// that have injectable properties. This enables AOT-compatible property injection for generic types. + /// + private static IEnumerable? GetClosedGenericTypesFromDataSources(GeneratorSyntaxContext context) + { + var typeDecl = (TypeDeclarationSyntax)context.Node; + var semanticModel = context.SemanticModel; + + if (semanticModel.GetDeclaredSymbol(typeDecl) is not INamedTypeSymbol typeSymbol) + { + return null; + } + + var dataSourceInterface = semanticModel.Compilation.GetTypeByMetadataName("TUnit.Core.IDataSourceAttribute"); + if (dataSourceInterface == null) + { + return null; + } + + var closedGenericTypes = new List(); + var processedTypes = new HashSet(); + + // Check all properties for data source attributes that reference closed generic types + var allProperties = typeSymbol.GetMembers() + .OfType() + .Concat(typeSymbol.GetMembersIncludingBase().OfType()); + + foreach (var property in allProperties) + { + foreach (var attr in property.GetAttributes()) + { + if (attr.AttributeClass == null || + !attr.AttributeClass.AllInterfaces.Contains(dataSourceInterface, SymbolEqualityComparer.Default)) + { + continue; + } + + // Check if the attribute is a generic type like ClassDataSource + if (attr.AttributeClass.IsGenericType && attr.AttributeClass.TypeArguments.Length > 0) + { + foreach (var typeArg in attr.AttributeClass.TypeArguments) + { + if (typeArg is INamedTypeSymbol namedTypeArg && namedTypeArg.IsGenericType && + !namedTypeArg.IsUnboundGenericType && namedTypeArg.TypeParameters.Length == 0) + { + // This is a closed generic type (e.g., ErrFixture) + var fullName = namedTypeArg.ToDisplayString(); + if (!processedTypes.Add(fullName)) + { + continue; + } + + // Check if this type has properties with data source attributes + var classData = GetClassWithDataSourcePropertiesForType(namedTypeArg, semanticModel, dataSourceInterface); + if (classData != null) + { + closedGenericTypes.Add(classData); + } + } + } + } + } + } + + return closedGenericTypes.Count > 0 ? closedGenericTypes : null; + } + + /// + /// Creates a ClassWithDataSourceProperties for a specific type (used for closed generic types). + /// + private static ClassWithDataSourceProperties? GetClassWithDataSourcePropertiesForType( + INamedTypeSymbol typeSymbol, + SemanticModel semanticModel, + INamedTypeSymbol dataSourceInterface) + { + // Skip types that are not publicly accessible + if (!IsPubliclyAccessible(typeSymbol)) + { + return null; + } + + var propertiesWithDataSources = new List(); + var processedProperties = new HashSet(); + + var allProperties = typeSymbol.GetMembers() + .OfType() + .Where(CanSetProperty) + .ToList(); + + foreach (var property in allProperties) + { + if (!processedProperties.Add(property.Name)) + { + continue; + } + + foreach (var attr in property.GetAttributes()) + { + if (attr.AttributeClass != null && + attr.AttributeClass.AllInterfaces.Contains(dataSourceInterface, SymbolEqualityComparer.Default)) + { + propertiesWithDataSources.Add(new PropertyWithDataSourceAttribute + { + Property = property, + DataSourceAttribute = attr + }); + break; + } + } + } + + if (propertiesWithDataSources.Count == 0) + { + return null; + } + + return new ClassWithDataSourceProperties + { + ClassSymbol = typeSymbol, + Properties = propertiesWithDataSources.ToImmutableArray() + }; + } + private static ClassWithDataSourceProperties? GetClassWithDataSourceProperties(GeneratorSyntaxContext context) { var typeDecl = (TypeDeclarationSyntax)context.Node; diff --git a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs index 8c5f623eb9..be1bbd1320 100644 --- a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs +++ b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs @@ -937,15 +937,23 @@ private static void GenerateMethodDataSourceAttribute(CodeWriter writer, Attribu // Generate the attribute with factory // We need to manually construct this to properly add the Factory property - var attrClass = attr.AttributeClass!; - var attrTypeName = attrClass.GloballyQualified(); + + // Determine if the data source is static or instance-based + var isStatic = dataSourceMethod?.IsStatic ?? dataSourceProperty?.GetMethod?.IsStatic ?? true; + + // Use InstanceMethodDataSourceAttribute for instance-based data sources + // This implements IAccessesInstanceData which tells the engine to create an instance early + var attrTypeName = isStatic + ? "global::TUnit.Core.MethodDataSourceAttribute" + : "global::TUnit.Core.InstanceMethodDataSourceAttribute"; if (attr.ConstructorArguments is [ { Value: ITypeSymbol typeArg } _, _, .. ]) { - // MethodDataSource(Type, string) constructor + // MethodDataSource(Type, string) constructor - only available on MethodDataSourceAttribute + // For instance data sources, we still use the same constructor signature writer.AppendLine($"new {attrTypeName}(typeof({typeArg.GloballyQualified()}), \"{methodName}\")"); } else @@ -1048,7 +1056,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1080,7 +1088,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1124,7 +1132,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1167,7 +1175,7 @@ private static void GenerateMethodDataSourceFactory(CodeWriter writer, IMethodSy writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{methodCall};"); @@ -1217,7 +1225,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); @@ -1249,7 +1257,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); @@ -1293,7 +1301,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); @@ -1336,7 +1344,7 @@ private static void GeneratePropertyDataSourceFactory(CodeWriter writer, IProper writer.AppendLine("else"); writer.AppendLine("{"); writer.Indent(); - InstanceFactoryGenerator.GenerateInstanceCreation(writer, targetType, "instance"); + writer.AppendLine("throw new global::System.InvalidOperationException(\"Instance method data source requires TestClassInstance. This should have been provided by the engine.\");"); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine($"var result = (({fullyQualifiedType})instance).{propertyAccess};"); diff --git a/TUnit.Core/Attributes/TestData/ClassDataSources.cs b/TUnit.Core/Attributes/TestData/ClassDataSources.cs index efad3790cd..0f21903fd1 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSources.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSources.cs @@ -1,7 +1,9 @@ -using System.Diagnostics.CodeAnalysis; +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.ExceptionServices; using TUnit.Core.Data; +using TUnit.Core.PropertyInjection; namespace TUnit.Core; @@ -87,7 +89,12 @@ private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemb try { - return Activator.CreateInstance(type)!; + var instance = Activator.CreateInstance(type)!; + + // Inject properties into the created instance + InjectPropertiesSync(instance, type, dataGeneratorMetadata, recursionDepth); + + return instance; } catch (TargetInvocationException targetInvocationException) { @@ -99,4 +106,197 @@ private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemb throw; } } + + /// + /// Injects properties into an instance synchronously. + /// Used when creating instances via ClassDataSource for nested data source dependencies. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Type is already annotated with DynamicallyAccessedMembers")] + [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute' may break functionality when AOT compiling", Justification = "Fallback to reflection mode when source-gen not available")] + private static void InjectPropertiesSync( + object instance, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, + DataGeneratorMetadata dataGeneratorMetadata, + int recursionDepth) + { + // Get the injection plan for this type + var plan = PropertyInjectionPlanBuilder.Build(type); + if (!plan.HasProperties) + { + return; + } + + // Handle source-generated properties + foreach (var metadata in plan.SourceGeneratedProperties) + { + var dataSource = metadata.CreateDataSource(); + var propertyMetadata = CreatePropertyMetadata(type, metadata.PropertyName, metadata.PropertyType); + + var propertyDataGeneratorMetadata = DataGeneratorMetadataCreator.CreateForPropertyInjection( + propertyMetadata, + dataGeneratorMetadata.TestInformation, + dataSource, + testContext: null, + testClassInstance: instance, + events: new TestContextEvents(), + objectBag: new ConcurrentDictionary()); + + var value = ResolveDataSourceValueSync(dataSource, propertyDataGeneratorMetadata, recursionDepth + 1); + if (value != null) + { + metadata.SetProperty(instance, value); + } + } + + // Handle reflection-mode properties + foreach (var (property, dataSource) in plan.ReflectionProperties) + { + var propertyMetadata = CreatePropertyMetadataFromPropertyInfo(property); + + var propertyDataGeneratorMetadata = DataGeneratorMetadataCreator.CreateForPropertyInjection( + propertyMetadata, + dataGeneratorMetadata.TestInformation, + dataSource, + testContext: null, + testClassInstance: instance, + events: new TestContextEvents(), + objectBag: new ConcurrentDictionary()); + + var value = ResolveDataSourceValueSync(dataSource, propertyDataGeneratorMetadata, recursionDepth + 1); + if (value != null) + { + SetPropertyValue(property, instance, value); + } + } + } + + [UnconditionalSuppressMessage("Trimming", "IL2067:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "Type is already annotated in caller")] + [UnconditionalSuppressMessage("Trimming", "IL2070:Target method return value does not satisfy 'DynamicallyAccessedMembersAttribute'", Justification = "Type is already annotated in caller")] + private static PropertyMetadata CreatePropertyMetadata( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] Type containingType, + string propertyName, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties)] Type propertyType) + { + return new PropertyMetadata + { + Name = propertyName, + Type = propertyType, + IsStatic = false, + ClassMetadata = GetClassMetadataForType(containingType), + ContainingTypeMetadata = GetClassMetadataForType(containingType), + ReflectionInfo = containingType.GetProperty(propertyName)!, + Getter = parent => containingType.GetProperty(propertyName)?.GetValue(parent) + }; + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "PropertyInfo already obtained")] + [UnconditionalSuppressMessage("Trimming", "IL2072:'value' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "PropertyInfo already obtained with type annotations")] + private static PropertyMetadata CreatePropertyMetadataFromPropertyInfo(PropertyInfo property) + { + var containingType = property.DeclaringType!; + return new PropertyMetadata + { + Name = property.Name, + Type = property.PropertyType, + IsStatic = property.GetMethod?.IsStatic ?? false, + ClassMetadata = GetClassMetadataForType(containingType), + ContainingTypeMetadata = GetClassMetadataForType(containingType), + ReflectionInfo = property, + Getter = parent => property.GetValue(parent) + }; + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Type is already annotated")] + [UnconditionalSuppressMessage("Trimming", "IL2070:Target method return value does not satisfy 'DynamicallyAccessedMembersAttribute'", Justification = "Type is already annotated")] + [UnconditionalSuppressMessage("Trimming", "IL2072:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "Type is already annotated")] + [UnconditionalSuppressMessage("Trimming", "IL2067:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "Type is already annotated")] + private static ClassMetadata GetClassMetadataForType(Type type) + { + return ClassMetadata.GetOrAdd(type.FullName ?? type.Name, () => + { + var constructors = type.GetConstructors(BindingFlags.Public | BindingFlags.Instance); + var constructor = constructors.FirstOrDefault(); + + var constructorParameters = constructor?.GetParameters().Select((p, i) => new ParameterMetadata(p.ParameterType) + { + Name = p.Name ?? $"param{i}", + TypeInfo = new ConcreteType(p.ParameterType), + ReflectionInfo = p + }).ToArray() ?? []; + + return new ClassMetadata + { + Type = type, + TypeInfo = new ConcreteType(type), + Name = type.Name, + Namespace = type.Namespace ?? string.Empty, + Assembly = AssemblyMetadata.GetOrAdd(type.Assembly.GetName().Name ?? type.Assembly.GetName().FullName ?? "Unknown", () => new AssemblyMetadata + { + Name = type.Assembly.GetName().Name ?? type.Assembly.GetName().FullName ?? "Unknown" + }), + Properties = [], + Parameters = constructorParameters, + Parent = type.DeclaringType != null ? GetClassMetadataForType(type.DeclaringType) : null + }; + }); + } + + /// + /// Resolves a data source value synchronously by running the async enumerable. + /// + private static object? ResolveDataSourceValueSync(IDataSourceAttribute dataSource, DataGeneratorMetadata metadata, int recursionDepth) + { + var dataRows = dataSource.GetDataRowsAsync(metadata); + + // Get the first value from the async enumerable synchronously + var enumerator = dataRows.GetAsyncEnumerator(); + try + { + if (enumerator.MoveNextAsync().AsTask().GetAwaiter().GetResult()) + { + var factory = enumerator.Current; + var args = factory().GetAwaiter().GetResult(); + if (args is { Length: > 0 }) + { + var value = args[0]; + + // Initialize the value if it implements IAsyncInitializer + ObjectInitializer.InitializeAsync(value).AsTask().GetAwaiter().GetResult(); + + return value; + } + } + } + finally + { + enumerator.DisposeAsync().AsTask().GetAwaiter().GetResult(); + } + + return null; + } + + /// + /// Sets a property value, handling init-only properties via backing field if necessary. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "PropertyInfo already obtained")] + [UnconditionalSuppressMessage("Trimming", "IL2075:'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "PropertyInfo already obtained with type annotations")] + private static void SetPropertyValue(PropertyInfo property, object instance, object? value) + { + if (property.CanWrite && property.SetMethod != null) + { + property.SetValue(instance, value); + return; + } + + // Try to set via backing field for init-only properties + var backingFieldName = $"<{property.Name}>k__BackingField"; + var backingField = property.DeclaringType?.GetField( + backingFieldName, + BindingFlags.Instance | BindingFlags.NonPublic); + + if (backingField != null) + { + backingField.SetValue(instance, value); + } + } } diff --git a/TUnit.Core/Attributes/TestData/InstanceMethodDataSourceSourceAttribute.cs b/TUnit.Core/Attributes/TestData/InstanceMethodDataSourceSourceAttribute.cs index 28664cdc9f..9413df05a1 100644 --- a/TUnit.Core/Attributes/TestData/InstanceMethodDataSourceSourceAttribute.cs +++ b/TUnit.Core/Attributes/TestData/InstanceMethodDataSourceSourceAttribute.cs @@ -1,4 +1,25 @@ -namespace TUnit.Core; +using System.Diagnostics.CodeAnalysis; +namespace TUnit.Core; + +/// +/// A method data source attribute that requires an instance of the test class to be created first. +/// This implements IAccessesInstanceData which tells the engine to create a properly-initialized +/// instance before evaluating the data source. +/// [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] -public class InstanceMethodDataSourceAttribute(string methodNameProvidingDataSource) : MethodDataSourceAttribute(methodNameProvidingDataSource), IAccessesInstanceData; +public class InstanceMethodDataSourceAttribute : MethodDataSourceAttribute, IAccessesInstanceData +{ + public InstanceMethodDataSourceAttribute(string methodNameProvidingDataSource) + : base(methodNameProvidingDataSource) + { + } + + public InstanceMethodDataSourceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] + Type classProvidingDataSource, + string methodNameProvidingDataSource) + : base(classProvidingDataSource, methodNameProvidingDataSource) + { + } +} diff --git a/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs b/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs index a0cf5ee323..c0251ce158 100644 --- a/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs +++ b/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs @@ -102,13 +102,33 @@ public static PropertyInjectionPlan BuildReflectionPlan(Type type) /// /// Builds an injection plan based on the current execution mode. + /// Falls back to reflection when source-gen mode has no registered source for a type. + /// This handles generic types like ErrFixture<MyType> where the source generator + /// couldn't register a property source for the closed generic type. /// [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Source gen mode has its own path>")] public static PropertyInjectionPlan Build(Type type) { - return SourceRegistrar.IsEnabled - ? BuildSourceGeneratedPlan(type) - : BuildReflectionPlan(type); + if (!SourceRegistrar.IsEnabled) + { + return BuildReflectionPlan(type); + } + + // Try source-generated plan first + var plan = BuildSourceGeneratedPlan(type); + + // If no properties found in source-gen mode, fall back to reflection + // This handles generic types that couldn't be registered at compile time + if (!plan.HasProperties) + { + var reflectionPlan = BuildReflectionPlan(type); + if (reflectionPlan.HasProperties) + { + return reflectionPlan; + } + } + + return plan; } } diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index cc6da989b9..35993d71b6 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -250,6 +250,24 @@ public async Task> BuildTestsFromMetadataAsy // Non-generic class instanceForMethodDataSources = metadata.InstanceFactory([], classData); } + + // Initialize property data sources on the early instance so that + // method data sources can access fully-initialized properties. + // This is critical for scenarios like: + // [ClassDataSource>] public required ErrFixture Fixture { get; init; } + // public IEnumerable> TestExecutions => [() => Fixture.Value]; + // [MethodDataSource("TestExecutions")] [Test] public void MyTest(T value) { } + if (instanceForMethodDataSources != null) + { + var tempObjectBag = new ConcurrentDictionary(); + var tempEvents = new TestContextEvents(); + + await _propertyInjectionService.InjectPropertiesIntoObjectAsync( + instanceForMethodDataSources, + tempObjectBag, + metadata.MethodMetadata, + tempEvents); + } } catch (Exception ex) { @@ -1371,6 +1389,17 @@ public async IAsyncEnumerable BuildTestsStreamingAsync( { continue; // Skip if instance creation failed } + + // Initialize property data sources on the early instance so that + // method data sources can access fully-initialized properties. + var tempObjectBag = new ConcurrentDictionary(); + var tempEvents = new TestContextEvents(); + + await _propertyInjectionService.InjectPropertiesIntoObjectAsync( + instanceForMethodDataSources, + tempObjectBag, + metadata.MethodMetadata, + tempEvents); } // Stream through method data sources diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 556486d6e4..d3d12fecde 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -881,6 +881,7 @@ namespace public class InstanceMethodDataSourceAttribute : .MethodDataSourceAttribute, .IAccessesInstanceData { public InstanceMethodDataSourceAttribute(string methodNameProvidingDataSource) { } + public InstanceMethodDataSourceAttribute([.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..PublicMethods | ..NonPublicMethods | ..PublicProperties)] classProvidingDataSource, string methodNameProvidingDataSource) { } } public class InvalidTestMetadataException : .TestBuilderException { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 8bbca55ff3..3d1bb5b556 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -881,6 +881,7 @@ namespace public class InstanceMethodDataSourceAttribute : .MethodDataSourceAttribute, .IAccessesInstanceData { public InstanceMethodDataSourceAttribute(string methodNameProvidingDataSource) { } + public InstanceMethodDataSourceAttribute([.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..PublicMethods | ..NonPublicMethods | ..PublicProperties)] classProvidingDataSource, string methodNameProvidingDataSource) { } } public class InvalidTestMetadataException : .TestBuilderException { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index e7945a9846..7f3054b2c2 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -881,6 +881,7 @@ namespace public class InstanceMethodDataSourceAttribute : .MethodDataSourceAttribute, .IAccessesInstanceData { public InstanceMethodDataSourceAttribute(string methodNameProvidingDataSource) { } + public InstanceMethodDataSourceAttribute([.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..PublicMethods | ..NonPublicMethods | ..PublicProperties)] classProvidingDataSource, string methodNameProvidingDataSource) { } } public class InvalidTestMetadataException : .TestBuilderException { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index dd3923472e..ee302f89a4 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -858,6 +858,7 @@ namespace public class InstanceMethodDataSourceAttribute : .MethodDataSourceAttribute, .IAccessesInstanceData { public InstanceMethodDataSourceAttribute(string methodNameProvidingDataSource) { } + public InstanceMethodDataSourceAttribute( classProvidingDataSource, string methodNameProvidingDataSource) { } } public class InvalidTestMetadataException : .TestBuilderException { diff --git a/TUnit.TestProject/Bugs/3951/Tests.cs b/TUnit.TestProject/Bugs/3951/Tests.cs index 8527375a81..d54909778d 100644 --- a/TUnit.TestProject/Bugs/3951/Tests.cs +++ b/TUnit.TestProject/Bugs/3951/Tests.cs @@ -19,6 +19,7 @@ public class ErrContext: IAsyncInitializer, IAsyncDisposable public class ErrFixture : IAsyncDisposable, IAsyncInitializer { + [ClassDataSource(Shared = SharedType.PerClass)] public required ErrContext Fixture { get; set; } public ValueTask DisposeAsync() => default; public Task InitializeAsync() => Task.CompletedTask; @@ -43,6 +44,6 @@ public async Task MyTest(ErrContext context) [Test] public async Task MyTest2(MyType t) { - await Assert.That(t.GetType()).IsAssignableTo(); + await Assert.That(t).IsAssignableTo(); } } From 9a86180f68f1477d144a55478a22bd8bfd5ee137 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 16:30:38 +0000 Subject: [PATCH 125/192] chore(deps): update tunit to 1.3.13 (#3957) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1b99800122..a81b92324e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 0d0287b63c..d4ccd6864c 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 12a6883b3a..128152fdf1 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 32c3d112bd..ef9d916bc1 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index a3c5375825..a34180a833 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 103b19fc7d..b6efdf9b19 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index eeeb221993..d582d1079e 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 969a69127d..9314066baa 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index 76ce9ddde2..f8dff8bc55 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 07c3c1e68fe65a0f0dc6f64619aae5b09f0a4032 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 17:58:20 +0000 Subject: [PATCH 126/192] feat: enhance data source initialization and property injection handling (#3959) * feat: enhance data source initialization and property injection handling * feat: implement initialization order tracking for async components --- .../Attributes/TestData/ClassDataSources.cs | 243 +------------- .../Framework/TUnitServiceProvider.cs | 2 +- .../Services/DataSourceInitializer.cs | 32 +- .../PropertyInitializationOrchestrator.cs | 7 +- .../Services/PropertyInjectionService.cs | 6 +- TUnit.Engine/TestInitializer.cs | 21 +- TUnit.TestProject/Bugs/3266/Tests.cs | 305 ++++++++++++++++++ 7 files changed, 365 insertions(+), 251 deletions(-) diff --git a/TUnit.Core/Attributes/TestData/ClassDataSources.cs b/TUnit.Core/Attributes/TestData/ClassDataSources.cs index 0f21903fd1..d6fc652455 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSources.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSources.cs @@ -1,9 +1,7 @@ -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.ExceptionServices; using TUnit.Core.Data; -using TUnit.Core.PropertyInjection; namespace TUnit.Core; @@ -45,11 +43,11 @@ private string GetKey(int index, SharedType[] sharedTypes, string[] keys) { return sharedType switch { - SharedType.None => Create(dataGeneratorMetadata), - SharedType.PerTestSession => (T) TestDataContainer.GetGlobalInstance(typeof(T), _ => Create(typeof(T), dataGeneratorMetadata))!, - SharedType.PerClass => (T) TestDataContainer.GetInstanceForClass(testClassType, typeof(T), _ => Create(typeof(T), dataGeneratorMetadata))!, - SharedType.Keyed => (T) TestDataContainer.GetInstanceForKey(key, typeof(T), _ => Create(typeof(T), dataGeneratorMetadata))!, - SharedType.PerAssembly => (T) TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, typeof(T), _ => Create(typeof(T), dataGeneratorMetadata))!, + SharedType.None => Create(), + SharedType.PerTestSession => (T) TestDataContainer.GetGlobalInstance(typeof(T), _ => Create(typeof(T)))!, + SharedType.PerClass => (T) TestDataContainer.GetInstanceForClass(testClassType, typeof(T), _ => Create(typeof(T)))!, + SharedType.Keyed => (T) TestDataContainer.GetInstanceForKey(key, typeof(T), _ => Create(typeof(T)))!, + SharedType.PerAssembly => (T) TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, typeof(T), _ => Create(typeof(T)))!, _ => throw new ArgumentOutOfRangeException() }; } @@ -58,43 +56,27 @@ private string GetKey(int index, SharedType[] sharedTypes, string[] keys) { return sharedType switch { - SharedType.None => Create(type, dataGeneratorMetadata), - SharedType.PerTestSession => TestDataContainer.GetGlobalInstance(type, _ => Create(type, dataGeneratorMetadata)), - SharedType.PerClass => TestDataContainer.GetInstanceForClass(testClassType, type, _ => Create(type, dataGeneratorMetadata)), - SharedType.Keyed => TestDataContainer.GetInstanceForKey(key!, type, _ => Create(type, dataGeneratorMetadata)), - SharedType.PerAssembly => TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, type, _ => Create(type, dataGeneratorMetadata)), + SharedType.None => Create(type), + SharedType.PerTestSession => TestDataContainer.GetGlobalInstance(type, _ => Create(type)), + SharedType.PerClass => TestDataContainer.GetInstanceForClass(testClassType, type, _ => Create(type)), + SharedType.Keyed => TestDataContainer.GetInstanceForKey(key!, type, _ => Create(type)), + SharedType.PerAssembly => TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, type, _ => Create(type)), _ => throw new ArgumentOutOfRangeException() }; } [return: NotNull] - private static T Create<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(DataGeneratorMetadata dataGeneratorMetadata) + private static T Create<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] T>() { - return ((T) Create(typeof(T), dataGeneratorMetadata))!; + return ((T) Create(typeof(T)))!; } - private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, DataGeneratorMetadata dataGeneratorMetadata) + private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type) { - return Create(type, dataGeneratorMetadata, recursionDepth: 0); - } - - private const int MaxRecursionDepth = 10; - - private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, DataGeneratorMetadata dataGeneratorMetadata, int recursionDepth) - { - if (recursionDepth >= MaxRecursionDepth) - { - throw new InvalidOperationException($"Maximum recursion depth ({MaxRecursionDepth}) exceeded when creating nested ClassDataSource dependencies. This may indicate a circular dependency."); - } - try { - var instance = Activator.CreateInstance(type)!; - - // Inject properties into the created instance - InjectPropertiesSync(instance, type, dataGeneratorMetadata, recursionDepth); - - return instance; + // Just create the instance - initialization happens in the Engine + return Activator.CreateInstance(type)!; } catch (TargetInvocationException targetInvocationException) { @@ -106,197 +88,4 @@ private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemb throw; } } - - /// - /// Injects properties into an instance synchronously. - /// Used when creating instances via ClassDataSource for nested data source dependencies. - /// - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Type is already annotated with DynamicallyAccessedMembers")] - [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute' may break functionality when AOT compiling", Justification = "Fallback to reflection mode when source-gen not available")] - private static void InjectPropertiesSync( - object instance, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, - DataGeneratorMetadata dataGeneratorMetadata, - int recursionDepth) - { - // Get the injection plan for this type - var plan = PropertyInjectionPlanBuilder.Build(type); - if (!plan.HasProperties) - { - return; - } - - // Handle source-generated properties - foreach (var metadata in plan.SourceGeneratedProperties) - { - var dataSource = metadata.CreateDataSource(); - var propertyMetadata = CreatePropertyMetadata(type, metadata.PropertyName, metadata.PropertyType); - - var propertyDataGeneratorMetadata = DataGeneratorMetadataCreator.CreateForPropertyInjection( - propertyMetadata, - dataGeneratorMetadata.TestInformation, - dataSource, - testContext: null, - testClassInstance: instance, - events: new TestContextEvents(), - objectBag: new ConcurrentDictionary()); - - var value = ResolveDataSourceValueSync(dataSource, propertyDataGeneratorMetadata, recursionDepth + 1); - if (value != null) - { - metadata.SetProperty(instance, value); - } - } - - // Handle reflection-mode properties - foreach (var (property, dataSource) in plan.ReflectionProperties) - { - var propertyMetadata = CreatePropertyMetadataFromPropertyInfo(property); - - var propertyDataGeneratorMetadata = DataGeneratorMetadataCreator.CreateForPropertyInjection( - propertyMetadata, - dataGeneratorMetadata.TestInformation, - dataSource, - testContext: null, - testClassInstance: instance, - events: new TestContextEvents(), - objectBag: new ConcurrentDictionary()); - - var value = ResolveDataSourceValueSync(dataSource, propertyDataGeneratorMetadata, recursionDepth + 1); - if (value != null) - { - SetPropertyValue(property, instance, value); - } - } - } - - [UnconditionalSuppressMessage("Trimming", "IL2067:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "Type is already annotated in caller")] - [UnconditionalSuppressMessage("Trimming", "IL2070:Target method return value does not satisfy 'DynamicallyAccessedMembersAttribute'", Justification = "Type is already annotated in caller")] - private static PropertyMetadata CreatePropertyMetadata( - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] Type containingType, - string propertyName, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicProperties)] Type propertyType) - { - return new PropertyMetadata - { - Name = propertyName, - Type = propertyType, - IsStatic = false, - ClassMetadata = GetClassMetadataForType(containingType), - ContainingTypeMetadata = GetClassMetadataForType(containingType), - ReflectionInfo = containingType.GetProperty(propertyName)!, - Getter = parent => containingType.GetProperty(propertyName)?.GetValue(parent) - }; - } - - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "PropertyInfo already obtained")] - [UnconditionalSuppressMessage("Trimming", "IL2072:'value' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "PropertyInfo already obtained with type annotations")] - private static PropertyMetadata CreatePropertyMetadataFromPropertyInfo(PropertyInfo property) - { - var containingType = property.DeclaringType!; - return new PropertyMetadata - { - Name = property.Name, - Type = property.PropertyType, - IsStatic = property.GetMethod?.IsStatic ?? false, - ClassMetadata = GetClassMetadataForType(containingType), - ContainingTypeMetadata = GetClassMetadataForType(containingType), - ReflectionInfo = property, - Getter = parent => property.GetValue(parent) - }; - } - - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Type is already annotated")] - [UnconditionalSuppressMessage("Trimming", "IL2070:Target method return value does not satisfy 'DynamicallyAccessedMembersAttribute'", Justification = "Type is already annotated")] - [UnconditionalSuppressMessage("Trimming", "IL2072:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "Type is already annotated")] - [UnconditionalSuppressMessage("Trimming", "IL2067:Target parameter argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "Type is already annotated")] - private static ClassMetadata GetClassMetadataForType(Type type) - { - return ClassMetadata.GetOrAdd(type.FullName ?? type.Name, () => - { - var constructors = type.GetConstructors(BindingFlags.Public | BindingFlags.Instance); - var constructor = constructors.FirstOrDefault(); - - var constructorParameters = constructor?.GetParameters().Select((p, i) => new ParameterMetadata(p.ParameterType) - { - Name = p.Name ?? $"param{i}", - TypeInfo = new ConcreteType(p.ParameterType), - ReflectionInfo = p - }).ToArray() ?? []; - - return new ClassMetadata - { - Type = type, - TypeInfo = new ConcreteType(type), - Name = type.Name, - Namespace = type.Namespace ?? string.Empty, - Assembly = AssemblyMetadata.GetOrAdd(type.Assembly.GetName().Name ?? type.Assembly.GetName().FullName ?? "Unknown", () => new AssemblyMetadata - { - Name = type.Assembly.GetName().Name ?? type.Assembly.GetName().FullName ?? "Unknown" - }), - Properties = [], - Parameters = constructorParameters, - Parent = type.DeclaringType != null ? GetClassMetadataForType(type.DeclaringType) : null - }; - }); - } - - /// - /// Resolves a data source value synchronously by running the async enumerable. - /// - private static object? ResolveDataSourceValueSync(IDataSourceAttribute dataSource, DataGeneratorMetadata metadata, int recursionDepth) - { - var dataRows = dataSource.GetDataRowsAsync(metadata); - - // Get the first value from the async enumerable synchronously - var enumerator = dataRows.GetAsyncEnumerator(); - try - { - if (enumerator.MoveNextAsync().AsTask().GetAwaiter().GetResult()) - { - var factory = enumerator.Current; - var args = factory().GetAwaiter().GetResult(); - if (args is { Length: > 0 }) - { - var value = args[0]; - - // Initialize the value if it implements IAsyncInitializer - ObjectInitializer.InitializeAsync(value).AsTask().GetAwaiter().GetResult(); - - return value; - } - } - } - finally - { - enumerator.DisposeAsync().AsTask().GetAwaiter().GetResult(); - } - - return null; - } - - /// - /// Sets a property value, handling init-only properties via backing field if necessary. - /// - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "PropertyInfo already obtained")] - [UnconditionalSuppressMessage("Trimming", "IL2075:'this' argument does not satisfy 'DynamicallyAccessedMembersAttribute' in call to target method", Justification = "PropertyInfo already obtained with type annotations")] - private static void SetPropertyValue(PropertyInfo property, object instance, object? value) - { - if (property.CanWrite && property.SetMethod != null) - { - property.SetValue(instance, value); - return; - } - - // Try to set via backing field for init-only properties - var backingFieldName = $"<{property.Name}>k__BackingField"; - var backingField = property.DeclaringType?.GetField( - backingFieldName, - BindingFlags.Instance | BindingFlags.NonPublic); - - if (backingField != null) - { - backingField.SetValue(instance, value); - } - } } diff --git a/TUnit.Engine/Framework/TUnitServiceProvider.cs b/TUnit.Engine/Framework/TUnitServiceProvider.cs index dd6896971d..ed2543909d 100644 --- a/TUnit.Engine/Framework/TUnitServiceProvider.cs +++ b/TUnit.Engine/Framework/TUnitServiceProvider.cs @@ -188,7 +188,7 @@ public TUnitServiceProvider(IExtension extension, // Create test finder service after discovery service so it can use its cache TestFinder = Register(new TestFinder(DiscoveryService)); - var testInitializer = new TestInitializer(EventReceiverOrchestrator, PropertyInjectionService, objectTracker); + var testInitializer = new TestInitializer(EventReceiverOrchestrator, PropertyInjectionService, DataSourceInitializer, objectTracker); // Create the new TestCoordinator that orchestrates the granular services var testCoordinator = Register( diff --git a/TUnit.Engine/Services/DataSourceInitializer.cs b/TUnit.Engine/Services/DataSourceInitializer.cs index ae69a2f52e..e69b0a385f 100644 --- a/TUnit.Engine/Services/DataSourceInitializer.cs +++ b/TUnit.Engine/Services/DataSourceInitializer.cs @@ -162,12 +162,21 @@ private void CollectNestedObjects( { var plan = PropertyInjectionCache.GetOrCreatePlan(obj.GetType()); - if (!SourceRegistrar.IsEnabled) + // Use whichever properties are available in the plan + // For closed generic types, source-gen may not have registered them, so use reflection fallback + if (plan.SourceGeneratedProperties.Length > 0) { - // Reflection mode - foreach (var prop in plan.ReflectionProperties) + // Source-generated mode + foreach (var metadata in plan.SourceGeneratedProperties) { - var value = prop.Property.GetValue(obj); + var property = metadata.ContainingType.GetProperty(metadata.PropertyName); + + if (property == null || !property.CanRead) + { + continue; + } + + var value = property.GetValue(obj); if (value == null || !visitedObjects.Add(value)) { @@ -192,19 +201,12 @@ private void CollectNestedObjects( } } } - else + else if (plan.ReflectionProperties.Length > 0) { - // Source-generated mode - foreach (var metadata in plan.SourceGeneratedProperties) + // Reflection mode fallback + foreach (var prop in plan.ReflectionProperties) { - var property = metadata.ContainingType.GetProperty(metadata.PropertyName); - - if (property == null || !property.CanRead) - { - continue; - } - - var value = property.GetValue(obj); + var value = prop.Property.GetValue(obj); if (value == null || !visitedObjects.Add(value)) { diff --git a/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs b/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs index 7462566749..2b7e3ab34b 100644 --- a/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs +++ b/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs @@ -196,13 +196,14 @@ public async Task InitializeObjectWithPropertiesAsync( return; } - // Initialize properties based on the mode (source-generated or reflection) - if (SourceRegistrar.IsEnabled) + // Initialize properties based on what's available in the plan + // For closed generic types, source-gen may not have registered them, so use reflection fallback + if (plan.SourceGeneratedProperties.Length > 0) { await InitializeSourceGeneratedPropertiesAsync( instance, plan.SourceGeneratedProperties, objectBag, methodMetadata, events, visitedObjects); } - else + else if (plan.ReflectionProperties.Length > 0) { await InitializeReflectionPropertiesAsync( instance, plan.ReflectionProperties, objectBag, methodMetadata, events, visitedObjects); diff --git a/TUnit.Engine/Services/PropertyInjectionService.cs b/TUnit.Engine/Services/PropertyInjectionService.cs index 9cdde83a2d..de10b2dfb7 100644 --- a/TUnit.Engine/Services/PropertyInjectionService.cs +++ b/TUnit.Engine/Services/PropertyInjectionService.cs @@ -162,7 +162,9 @@ private async Task RecurseIntoNestedPropertiesAsync( return; } - if (SourceRegistrar.IsEnabled) + // Use whichever properties are available in the plan + // For closed generic types, source-gen may not have registered them, so use reflection fallback + if (plan.SourceGeneratedProperties.Length > 0) { foreach (var metadata in plan.SourceGeneratedProperties) { @@ -184,7 +186,7 @@ private async Task RecurseIntoNestedPropertiesAsync( } } } - else + else if (plan.ReflectionProperties.Length > 0) { foreach (var (property, _) in plan.ReflectionProperties) { diff --git a/TUnit.Engine/TestInitializer.cs b/TUnit.Engine/TestInitializer.cs index 2c8e0c7156..f9912932e4 100644 --- a/TUnit.Engine/TestInitializer.cs +++ b/TUnit.Engine/TestInitializer.cs @@ -10,14 +10,17 @@ internal class TestInitializer { private readonly EventReceiverOrchestrator _eventReceiverOrchestrator; private readonly PropertyInjectionService _propertyInjectionService; + private readonly DataSourceInitializer _dataSourceInitializer; private readonly ObjectTracker _objectTracker; public TestInitializer(EventReceiverOrchestrator eventReceiverOrchestrator, PropertyInjectionService propertyInjectionService, + DataSourceInitializer dataSourceInitializer, ObjectTracker objectTracker) { _eventReceiverOrchestrator = eventReceiverOrchestrator; _propertyInjectionService = propertyInjectionService; + _dataSourceInitializer = dataSourceInitializer; _objectTracker = objectTracker; } @@ -42,15 +45,27 @@ await _propertyInjectionService.InjectPropertiesIntoObjectAsync( private async Task InitializeTrackedObjects(TestContext testContext, CancellationToken cancellationToken) { // Initialize by level (deepest first), with objects at the same level in parallel + // Using DataSourceInitializer ensures property injection + nested objects + IAsyncInitializer var levels = testContext.TrackedObjects.Keys.OrderByDescending(level => level); foreach (var level in levels) { var objectsAtLevel = testContext.TrackedObjects[level]; - await Task.WhenAll(objectsAtLevel.Select(obj => ObjectInitializer.InitializeAsync(obj, cancellationToken).AsTask())); + await Task.WhenAll(objectsAtLevel.Select(obj => + _dataSourceInitializer.EnsureInitializedAsync( + obj, + testContext.StateBag.Items, + testContext.Metadata.TestDetails.MethodMetadata, + testContext.InternalEvents, + cancellationToken).AsTask())); } - // Finally, ensure the test class itself is initialized - await ObjectInitializer.InitializeAsync(testContext.Metadata.TestDetails.ClassInstance, cancellationToken); + // Finally, ensure the test class itself is initialized (property injection + IAsyncInitializer) + await _dataSourceInitializer.EnsureInitializedAsync( + testContext.Metadata.TestDetails.ClassInstance, + testContext.StateBag.Items, + testContext.Metadata.TestDetails.MethodMetadata, + testContext.InternalEvents, + cancellationToken); } } diff --git a/TUnit.TestProject/Bugs/3266/Tests.cs b/TUnit.TestProject/Bugs/3266/Tests.cs index f18ef81aed..25dadb37fa 100644 --- a/TUnit.TestProject/Bugs/3266/Tests.cs +++ b/TUnit.TestProject/Bugs/3266/Tests.cs @@ -1,17 +1,42 @@ +using System.Collections.Concurrent; using TUnit.Core; using TUnit.Core.Interfaces; using TUnit.TestProject.Attributes; namespace TUnit.TestProject.Bugs.Bug3266; +// Global tracker to verify initialization order across all components +public static class InitializationOrderTracker +{ + private static int _counter; + private static readonly ConcurrentDictionary InitOrder = new(); + + public static int RecordInitialization(string componentName) + { + var order = Interlocked.Increment(ref _counter); + InitOrder[componentName] = order; + return order; + } + + public static int GetOrder(string componentName) => InitOrder.TryGetValue(componentName, out var order) ? order : -1; + + public static void Reset() + { + _counter = 0; + InitOrder.Clear(); + } +} + // Mock test container - shared per test session public class PulsarTestContainer : IAsyncInitializer, IAsyncDisposable { public bool IsInitialized { get; private set; } public bool IsDisposed { get; private set; } + public int InitializationOrder { get; private set; } public Task InitializeAsync() { + InitializationOrder = InitializationOrderTracker.RecordInitialization(nameof(PulsarTestContainer)); IsInitialized = true; return Task.CompletedTask; } @@ -31,6 +56,7 @@ public class PulsarConnection : IAsyncInitializer, IAsyncDisposable public bool IsInitialized { get; private set; } public bool IsDisposed { get; private set; } + public int InitializationOrder { get; private set; } public Task InitializeAsync() { @@ -41,6 +67,7 @@ public Task InitializeAsync() "PulsarConnection.InitializeAsync() called before nested Container property was initialized!"); } + InitializationOrder = InitializationOrderTracker.RecordInitialization(nameof(PulsarConnection)); IsInitialized = true; return Task.CompletedTask; } @@ -60,6 +87,7 @@ public class WebAppFactory : IAsyncInitializer, IAsyncDisposable public bool IsInitialized { get; private set; } public bool IsDisposed { get; private set; } + public int InitializationOrder { get; private set; } public Task InitializeAsync() { @@ -70,6 +98,7 @@ public Task InitializeAsync() "WebAppFactory.InitializeAsync() called before nested Container property was initialized!"); } + InitializationOrder = InitializationOrderTracker.RecordInitialization(nameof(WebAppFactory)); IsInitialized = true; return Task.CompletedTask; } @@ -130,4 +159,280 @@ await Assert.That(Connection.Container) .IsSameReferenceAs(WebApp.Container) .Because("Both properties should share the same PulsarTestContainer instance"); } + + [Test] + public async Task InitializationOrderShouldBeDependencyFirst() + { + // PulsarTestContainer must be initialized before both PulsarConnection and WebAppFactory + await Assert.That(Connection.Container.InitializationOrder) + .IsLessThan(Connection.InitializationOrder) + .Because("Container should be initialized before PulsarConnection"); + + await Assert.That(WebApp.Container.InitializationOrder) + .IsLessThan(WebApp.InitializationOrder) + .Because("Container should be initialized before WebAppFactory"); + } +} + +#region Deep Nested Dependency Chain Tests + +// Level 1: Deepest shared dependency +public class DeepDependencyLevel1 : IAsyncInitializer, IAsyncDisposable +{ + public bool IsInitialized { get; private set; } + public int InitializationOrder { get; private set; } + + public Task InitializeAsync() + { + InitializationOrder = InitializationOrderTracker.RecordInitialization($"{nameof(DeepDependencyLevel1)}_{GetHashCode()}"); + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; +} + +// Level 2: Depends on Level 1 +public class DeepDependencyLevel2 : IAsyncInitializer, IAsyncDisposable +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required DeepDependencyLevel1 Level1 { get; init; } + + public bool IsInitialized { get; private set; } + public int InitializationOrder { get; private set; } + + public Task InitializeAsync() + { + if (!Level1.IsInitialized) + { + throw new InvalidOperationException("Level2 initialized before Level1!"); + } + InitializationOrder = InitializationOrderTracker.RecordInitialization($"{nameof(DeepDependencyLevel2)}_{GetHashCode()}"); + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; +} + +// Level 3: Depends on Level 2 +public class DeepDependencyLevel3 : IAsyncInitializer, IAsyncDisposable +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required DeepDependencyLevel2 Level2 { get; init; } + + public bool IsInitialized { get; private set; } + public int InitializationOrder { get; private set; } + + public Task InitializeAsync() + { + if (!Level2.IsInitialized) + { + throw new InvalidOperationException("Level3 initialized before Level2!"); + } + if (!Level2.Level1.IsInitialized) + { + throw new InvalidOperationException("Level3 initialized before Level1!"); + } + InitializationOrder = InitializationOrderTracker.RecordInitialization($"{nameof(DeepDependencyLevel3)}_{GetHashCode()}"); + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; +} + +// Level 4: Depends on Level 3 (deepest level in the chain) +public class DeepDependencyLevel4 : IAsyncInitializer, IAsyncDisposable +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required DeepDependencyLevel3 Level3 { get; init; } + + public bool IsInitialized { get; private set; } + public int InitializationOrder { get; private set; } + + public Task InitializeAsync() + { + if (!Level3.IsInitialized) + { + throw new InvalidOperationException("Level4 initialized before Level3!"); + } + InitializationOrder = InitializationOrderTracker.RecordInitialization($"{nameof(DeepDependencyLevel4)}_{GetHashCode()}"); + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; +} + +// Abstract base class in deep chain +public abstract class DeepAbstractBase +{ + [ClassDataSource(Shared = SharedType.None)] + public required DeepDependencyLevel4 DeepDependency { get; init; } +} + +// Concrete test for 4-level deep dependency chain +[EngineTest(ExpectedResult.Pass)] +[NotInParallel] +public class DeepDependencyChainTest : DeepAbstractBase +{ + [Test] + public async Task FourLevelDeepChainShouldInitializeInCorrectOrder() + { + // Verify all levels are initialized + await Assert.That(DeepDependency.Level3.Level2.Level1.IsInitialized).IsTrue(); + await Assert.That(DeepDependency.Level3.Level2.IsInitialized).IsTrue(); + await Assert.That(DeepDependency.Level3.IsInitialized).IsTrue(); + await Assert.That(DeepDependency.IsInitialized).IsTrue(); + + // Verify initialization order: Level1 < Level2 < Level3 < Level4 + await Assert.That(DeepDependency.Level3.Level2.Level1.InitializationOrder) + .IsLessThan(DeepDependency.Level3.Level2.InitializationOrder); + + await Assert.That(DeepDependency.Level3.Level2.InitializationOrder) + .IsLessThan(DeepDependency.Level3.InitializationOrder); + + await Assert.That(DeepDependency.Level3.InitializationOrder) + .IsLessThan(DeepDependency.InitializationOrder); + } +} + +#endregion + +#region MethodDataSource with Property Injection Tests + +// A fixture that uses property injection and provides data via MethodDataSource +public class FixtureWithMethodDataSource : IAsyncInitializer, IAsyncDisposable +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required PulsarTestContainer Container { get; init; } + + public bool IsInitialized { get; private set; } + + public Task InitializeAsync() + { + if (!Container.IsInitialized) + { + throw new InvalidOperationException("FixtureWithMethodDataSource initialized before its Container!"); + } + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; + + // This method provides test data and requires the fixture to be initialized + public IEnumerable> GetTestData() + { + if (!IsInitialized) + { + throw new InvalidOperationException("GetTestData called before fixture was initialized!"); + } + yield return () => "TestValue1"; + yield return () => "TestValue2"; + } +} + +// Test that combines MethodDataSource with ClassDataSource property injection +[EngineTest(ExpectedResult.Pass)] +[NotInParallel] +public class MethodDataSourceWithPropertyInjectionTest +{ + [ClassDataSource(Shared = SharedType.PerClass)] + public required FixtureWithMethodDataSource Fixture { get; init; } + + public IEnumerable> TestData => Fixture.GetTestData(); + + [Test] + [MethodDataSource(nameof(TestData))] + public async Task TestWithMethodDataFromInjectedFixture(string testValue) + { + // If we reach here, the initialization order was correct + await Assert.That(Fixture.IsInitialized).IsTrue(); + await Assert.That(Fixture.Container.IsInitialized).IsTrue(); + await Assert.That(testValue).IsNotNullOrEmpty(); + } +} + +#endregion + +#region Multiple Abstract Base Classes with Different Sharing Modes + +// Shared per class container +public class PerClassContainer : IAsyncInitializer, IAsyncDisposable +{ + public bool IsInitialized { get; private set; } + public string InstanceId { get; } = Guid.NewGuid().ToString(); + + public Task InitializeAsync() + { + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; +} + +// Dependency that uses PerClass shared container +public class PerClassDependency : IAsyncInitializer, IAsyncDisposable +{ + [ClassDataSource(Shared = SharedType.PerClass)] + public required PerClassContainer Container { get; init; } + + public bool IsInitialized { get; private set; } + + public Task InitializeAsync() + { + if (!Container.IsInitialized) + { + throw new InvalidOperationException("PerClassDependency initialized before Container!"); + } + IsInitialized = true; + return Task.CompletedTask; + } + + public ValueTask DisposeAsync() => default; +} + +// First abstract base with PerClass dependency +public abstract class AbstractWithPerClassDependency +{ + [ClassDataSource(Shared = SharedType.None)] + public required PerClassDependency PerClassDep { get; init; } +} + +// Second abstract layer with additional PerTestSession dependency +public abstract class AbstractWithMixedSharing : AbstractWithPerClassDependency +{ + [ClassDataSource(Shared = SharedType.None)] + public required PulsarConnection SessionDep { get; init; } +} + +// Test for mixed sharing modes in abstract hierarchy +[EngineTest(ExpectedResult.Pass)] +[NotInParallel] +public class MixedSharingModesInAbstractHierarchyTest : AbstractWithMixedSharing +{ + [Test] + public async Task AllDependenciesShouldBeProperlyInitialized() + { + // Verify PerClass chain + await Assert.That(PerClassDep.IsInitialized).IsTrue(); + await Assert.That(PerClassDep.Container.IsInitialized).IsTrue(); + + // Verify PerTestSession chain + await Assert.That(SessionDep.IsInitialized).IsTrue(); + await Assert.That(SessionDep.Container.IsInitialized).IsTrue(); + } + + [Test] + public async Task ContainersWithSameSharingModeAndTypeShouldBeShared() + { + // Both PulsarConnection and WebAppFactory should share the same PulsarTestContainer + // because they both use SharedType.PerTestSession for PulsarTestContainer + await Assert.That(SessionDep.Container).IsNotNull(); + } } + +#endregion From 85a73f2d27d8d93e02b92054886ae9c158e5f6a0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 18:24:00 +0000 Subject: [PATCH 127/192] feat: add EngineTest attribute to ErrTest class for expected result validation --- TUnit.TestProject/Bugs/3951/Tests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/TUnit.TestProject/Bugs/3951/Tests.cs b/TUnit.TestProject/Bugs/3951/Tests.cs index d54909778d..7bcb4c6e14 100644 --- a/TUnit.TestProject/Bugs/3951/Tests.cs +++ b/TUnit.TestProject/Bugs/3951/Tests.cs @@ -25,6 +25,7 @@ public class ErrFixture : IAsyncDisposable, IAsyncInitializer public Task InitializeAsync() => Task.CompletedTask; } +[EngineTest(ExpectedResult.Pass)] public class ErrTest { [ClassDataSource>(Shared = SharedType.PerClass)] From 4c3a91630e267730c6b23e078830ede6a1c789c9 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 30 Nov 2025 19:04:49 +0000 Subject: [PATCH 128/192] chore(deps): update tunit to 1.3.15 (#3960) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index a81b92324e..22db5dc779 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index d4ccd6864c..c2de3439eb 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 128152fdf1..05c99383fc 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index ef9d916bc1..a57bab985e 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index a34180a833..3c5a2367c5 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index b6efdf9b19..ddd9fcfa9a 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index d582d1079e..cafacf59ae 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 9314066baa..87e25e1506 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index f8dff8bc55..d878f36905 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 7175a58e86e94af964dad0deed2ed3e321134533 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:34:14 +0000 Subject: [PATCH 129/192] chore: update benchmark results (#3948) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 10 +- docs/static/benchmarks/AsyncTests.json | 50 +-- docs/static/benchmarks/BuildTime.json | 40 +-- docs/static/benchmarks/DataDrivenTests.json | 50 +-- .../benchmarks/MassiveParallelTests.json | 50 +-- docs/static/benchmarks/MatrixTests.json | 50 +-- docs/static/benchmarks/ScaleTests.json | 50 +-- .../static/benchmarks/SetupTeardownTests.json | 42 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 310 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 392 insertions(+), 388 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 98eed244c2..8d876c21e4 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 567.1 ms | 566.4 ms | 2.57 ms | -| NUnit | 4.4.0 | 688.2 ms | 683.1 ms | 13.62 ms | -| MSTest | 4.0.2 | 658.5 ms | 659.6 ms | 10.71 ms | -| xUnit3 | 3.2.0 | 736.1 ms | 733.4 ms | 13.54 ms | -| **TUnit (AOT)** | 1.2.11 | 124.7 ms | 124.8 ms | 0.42 ms | +| **TUnit** | 1.3.15 | 562.8 ms | 562.1 ms | 2.60 ms | +| NUnit | 4.4.0 | 667.3 ms | 663.3 ms | 9.72 ms | +| MSTest | 4.0.2 | 644.2 ms | 641.4 ms | 10.82 ms | +| xUnit3 | 3.2.1 | 719.3 ms | 719.4 ms | 5.85 ms | +| **TUnit (AOT)** | 1.3.15 | 123.3 ms | 123.2 ms | 0.43 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 884 - bar [567.1, 688.2, 658.5, 736.1, 124.7] + y-axis "Time (ms)" 0 --> 864 + bar [562.8, 667.3, 644.2, 719.3, 123.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-12-01T00:33:55.391Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 0e293d83f3..e431f2ea14 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 2.043 s | 2.035 s | 0.0196 s | -| Build_NUnit | 4.4.0 | 1.639 s | 1.639 s | 0.0088 s | -| Build_MSTest | 4.0.2 | 1.715 s | 1.712 s | 0.0172 s | -| Build_xUnit3 | 3.2.0 | 1.616 s | 1.621 s | 0.0283 s | +| **TUnit** | 1.3.15 | 2.035 s | 2.027 s | 0.0205 s | +| Build_NUnit | 4.4.0 | 1.632 s | 1.634 s | 0.0150 s | +| Build_MSTest | 4.0.2 | 1.706 s | 1.702 s | 0.0135 s | +| Build_xUnit3 | 3.2.1 | 1.612 s | 1.620 s | 0.0242 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.043, 1.639, 1.715, 1.616] + bar [2.035, 1.632, 1.706, 1.612] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.447Z* +*Last generated: 2025-12-01T00:33:55.393Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 3c58c40c9d..330f59c036 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 497.25 ms | 497.97 ms | 3.518 ms | -| NUnit | 4.4.0 | 526.05 ms | 524.98 ms | 6.301 ms | -| MSTest | 4.0.2 | 482.94 ms | 483.13 ms | 10.339 ms | -| xUnit3 | 3.2.0 | 573.56 ms | 576.44 ms | 10.043 ms | -| **TUnit (AOT)** | 1.2.11 | 24.70 ms | 24.72 ms | 0.182 ms | +| **TUnit** | 1.3.15 | 497.56 ms | 495.65 ms | 4.023 ms | +| NUnit | 4.4.0 | 600.60 ms | 597.73 ms | 8.292 ms | +| MSTest | 4.0.2 | 613.66 ms | 612.85 ms | 7.629 ms | +| xUnit3 | 3.2.1 | 612.22 ms | 611.95 ms | 7.876 ms | +| **TUnit (AOT)** | 1.3.15 | 24.17 ms | 24.17 ms | 0.215 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 689 - bar [497.25, 526.05, 482.94, 573.56, 24.7] + y-axis "Time (ms)" 0 --> 737 + bar [497.56, 600.6, 613.66, 612.22, 24.17] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-12-01T00:33:55.392Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 9136b82712..18e039b65d 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 623.3 ms | 624.8 ms | 4.14 ms | -| NUnit | 4.4.0 | 1,212.4 ms | 1,210.2 ms | 9.48 ms | -| MSTest | 4.0.2 | 3,001.4 ms | 2,999.8 ms | 10.05 ms | -| xUnit3 | 3.2.0 | 3,086.1 ms | 3,086.8 ms | 7.57 ms | -| **TUnit (AOT)** | 1.2.11 | 132.7 ms | 132.6 ms | 0.54 ms | +| **TUnit** | 1.3.15 | 602.4 ms | 602.9 ms | 4.85 ms | +| NUnit | 4.4.0 | 1,171.6 ms | 1,168.4 ms | 8.72 ms | +| MSTest | 4.0.2 | 2,957.9 ms | 2,956.5 ms | 8.45 ms | +| xUnit3 | 3.2.1 | 3,061.8 ms | 3,060.8 ms | 6.37 ms | +| **TUnit (AOT)** | 1.3.15 | 132.1 ms | 132.1 ms | 0.36 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3704 - bar [623.3, 1212.4, 3001.4, 3086.1, 132.7] + y-axis "Time (ms)" 0 --> 3675 + bar [602.4, 1171.6, 2957.9, 3061.8, 132.1] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-12-01T00:33:55.392Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 7b17a6c761..6663245dbb 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 566.13 ms | 565.43 ms | 6.050 ms | -| NUnit | 4.4.0 | 1,578.62 ms | 1,578.58 ms | 6.773 ms | -| MSTest | 4.0.2 | 1,539.67 ms | 1,540.17 ms | 3.979 ms | -| xUnit3 | 3.2.0 | 1,625.28 ms | 1,624.99 ms | 11.364 ms | -| **TUnit (AOT)** | 1.2.11 | 79.52 ms | 79.55 ms | 0.341 ms | +| **TUnit** | 1.3.15 | 558.14 ms | 556.82 ms | 3.518 ms | +| NUnit | 4.4.0 | 1,566.32 ms | 1,567.91 ms | 8.685 ms | +| MSTest | 4.0.2 | 1,524.78 ms | 1,525.41 ms | 5.860 ms | +| xUnit3 | 3.2.1 | 1,608.89 ms | 1,610.14 ms | 4.768 ms | +| **TUnit (AOT)** | 1.3.15 | 78.93 ms | 79.01 ms | 0.342 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1951 - bar [566.13, 1578.62, 1539.67, 1625.28, 79.52] + y-axis "Time (ms)" 0 --> 1931 + bar [558.14, 1566.32, 1524.78, 1608.89, 78.93] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-12-01T00:33:55.392Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index c459176451..949c5e51be 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 522.37 ms | 521.16 ms | 5.026 ms | -| NUnit | 4.4.0 | 611.57 ms | 612.00 ms | 8.234 ms | -| MSTest | 4.0.2 | 615.51 ms | 617.04 ms | 9.675 ms | -| xUnit3 | 3.2.0 | 614.63 ms | 610.65 ms | 7.412 ms | -| **TUnit (AOT)** | 1.2.11 | 43.96 ms | 44.10 ms | 3.394 ms | +| **TUnit** | 1.3.15 | 522.58 ms | 522.80 ms | 3.917 ms | +| NUnit | 4.4.0 | 564.49 ms | 563.16 ms | 9.236 ms | +| MSTest | 4.0.2 | 485.17 ms | 484.63 ms | 9.099 ms | +| xUnit3 | 3.2.1 | 571.36 ms | 569.92 ms | 8.114 ms | +| **TUnit (AOT)** | 1.3.15 | 44.39 ms | 44.66 ms | 3.669 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 739 - bar [522.37, 611.57, 615.51, 614.63, 43.96] + y-axis "Time (ms)" 0 --> 686 + bar [522.58, 564.49, 485.17, 571.36, 44.39] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.446Z* +*Last generated: 2025-12-01T00:33:55.393Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 348cafc187..ce88f7612d 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-27** from the latest CI run. +This benchmark was automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.2.11 | 575.6 ms | 575.7 ms | 4.64 ms | -| NUnit | 4.4.0 | 1,194.3 ms | 1,195.1 ms | 6.50 ms | -| MSTest | 4.0.2 | 1,165.8 ms | 1,164.6 ms | 9.87 ms | -| xUnit3 | 3.2.0 | 1,258.5 ms | 1,258.8 ms | 7.83 ms | -| **TUnit (AOT)** | 1.2.11 | NA | NA | NA | +| **TUnit** | 1.3.15 | 564.1 ms | 564.9 ms | 4.29 ms | +| NUnit | 4.4.0 | 1,128.7 ms | 1,129.3 ms | 4.76 ms | +| MSTest | 4.0.2 | 1,102.2 ms | 1,102.6 ms | 11.14 ms | +| xUnit3 | 3.2.1 | 1,199.7 ms | 1,197.9 ms | 10.19 ms | +| **TUnit (AOT)** | 1.3.15 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-27** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1511 - bar [575.6, 1194.3, 1165.8, 1258.5, 0] + y-axis "Time (ms)" 0 --> 1440 + bar [564.1, 1128.7, 1102.2, 1199.7, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-27T00:28:35.447Z* +*Last generated: 2025-12-01T00:33:55.393Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 871d642265..8a40c7cba9 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-27** from the latest CI run. +These benchmarks were automatically generated on **2025-12-01** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,8 +37,8 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.2.11 | -| **xUnit v3** | 3.2.0 | +| **TUnit** | 1.3.15 | +| **xUnit v3** | 3.2.1 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -59,7 +59,7 @@ The benchmarks measure real-world testing patterns: - **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) -- **Tool**: BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat) +- **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat) ### Why These Numbers Matter @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-27T00:28:35.447Z* +*Last generated: 2025-12-01T00:33:55.394Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index d31c3d85de..95bcf3160f 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-12-01T00:33:55.392Z", "category": "AsyncTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "567.1 ms", - "Error": "3.08 ms", - "StdDev": "2.57 ms", - "Median": "566.4 ms" + "Version": "1.3.15", + "Mean": "562.8 ms", + "Error": "2.78 ms", + "StdDev": "2.60 ms", + "Median": "562.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "688.2 ms", - "Error": "13.26 ms", - "StdDev": "13.62 ms", - "Median": "683.1 ms" + "Mean": "667.3 ms", + "Error": "12.45 ms", + "StdDev": "9.72 ms", + "Median": "663.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "658.5 ms", - "Error": "12.82 ms", - "StdDev": "10.71 ms", - "Median": "659.6 ms" + "Mean": "644.2 ms", + "Error": "12.21 ms", + "StdDev": "10.82 ms", + "Median": "641.4 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "736.1 ms", - "Error": "14.47 ms", - "StdDev": "13.54 ms", - "Median": "733.4 ms" + "Version": "3.2.1", + "Mean": "719.3 ms", + "Error": "6.25 ms", + "StdDev": "5.85 ms", + "Median": "719.4 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "124.7 ms", - "Error": "0.45 ms", - "StdDev": "0.42 ms", - "Median": "124.8 ms" + "Version": "1.3.15", + "Mean": "123.3 ms", + "Error": "0.48 ms", + "StdDev": "0.43 ms", + "Median": "123.2 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index c71476e2e7..b5c50ad25b 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-27T00:28:35.447Z", + "timestamp": "2025-12-01T00:33:55.394Z", "category": "BuildTime", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "Build_TUnit", - "Version": "1.2.11", - "Mean": "2.043 s", - "Error": "0.0210 s", - "StdDev": "0.0196 s", - "Median": "2.035 s" + "Version": "1.3.15", + "Mean": "2.035 s", + "Error": "0.0231 s", + "StdDev": "0.0205 s", + "Median": "2.027 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.639 s", - "Error": "0.0094 s", - "StdDev": "0.0088 s", - "Median": "1.639 s" + "Mean": "1.632 s", + "Error": "0.0161 s", + "StdDev": "0.0150 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.715 s", - "Error": "0.0184 s", - "StdDev": "0.0172 s", - "Median": "1.712 s" + "Mean": "1.706 s", + "Error": "0.0144 s", + "StdDev": "0.0135 s", + "Median": "1.702 s" }, { "Method": "Build_xUnit3", - "Version": "3.2.0", - "Mean": "1.616 s", - "Error": "0.0302 s", - "StdDev": "0.0283 s", - "Median": "1.621 s" + "Version": "3.2.1", + "Mean": "1.612 s", + "Error": "0.0273 s", + "StdDev": "0.0242 s", + "Median": "1.620 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index cf5ab9e10b..10494f0562 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-12-01T00:33:55.392Z", "category": "DataDrivenTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "497.25 ms", - "Error": "4.213 ms", - "StdDev": "3.518 ms", - "Median": "497.97 ms" + "Version": "1.3.15", + "Mean": "497.56 ms", + "Error": "4.301 ms", + "StdDev": "4.023 ms", + "Median": "495.65 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "526.05 ms", - "Error": "7.107 ms", - "StdDev": "6.301 ms", - "Median": "524.98 ms" + "Mean": "600.60 ms", + "Error": "9.354 ms", + "StdDev": "8.292 ms", + "Median": "597.73 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "482.94 ms", - "Error": "9.302 ms", - "StdDev": "10.339 ms", - "Median": "483.13 ms" + "Mean": "613.66 ms", + "Error": "8.606 ms", + "StdDev": "7.629 ms", + "Median": "612.85 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "573.56 ms", - "Error": "10.737 ms", - "StdDev": "10.043 ms", - "Median": "576.44 ms" + "Version": "3.2.1", + "Mean": "612.22 ms", + "Error": "8.885 ms", + "StdDev": "7.876 ms", + "Median": "611.95 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "24.70 ms", - "Error": "0.194 ms", - "StdDev": "0.182 ms", - "Median": "24.72 ms" + "Version": "1.3.15", + "Mean": "24.17 ms", + "Error": "0.230 ms", + "StdDev": "0.215 ms", + "Median": "24.17 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 3bbbbc8549..3ddbdad325 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-12-01T00:33:55.392Z", "category": "MassiveParallelTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "623.3 ms", - "Error": "4.42 ms", - "StdDev": "4.14 ms", - "Median": "624.8 ms" + "Version": "1.3.15", + "Mean": "602.4 ms", + "Error": "5.47 ms", + "StdDev": "4.85 ms", + "Median": "602.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,212.4 ms", - "Error": "10.13 ms", - "StdDev": "9.48 ms", - "Median": "1,210.2 ms" + "Mean": "1,171.6 ms", + "Error": "9.33 ms", + "StdDev": "8.72 ms", + "Median": "1,168.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,001.4 ms", - "Error": "12.87 ms", - "StdDev": "10.05 ms", - "Median": "2,999.8 ms" + "Mean": "2,957.9 ms", + "Error": "10.12 ms", + "StdDev": "8.45 ms", + "Median": "2,956.5 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "3,086.1 ms", - "Error": "9.06 ms", - "StdDev": "7.57 ms", - "Median": "3,086.8 ms" + "Version": "3.2.1", + "Mean": "3,061.8 ms", + "Error": "7.18 ms", + "StdDev": "6.37 ms", + "Median": "3,060.8 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "132.7 ms", - "Error": "0.58 ms", - "StdDev": "0.54 ms", - "Median": "132.6 ms" + "Version": "1.3.15", + "Mean": "132.1 ms", + "Error": "0.41 ms", + "StdDev": "0.36 ms", + "Median": "132.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 8d10cf0aa4..979d105c56 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-12-01T00:33:55.393Z", "category": "MatrixTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "566.13 ms", - "Error": "6.468 ms", - "StdDev": "6.050 ms", - "Median": "565.43 ms" + "Version": "1.3.15", + "Mean": "558.14 ms", + "Error": "3.968 ms", + "StdDev": "3.518 ms", + "Median": "556.82 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,578.62 ms", - "Error": "7.240 ms", - "StdDev": "6.773 ms", - "Median": "1,578.58 ms" + "Mean": "1,566.32 ms", + "Error": "9.797 ms", + "StdDev": "8.685 ms", + "Median": "1,567.91 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,539.67 ms", - "Error": "4.489 ms", - "StdDev": "3.979 ms", - "Median": "1,540.17 ms" + "Mean": "1,524.78 ms", + "Error": "6.264 ms", + "StdDev": "5.860 ms", + "Median": "1,525.41 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,625.28 ms", - "Error": "13.608 ms", - "StdDev": "11.364 ms", - "Median": "1,624.99 ms" + "Version": "3.2.1", + "Mean": "1,608.89 ms", + "Error": "5.097 ms", + "StdDev": "4.768 ms", + "Median": "1,610.14 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "79.52 ms", - "Error": "0.365 ms", - "StdDev": "0.341 ms", - "Median": "79.55 ms" + "Version": "1.3.15", + "Mean": "78.93 ms", + "Error": "0.409 ms", + "StdDev": "0.342 ms", + "Median": "79.01 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 7cd77e77f9..bf644123f9 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-27T00:28:35.446Z", + "timestamp": "2025-12-01T00:33:55.393Z", "category": "ScaleTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "522.37 ms", - "Error": "5.373 ms", - "StdDev": "5.026 ms", - "Median": "521.16 ms" + "Version": "1.3.15", + "Mean": "522.58 ms", + "Error": "4.419 ms", + "StdDev": "3.917 ms", + "Median": "522.80 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "611.57 ms", - "Error": "9.860 ms", - "StdDev": "8.234 ms", - "Median": "612.00 ms" + "Mean": "564.49 ms", + "Error": "9.874 ms", + "StdDev": "9.236 ms", + "Median": "563.16 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.51 ms", - "Error": "10.914 ms", - "StdDev": "9.675 ms", - "Median": "617.04 ms" + "Mean": "485.17 ms", + "Error": "9.265 ms", + "StdDev": "9.099 ms", + "Median": "484.63 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "614.63 ms", - "Error": "8.361 ms", - "StdDev": "7.412 ms", - "Median": "610.65 ms" + "Version": "3.2.1", + "Mean": "571.36 ms", + "Error": "8.675 ms", + "StdDev": "8.114 ms", + "Median": "569.92 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "43.96 ms", - "Error": "1.151 ms", - "StdDev": "3.394 ms", - "Median": "44.10 ms" + "Version": "1.3.15", + "Mean": "44.39 ms", + "Error": "1.244 ms", + "StdDev": "3.669 ms", + "Median": "44.66 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index d3f8eaa939..f61be46009 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,47 +1,47 @@ { - "timestamp": "2025-11-27T00:28:35.447Z", + "timestamp": "2025-12-01T00:33:55.393Z", "category": "SetupTeardownTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "575.6 ms", - "Error": "4.96 ms", - "StdDev": "4.64 ms", - "Median": "575.7 ms" + "Version": "1.3.15", + "Mean": "564.1 ms", + "Error": "4.84 ms", + "StdDev": "4.29 ms", + "Median": "564.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,194.3 ms", - "Error": "7.33 ms", - "StdDev": "6.50 ms", - "Median": "1,195.1 ms" + "Mean": "1,128.7 ms", + "Error": "5.37 ms", + "StdDev": "4.76 ms", + "Median": "1,129.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,165.8 ms", - "Error": "10.55 ms", - "StdDev": "9.87 ms", - "Median": "1,164.6 ms" + "Mean": "1,102.2 ms", + "Error": "11.91 ms", + "StdDev": "11.14 ms", + "Median": "1,102.6 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,258.5 ms", - "Error": "8.37 ms", - "StdDev": "7.83 ms", - "Median": "1,258.8 ms" + "Version": "3.2.1", + "Mean": "1,199.7 ms", + "Error": "11.50 ms", + "StdDev": "10.19 ms", + "Median": "1,197.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", + "Version": "1.3.15", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 943a897347..439801ceff 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -82,5 +82,9 @@ { "date": "2025-11-27", "environment": "Ubuntu" + }, + { + "date": "2025-12-01", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 45e79f39d6..9b3f4a984f 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,7 +1,7 @@ { - "timestamp": "2025-11-27T00:28:35.447Z", + "timestamp": "2025-12-01T00:33:55.394Z", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "567.1 ms", - "Error": "3.08 ms", - "StdDev": "2.57 ms", - "Median": "566.4 ms" + "Version": "1.3.15", + "Mean": "562.8 ms", + "Error": "2.78 ms", + "StdDev": "2.60 ms", + "Median": "562.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "688.2 ms", - "Error": "13.26 ms", - "StdDev": "13.62 ms", - "Median": "683.1 ms" + "Mean": "667.3 ms", + "Error": "12.45 ms", + "StdDev": "9.72 ms", + "Median": "663.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "658.5 ms", - "Error": "12.82 ms", - "StdDev": "10.71 ms", - "Median": "659.6 ms" + "Mean": "644.2 ms", + "Error": "12.21 ms", + "StdDev": "10.82 ms", + "Median": "641.4 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "736.1 ms", - "Error": "14.47 ms", - "StdDev": "13.54 ms", - "Median": "733.4 ms" + "Version": "3.2.1", + "Mean": "719.3 ms", + "Error": "6.25 ms", + "StdDev": "5.85 ms", + "Median": "719.4 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "124.7 ms", - "Error": "0.45 ms", - "StdDev": "0.42 ms", - "Median": "124.8 ms" + "Version": "1.3.15", + "Mean": "123.3 ms", + "Error": "0.48 ms", + "StdDev": "0.43 ms", + "Median": "123.2 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "497.25 ms", - "Error": "4.213 ms", - "StdDev": "3.518 ms", - "Median": "497.97 ms" + "Version": "1.3.15", + "Mean": "497.56 ms", + "Error": "4.301 ms", + "StdDev": "4.023 ms", + "Median": "495.65 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "526.05 ms", - "Error": "7.107 ms", - "StdDev": "6.301 ms", - "Median": "524.98 ms" + "Mean": "600.60 ms", + "Error": "9.354 ms", + "StdDev": "8.292 ms", + "Median": "597.73 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "482.94 ms", - "Error": "9.302 ms", - "StdDev": "10.339 ms", - "Median": "483.13 ms" + "Mean": "613.66 ms", + "Error": "8.606 ms", + "StdDev": "7.629 ms", + "Median": "612.85 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "573.56 ms", - "Error": "10.737 ms", - "StdDev": "10.043 ms", - "Median": "576.44 ms" + "Version": "3.2.1", + "Mean": "612.22 ms", + "Error": "8.885 ms", + "StdDev": "7.876 ms", + "Median": "611.95 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "24.70 ms", - "Error": "0.194 ms", - "StdDev": "0.182 ms", - "Median": "24.72 ms" + "Version": "1.3.15", + "Mean": "24.17 ms", + "Error": "0.230 ms", + "StdDev": "0.215 ms", + "Median": "24.17 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "623.3 ms", - "Error": "4.42 ms", - "StdDev": "4.14 ms", - "Median": "624.8 ms" + "Version": "1.3.15", + "Mean": "602.4 ms", + "Error": "5.47 ms", + "StdDev": "4.85 ms", + "Median": "602.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,212.4 ms", - "Error": "10.13 ms", - "StdDev": "9.48 ms", - "Median": "1,210.2 ms" + "Mean": "1,171.6 ms", + "Error": "9.33 ms", + "StdDev": "8.72 ms", + "Median": "1,168.4 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,001.4 ms", - "Error": "12.87 ms", - "StdDev": "10.05 ms", - "Median": "2,999.8 ms" + "Mean": "2,957.9 ms", + "Error": "10.12 ms", + "StdDev": "8.45 ms", + "Median": "2,956.5 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "3,086.1 ms", - "Error": "9.06 ms", - "StdDev": "7.57 ms", - "Median": "3,086.8 ms" + "Version": "3.2.1", + "Mean": "3,061.8 ms", + "Error": "7.18 ms", + "StdDev": "6.37 ms", + "Median": "3,060.8 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "132.7 ms", - "Error": "0.58 ms", - "StdDev": "0.54 ms", - "Median": "132.6 ms" + "Version": "1.3.15", + "Mean": "132.1 ms", + "Error": "0.41 ms", + "StdDev": "0.36 ms", + "Median": "132.1 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "566.13 ms", - "Error": "6.468 ms", - "StdDev": "6.050 ms", - "Median": "565.43 ms" + "Version": "1.3.15", + "Mean": "558.14 ms", + "Error": "3.968 ms", + "StdDev": "3.518 ms", + "Median": "556.82 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,578.62 ms", - "Error": "7.240 ms", - "StdDev": "6.773 ms", - "Median": "1,578.58 ms" + "Mean": "1,566.32 ms", + "Error": "9.797 ms", + "StdDev": "8.685 ms", + "Median": "1,567.91 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,539.67 ms", - "Error": "4.489 ms", - "StdDev": "3.979 ms", - "Median": "1,540.17 ms" + "Mean": "1,524.78 ms", + "Error": "6.264 ms", + "StdDev": "5.860 ms", + "Median": "1,525.41 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,625.28 ms", - "Error": "13.608 ms", - "StdDev": "11.364 ms", - "Median": "1,624.99 ms" + "Version": "3.2.1", + "Mean": "1,608.89 ms", + "Error": "5.097 ms", + "StdDev": "4.768 ms", + "Median": "1,610.14 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "79.52 ms", - "Error": "0.365 ms", - "StdDev": "0.341 ms", - "Median": "79.55 ms" + "Version": "1.3.15", + "Mean": "78.93 ms", + "Error": "0.409 ms", + "StdDev": "0.342 ms", + "Median": "79.01 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "522.37 ms", - "Error": "5.373 ms", - "StdDev": "5.026 ms", - "Median": "521.16 ms" + "Version": "1.3.15", + "Mean": "522.58 ms", + "Error": "4.419 ms", + "StdDev": "3.917 ms", + "Median": "522.80 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "611.57 ms", - "Error": "9.860 ms", - "StdDev": "8.234 ms", - "Median": "612.00 ms" + "Mean": "564.49 ms", + "Error": "9.874 ms", + "StdDev": "9.236 ms", + "Median": "563.16 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.51 ms", - "Error": "10.914 ms", - "StdDev": "9.675 ms", - "Median": "617.04 ms" + "Mean": "485.17 ms", + "Error": "9.265 ms", + "StdDev": "9.099 ms", + "Median": "484.63 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "614.63 ms", - "Error": "8.361 ms", - "StdDev": "7.412 ms", - "Median": "610.65 ms" + "Version": "3.2.1", + "Mean": "571.36 ms", + "Error": "8.675 ms", + "StdDev": "8.114 ms", + "Median": "569.92 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", - "Mean": "43.96 ms", - "Error": "1.151 ms", - "StdDev": "3.394 ms", - "Median": "44.10 ms" + "Version": "1.3.15", + "Mean": "44.39 ms", + "Error": "1.244 ms", + "StdDev": "3.669 ms", + "Median": "44.66 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.2.11", - "Mean": "575.6 ms", - "Error": "4.96 ms", - "StdDev": "4.64 ms", - "Median": "575.7 ms" + "Version": "1.3.15", + "Mean": "564.1 ms", + "Error": "4.84 ms", + "StdDev": "4.29 ms", + "Median": "564.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,194.3 ms", - "Error": "7.33 ms", - "StdDev": "6.50 ms", - "Median": "1,195.1 ms" + "Mean": "1,128.7 ms", + "Error": "5.37 ms", + "StdDev": "4.76 ms", + "Median": "1,129.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,165.8 ms", - "Error": "10.55 ms", - "StdDev": "9.87 ms", - "Median": "1,164.6 ms" + "Mean": "1,102.2 ms", + "Error": "11.91 ms", + "StdDev": "11.14 ms", + "Median": "1,102.6 ms" }, { "Method": "xUnit3", - "Version": "3.2.0", - "Mean": "1,258.5 ms", - "Error": "8.37 ms", - "StdDev": "7.83 ms", - "Median": "1,258.8 ms" + "Version": "3.2.1", + "Mean": "1,199.7 ms", + "Error": "11.50 ms", + "StdDev": "10.19 ms", + "Median": "1,197.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.2.11", + "Version": "1.3.15", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.2.11", - "Mean": "2.043 s", - "Error": "0.0210 s", - "StdDev": "0.0196 s", - "Median": "2.035 s" + "Version": "1.3.15", + "Mean": "2.035 s", + "Error": "0.0231 s", + "StdDev": "0.0205 s", + "Median": "2.027 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.639 s", - "Error": "0.0094 s", - "StdDev": "0.0088 s", - "Median": "1.639 s" + "Mean": "1.632 s", + "Error": "0.0161 s", + "StdDev": "0.0150 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.715 s", - "Error": "0.0184 s", - "StdDev": "0.0172 s", - "Median": "1.712 s" + "Mean": "1.706 s", + "Error": "0.0144 s", + "StdDev": "0.0135 s", + "Median": "1.702 s" }, { "Method": "Build_xUnit3", - "Version": "3.2.0", - "Mean": "1.616 s", - "Error": "0.0302 s", - "StdDev": "0.0283 s", - "Median": "1.621 s" + "Version": "3.2.1", + "Mean": "1.612 s", + "Error": "0.0273 s", + "StdDev": "0.0242 s", + "Median": "1.620 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-27T00:28:35.445Z" + "lastUpdated": "2025-12-01T00:33:55.391Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index ff4e003094..f7a8c9b934 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-27", + "timestamp": "2025-12-01", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From c2e81d129408d30fc36fb254665d8bf3386e59d2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 2 Dec 2025 00:29:04 +0000 Subject: [PATCH 130/192] chore: update benchmark results (#3962) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 44 +-- .../benchmarks/MassiveParallelTests.json | 44 +-- docs/static/benchmarks/MatrixTests.json | 44 +-- docs/static/benchmarks/ScaleTests.json | 44 +-- .../static/benchmarks/SetupTeardownTests.json | 36 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 270 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 349 insertions(+), 345 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 8d876c21e4..c670f47a84 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 562.8 ms | 562.1 ms | 2.60 ms | -| NUnit | 4.4.0 | 667.3 ms | 663.3 ms | 9.72 ms | -| MSTest | 4.0.2 | 644.2 ms | 641.4 ms | 10.82 ms | -| xUnit3 | 3.2.1 | 719.3 ms | 719.4 ms | 5.85 ms | -| **TUnit (AOT)** | 1.3.15 | 123.3 ms | 123.2 ms | 0.43 ms | +| **TUnit** | 1.3.15 | 568.0 ms | 568.1 ms | 3.51 ms | +| NUnit | 4.4.0 | 654.9 ms | 653.8 ms | 6.68 ms | +| MSTest | 4.0.2 | 624.1 ms | 624.1 ms | 8.38 ms | +| xUnit3 | 3.2.1 | 710.1 ms | 708.2 ms | 8.76 ms | +| **TUnit (AOT)** | 1.3.15 | 124.3 ms | 124.3 ms | 0.48 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 864 - bar [562.8, 667.3, 644.2, 719.3, 123.3] + y-axis "Time (ms)" 0 --> 853 + bar [568, 654.9, 624.1, 710.1, 124.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.391Z* +*Last generated: 2025-12-02T00:28:45.129Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index e431f2ea14..7d34a916ae 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 2.035 s | 2.027 s | 0.0205 s | -| Build_NUnit | 4.4.0 | 1.632 s | 1.634 s | 0.0150 s | -| Build_MSTest | 4.0.2 | 1.706 s | 1.702 s | 0.0135 s | -| Build_xUnit3 | 3.2.1 | 1.612 s | 1.620 s | 0.0242 s | +| **TUnit** | 1.3.15 | 1.999 s | 1.999 s | 0.0190 s | +| Build_NUnit | 4.4.0 | 1.606 s | 1.607 s | 0.0103 s | +| Build_MSTest | 4.0.2 | 1.694 s | 1.689 s | 0.0225 s | +| Build_xUnit3 | 3.2.1 | 1.592 s | 1.584 s | 0.0184 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.035, 1.632, 1.706, 1.612] + bar [1.999, 1.606, 1.694, 1.592] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.393Z* +*Last generated: 2025-12-02T00:28:45.131Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 330f59c036..367d55db0a 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 497.56 ms | 495.65 ms | 4.023 ms | -| NUnit | 4.4.0 | 600.60 ms | 597.73 ms | 8.292 ms | -| MSTest | 4.0.2 | 613.66 ms | 612.85 ms | 7.629 ms | -| xUnit3 | 3.2.1 | 612.22 ms | 611.95 ms | 7.876 ms | -| **TUnit (AOT)** | 1.3.15 | 24.17 ms | 24.17 ms | 0.215 ms | +| **TUnit** | 1.3.15 | 491.60 ms | 492.41 ms | 2.897 ms | +| NUnit | 4.4.0 | 541.30 ms | 538.13 ms | 15.457 ms | +| MSTest | 4.0.2 | 554.63 ms | 552.54 ms | 13.552 ms | +| xUnit3 | 3.2.1 | 572.96 ms | 574.24 ms | 5.472 ms | +| **TUnit (AOT)** | 1.3.15 | 23.67 ms | 23.66 ms | 0.106 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 737 - bar [497.56, 600.6, 613.66, 612.22, 24.17] + y-axis "Time (ms)" 0 --> 688 + bar [491.6, 541.3, 554.63, 572.96, 23.67] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.392Z* +*Last generated: 2025-12-02T00:28:45.129Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 18e039b65d..4f70f8ed07 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 602.4 ms | 602.9 ms | 4.85 ms | -| NUnit | 4.4.0 | 1,171.6 ms | 1,168.4 ms | 8.72 ms | -| MSTest | 4.0.2 | 2,957.9 ms | 2,956.5 ms | 8.45 ms | -| xUnit3 | 3.2.1 | 3,061.8 ms | 3,060.8 ms | 6.37 ms | -| **TUnit (AOT)** | 1.3.15 | 132.1 ms | 132.1 ms | 0.36 ms | +| **TUnit** | 1.3.15 | 587.9 ms | 589.4 ms | 5.01 ms | +| NUnit | 4.4.0 | 1,168.8 ms | 1,167.3 ms | 6.86 ms | +| MSTest | 4.0.2 | 2,971.3 ms | 2,971.7 ms | 6.73 ms | +| xUnit3 | 3.2.1 | 3,048.3 ms | 3,048.0 ms | 10.03 ms | +| **TUnit (AOT)** | 1.3.15 | 130.7 ms | 130.7 ms | 0.33 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3675 - bar [602.4, 1171.6, 2957.9, 3061.8, 132.1] + y-axis "Time (ms)" 0 --> 3658 + bar [587.9, 1168.8, 2971.3, 3048.3, 130.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.392Z* +*Last generated: 2025-12-02T00:28:45.130Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 6663245dbb..bd52fe6146 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 558.14 ms | 556.82 ms | 3.518 ms | -| NUnit | 4.4.0 | 1,566.32 ms | 1,567.91 ms | 8.685 ms | -| MSTest | 4.0.2 | 1,524.78 ms | 1,525.41 ms | 5.860 ms | -| xUnit3 | 3.2.1 | 1,608.89 ms | 1,610.14 ms | 4.768 ms | -| **TUnit (AOT)** | 1.3.15 | 78.93 ms | 79.01 ms | 0.342 ms | +| **TUnit** | 1.3.15 | 555.85 ms | 555.18 ms | 5.260 ms | +| NUnit | 4.4.0 | 1,553.46 ms | 1,553.90 ms | 8.260 ms | +| MSTest | 4.0.2 | 1,510.07 ms | 1,506.54 ms | 15.365 ms | +| xUnit3 | 3.2.1 | 1,587.52 ms | 1,587.59 ms | 5.669 ms | +| **TUnit (AOT)** | 1.3.15 | 78.81 ms | 78.78 ms | 0.529 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1931 - bar [558.14, 1566.32, 1524.78, 1608.89, 78.93] + y-axis "Time (ms)" 0 --> 1906 + bar [555.85, 1553.46, 1510.07, 1587.52, 78.81] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.392Z* +*Last generated: 2025-12-02T00:28:45.130Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 949c5e51be..c103abcaf8 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 522.58 ms | 522.80 ms | 3.917 ms | -| NUnit | 4.4.0 | 564.49 ms | 563.16 ms | 9.236 ms | -| MSTest | 4.0.2 | 485.17 ms | 484.63 ms | 9.099 ms | -| xUnit3 | 3.2.1 | 571.36 ms | 569.92 ms | 8.114 ms | -| **TUnit (AOT)** | 1.3.15 | 44.39 ms | 44.66 ms | 3.669 ms | +| **TUnit** | 1.3.15 | 536.51 ms | 535.70 ms | 5.013 ms | +| NUnit | 4.4.0 | 612.30 ms | 612.71 ms | 8.103 ms | +| MSTest | 4.0.2 | 622.86 ms | 622.97 ms | 8.334 ms | +| xUnit3 | 3.2.1 | 616.30 ms | 613.27 ms | 10.027 ms | +| **TUnit (AOT)** | 1.3.15 | 45.29 ms | 45.38 ms | 3.410 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 686 - bar [522.58, 564.49, 485.17, 571.36, 44.39] + y-axis "Time (ms)" 0 --> 748 + bar [536.51, 612.3, 622.86, 616.3, 45.29] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.393Z* +*Last generated: 2025-12-02T00:28:45.130Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index ce88f7612d..c7eb702d5f 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-01** from the latest CI run. +This benchmark was automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 564.1 ms | 564.9 ms | 4.29 ms | -| NUnit | 4.4.0 | 1,128.7 ms | 1,129.3 ms | 4.76 ms | -| MSTest | 4.0.2 | 1,102.2 ms | 1,102.6 ms | 11.14 ms | -| xUnit3 | 3.2.1 | 1,199.7 ms | 1,197.9 ms | 10.19 ms | +| **TUnit** | 1.3.15 | 540.5 ms | 539.7 ms | 6.96 ms | +| NUnit | 4.4.0 | 1,135.1 ms | 1,135.3 ms | 11.91 ms | +| MSTest | 4.0.2 | 1,115.8 ms | 1,115.4 ms | 5.03 ms | +| xUnit3 | 3.2.1 | 1,190.2 ms | 1,189.8 ms | 11.12 ms | | **TUnit (AOT)** | 1.3.15 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-01** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1440 - bar [564.1, 1128.7, 1102.2, 1199.7, 0] + y-axis "Time (ms)" 0 --> 1429 + bar [540.5, 1135.1, 1115.8, 1190.2, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-01T00:33:55.393Z* +*Last generated: 2025-12-02T00:28:45.131Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 8a40c7cba9..4f7eb20422 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-01** from the latest CI run. +These benchmarks were automatically generated on **2025-12-02** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -56,7 +56,7 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-01T00:33:55.394Z* +*Last generated: 2025-12-02T00:28:45.131Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 95bcf3160f..35849a60c2 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-01T00:33:55.392Z", + "timestamp": "2025-12-02T00:28:45.129Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "562.8 ms", - "Error": "2.78 ms", - "StdDev": "2.60 ms", - "Median": "562.1 ms" + "Mean": "568.0 ms", + "Error": "4.21 ms", + "StdDev": "3.51 ms", + "Median": "568.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "667.3 ms", - "Error": "12.45 ms", - "StdDev": "9.72 ms", - "Median": "663.3 ms" + "Mean": "654.9 ms", + "Error": "7.54 ms", + "StdDev": "6.68 ms", + "Median": "653.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "644.2 ms", - "Error": "12.21 ms", - "StdDev": "10.82 ms", - "Median": "641.4 ms" + "Mean": "624.1 ms", + "Error": "8.96 ms", + "StdDev": "8.38 ms", + "Median": "624.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "719.3 ms", - "Error": "6.25 ms", - "StdDev": "5.85 ms", - "Median": "719.4 ms" + "Mean": "710.1 ms", + "Error": "9.37 ms", + "StdDev": "8.76 ms", + "Median": "708.2 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "123.3 ms", - "Error": "0.48 ms", - "StdDev": "0.43 ms", - "Median": "123.2 ms" + "Mean": "124.3 ms", + "Error": "0.54 ms", + "StdDev": "0.48 ms", + "Median": "124.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index b5c50ad25b..f65fff65bd 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-12-01T00:33:55.394Z", + "timestamp": "2025-12-02T00:28:45.131Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "Build_TUnit", "Version": "1.3.15", - "Mean": "2.035 s", - "Error": "0.0231 s", - "StdDev": "0.0205 s", - "Median": "2.027 s" + "Mean": "1.999 s", + "Error": "0.0203 s", + "StdDev": "0.0190 s", + "Median": "1.999 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.632 s", - "Error": "0.0161 s", - "StdDev": "0.0150 s", - "Median": "1.634 s" + "Mean": "1.606 s", + "Error": "0.0117 s", + "StdDev": "0.0103 s", + "Median": "1.607 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.706 s", - "Error": "0.0144 s", - "StdDev": "0.0135 s", - "Median": "1.702 s" + "Mean": "1.694 s", + "Error": "0.0241 s", + "StdDev": "0.0225 s", + "Median": "1.689 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.612 s", - "Error": "0.0273 s", - "StdDev": "0.0242 s", - "Median": "1.620 s" + "Mean": "1.592 s", + "Error": "0.0196 s", + "StdDev": "0.0184 s", + "Median": "1.584 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 10494f0562..6a864131f3 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-01T00:33:55.392Z", + "timestamp": "2025-12-02T00:28:45.130Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "497.56 ms", - "Error": "4.301 ms", - "StdDev": "4.023 ms", - "Median": "495.65 ms" + "Mean": "491.60 ms", + "Error": "3.097 ms", + "StdDev": "2.897 ms", + "Median": "492.41 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "600.60 ms", - "Error": "9.354 ms", - "StdDev": "8.292 ms", - "Median": "597.73 ms" + "Mean": "541.30 ms", + "Error": "9.572 ms", + "StdDev": "15.457 ms", + "Median": "538.13 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "613.66 ms", - "Error": "8.606 ms", - "StdDev": "7.629 ms", - "Median": "612.85 ms" + "Mean": "554.63 ms", + "Error": "11.035 ms", + "StdDev": "13.552 ms", + "Median": "552.54 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "612.22 ms", - "Error": "8.885 ms", - "StdDev": "7.876 ms", - "Median": "611.95 ms" + "Mean": "572.96 ms", + "Error": "5.850 ms", + "StdDev": "5.472 ms", + "Median": "574.24 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "24.17 ms", - "Error": "0.230 ms", - "StdDev": "0.215 ms", - "Median": "24.17 ms" + "Mean": "23.67 ms", + "Error": "0.127 ms", + "StdDev": "0.106 ms", + "Median": "23.66 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 3ddbdad325..0af62f3ed2 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-01T00:33:55.392Z", + "timestamp": "2025-12-02T00:28:45.130Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "602.4 ms", - "Error": "5.47 ms", - "StdDev": "4.85 ms", - "Median": "602.9 ms" + "Mean": "587.9 ms", + "Error": "5.36 ms", + "StdDev": "5.01 ms", + "Median": "589.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,171.6 ms", - "Error": "9.33 ms", - "StdDev": "8.72 ms", - "Median": "1,168.4 ms" + "Mean": "1,168.8 ms", + "Error": "7.74 ms", + "StdDev": "6.86 ms", + "Median": "1,167.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,957.9 ms", - "Error": "10.12 ms", - "StdDev": "8.45 ms", - "Median": "2,956.5 ms" + "Mean": "2,971.3 ms", + "Error": "7.59 ms", + "StdDev": "6.73 ms", + "Median": "2,971.7 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,061.8 ms", - "Error": "7.18 ms", - "StdDev": "6.37 ms", - "Median": "3,060.8 ms" + "Mean": "3,048.3 ms", + "Error": "10.72 ms", + "StdDev": "10.03 ms", + "Median": "3,048.0 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "132.1 ms", - "Error": "0.41 ms", - "StdDev": "0.36 ms", - "Median": "132.1 ms" + "Mean": "130.7 ms", + "Error": "0.37 ms", + "StdDev": "0.33 ms", + "Median": "130.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 979d105c56..1b36919455 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-01T00:33:55.393Z", + "timestamp": "2025-12-02T00:28:45.130Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "558.14 ms", - "Error": "3.968 ms", - "StdDev": "3.518 ms", - "Median": "556.82 ms" + "Mean": "555.85 ms", + "Error": "5.623 ms", + "StdDev": "5.260 ms", + "Median": "555.18 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,566.32 ms", - "Error": "9.797 ms", - "StdDev": "8.685 ms", - "Median": "1,567.91 ms" + "Mean": "1,553.46 ms", + "Error": "8.830 ms", + "StdDev": "8.260 ms", + "Median": "1,553.90 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,524.78 ms", - "Error": "6.264 ms", - "StdDev": "5.860 ms", - "Median": "1,525.41 ms" + "Mean": "1,510.07 ms", + "Error": "17.333 ms", + "StdDev": "15.365 ms", + "Median": "1,506.54 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,608.89 ms", - "Error": "5.097 ms", - "StdDev": "4.768 ms", - "Median": "1,610.14 ms" + "Mean": "1,587.52 ms", + "Error": "6.395 ms", + "StdDev": "5.669 ms", + "Median": "1,587.59 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "78.93 ms", - "Error": "0.409 ms", - "StdDev": "0.342 ms", - "Median": "79.01 ms" + "Mean": "78.81 ms", + "Error": "0.566 ms", + "StdDev": "0.529 ms", + "Median": "78.78 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index bf644123f9..27af45c11b 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-01T00:33:55.393Z", + "timestamp": "2025-12-02T00:28:45.130Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "522.58 ms", - "Error": "4.419 ms", - "StdDev": "3.917 ms", - "Median": "522.80 ms" + "Mean": "536.51 ms", + "Error": "5.359 ms", + "StdDev": "5.013 ms", + "Median": "535.70 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "564.49 ms", - "Error": "9.874 ms", - "StdDev": "9.236 ms", - "Median": "563.16 ms" + "Mean": "612.30 ms", + "Error": "9.140 ms", + "StdDev": "8.103 ms", + "Median": "612.71 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "485.17 ms", - "Error": "9.265 ms", - "StdDev": "9.099 ms", - "Median": "484.63 ms" + "Mean": "622.86 ms", + "Error": "9.402 ms", + "StdDev": "8.334 ms", + "Median": "622.97 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "571.36 ms", - "Error": "8.675 ms", - "StdDev": "8.114 ms", - "Median": "569.92 ms" + "Mean": "616.30 ms", + "Error": "12.008 ms", + "StdDev": "10.027 ms", + "Median": "613.27 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "44.39 ms", - "Error": "1.244 ms", - "StdDev": "3.669 ms", - "Median": "44.66 ms" + "Mean": "45.29 ms", + "Error": "1.163 ms", + "StdDev": "3.410 ms", + "Median": "45.38 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index f61be46009..db26edac93 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-12-01T00:33:55.393Z", + "timestamp": "2025-12-02T00:28:45.131Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "564.1 ms", - "Error": "4.84 ms", - "StdDev": "4.29 ms", - "Median": "564.9 ms" + "Mean": "540.5 ms", + "Error": "7.44 ms", + "StdDev": "6.96 ms", + "Median": "539.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,128.7 ms", - "Error": "5.37 ms", - "StdDev": "4.76 ms", - "Median": "1,129.3 ms" + "Mean": "1,135.1 ms", + "Error": "12.73 ms", + "StdDev": "11.91 ms", + "Median": "1,135.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,102.2 ms", - "Error": "11.91 ms", - "StdDev": "11.14 ms", - "Median": "1,102.6 ms" + "Mean": "1,115.8 ms", + "Error": "5.67 ms", + "StdDev": "5.03 ms", + "Median": "1,115.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,199.7 ms", - "Error": "11.50 ms", - "StdDev": "10.19 ms", - "Median": "1,197.9 ms" + "Mean": "1,190.2 ms", + "Error": "12.54 ms", + "StdDev": "11.12 ms", + "Median": "1,189.8 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 439801ceff..23b3febc58 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -86,5 +86,9 @@ { "date": "2025-12-01", "environment": "Ubuntu" + }, + { + "date": "2025-12-02", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 9b3f4a984f..759e5eae2e 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,253 +1,253 @@ { - "timestamp": "2025-12-01T00:33:55.394Z", + "timestamp": "2025-12-02T00:28:45.132Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "categories": { "AsyncTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "562.8 ms", - "Error": "2.78 ms", - "StdDev": "2.60 ms", - "Median": "562.1 ms" + "Mean": "568.0 ms", + "Error": "4.21 ms", + "StdDev": "3.51 ms", + "Median": "568.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "667.3 ms", - "Error": "12.45 ms", - "StdDev": "9.72 ms", - "Median": "663.3 ms" + "Mean": "654.9 ms", + "Error": "7.54 ms", + "StdDev": "6.68 ms", + "Median": "653.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "644.2 ms", - "Error": "12.21 ms", - "StdDev": "10.82 ms", - "Median": "641.4 ms" + "Mean": "624.1 ms", + "Error": "8.96 ms", + "StdDev": "8.38 ms", + "Median": "624.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "719.3 ms", - "Error": "6.25 ms", - "StdDev": "5.85 ms", - "Median": "719.4 ms" + "Mean": "710.1 ms", + "Error": "9.37 ms", + "StdDev": "8.76 ms", + "Median": "708.2 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "123.3 ms", - "Error": "0.48 ms", - "StdDev": "0.43 ms", - "Median": "123.2 ms" + "Mean": "124.3 ms", + "Error": "0.54 ms", + "StdDev": "0.48 ms", + "Median": "124.3 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "497.56 ms", - "Error": "4.301 ms", - "StdDev": "4.023 ms", - "Median": "495.65 ms" + "Mean": "491.60 ms", + "Error": "3.097 ms", + "StdDev": "2.897 ms", + "Median": "492.41 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "600.60 ms", - "Error": "9.354 ms", - "StdDev": "8.292 ms", - "Median": "597.73 ms" + "Mean": "541.30 ms", + "Error": "9.572 ms", + "StdDev": "15.457 ms", + "Median": "538.13 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "613.66 ms", - "Error": "8.606 ms", - "StdDev": "7.629 ms", - "Median": "612.85 ms" + "Mean": "554.63 ms", + "Error": "11.035 ms", + "StdDev": "13.552 ms", + "Median": "552.54 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "612.22 ms", - "Error": "8.885 ms", - "StdDev": "7.876 ms", - "Median": "611.95 ms" + "Mean": "572.96 ms", + "Error": "5.850 ms", + "StdDev": "5.472 ms", + "Median": "574.24 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "24.17 ms", - "Error": "0.230 ms", - "StdDev": "0.215 ms", - "Median": "24.17 ms" + "Mean": "23.67 ms", + "Error": "0.127 ms", + "StdDev": "0.106 ms", + "Median": "23.66 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "602.4 ms", - "Error": "5.47 ms", - "StdDev": "4.85 ms", - "Median": "602.9 ms" + "Mean": "587.9 ms", + "Error": "5.36 ms", + "StdDev": "5.01 ms", + "Median": "589.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,171.6 ms", - "Error": "9.33 ms", - "StdDev": "8.72 ms", - "Median": "1,168.4 ms" + "Mean": "1,168.8 ms", + "Error": "7.74 ms", + "StdDev": "6.86 ms", + "Median": "1,167.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,957.9 ms", - "Error": "10.12 ms", - "StdDev": "8.45 ms", - "Median": "2,956.5 ms" + "Mean": "2,971.3 ms", + "Error": "7.59 ms", + "StdDev": "6.73 ms", + "Median": "2,971.7 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,061.8 ms", - "Error": "7.18 ms", - "StdDev": "6.37 ms", - "Median": "3,060.8 ms" + "Mean": "3,048.3 ms", + "Error": "10.72 ms", + "StdDev": "10.03 ms", + "Median": "3,048.0 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "132.1 ms", - "Error": "0.41 ms", - "StdDev": "0.36 ms", - "Median": "132.1 ms" + "Mean": "130.7 ms", + "Error": "0.37 ms", + "StdDev": "0.33 ms", + "Median": "130.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "558.14 ms", - "Error": "3.968 ms", - "StdDev": "3.518 ms", - "Median": "556.82 ms" + "Mean": "555.85 ms", + "Error": "5.623 ms", + "StdDev": "5.260 ms", + "Median": "555.18 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,566.32 ms", - "Error": "9.797 ms", - "StdDev": "8.685 ms", - "Median": "1,567.91 ms" + "Mean": "1,553.46 ms", + "Error": "8.830 ms", + "StdDev": "8.260 ms", + "Median": "1,553.90 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,524.78 ms", - "Error": "6.264 ms", - "StdDev": "5.860 ms", - "Median": "1,525.41 ms" + "Mean": "1,510.07 ms", + "Error": "17.333 ms", + "StdDev": "15.365 ms", + "Median": "1,506.54 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,608.89 ms", - "Error": "5.097 ms", - "StdDev": "4.768 ms", - "Median": "1,610.14 ms" + "Mean": "1,587.52 ms", + "Error": "6.395 ms", + "StdDev": "5.669 ms", + "Median": "1,587.59 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "78.93 ms", - "Error": "0.409 ms", - "StdDev": "0.342 ms", - "Median": "79.01 ms" + "Mean": "78.81 ms", + "Error": "0.566 ms", + "StdDev": "0.529 ms", + "Median": "78.78 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "522.58 ms", - "Error": "4.419 ms", - "StdDev": "3.917 ms", - "Median": "522.80 ms" + "Mean": "536.51 ms", + "Error": "5.359 ms", + "StdDev": "5.013 ms", + "Median": "535.70 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "564.49 ms", - "Error": "9.874 ms", - "StdDev": "9.236 ms", - "Median": "563.16 ms" + "Mean": "612.30 ms", + "Error": "9.140 ms", + "StdDev": "8.103 ms", + "Median": "612.71 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "485.17 ms", - "Error": "9.265 ms", - "StdDev": "9.099 ms", - "Median": "484.63 ms" + "Mean": "622.86 ms", + "Error": "9.402 ms", + "StdDev": "8.334 ms", + "Median": "622.97 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "571.36 ms", - "Error": "8.675 ms", - "StdDev": "8.114 ms", - "Median": "569.92 ms" + "Mean": "616.30 ms", + "Error": "12.008 ms", + "StdDev": "10.027 ms", + "Median": "613.27 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "44.39 ms", - "Error": "1.244 ms", - "StdDev": "3.669 ms", - "Median": "44.66 ms" + "Mean": "45.29 ms", + "Error": "1.163 ms", + "StdDev": "3.410 ms", + "Median": "45.38 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "564.1 ms", - "Error": "4.84 ms", - "StdDev": "4.29 ms", - "Median": "564.9 ms" + "Mean": "540.5 ms", + "Error": "7.44 ms", + "StdDev": "6.96 ms", + "Median": "539.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,128.7 ms", - "Error": "5.37 ms", - "StdDev": "4.76 ms", - "Median": "1,129.3 ms" + "Mean": "1,135.1 ms", + "Error": "12.73 ms", + "StdDev": "11.91 ms", + "Median": "1,135.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,102.2 ms", - "Error": "11.91 ms", - "StdDev": "11.14 ms", - "Median": "1,102.6 ms" + "Mean": "1,115.8 ms", + "Error": "5.67 ms", + "StdDev": "5.03 ms", + "Median": "1,115.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,199.7 ms", - "Error": "11.50 ms", - "StdDev": "10.19 ms", - "Median": "1,197.9 ms" + "Mean": "1,190.2 ms", + "Error": "12.54 ms", + "StdDev": "11.12 ms", + "Median": "1,189.8 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.3.15", - "Mean": "2.035 s", - "Error": "0.0231 s", - "StdDev": "0.0205 s", - "Median": "2.027 s" + "Mean": "1.999 s", + "Error": "0.0203 s", + "StdDev": "0.0190 s", + "Median": "1.999 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.632 s", - "Error": "0.0161 s", - "StdDev": "0.0150 s", - "Median": "1.634 s" + "Mean": "1.606 s", + "Error": "0.0117 s", + "StdDev": "0.0103 s", + "Median": "1.607 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.706 s", - "Error": "0.0144 s", - "StdDev": "0.0135 s", - "Median": "1.702 s" + "Mean": "1.694 s", + "Error": "0.0241 s", + "StdDev": "0.0225 s", + "Median": "1.689 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.612 s", - "Error": "0.0273 s", - "StdDev": "0.0242 s", - "Median": "1.620 s" + "Mean": "1.592 s", + "Error": "0.0196 s", + "StdDev": "0.0184 s", + "Median": "1.584 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-01T00:33:55.391Z" + "lastUpdated": "2025-12-02T00:28:45.129Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index f7a8c9b934..f4aa611b9a 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-01", + "timestamp": "2025-12-02", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From e5624940d68a54a19bea1ab253505679480073f7 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 2 Dec 2025 06:32:56 +0000 Subject: [PATCH 131/192] chore(deps): update dependency polyfill to 9.3.1 (#3965) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index 7e0cdfbd3e..2d3609dd1b 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.3.0 + <_TUnitPolyfillVersion>9.3.1 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From 1302d23731d4a65e307be3d3de12691a5ec678a4 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 2 Dec 2025 06:34:02 +0000 Subject: [PATCH 132/192] chore(deps): update dependency polyfill to 9.3.1 (#3964) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 22db5dc779..75d2925bb1 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,7 +59,7 @@ - + From bbcaaab6d281dd4feb446dfc04f5dd95ad2bdfd1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 2 Dec 2025 07:34:12 +0000 Subject: [PATCH 133/192] chore(deps): update verify to 31.8.0 (#3966) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 75d2925bb1..d6ce0c4576 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -81,12 +81,12 @@ - - + + - + From a2c83515bc8d784e630644214064f13b677dece5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:29:22 +0000 Subject: [PATCH 134/192] chore: update benchmark results (#3970) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 16 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 44 +-- .../benchmarks/MassiveParallelTests.json | 44 +-- docs/static/benchmarks/MatrixTests.json | 44 +-- docs/static/benchmarks/ScaleTests.json | 40 +-- .../static/benchmarks/SetupTeardownTests.json | 36 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 266 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 344 insertions(+), 340 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index c670f47a84..2752575378 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 568.0 ms | 568.1 ms | 3.51 ms | -| NUnit | 4.4.0 | 654.9 ms | 653.8 ms | 6.68 ms | -| MSTest | 4.0.2 | 624.1 ms | 624.1 ms | 8.38 ms | -| xUnit3 | 3.2.1 | 710.1 ms | 708.2 ms | 8.76 ms | -| **TUnit (AOT)** | 1.3.15 | 124.3 ms | 124.3 ms | 0.48 ms | +| **TUnit** | 1.3.15 | 576.1 ms | 574.4 ms | 4.53 ms | +| NUnit | 4.4.0 | 684.2 ms | 682.2 ms | 12.67 ms | +| MSTest | 4.0.2 | 645.2 ms | 645.5 ms | 6.97 ms | +| xUnit3 | 3.2.1 | 727.7 ms | 728.8 ms | 10.39 ms | +| **TUnit (AOT)** | 1.3.15 | 123.9 ms | 123.9 ms | 0.37 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 853 - bar [568, 654.9, 624.1, 710.1, 124.3] + y-axis "Time (ms)" 0 --> 874 + bar [576.1, 684.2, 645.2, 727.7, 123.9] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.129Z* +*Last generated: 2025-12-03T00:29:03.206Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 7d34a916ae..45d4aba1bf 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 1.999 s | 1.999 s | 0.0190 s | -| Build_NUnit | 4.4.0 | 1.606 s | 1.607 s | 0.0103 s | -| Build_MSTest | 4.0.2 | 1.694 s | 1.689 s | 0.0225 s | -| Build_xUnit3 | 3.2.1 | 1.592 s | 1.584 s | 0.0184 s | +| **TUnit** | 1.3.15 | 1.998 s | 1.993 s | 0.0281 s | +| Build_NUnit | 4.4.0 | 1.644 s | 1.634 s | 0.0247 s | +| Build_MSTest | 4.0.2 | 1.744 s | 1.742 s | 0.0152 s | +| Build_xUnit3 | 3.2.1 | 1.649 s | 1.650 s | 0.0178 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [1.999, 1.606, 1.694, 1.592] + bar [1.998, 1.644, 1.744, 1.649] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.131Z* +*Last generated: 2025-12-03T00:29:03.208Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 367d55db0a..72eea7cbe6 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 491.60 ms | 492.41 ms | 2.897 ms | -| NUnit | 4.4.0 | 541.30 ms | 538.13 ms | 15.457 ms | -| MSTest | 4.0.2 | 554.63 ms | 552.54 ms | 13.552 ms | -| xUnit3 | 3.2.1 | 572.96 ms | 574.24 ms | 5.472 ms | -| **TUnit (AOT)** | 1.3.15 | 23.67 ms | 23.66 ms | 0.106 ms | +| **TUnit** | 1.3.15 | 509.49 ms | 509.23 ms | 4.808 ms | +| NUnit | 4.4.0 | 537.70 ms | 537.50 ms | 7.456 ms | +| MSTest | 4.0.2 | 500.01 ms | 497.41 ms | 13.464 ms | +| xUnit3 | 3.2.1 | 577.92 ms | 575.57 ms | 8.284 ms | +| **TUnit (AOT)** | 1.3.15 | 25.20 ms | 25.22 ms | 0.441 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 688 - bar [491.6, 541.3, 554.63, 572.96, 23.67] + y-axis "Time (ms)" 0 --> 694 + bar [509.49, 537.7, 500.01, 577.92, 25.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.129Z* +*Last generated: 2025-12-03T00:29:03.207Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 4f70f8ed07..a4bfe3335e 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 587.9 ms | 589.4 ms | 5.01 ms | -| NUnit | 4.4.0 | 1,168.8 ms | 1,167.3 ms | 6.86 ms | -| MSTest | 4.0.2 | 2,971.3 ms | 2,971.7 ms | 6.73 ms | -| xUnit3 | 3.2.1 | 3,048.3 ms | 3,048.0 ms | 10.03 ms | -| **TUnit (AOT)** | 1.3.15 | 130.7 ms | 130.7 ms | 0.33 ms | +| **TUnit** | 1.3.15 | 604.9 ms | 605.1 ms | 3.81 ms | +| NUnit | 4.4.0 | 1,203.3 ms | 1,202.8 ms | 9.59 ms | +| MSTest | 4.0.2 | 2,994.0 ms | 2,994.6 ms | 4.85 ms | +| xUnit3 | 3.2.1 | 3,080.6 ms | 3,077.9 ms | 10.62 ms | +| **TUnit (AOT)** | 1.3.15 | 131.4 ms | 131.4 ms | 0.49 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3658 - bar [587.9, 1168.8, 2971.3, 3048.3, 130.7] + y-axis "Time (ms)" 0 --> 3697 + bar [604.9, 1203.3, 2994, 3080.6, 131.4] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.130Z* +*Last generated: 2025-12-03T00:29:03.207Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index bd52fe6146..91ee0f7db4 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 555.85 ms | 555.18 ms | 5.260 ms | -| NUnit | 4.4.0 | 1,553.46 ms | 1,553.90 ms | 8.260 ms | -| MSTest | 4.0.2 | 1,510.07 ms | 1,506.54 ms | 15.365 ms | -| xUnit3 | 3.2.1 | 1,587.52 ms | 1,587.59 ms | 5.669 ms | -| **TUnit (AOT)** | 1.3.15 | 78.81 ms | 78.78 ms | 0.529 ms | +| **TUnit** | 1.3.15 | 562.20 ms | 562.66 ms | 3.997 ms | +| NUnit | 4.4.0 | 1,535.28 ms | 1,535.46 ms | 8.283 ms | +| MSTest | 4.0.2 | 1,492.91 ms | 1,491.03 ms | 8.601 ms | +| xUnit3 | 3.2.1 | 1,587.83 ms | 1,585.14 ms | 8.779 ms | +| **TUnit (AOT)** | 1.3.15 | 79.07 ms | 79.05 ms | 0.175 ms | ## šŸ“ˆ Visual Comparison @@ -59,7 +59,7 @@ xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] y-axis "Time (ms)" 0 --> 1906 - bar [555.85, 1553.46, 1510.07, 1587.52, 78.81] + bar [562.2, 1535.28, 1492.91, 1587.83, 79.07] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.130Z* +*Last generated: 2025-12-03T00:29:03.207Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index c103abcaf8..5cc897672b 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 536.51 ms | 535.70 ms | 5.013 ms | -| NUnit | 4.4.0 | 612.30 ms | 612.71 ms | 8.103 ms | -| MSTest | 4.0.2 | 622.86 ms | 622.97 ms | 8.334 ms | -| xUnit3 | 3.2.1 | 616.30 ms | 613.27 ms | 10.027 ms | -| **TUnit (AOT)** | 1.3.15 | 45.29 ms | 45.38 ms | 3.410 ms | +| **TUnit** | 1.3.15 | 513.47 ms | 514.37 ms | 2.022 ms | +| NUnit | 4.4.0 | 591.32 ms | 590.12 ms | 9.736 ms | +| MSTest | 4.0.2 | 607.19 ms | 606.33 ms | 10.333 ms | +| xUnit3 | 3.2.1 | 593.97 ms | 594.08 ms | 7.557 ms | +| **TUnit (AOT)** | 1.3.15 | 44.09 ms | 43.81 ms | 3.410 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 748 - bar [536.51, 612.3, 622.86, 616.3, 45.29] + y-axis "Time (ms)" 0 --> 729 + bar [513.47, 591.32, 607.19, 593.97, 44.09] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.130Z* +*Last generated: 2025-12-03T00:29:03.207Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index c7eb702d5f..d08f3dcfcb 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-02** from the latest CI run. +This benchmark was automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 540.5 ms | 539.7 ms | 6.96 ms | -| NUnit | 4.4.0 | 1,135.1 ms | 1,135.3 ms | 11.91 ms | -| MSTest | 4.0.2 | 1,115.8 ms | 1,115.4 ms | 5.03 ms | -| xUnit3 | 3.2.1 | 1,190.2 ms | 1,189.8 ms | 11.12 ms | +| **TUnit** | 1.3.15 | 576.8 ms | 576.7 ms | 3.50 ms | +| NUnit | 4.4.0 | 1,173.6 ms | 1,173.5 ms | 9.79 ms | +| MSTest | 4.0.2 | 1,153.1 ms | 1,153.5 ms | 10.94 ms | +| xUnit3 | 3.2.1 | 1,218.3 ms | 1,218.1 ms | 7.19 ms | | **TUnit (AOT)** | 1.3.15 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-02** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1429 - bar [540.5, 1135.1, 1115.8, 1190.2, 0] + y-axis "Time (ms)" 0 --> 1462 + bar [576.8, 1173.6, 1153.1, 1218.3, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-02T00:28:45.131Z* +*Last generated: 2025-12-03T00:29:03.208Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 4f7eb20422..f6d3d565c8 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-02** from the latest CI run. +These benchmarks were automatically generated on **2025-12-03** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -56,7 +56,7 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-02T00:28:45.131Z* +*Last generated: 2025-12-03T00:29:03.208Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 35849a60c2..b0beb803f1 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-02T00:28:45.129Z", + "timestamp": "2025-12-03T00:29:03.206Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "568.0 ms", - "Error": "4.21 ms", - "StdDev": "3.51 ms", - "Median": "568.1 ms" + "Mean": "576.1 ms", + "Error": "4.84 ms", + "StdDev": "4.53 ms", + "Median": "574.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "654.9 ms", - "Error": "7.54 ms", - "StdDev": "6.68 ms", - "Median": "653.8 ms" + "Mean": "684.2 ms", + "Error": "13.55 ms", + "StdDev": "12.67 ms", + "Median": "682.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "624.1 ms", - "Error": "8.96 ms", - "StdDev": "8.38 ms", - "Median": "624.1 ms" + "Mean": "645.2 ms", + "Error": "7.86 ms", + "StdDev": "6.97 ms", + "Median": "645.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "710.1 ms", - "Error": "9.37 ms", - "StdDev": "8.76 ms", - "Median": "708.2 ms" + "Mean": "727.7 ms", + "Error": "11.11 ms", + "StdDev": "10.39 ms", + "Median": "728.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "124.3 ms", - "Error": "0.54 ms", - "StdDev": "0.48 ms", - "Median": "124.3 ms" + "Mean": "123.9 ms", + "Error": "0.40 ms", + "StdDev": "0.37 ms", + "Median": "123.9 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index f65fff65bd..d133316d39 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-12-02T00:28:45.131Z", + "timestamp": "2025-12-03T00:29:03.208Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "Build_TUnit", "Version": "1.3.15", - "Mean": "1.999 s", - "Error": "0.0203 s", - "StdDev": "0.0190 s", - "Median": "1.999 s" + "Mean": "1.998 s", + "Error": "0.0317 s", + "StdDev": "0.0281 s", + "Median": "1.993 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.606 s", - "Error": "0.0117 s", - "StdDev": "0.0103 s", - "Median": "1.607 s" + "Mean": "1.644 s", + "Error": "0.0264 s", + "StdDev": "0.0247 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.694 s", - "Error": "0.0241 s", - "StdDev": "0.0225 s", - "Median": "1.689 s" + "Mean": "1.744 s", + "Error": "0.0163 s", + "StdDev": "0.0152 s", + "Median": "1.742 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.592 s", - "Error": "0.0196 s", - "StdDev": "0.0184 s", - "Median": "1.584 s" + "Mean": "1.649 s", + "Error": "0.0190 s", + "StdDev": "0.0178 s", + "Median": "1.650 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 6a864131f3..1e39e67d22 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-02T00:28:45.130Z", + "timestamp": "2025-12-03T00:29:03.207Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "491.60 ms", - "Error": "3.097 ms", - "StdDev": "2.897 ms", - "Median": "492.41 ms" + "Mean": "509.49 ms", + "Error": "5.424 ms", + "StdDev": "4.808 ms", + "Median": "509.23 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "541.30 ms", - "Error": "9.572 ms", - "StdDev": "15.457 ms", - "Median": "538.13 ms" + "Mean": "537.70 ms", + "Error": "8.411 ms", + "StdDev": "7.456 ms", + "Median": "537.50 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "554.63 ms", - "Error": "11.035 ms", - "StdDev": "13.552 ms", - "Median": "552.54 ms" + "Mean": "500.01 ms", + "Error": "9.836 ms", + "StdDev": "13.464 ms", + "Median": "497.41 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "572.96 ms", - "Error": "5.850 ms", - "StdDev": "5.472 ms", - "Median": "574.24 ms" + "Mean": "577.92 ms", + "Error": "8.856 ms", + "StdDev": "8.284 ms", + "Median": "575.57 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "23.67 ms", - "Error": "0.127 ms", - "StdDev": "0.106 ms", - "Median": "23.66 ms" + "Mean": "25.20 ms", + "Error": "0.471 ms", + "StdDev": "0.441 ms", + "Median": "25.22 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 0af62f3ed2..7b98dc68cb 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-02T00:28:45.130Z", + "timestamp": "2025-12-03T00:29:03.207Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "587.9 ms", - "Error": "5.36 ms", - "StdDev": "5.01 ms", - "Median": "589.4 ms" + "Mean": "604.9 ms", + "Error": "4.30 ms", + "StdDev": "3.81 ms", + "Median": "605.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,168.8 ms", - "Error": "7.74 ms", - "StdDev": "6.86 ms", - "Median": "1,167.3 ms" + "Mean": "1,203.3 ms", + "Error": "12.29 ms", + "StdDev": "9.59 ms", + "Median": "1,202.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,971.3 ms", - "Error": "7.59 ms", - "StdDev": "6.73 ms", - "Median": "2,971.7 ms" + "Mean": "2,994.0 ms", + "Error": "5.18 ms", + "StdDev": "4.85 ms", + "Median": "2,994.6 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,048.3 ms", - "Error": "10.72 ms", - "StdDev": "10.03 ms", - "Median": "3,048.0 ms" + "Mean": "3,080.6 ms", + "Error": "11.35 ms", + "StdDev": "10.62 ms", + "Median": "3,077.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "130.7 ms", - "Error": "0.37 ms", - "StdDev": "0.33 ms", - "Median": "130.7 ms" + "Mean": "131.4 ms", + "Error": "0.55 ms", + "StdDev": "0.49 ms", + "Median": "131.4 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 1b36919455..025d54b8d4 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-02T00:28:45.130Z", + "timestamp": "2025-12-03T00:29:03.207Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "555.85 ms", - "Error": "5.623 ms", - "StdDev": "5.260 ms", - "Median": "555.18 ms" + "Mean": "562.20 ms", + "Error": "4.786 ms", + "StdDev": "3.997 ms", + "Median": "562.66 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,553.46 ms", - "Error": "8.830 ms", - "StdDev": "8.260 ms", - "Median": "1,553.90 ms" + "Mean": "1,535.28 ms", + "Error": "9.344 ms", + "StdDev": "8.283 ms", + "Median": "1,535.46 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,510.07 ms", - "Error": "17.333 ms", - "StdDev": "15.365 ms", - "Median": "1,506.54 ms" + "Mean": "1,492.91 ms", + "Error": "10.300 ms", + "StdDev": "8.601 ms", + "Median": "1,491.03 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,587.52 ms", - "Error": "6.395 ms", - "StdDev": "5.669 ms", - "Median": "1,587.59 ms" + "Mean": "1,587.83 ms", + "Error": "9.385 ms", + "StdDev": "8.779 ms", + "Median": "1,585.14 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "78.81 ms", - "Error": "0.566 ms", - "StdDev": "0.529 ms", - "Median": "78.78 ms" + "Mean": "79.07 ms", + "Error": "0.197 ms", + "StdDev": "0.175 ms", + "Median": "79.05 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 27af45c11b..d463427e76 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-02T00:28:45.130Z", + "timestamp": "2025-12-03T00:29:03.208Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "536.51 ms", - "Error": "5.359 ms", - "StdDev": "5.013 ms", - "Median": "535.70 ms" + "Mean": "513.47 ms", + "Error": "2.422 ms", + "StdDev": "2.022 ms", + "Median": "514.37 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "612.30 ms", - "Error": "9.140 ms", - "StdDev": "8.103 ms", - "Median": "612.71 ms" + "Mean": "591.32 ms", + "Error": "10.983 ms", + "StdDev": "9.736 ms", + "Median": "590.12 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "622.86 ms", - "Error": "9.402 ms", - "StdDev": "8.334 ms", - "Median": "622.97 ms" + "Mean": "607.19 ms", + "Error": "11.656 ms", + "StdDev": "10.333 ms", + "Median": "606.33 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "616.30 ms", - "Error": "12.008 ms", - "StdDev": "10.027 ms", - "Median": "613.27 ms" + "Mean": "593.97 ms", + "Error": "8.079 ms", + "StdDev": "7.557 ms", + "Median": "594.08 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "45.29 ms", + "Mean": "44.09 ms", "Error": "1.163 ms", "StdDev": "3.410 ms", - "Median": "45.38 ms" + "Median": "43.81 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index db26edac93..5f89a598af 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-12-02T00:28:45.131Z", + "timestamp": "2025-12-03T00:29:03.208Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "540.5 ms", - "Error": "7.44 ms", - "StdDev": "6.96 ms", - "Median": "539.7 ms" + "Mean": "576.8 ms", + "Error": "3.95 ms", + "StdDev": "3.50 ms", + "Median": "576.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,135.1 ms", - "Error": "12.73 ms", - "StdDev": "11.91 ms", - "Median": "1,135.3 ms" + "Mean": "1,173.6 ms", + "Error": "11.05 ms", + "StdDev": "9.79 ms", + "Median": "1,173.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,115.8 ms", - "Error": "5.67 ms", - "StdDev": "5.03 ms", - "Median": "1,115.4 ms" + "Mean": "1,153.1 ms", + "Error": "11.70 ms", + "StdDev": "10.94 ms", + "Median": "1,153.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,190.2 ms", - "Error": "12.54 ms", - "StdDev": "11.12 ms", - "Median": "1,189.8 ms" + "Mean": "1,218.3 ms", + "Error": "8.11 ms", + "StdDev": "7.19 ms", + "Median": "1,218.1 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 23b3febc58..896d2cdb76 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -90,5 +90,9 @@ { "date": "2025-12-02", "environment": "Ubuntu" + }, + { + "date": "2025-12-03", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 759e5eae2e..dafe543240 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,253 +1,253 @@ { - "timestamp": "2025-12-02T00:28:45.132Z", + "timestamp": "2025-12-03T00:29:03.209Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" }, "categories": { "AsyncTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "568.0 ms", - "Error": "4.21 ms", - "StdDev": "3.51 ms", - "Median": "568.1 ms" + "Mean": "576.1 ms", + "Error": "4.84 ms", + "StdDev": "4.53 ms", + "Median": "574.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "654.9 ms", - "Error": "7.54 ms", - "StdDev": "6.68 ms", - "Median": "653.8 ms" + "Mean": "684.2 ms", + "Error": "13.55 ms", + "StdDev": "12.67 ms", + "Median": "682.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "624.1 ms", - "Error": "8.96 ms", - "StdDev": "8.38 ms", - "Median": "624.1 ms" + "Mean": "645.2 ms", + "Error": "7.86 ms", + "StdDev": "6.97 ms", + "Median": "645.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "710.1 ms", - "Error": "9.37 ms", - "StdDev": "8.76 ms", - "Median": "708.2 ms" + "Mean": "727.7 ms", + "Error": "11.11 ms", + "StdDev": "10.39 ms", + "Median": "728.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "124.3 ms", - "Error": "0.54 ms", - "StdDev": "0.48 ms", - "Median": "124.3 ms" + "Mean": "123.9 ms", + "Error": "0.40 ms", + "StdDev": "0.37 ms", + "Median": "123.9 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "491.60 ms", - "Error": "3.097 ms", - "StdDev": "2.897 ms", - "Median": "492.41 ms" + "Mean": "509.49 ms", + "Error": "5.424 ms", + "StdDev": "4.808 ms", + "Median": "509.23 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "541.30 ms", - "Error": "9.572 ms", - "StdDev": "15.457 ms", - "Median": "538.13 ms" + "Mean": "537.70 ms", + "Error": "8.411 ms", + "StdDev": "7.456 ms", + "Median": "537.50 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "554.63 ms", - "Error": "11.035 ms", - "StdDev": "13.552 ms", - "Median": "552.54 ms" + "Mean": "500.01 ms", + "Error": "9.836 ms", + "StdDev": "13.464 ms", + "Median": "497.41 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "572.96 ms", - "Error": "5.850 ms", - "StdDev": "5.472 ms", - "Median": "574.24 ms" + "Mean": "577.92 ms", + "Error": "8.856 ms", + "StdDev": "8.284 ms", + "Median": "575.57 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "23.67 ms", - "Error": "0.127 ms", - "StdDev": "0.106 ms", - "Median": "23.66 ms" + "Mean": "25.20 ms", + "Error": "0.471 ms", + "StdDev": "0.441 ms", + "Median": "25.22 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "587.9 ms", - "Error": "5.36 ms", - "StdDev": "5.01 ms", - "Median": "589.4 ms" + "Mean": "604.9 ms", + "Error": "4.30 ms", + "StdDev": "3.81 ms", + "Median": "605.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,168.8 ms", - "Error": "7.74 ms", - "StdDev": "6.86 ms", - "Median": "1,167.3 ms" + "Mean": "1,203.3 ms", + "Error": "12.29 ms", + "StdDev": "9.59 ms", + "Median": "1,202.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,971.3 ms", - "Error": "7.59 ms", - "StdDev": "6.73 ms", - "Median": "2,971.7 ms" + "Mean": "2,994.0 ms", + "Error": "5.18 ms", + "StdDev": "4.85 ms", + "Median": "2,994.6 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,048.3 ms", - "Error": "10.72 ms", - "StdDev": "10.03 ms", - "Median": "3,048.0 ms" + "Mean": "3,080.6 ms", + "Error": "11.35 ms", + "StdDev": "10.62 ms", + "Median": "3,077.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "130.7 ms", - "Error": "0.37 ms", - "StdDev": "0.33 ms", - "Median": "130.7 ms" + "Mean": "131.4 ms", + "Error": "0.55 ms", + "StdDev": "0.49 ms", + "Median": "131.4 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "555.85 ms", - "Error": "5.623 ms", - "StdDev": "5.260 ms", - "Median": "555.18 ms" + "Mean": "562.20 ms", + "Error": "4.786 ms", + "StdDev": "3.997 ms", + "Median": "562.66 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,553.46 ms", - "Error": "8.830 ms", - "StdDev": "8.260 ms", - "Median": "1,553.90 ms" + "Mean": "1,535.28 ms", + "Error": "9.344 ms", + "StdDev": "8.283 ms", + "Median": "1,535.46 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,510.07 ms", - "Error": "17.333 ms", - "StdDev": "15.365 ms", - "Median": "1,506.54 ms" + "Mean": "1,492.91 ms", + "Error": "10.300 ms", + "StdDev": "8.601 ms", + "Median": "1,491.03 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,587.52 ms", - "Error": "6.395 ms", - "StdDev": "5.669 ms", - "Median": "1,587.59 ms" + "Mean": "1,587.83 ms", + "Error": "9.385 ms", + "StdDev": "8.779 ms", + "Median": "1,585.14 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "78.81 ms", - "Error": "0.566 ms", - "StdDev": "0.529 ms", - "Median": "78.78 ms" + "Mean": "79.07 ms", + "Error": "0.197 ms", + "StdDev": "0.175 ms", + "Median": "79.05 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "536.51 ms", - "Error": "5.359 ms", - "StdDev": "5.013 ms", - "Median": "535.70 ms" + "Mean": "513.47 ms", + "Error": "2.422 ms", + "StdDev": "2.022 ms", + "Median": "514.37 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "612.30 ms", - "Error": "9.140 ms", - "StdDev": "8.103 ms", - "Median": "612.71 ms" + "Mean": "591.32 ms", + "Error": "10.983 ms", + "StdDev": "9.736 ms", + "Median": "590.12 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "622.86 ms", - "Error": "9.402 ms", - "StdDev": "8.334 ms", - "Median": "622.97 ms" + "Mean": "607.19 ms", + "Error": "11.656 ms", + "StdDev": "10.333 ms", + "Median": "606.33 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "616.30 ms", - "Error": "12.008 ms", - "StdDev": "10.027 ms", - "Median": "613.27 ms" + "Mean": "593.97 ms", + "Error": "8.079 ms", + "StdDev": "7.557 ms", + "Median": "594.08 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.15", - "Mean": "45.29 ms", + "Mean": "44.09 ms", "Error": "1.163 ms", "StdDev": "3.410 ms", - "Median": "45.38 ms" + "Median": "43.81 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.3.15", - "Mean": "540.5 ms", - "Error": "7.44 ms", - "StdDev": "6.96 ms", - "Median": "539.7 ms" + "Mean": "576.8 ms", + "Error": "3.95 ms", + "StdDev": "3.50 ms", + "Median": "576.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,135.1 ms", - "Error": "12.73 ms", - "StdDev": "11.91 ms", - "Median": "1,135.3 ms" + "Mean": "1,173.6 ms", + "Error": "11.05 ms", + "StdDev": "9.79 ms", + "Median": "1,173.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,115.8 ms", - "Error": "5.67 ms", - "StdDev": "5.03 ms", - "Median": "1,115.4 ms" + "Mean": "1,153.1 ms", + "Error": "11.70 ms", + "StdDev": "10.94 ms", + "Median": "1,153.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,190.2 ms", - "Error": "12.54 ms", - "StdDev": "11.12 ms", - "Median": "1,189.8 ms" + "Mean": "1,218.3 ms", + "Error": "8.11 ms", + "StdDev": "7.19 ms", + "Median": "1,218.1 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.3.15", - "Mean": "1.999 s", - "Error": "0.0203 s", - "StdDev": "0.0190 s", - "Median": "1.999 s" + "Mean": "1.998 s", + "Error": "0.0317 s", + "StdDev": "0.0281 s", + "Median": "1.993 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.606 s", - "Error": "0.0117 s", - "StdDev": "0.0103 s", - "Median": "1.607 s" + "Mean": "1.644 s", + "Error": "0.0264 s", + "StdDev": "0.0247 s", + "Median": "1.634 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.694 s", - "Error": "0.0241 s", - "StdDev": "0.0225 s", - "Median": "1.689 s" + "Mean": "1.744 s", + "Error": "0.0163 s", + "StdDev": "0.0152 s", + "Median": "1.742 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.592 s", - "Error": "0.0196 s", - "StdDev": "0.0184 s", - "Median": "1.584 s" + "Mean": "1.649 s", + "Error": "0.0190 s", + "StdDev": "0.0178 s", + "Median": "1.650 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-02T00:28:45.129Z" + "lastUpdated": "2025-12-03T00:29:03.206Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index f4aa611b9a..d001077059 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-02", + "timestamp": "2025-12-03", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 15baa677b97f5140b71122f136f3d03231725937 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 3 Dec 2025 16:06:53 +0000 Subject: [PATCH 135/192] chore(deps): update react to v19.2.1 (#3972) Co-authored-by: Renovate Bot --- docs/yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 9c425ab1e4..63e350d3d4 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -8275,9 +8275,9 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-dom@^19.0.0: - version "19.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.0.tgz#00ed1e959c365e9a9d48f8918377465466ec3af8" - integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== + version "19.2.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.1.tgz#ce3527560bda4f997e47d10dab754825b3061f59" + integrity sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg== dependencies: scheduler "^0.27.0" @@ -8357,9 +8357,9 @@ react-router@5.3.4, react-router@^5.3.4: tiny-warning "^1.0.0" react@^19.2.0: - version "19.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.0.tgz#d33dd1721698f4376ae57a54098cb47fc75d93a5" - integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== + version "19.2.1" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.1.tgz#8600fa205e58e2e807f6ef431c9f6492591a2700" + integrity sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw== readable-stream@^2.0.1: version "2.3.8" From 7c069a0753bec3f2975ca5dff8c4a8738fb38be9 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:12:22 +0000 Subject: [PATCH 136/192] Refactor object lifecycle management and property injection services (#3967) * Refactor object lifecycle management and property injection services * feat: enhance GetPropertyInfo method to support internal properties * fix: update ContainingType attribute to include non-public properties * fix: update ContainingType attribute to include NonPublicProperties * feat: add testSessionId parameter to property injection and lifecycle management * Refactor object lifecycle management and property injection services * feat: enhance GetPropertyInfo method to support internal properties * fix: update ContainingType attribute to include non-public properties * fix: update ContainingType attribute to include NonPublicProperties * feat: add testSessionId parameter to property injection and lifecycle management * feat: enhance PrepareTestAsync to set cached properties on new instances during retries * feat: implement ResolveAndCachePropertiesAsync for early shared object creation and reference counting --- TUnit.Core/DataGeneratorMetadataCreator.cs | 5 +- TUnit.Core/Helpers/DataSourceHelpers.cs | 1 + .../PropertyInjectionMetadata.cs | 2 +- .../PropertyInjection/PropertyHelper.cs | 9 +- .../PropertyInjectionCache.cs | 50 +- TUnit.Engine/Building/TestBuilder.cs | 21 +- .../Framework/TUnitServiceProvider.cs | 34 +- .../Services/DataSourceInitializer.cs | 243 ------- .../Services/EventReceiverOrchestrator.cs | 5 +- .../Services/ObjectGraphDiscoveryService.cs | 198 ++++++ .../Services/ObjectLifecycleService.cs | 338 ++++++++++ .../Services/ObjectRegistrationService.cs | 101 --- TUnit.Engine/Services/PropertyDataResolver.cs | 182 ------ .../PropertyInitializationOrchestrator.cs | 213 ------ .../Services/PropertyInjectionService.cs | 206 ------ TUnit.Engine/Services/PropertyInjector.cs | 616 ++++++++++++++++++ .../TestArgumentRegistrationService.cs | 146 +---- TUnit.Engine/Services/TestFilterService.cs | 2 +- TUnit.Engine/TestInitializer.cs | 64 +- ...Has_No_API_Changes.DotNet10_0.verified.txt | 2 +- ..._Has_No_API_Changes.DotNet8_0.verified.txt | 2 +- ..._Has_No_API_Changes.DotNet9_0.verified.txt | 2 +- 22 files changed, 1229 insertions(+), 1213 deletions(-) delete mode 100644 TUnit.Engine/Services/DataSourceInitializer.cs create mode 100644 TUnit.Engine/Services/ObjectGraphDiscoveryService.cs create mode 100644 TUnit.Engine/Services/ObjectLifecycleService.cs delete mode 100644 TUnit.Engine/Services/ObjectRegistrationService.cs delete mode 100644 TUnit.Engine/Services/PropertyDataResolver.cs delete mode 100644 TUnit.Engine/Services/PropertyInitializationOrchestrator.cs delete mode 100644 TUnit.Engine/Services/PropertyInjectionService.cs create mode 100644 TUnit.Engine/Services/PropertyInjector.cs diff --git a/TUnit.Core/DataGeneratorMetadataCreator.cs b/TUnit.Core/DataGeneratorMetadataCreator.cs index cc0b713f70..8abfb23152 100644 --- a/TUnit.Core/DataGeneratorMetadataCreator.cs +++ b/TUnit.Core/DataGeneratorMetadataCreator.cs @@ -170,6 +170,7 @@ public static DataGeneratorMetadata CreateForPropertyInjection( PropertyMetadata propertyMetadata, MethodMetadata? methodMetadata, IDataSourceAttribute dataSource, + string testSessionId, TestContext? testContext = null, object? testClassInstance = null, TestContextEvents? events = null, @@ -193,7 +194,7 @@ public static DataGeneratorMetadata CreateForPropertyInjection( MembersToGenerate = [propertyMetadata], TestInformation = methodMetadata, Type = DataGeneratorType.Property, - TestSessionId = TestSessionContext.Current?.Id ?? "property-injection", + TestSessionId = testSessionId, TestClassInstance = testClassInstance ?? testContext?.Metadata.TestDetails.ClassInstance, ClassInstanceArguments = testContext?.Metadata.TestDetails.TestClassArguments ?? [] }; @@ -215,6 +216,7 @@ public static DataGeneratorMetadata CreateForPropertyInjection( Type containingType, MethodMetadata? methodMetadata, IDataSourceAttribute dataSource, + string testSessionId, TestContext? testContext = null, object? testClassInstance = null, TestContextEvents? events = null, @@ -235,6 +237,7 @@ public static DataGeneratorMetadata CreateForPropertyInjection( propertyMetadata, methodMetadata, dataSource, + testSessionId, testContext, testClassInstance, events, diff --git a/TUnit.Core/Helpers/DataSourceHelpers.cs b/TUnit.Core/Helpers/DataSourceHelpers.cs index d77e6aff47..001fb6077b 100644 --- a/TUnit.Core/Helpers/DataSourceHelpers.cs +++ b/TUnit.Core/Helpers/DataSourceHelpers.cs @@ -561,6 +561,7 @@ public static void RegisterTypeCreator(Func> containingType, testInformation, dataSourceAttribute, + testSessionId, TestContext.Current, TestContext.Current?.Metadata.TestDetails.ClassInstance, TestContext.Current?.InternalEvents, diff --git a/TUnit.Core/Interfaces/SourceGenerator/PropertyInjectionMetadata.cs b/TUnit.Core/Interfaces/SourceGenerator/PropertyInjectionMetadata.cs index d4c8309fc3..bea4f11a9f 100644 --- a/TUnit.Core/Interfaces/SourceGenerator/PropertyInjectionMetadata.cs +++ b/TUnit.Core/Interfaces/SourceGenerator/PropertyInjectionMetadata.cs @@ -24,7 +24,7 @@ public sealed class PropertyInjectionMetadata /// /// Gets the type that contains the property (the parent class). /// - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public required Type ContainingType { get; init; } /// diff --git a/TUnit.Core/PropertyInjection/PropertyHelper.cs b/TUnit.Core/PropertyInjection/PropertyHelper.cs index e5cd934d66..a32d24a7a7 100644 --- a/TUnit.Core/PropertyInjection/PropertyHelper.cs +++ b/TUnit.Core/PropertyInjection/PropertyHelper.cs @@ -11,13 +11,18 @@ internal static class PropertyHelper { /// /// Gets PropertyInfo in an AOT-safe manner. + /// Searches for both public and non-public properties to support internal properties. /// public static PropertyInfo GetPropertyInfo( - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type containingType, string propertyName) { - var property = containingType.GetProperty(propertyName); + // Use binding flags to find both public and non-public properties + // This is necessary to support internal properties on internal classes + var property = containingType.GetProperty( + propertyName, + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); if (property == null) { diff --git a/TUnit.Core/PropertyInjection/PropertyInjectionCache.cs b/TUnit.Core/PropertyInjection/PropertyInjectionCache.cs index c883dfc858..b94917c014 100644 --- a/TUnit.Core/PropertyInjection/PropertyInjectionCache.cs +++ b/TUnit.Core/PropertyInjection/PropertyInjectionCache.cs @@ -1,24 +1,22 @@ -using System.Diagnostics.CodeAnalysis; -using TUnit.Core.Data; +using TUnit.Core.Data; namespace TUnit.Core.PropertyInjection; /// -/// Provides caching functionality for property injection operations. -/// Follows Single Responsibility Principle by focusing only on caching. +/// Provides pure caching functionality for property injection metadata. +/// Follows Single Responsibility Principle - only caches type metadata, no execution logic. /// /// This cache supports both execution modes: /// - Source Generation Mode: Uses pre-compiled property setters and metadata /// - Reflection Mode: Uses runtime discovery and dynamic property access /// -/// The IL2067 suppressions are necessary because types come from runtime objects -/// (via GetType() calls) which cannot have compile-time annotations. +/// Instance-level injection tracking has been moved to ObjectLifecycleService +/// to maintain SRP (caching vs execution are separate concerns). /// internal static class PropertyInjectionCache { private static readonly ThreadSafeDictionary _injectionPlans = new(); private static readonly ThreadSafeDictionary _shouldInjectCache = new(); - private static readonly ThreadSafeDictionary> _injectionTasks = new(); /// /// Gets or creates an injection plan for the specified type. @@ -41,42 +39,4 @@ public static bool HasInjectableProperties(Type type) return plan.HasProperties; }); } - - /// - /// Ensures properties are injected into the specified instance. - /// Fast-path optimized for already-injected instances (zero allocation). - /// - public static async ValueTask EnsureInjectedAsync(object instance, Func injectionFactory) - { - if (_injectionTasks.TryGetValue(instance, out var existingTcs) && existingTcs.Task.IsCompleted) - { - if (existingTcs.Task.IsFaulted) - { - await existingTcs.Task.ConfigureAwait(false); - } - - return; - } - - var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - existingTcs = _injectionTasks.GetOrAdd(instance, _ => tcs); - - if (existingTcs == tcs) - { - try - { - await injectionFactory(instance).ConfigureAwait(false); - tcs.SetResult(true); - } - catch (Exception ex) - { - tcs.SetException(ex); - throw; - } - } - else - { - await existingTcs.Task.ConfigureAwait(false); - } - } } diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index 35993d71b6..38cf785996 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -21,8 +21,7 @@ internal sealed class TestBuilder : ITestBuilder private readonly string _sessionId; private readonly EventReceiverOrchestrator _eventReceiverOrchestrator; private readonly IContextProvider _contextProvider; - private readonly PropertyInjectionService _propertyInjectionService; - private readonly DataSourceInitializer _dataSourceInitializer; + private readonly ObjectLifecycleService _objectLifecycleService; private readonly Discovery.IHookDiscoveryService _hookDiscoveryService; private readonly TestArgumentRegistrationService _testArgumentRegistrationService; private readonly IMetadataFilterMatcher _filterMatcher; @@ -31,8 +30,7 @@ public TestBuilder( string sessionId, EventReceiverOrchestrator eventReceiverOrchestrator, IContextProvider contextProvider, - PropertyInjectionService propertyInjectionService, - DataSourceInitializer dataSourceInitializer, + ObjectLifecycleService objectLifecycleService, Discovery.IHookDiscoveryService hookDiscoveryService, TestArgumentRegistrationService testArgumentRegistrationService, IMetadataFilterMatcher filterMatcher) @@ -41,8 +39,7 @@ public TestBuilder( _hookDiscoveryService = hookDiscoveryService; _eventReceiverOrchestrator = eventReceiverOrchestrator; _contextProvider = contextProvider; - _propertyInjectionService = propertyInjectionService; - _dataSourceInitializer = dataSourceInitializer; + _objectLifecycleService = objectLifecycleService; _testArgumentRegistrationService = testArgumentRegistrationService; _filterMatcher = filterMatcher ?? throw new ArgumentNullException(nameof(filterMatcher)); } @@ -262,7 +259,7 @@ public async Task> BuildTestsFromMetadataAsy var tempObjectBag = new ConcurrentDictionary(); var tempEvents = new TestContextEvents(); - await _propertyInjectionService.InjectPropertiesIntoObjectAsync( + await _objectLifecycleService.RegisterObjectAsync( instanceForMethodDataSources, tempObjectBag, metadata.MethodMetadata, @@ -772,7 +769,7 @@ private async Task GetDataSourcesAsync(IDataSourceAttrib // Initialize all data sources to ensure properties are injected foreach (var dataSource in dataSources) { - await _dataSourceInitializer.EnsureInitializedAsync(dataSource); + await _objectLifecycleService.EnsureInitializedAsync(dataSource); } return dataSources; @@ -788,7 +785,7 @@ private async Task GetDataSourcesAsync(IDataSourceAttrib { // Ensure the data source is fully initialized before getting data rows // This includes property injection and IAsyncInitializer.InitializeAsync - var initializedDataSource = await _dataSourceInitializer.EnsureInitializedAsync( + var initializedDataSource = await _objectLifecycleService.EnsureInitializedAsync( dataSource, dataGeneratorMetadata.TestBuilderContext.Current.StateBag, dataGeneratorMetadata.TestInformation, @@ -952,7 +949,7 @@ private async Task InvokeTestRegisteredEventReceiversAsync(TestContext context) context.InternalDiscoveredTest = discoveredTest; // First, invoke the global test argument registration service to register shared instances - await _testArgumentRegistrationService.OnTestRegistered(registeredContext); + await _testArgumentRegistrationService.RegisterTestArgumentsAsync(context); var eventObjects = context.GetEligibleEventObjects(); @@ -1027,7 +1024,7 @@ private async Task InitializeAttributesAsync(Attribute[] attributes if (attribute is IDataSourceAttribute dataSource) { // Data source attributes need to be initialized with property injection - await _dataSourceInitializer.EnsureInitializedAsync(dataSource); + await _objectLifecycleService.EnsureInitializedAsync(dataSource); } } @@ -1395,7 +1392,7 @@ public async IAsyncEnumerable BuildTestsStreamingAsync( var tempObjectBag = new ConcurrentDictionary(); var tempEvents = new TestContextEvents(); - await _propertyInjectionService.InjectPropertiesIntoObjectAsync( + await _objectLifecycleService.RegisterObjectAsync( instanceForMethodDataSources, tempObjectBag, metadata.MethodMetadata, diff --git a/TUnit.Engine/Framework/TUnitServiceProvider.cs b/TUnit.Engine/Framework/TUnitServiceProvider.cs index ed2543909d..f64d64d004 100644 --- a/TUnit.Engine/Framework/TUnitServiceProvider.cs +++ b/TUnit.Engine/Framework/TUnitServiceProvider.cs @@ -51,9 +51,7 @@ public ITestExecutionFilter? Filter public TUnitInitializer Initializer { get; } public CancellationTokenSource FailFastCancellationSource { get; } public ParallelLimitLockProvider ParallelLimitLockProvider { get; } - public PropertyInjectionService PropertyInjectionService { get; } - public DataSourceInitializer DataSourceInitializer { get; } - public ObjectRegistrationService ObjectRegistrationService { get; } + public ObjectLifecycleService ObjectLifecycleService { get; } public bool AfterSessionHooksFailed { get; set; } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT/trimmed scenarios")] @@ -104,25 +102,27 @@ public TUnitServiceProvider(IExtension extension, loggerFactory.CreateLogger(), logLevelProvider)); - // Create initialization services - // Note: Circular dependency managed through two-phase initialization - // Phase 1: Create services with partial dependencies - DataSourceInitializer = Register(new DataSourceInitializer()); - PropertyInjectionService = Register(new PropertyInjectionService(DataSourceInitializer)); - ObjectRegistrationService = Register(new ObjectRegistrationService(PropertyInjectionService)); - - // Phase 2: Complete dependencies (Initialize methods accept IObjectRegistry to break circular dependency) - PropertyInjectionService.Initialize(ObjectRegistrationService); - DataSourceInitializer.Initialize(PropertyInjectionService); + // Create initialization services using Lazy to break circular dependencies + // No more two-phase initialization with Initialize() calls + var objectGraphDiscoveryService = Register(new ObjectGraphDiscoveryService()); + // Keep TrackableObjectGraphProvider for ObjectTracker (TUnit.Core dependency) var trackableObjectGraphProvider = new TrackableObjectGraphProvider(); var disposer = new Disposer(Logger); var objectTracker = new ObjectTracker(trackableObjectGraphProvider, disposer); + // Use Lazy to break circular dependency between PropertyInjector and ObjectLifecycleService + ObjectLifecycleService? objectLifecycleServiceInstance = null; + var lazyObjectLifecycleService = new Lazy(() => objectLifecycleServiceInstance!); + var lazyPropertyInjector = new Lazy(() => new PropertyInjector(lazyObjectLifecycleService, TestSessionId)); + + objectLifecycleServiceInstance = new ObjectLifecycleService(lazyPropertyInjector, objectGraphDiscoveryService, objectTracker); + ObjectLifecycleService = Register(objectLifecycleServiceInstance); + // Register the test argument registration service to handle object registration for shared instances - var testArgumentRegistrationService = Register(new TestArgumentRegistrationService(ObjectRegistrationService, objectTracker)); + var testArgumentRegistrationService = Register(new TestArgumentRegistrationService(ObjectLifecycleService)); TestFilterService = Register(new TestFilterService(Logger, testArgumentRegistrationService)); @@ -135,7 +135,7 @@ public TUnitServiceProvider(IExtension extension, CancellationToken = Register(new EngineCancellationToken()); - EventReceiverOrchestrator = Register(new EventReceiverOrchestrator(Logger, trackableObjectGraphProvider)); + EventReceiverOrchestrator = Register(new EventReceiverOrchestrator(Logger)); HookCollectionService = Register(new HookCollectionService(EventReceiverOrchestrator)); ParallelLimitLockProvider = Register(new ParallelLimitLockProvider()); @@ -174,7 +174,7 @@ public TUnitServiceProvider(IExtension extension, var dependencyExpander = Register(new MetadataDependencyExpander(filterMatcher)); var testBuilder = Register( - new TestBuilder(TestSessionId, EventReceiverOrchestrator, ContextProvider, PropertyInjectionService, DataSourceInitializer, hookDiscoveryService, testArgumentRegistrationService, filterMatcher)); + new TestBuilder(TestSessionId, EventReceiverOrchestrator, ContextProvider, ObjectLifecycleService, hookDiscoveryService, testArgumentRegistrationService, filterMatcher)); TestBuilderPipeline = Register( new TestBuilderPipeline( @@ -188,7 +188,7 @@ public TUnitServiceProvider(IExtension extension, // Create test finder service after discovery service so it can use its cache TestFinder = Register(new TestFinder(DiscoveryService)); - var testInitializer = new TestInitializer(EventReceiverOrchestrator, PropertyInjectionService, DataSourceInitializer, objectTracker); + var testInitializer = new TestInitializer(EventReceiverOrchestrator, ObjectLifecycleService); // Create the new TestCoordinator that orchestrates the granular services var testCoordinator = Register( diff --git a/TUnit.Engine/Services/DataSourceInitializer.cs b/TUnit.Engine/Services/DataSourceInitializer.cs deleted file mode 100644 index e69b0a385f..0000000000 --- a/TUnit.Engine/Services/DataSourceInitializer.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Collections.Concurrent; -using TUnit.Core; -using TUnit.Core.Interfaces; -using TUnit.Core.PropertyInjection; - -namespace TUnit.Engine.Services; - -/// -/// Centralized service responsible for initializing data source instances. -/// Ensures all data sources are properly initialized before use, regardless of where they're used -/// (properties, constructor arguments, or method arguments). -/// -internal sealed class DataSourceInitializer -{ - private readonly ConcurrentDictionary> _initializationTasks = new(); - private PropertyInjectionService? _propertyInjectionService; - - /// - /// Completes initialization by providing the PropertyInjectionService. - /// This two-phase initialization breaks the circular dependency. - /// - public void Initialize(PropertyInjectionService propertyInjectionService) - { - _propertyInjectionService = propertyInjectionService ?? throw new ArgumentNullException(nameof(propertyInjectionService)); - } - - /// - /// Ensures a data source instance is fully initialized before use. - /// This includes property injection and calling IAsyncInitializer if implemented. - /// Optimized with fast-path for already-initialized data sources. - /// - public async ValueTask EnsureInitializedAsync( - T dataSource, - ConcurrentDictionary? objectBag = null, - MethodMetadata? methodMetadata = null, - TestContextEvents? events = null, - CancellationToken cancellationToken = default) where T : notnull - { - if (dataSource == null) - { - throw new ArgumentNullException(nameof(dataSource)); - } - - // Fast path: Check if already initialized (avoids Task allocation) - if (_initializationTasks.TryGetValue(dataSource, out var existingTcs) && existingTcs.Task.IsCompleted) - { - // Already initialized - return synchronously without allocating a Task - if (existingTcs.Task.IsFaulted) - { - // Re-throw the original exception - await existingTcs.Task.ConfigureAwait(false); - } - - return dataSource; - } - - // Slow path: Need to initialize or wait for initialization - var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - existingTcs = _initializationTasks.GetOrAdd(dataSource, tcs); - - if (existingTcs == tcs) - { - try - { - await InitializeDataSourceAsync(dataSource, objectBag, methodMetadata, events, cancellationToken).ConfigureAwait(false); - tcs.SetResult(true); - } - catch (Exception ex) - { - tcs.SetException(ex); - throw; - } - } - else - { - // Another thread is initializing or already initialized - wait for it - await existingTcs.Task.ConfigureAwait(false); - - // Check cancellation after waiting - if (cancellationToken.CanBeCanceled) - { - cancellationToken.ThrowIfCancellationRequested(); - } - } - - return dataSource; - } - - /// - /// Initializes a data source instance with the complete lifecycle. - /// - private async Task InitializeDataSourceAsync( - object dataSource, - ConcurrentDictionary? objectBag, - MethodMetadata? methodMetadata, - TestContextEvents? events, - CancellationToken cancellationToken) - { - try - { - // Ensure we have required context - objectBag ??= new ConcurrentDictionary(); - events ??= new TestContextEvents(); - - // Initialize the data source directly here - // Step 1: Property injection (if PropertyInjectionService has been initialized) - if (_propertyInjectionService != null && PropertyInjectionCache.HasInjectableProperties(dataSource.GetType())) - { - await _propertyInjectionService.InjectPropertiesIntoObjectAsync( - dataSource, objectBag, methodMetadata, events); - } - - // Step 2: Initialize nested property-injected objects (deepest first) - // This ensures that when the parent's IAsyncInitializer runs, all nested objects are already initialized - await InitializeNestedObjectsAsync(dataSource, cancellationToken); - - // Step 3: IAsyncInitializer on the data source itself - if (dataSource is IAsyncInitializer asyncInitializer) - { - await ObjectInitializer.InitializeAsync(asyncInitializer, cancellationToken); - } - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Failed to initialize data source of type '{dataSource.GetType().Name}': {ex.Message}", ex); - } - } - - /// - /// Initializes all nested property-injected objects in depth-first order. - /// This ensures that when the parent's IAsyncInitializer runs, all nested dependencies are already initialized. - /// - private async Task InitializeNestedObjectsAsync(object rootObject, CancellationToken cancellationToken) - { - var objectsByDepth = new Dictionary>(capacity: 4); - var visitedObjects = new HashSet(); - - // Collect all nested property-injected objects grouped by depth - CollectNestedObjects(rootObject, objectsByDepth, visitedObjects, currentDepth: 1); - - // Initialize objects deepest-first (highest depth to lowest) - var depths = objectsByDepth.Keys.OrderByDescending(depth => depth); - - foreach (var depth in depths) - { - var objectsAtDepth = objectsByDepth[depth]; - - // Initialize all objects at this depth in parallel - await Task.WhenAll(objectsAtDepth.Select(obj => ObjectInitializer.InitializeAsync(obj, cancellationToken).AsTask())); - } - } - - /// - /// Recursively collects all nested property-injected objects grouped by depth. - /// - private void CollectNestedObjects( - object obj, - Dictionary> objectsByDepth, - HashSet visitedObjects, - int currentDepth) - { - var plan = PropertyInjectionCache.GetOrCreatePlan(obj.GetType()); - - // Use whichever properties are available in the plan - // For closed generic types, source-gen may not have registered them, so use reflection fallback - if (plan.SourceGeneratedProperties.Length > 0) - { - // Source-generated mode - foreach (var metadata in plan.SourceGeneratedProperties) - { - var property = metadata.ContainingType.GetProperty(metadata.PropertyName); - - if (property == null || !property.CanRead) - { - continue; - } - - var value = property.GetValue(obj); - - if (value == null || !visitedObjects.Add(value)) - { - continue; - } - - // Add to the current depth level if it has injectable properties or implements IAsyncInitializer - if (PropertyInjectionCache.HasInjectableProperties(value.GetType()) || value is IAsyncInitializer) - { - if (!objectsByDepth.ContainsKey(currentDepth)) - { - objectsByDepth[currentDepth] = []; - } - - objectsByDepth[currentDepth].Add(value); - } - - // Recursively collect nested objects - if (PropertyInjectionCache.HasInjectableProperties(value.GetType())) - { - CollectNestedObjects(value, objectsByDepth, visitedObjects, currentDepth + 1); - } - } - } - else if (plan.ReflectionProperties.Length > 0) - { - // Reflection mode fallback - foreach (var prop in plan.ReflectionProperties) - { - var value = prop.Property.GetValue(obj); - - if (value == null || !visitedObjects.Add(value)) - { - continue; - } - - // Add to the current depth level if it has injectable properties or implements IAsyncInitializer - if (PropertyInjectionCache.HasInjectableProperties(value.GetType()) || value is IAsyncInitializer) - { - if (!objectsByDepth.ContainsKey(currentDepth)) - { - objectsByDepth[currentDepth] = []; - } - - objectsByDepth[currentDepth].Add(value); - } - - // Recursively collect nested objects - if (PropertyInjectionCache.HasInjectableProperties(value.GetType())) - { - CollectNestedObjects(value, objectsByDepth, visitedObjects, currentDepth + 1); - } - } - } - } - - /// - /// Clears the initialization cache. Should be called at the end of test sessions. - /// - public void ClearCache() - { - _initializationTasks.Clear(); - } -} diff --git a/TUnit.Engine/Services/EventReceiverOrchestrator.cs b/TUnit.Engine/Services/EventReceiverOrchestrator.cs index 014221efca..0d127feb35 100644 --- a/TUnit.Engine/Services/EventReceiverOrchestrator.cs +++ b/TUnit.Engine/Services/EventReceiverOrchestrator.cs @@ -5,7 +5,6 @@ using TUnit.Core.Enums; using TUnit.Core.Helpers; using TUnit.Core.Interfaces; -using TUnit.Core.Tracking; using TUnit.Engine.Events; using TUnit.Engine.Extensions; using TUnit.Engine.Logging; @@ -17,7 +16,6 @@ internal sealed class EventReceiverOrchestrator : IDisposable { private readonly EventReceiverRegistry _registry = new(); private readonly TUnitFrameworkLogger _logger; - private readonly TrackableObjectGraphProvider _trackableObjectGraphProvider; // Track which assemblies/classes/sessions have had their "first" event invoked private ThreadSafeDictionary _firstTestInAssemblyTasks = new(); @@ -35,10 +33,9 @@ internal sealed class EventReceiverOrchestrator : IDisposable // Track registered First event receiver types to avoid duplicate registrations private readonly ConcurrentHashSet _registeredFirstEventReceiverTypes = new(); - public EventReceiverOrchestrator(TUnitFrameworkLogger logger, TrackableObjectGraphProvider trackableObjectGraphProvider) + public EventReceiverOrchestrator(TUnitFrameworkLogger logger) { _logger = logger; - _trackableObjectGraphProvider = trackableObjectGraphProvider; } public void RegisterReceivers(TestContext context, CancellationToken cancellationToken) diff --git a/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs b/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs new file mode 100644 index 0000000000..8d5e46f7f9 --- /dev/null +++ b/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs @@ -0,0 +1,198 @@ +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using TUnit.Core; +using TUnit.Core.PropertyInjection; + +namespace TUnit.Engine.Services; + +/// +/// Centralized service for discovering and organizing object graphs. +/// Eliminates duplicate graph traversal logic that was scattered across +/// PropertyInjectionService, DataSourceInitializer, and TrackableObjectGraphProvider. +/// Follows Single Responsibility Principle - only discovers objects, doesn't modify them. +/// +internal sealed class ObjectGraphDiscoveryService +{ + /// + /// Discovers all objects from test context arguments and properties, organized by depth level. + /// Depth 0 = root objects (class args, method args, property values) + /// Depth 1+ = nested objects found in properties of objects at previous depth + /// + public ObjectGraph DiscoverObjectGraph(TestContext testContext) + { + var objectsByDepth = new ConcurrentDictionary>(); + var allObjects = new HashSet(); + var visitedObjects = new HashSet(); + + var testDetails = testContext.Metadata.TestDetails; + + // Collect root-level objects (depth 0) + foreach (var classArgument in testDetails.TestClassArguments) + { + if (classArgument != null && visitedObjects.Add(classArgument)) + { + AddToDepth(objectsByDepth, 0, classArgument); + allObjects.Add(classArgument); + DiscoverNestedObjects(classArgument, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); + } + } + + foreach (var methodArgument in testDetails.TestMethodArguments) + { + if (methodArgument != null && visitedObjects.Add(methodArgument)) + { + AddToDepth(objectsByDepth, 0, methodArgument); + allObjects.Add(methodArgument); + DiscoverNestedObjects(methodArgument, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); + } + } + + foreach (var property in testDetails.TestClassInjectedPropertyArguments.Values) + { + if (property != null && visitedObjects.Add(property)) + { + AddToDepth(objectsByDepth, 0, property); + allObjects.Add(property); + DiscoverNestedObjects(property, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); + } + } + + return new ObjectGraph(objectsByDepth, allObjects); + } + + /// + /// Discovers nested objects from a single root object, organized by depth. + /// Used for discovering objects within a data source or property value. + /// + public ObjectGraph DiscoverNestedObjectGraph(object rootObject) + { + var objectsByDepth = new ConcurrentDictionary>(); + var allObjects = new HashSet(); + var visitedObjects = new HashSet(); + + if (visitedObjects.Add(rootObject)) + { + AddToDepth(objectsByDepth, 0, rootObject); + allObjects.Add(rootObject); + DiscoverNestedObjects(rootObject, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); + } + + return new ObjectGraph(objectsByDepth, allObjects); + } + + /// + /// Recursively discovers nested objects that have injectable properties. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property discovery handles both AOT and reflection modes")] + private void DiscoverNestedObjects( + object obj, + ConcurrentDictionary> objectsByDepth, + HashSet visitedObjects, + HashSet allObjects, + int currentDepth) + { + var plan = PropertyInjectionCache.GetOrCreatePlan(obj.GetType()); + + if (!plan.HasProperties) + { + return; + } + + // Use source-generated properties if available, otherwise fall back to reflection + if (plan.SourceGeneratedProperties.Length > 0) + { + foreach (var metadata in plan.SourceGeneratedProperties) + { + var property = metadata.ContainingType.GetProperty(metadata.PropertyName); + if (property == null || !property.CanRead) + { + continue; + } + + var value = property.GetValue(obj); + if (value == null || !visitedObjects.Add(value)) + { + continue; + } + + AddToDepth(objectsByDepth, currentDepth, value); + allObjects.Add(value); + + // Recursively discover if this value has injectable properties + if (PropertyInjectionCache.HasInjectableProperties(value.GetType())) + { + DiscoverNestedObjects(value, objectsByDepth, visitedObjects, allObjects, currentDepth + 1); + } + } + } + else if (plan.ReflectionProperties.Length > 0) + { + foreach (var (property, _) in plan.ReflectionProperties) + { + var value = property.GetValue(obj); + if (value == null || !visitedObjects.Add(value)) + { + continue; + } + + AddToDepth(objectsByDepth, currentDepth, value); + allObjects.Add(value); + + // Recursively discover if this value has injectable properties + if (PropertyInjectionCache.HasInjectableProperties(value.GetType())) + { + DiscoverNestedObjects(value, objectsByDepth, visitedObjects, allObjects, currentDepth + 1); + } + } + } + } + + private static void AddToDepth(ConcurrentDictionary> objectsByDepth, int depth, object obj) + { + objectsByDepth.GetOrAdd(depth, _ => []).Add(obj); + } +} + +/// +/// Represents a discovered object graph organized by depth level. +/// +internal sealed class ObjectGraph +{ + public ObjectGraph(ConcurrentDictionary> objectsByDepth, HashSet allObjects) + { + ObjectsByDepth = objectsByDepth; + AllObjects = allObjects; + MaxDepth = objectsByDepth.Count > 0 ? objectsByDepth.Keys.Max() : -1; + } + + /// + /// Objects organized by depth (0 = root arguments, 1+ = nested). + /// + public ConcurrentDictionary> ObjectsByDepth { get; } + + /// + /// All unique objects in the graph. + /// + public HashSet AllObjects { get; } + + /// + /// Maximum nesting depth (-1 if empty). + /// + public int MaxDepth { get; } + + /// + /// Gets objects at a specific depth level. + /// + public IEnumerable GetObjectsAtDepth(int depth) + { + return ObjectsByDepth.TryGetValue(depth, out var objects) ? objects : []; + } + + /// + /// Gets depth levels in descending order (deepest first). + /// + public IEnumerable GetDepthsDescending() + { + return ObjectsByDepth.Keys.OrderByDescending(d => d); + } +} diff --git a/TUnit.Engine/Services/ObjectLifecycleService.cs b/TUnit.Engine/Services/ObjectLifecycleService.cs new file mode 100644 index 0000000000..f554d07ea0 --- /dev/null +++ b/TUnit.Engine/Services/ObjectLifecycleService.cs @@ -0,0 +1,338 @@ +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using TUnit.Core; +using TUnit.Core.Interfaces; +using TUnit.Core.PropertyInjection; +using TUnit.Core.PropertyInjection.Initialization; +using TUnit.Core.Tracking; + +namespace TUnit.Engine.Services; + +/// +/// Unified service for managing object lifecycle. +/// Orchestrates: registration, property injection, initialization (IAsyncInitializer), and tracking. +/// Replaces the fragmented: PropertyInjectionService, DataSourceInitializer, PropertyInitializationOrchestrator, +/// PropertyDataResolver, and ObjectRegistrationService. +/// +/// Uses Lazy<T> for dependencies to break circular references without manual Initialize() calls. +/// Follows clear phase separation: Register → Inject → Initialize → Cleanup. +/// +internal sealed class ObjectLifecycleService : IObjectRegistry +{ + private readonly Lazy _propertyInjector; + private readonly ObjectGraphDiscoveryService _objectGraphDiscoveryService; + private readonly ObjectTracker _objectTracker; + + // Track initialization state per object + private readonly ConcurrentDictionary> _initializationTasks = new(); + + public ObjectLifecycleService( + Lazy propertyInjector, + ObjectGraphDiscoveryService objectGraphDiscoveryService, + ObjectTracker objectTracker) + { + _propertyInjector = propertyInjector; + _objectGraphDiscoveryService = objectGraphDiscoveryService; + _objectTracker = objectTracker; + } + + private PropertyInjector PropertyInjector => _propertyInjector.Value; + + #region Phase 1: Registration (Discovery Time) + + /// + /// Registers a test for lifecycle management during discovery. + /// Resolves and caches property values (to create shared objects early) without setting them on the placeholder instance. + /// Tracks the resolved objects so reference counting works correctly across all tests. + /// Does NOT call IAsyncInitializer (deferred to execution). + /// + public async Task RegisterTestAsync(TestContext testContext) + { + var objectBag = testContext.StateBag.Items; + var methodMetadata = testContext.Metadata.TestDetails.MethodMetadata; + var events = testContext.InternalEvents; + var testClassType = testContext.Metadata.TestDetails.ClassType; + + // Resolve property values (creating shared objects) and cache them WITHOUT setting on placeholder instance + // This ensures shared objects are created once and tracked with the correct reference count + await PropertyInjector.ResolveAndCachePropertiesAsync(testClassType, objectBag, methodMetadata, events, testContext); + + // Track the cached objects so they get the correct reference count + _objectTracker.TrackObjects(testContext); + } + + /// + /// IObjectRegistry implementation - registers a single object. + /// Injects properties but does NOT call IAsyncInitializer (deferred to execution). + /// + public async Task RegisterObjectAsync( + object instance, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events) + { + if (instance == null) + { + throw new ArgumentNullException(nameof(instance)); + } + + // Inject properties during registration + await PropertyInjector.InjectPropertiesAsync(instance, objectBag, methodMetadata, events); + } + + /// + /// IObjectRegistry implementation - registers multiple argument objects. + /// + public async Task RegisterArgumentsAsync( + object?[] arguments, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events) + { + if (arguments == null || arguments.Length == 0) + { + return; + } + + var tasks = new List(); + foreach (var argument in arguments) + { + if (argument != null) + { + tasks.Add(RegisterObjectAsync(argument, objectBag, methodMetadata, events)); + } + } + + await Task.WhenAll(tasks); + } + + #endregion + + #region Phase 2: Preparation (Execution Time) + + /// + /// Prepares a test for execution. + /// Sets already-resolved cached property values on the current instance and initializes tracked objects. + /// This is needed because retries create new instances that don't have properties set yet. + /// + public async Task PrepareTestAsync(TestContext testContext, CancellationToken cancellationToken) + { + var testClassInstance = testContext.Metadata.TestDetails.ClassInstance; + + // Set already-cached property values on the current instance + // Properties were resolved and cached during RegisterTestAsync, so shared objects are already created + // We just need to set them on the actual test instance (retries create new instances) + SetCachedPropertiesOnInstance(testClassInstance, testContext); + + // Initialize all tracked objects (IAsyncInitializer) depth-first + await InitializeTrackedObjectsAsync(testContext, cancellationToken); + } + + /// + /// Sets already-cached property values on a test class instance. + /// This is used to apply cached property values to new instances created during retries. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] + private void SetCachedPropertiesOnInstance(object instance, TestContext testContext) + { + var plan = PropertyInjectionCache.GetOrCreatePlan(instance.GetType()); + + if (!plan.HasProperties) + { + return; + } + + var cachedProperties = testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments; + + if (plan.SourceGeneratedProperties.Length > 0) + { + foreach (var metadata in plan.SourceGeneratedProperties) + { + var cacheKey = $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + + if (cachedProperties.TryGetValue(cacheKey, out var cachedValue) && cachedValue != null) + { + // Set the cached value on the new instance + metadata.SetProperty(instance, cachedValue); + } + } + } + else if (plan.ReflectionProperties.Length > 0) + { + foreach (var (property, _) in plan.ReflectionProperties) + { + var cacheKey = $"{property.DeclaringType!.FullName}.{property.Name}"; + + if (cachedProperties.TryGetValue(cacheKey, out var cachedValue) && cachedValue != null) + { + // Set the cached value on the new instance + var setter = PropertySetterFactory.CreateSetter(property); + setter(instance, cachedValue); + } + } + } + } + + /// + /// Initializes all tracked objects depth-first (deepest objects first). + /// + private async Task InitializeTrackedObjectsAsync(TestContext testContext, CancellationToken cancellationToken) + { + var levels = testContext.TrackedObjects.Keys.OrderByDescending(level => level); + + foreach (var level in levels) + { + var objectsAtLevel = testContext.TrackedObjects[level]; + + // Initialize all objects at this depth in parallel + await Task.WhenAll(objectsAtLevel.Select(obj => + EnsureInitializedAsync( + obj, + testContext.StateBag.Items, + testContext.Metadata.TestDetails.MethodMetadata, + testContext.InternalEvents, + cancellationToken).AsTask())); + } + + // Finally initialize the test class itself + await EnsureInitializedAsync( + testContext.Metadata.TestDetails.ClassInstance, + testContext.StateBag.Items, + testContext.Metadata.TestDetails.MethodMetadata, + testContext.InternalEvents, + cancellationToken); + } + + #endregion + + #region Phase 3: Object Initialization + + /// + /// Ensures an object is fully initialized (property injection + IAsyncInitializer). + /// Thread-safe with fast-path for already-initialized objects. + /// + public async ValueTask EnsureInitializedAsync( + T obj, + ConcurrentDictionary? objectBag = null, + MethodMetadata? methodMetadata = null, + TestContextEvents? events = null, + CancellationToken cancellationToken = default) where T : notnull + { + if (obj == null) + { + throw new ArgumentNullException(nameof(obj)); + } + + // Fast path: already initialized + if (_initializationTasks.TryGetValue(obj, out var existingTcs) && existingTcs.Task.IsCompleted) + { + if (existingTcs.Task.IsFaulted) + { + await existingTcs.Task.ConfigureAwait(false); + } + return obj; + } + + // Slow path: need to initialize + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + existingTcs = _initializationTasks.GetOrAdd(obj, tcs); + + if (existingTcs == tcs) + { + try + { + await InitializeObjectCoreAsync(obj, objectBag, methodMetadata, events, cancellationToken); + tcs.SetResult(true); + } + catch (Exception ex) + { + tcs.SetException(ex); + throw; + } + } + else + { + await existingTcs.Task.ConfigureAwait(false); + cancellationToken.ThrowIfCancellationRequested(); + } + + return obj; + } + + /// + /// Core initialization: property injection + nested objects + IAsyncInitializer. + /// + private async Task InitializeObjectCoreAsync( + object obj, + ConcurrentDictionary? objectBag, + MethodMetadata? methodMetadata, + TestContextEvents? events, + CancellationToken cancellationToken) + { + objectBag ??= new ConcurrentDictionary(); + events ??= new TestContextEvents(); + + try + { + // Step 1: Inject properties + await PropertyInjector.InjectPropertiesAsync(obj, objectBag, methodMetadata, events); + + // Step 2: Initialize nested objects depth-first + await InitializeNestedObjectsAsync(obj, cancellationToken); + + // Step 3: Call IAsyncInitializer on the object itself + if (obj is IAsyncInitializer asyncInitializer) + { + await ObjectInitializer.InitializeAsync(asyncInitializer, cancellationToken); + } + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Failed to initialize object of type '{obj.GetType().Name}': {ex.Message}", ex); + } + } + + /// + /// Initializes nested objects depth-first using the centralized ObjectGraphDiscoveryService. + /// + private async Task InitializeNestedObjectsAsync(object rootObject, CancellationToken cancellationToken) + { + var graph = _objectGraphDiscoveryService.DiscoverNestedObjectGraph(rootObject); + + // Initialize from deepest to shallowest (skip depth 0 which is the root itself) + foreach (var depth in graph.GetDepthsDescending()) + { + if (depth == 0) continue; // Root handled separately + + var objectsAtDepth = graph.GetObjectsAtDepth(depth); + + await Task.WhenAll(objectsAtDepth + .Where(obj => obj is IAsyncInitializer) + .Select(obj => ObjectInitializer.InitializeAsync(obj, cancellationToken).AsTask())); + } + } + + #endregion + + #region Phase 4: Cleanup + + /// + /// Cleans up after test execution. + /// Decrements reference counts and disposes objects when count reaches zero. + /// + public async Task CleanupTestAsync(TestContext testContext, List cleanupExceptions) + { + await _objectTracker.UntrackObjects(testContext, cleanupExceptions); + } + + #endregion + + /// + /// Clears the initialization cache. Called at end of test session. + /// + public void ClearCache() + { + _initializationTasks.Clear(); + } +} diff --git a/TUnit.Engine/Services/ObjectRegistrationService.cs b/TUnit.Engine/Services/ObjectRegistrationService.cs deleted file mode 100644 index 26b8bc2bbe..0000000000 --- a/TUnit.Engine/Services/ObjectRegistrationService.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; -using TUnit.Core; -using TUnit.Core.PropertyInjection; -using TUnit.Core.Tracking; - -namespace TUnit.Engine.Services; - -/// -/// Handles object registration during the test discovery/registration phase. -/// Responsibilities: Create instances, inject properties, track for disposal (ONCE per object). -/// Does NOT call IAsyncInitializer - that's deferred to ObjectInitializationService during execution. -/// -internal sealed class ObjectRegistrationService : IObjectRegistry -{ - private readonly PropertyInjectionService _propertyInjectionService; - - public ObjectRegistrationService( - PropertyInjectionService propertyInjectionService) - { - _propertyInjectionService = propertyInjectionService ?? throw new ArgumentNullException(nameof(propertyInjectionService)); - } - - /// - /// Registers a single object during the registration phase. - /// Injects properties, tracks for disposal (once), but does NOT call IAsyncInitializer. - /// - /// The object instance to register. Must not be null. - /// Shared object bag for the test context. Must not be null. - /// Method metadata for the test. Can be null. - /// Test context events for tracking. Must not be null and must be unique per test permutation. - public async Task RegisterObjectAsync( - object instance, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events) - { - if (instance == null) - { - throw new ArgumentNullException(nameof(instance)); - } - - if (objectBag == null) - { - throw new ArgumentNullException(nameof(objectBag)); - } - - if (events == null) - { - throw new ArgumentNullException(nameof(events), "TestContextEvents must not be null. Each test permutation must have a unique TestContextEvents instance for proper disposal tracking."); - } - - if (RequiresPropertyInjection(instance)) - { - await _propertyInjectionService.InjectPropertiesIntoObjectAsync( - instance, - objectBag, - methodMetadata, - events); - } - } - - /// - /// Registers multiple objects (e.g., constructor/method arguments) in parallel. - /// Used during test registration to prepare arguments without executing expensive operations. - /// - public async Task RegisterArgumentsAsync( - object?[] arguments, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events) - { - if (arguments == null || arguments.Length == 0) - { - return; - } - - // Process arguments in parallel for performance - var tasks = new List(); - foreach (var argument in arguments) - { - if (argument != null) - { - tasks.Add(RegisterObjectAsync(argument, objectBag, methodMetadata, events)); - } - } - - await Task.WhenAll(tasks); - } - - /// - /// Determines if an object requires property injection. - /// - #if NET6_0_OR_GREATER - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property injection cache handles both AOT and reflection modes appropriately")] - #endif - private bool RequiresPropertyInjection(object instance) - { - return PropertyInjectionCache.HasInjectableProperties(instance.GetType()); - } -} diff --git a/TUnit.Engine/Services/PropertyDataResolver.cs b/TUnit.Engine/Services/PropertyDataResolver.cs deleted file mode 100644 index bd50c6d5fc..0000000000 --- a/TUnit.Engine/Services/PropertyDataResolver.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; -using TUnit.Core; -using TUnit.Core.Helpers; -using TUnit.Core.Interfaces; -using TUnit.Core.PropertyInjection; -using TUnit.Core.PropertyInjection.Initialization; - -namespace TUnit.Engine.Services; - -/// -/// Handles all data source resolution logic for property initialization. -/// Follows Single Responsibility Principle by focusing only on data resolution. -/// -internal static class PropertyDataResolver -{ - /// - /// Resolves data from a property's data source. - /// -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode("Property data resolution uses reflection on property types")] -#endif - public static async Task ResolvePropertyDataAsync(PropertyInitializationContext context, DataSourceInitializer dataSourceInitializer, IObjectRegistry objectRegistry) - { - var dataSource = await GetInitializedDataSourceAsync(context, dataSourceInitializer); - if (dataSource == null) - { - return null; - } - - var dataGeneratorMetadata = CreateDataGeneratorMetadata(context, dataSource); - var dataRows = dataSource.GetDataRowsAsync(dataGeneratorMetadata); - - // Get the first value from the data source - await foreach (var factory in dataRows) - { - var args = await factory(); - var value = ResolveValueFromArgs(context.PropertyType, args); - - // Resolve any Func wrappers - value = await ResolveDelegateValue(value); - - // Initialize the resolved value if needed - if (value != null) - { - // Ensure the value is fully initialized (property injection + IAsyncInitializer) - // DataSourceInitializer handles both data sources and regular objects - if (value is IDataSourceAttribute dataSourceValue) - { - value = await dataSourceInitializer.EnsureInitializedAsync( - dataSourceValue, - context.ObjectBag, - context.MethodMetadata, - context.Events); - } - else if (PropertyInjectionCache.HasInjectableProperties(value.GetType()) || value is IAsyncInitializer) - { - value = await dataSourceInitializer.EnsureInitializedAsync( - value, - context.ObjectBag, - context.MethodMetadata, - context.Events); - } - - return value; - } - } - - return null; - } - - /// - /// Gets an initialized data source from the context. - /// Ensures the data source is fully initialized (including property injection) before returning it. - /// - private static async Task GetInitializedDataSourceAsync(PropertyInitializationContext context, DataSourceInitializer dataSourceInitializer) - { - IDataSourceAttribute? dataSource = null; - - if (context.DataSource != null) - { - dataSource = context.DataSource; - } - else if (context.SourceGeneratedMetadata != null) - { - // Create a new data source instance - dataSource = context.SourceGeneratedMetadata.CreateDataSource(); - } - - if (dataSource == null) - { - return null; - } - - // Ensure the data source is fully initialized before use - // This handles property injection and IAsyncInitializer - return await dataSourceInitializer.EnsureInitializedAsync( - dataSource, - context.ObjectBag, - context.MethodMetadata, - context.Events); - } - - /// - /// Creates data generator metadata for the property. - /// -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode("Data generator metadata creation uses reflection on property types")] -#endif - private static DataGeneratorMetadata CreateDataGeneratorMetadata( - PropertyInitializationContext context, - IDataSourceAttribute dataSource) - { - if (context.SourceGeneratedMetadata != null) - { - // Source-generated mode - if (context.SourceGeneratedMetadata.ContainingType == null) - { - throw new InvalidOperationException( - $"ContainingType is null for property '{context.PropertyName}'. " + - $"This may indicate an issue with source generator for type '{context.PropertyType.Name}'."); - } - - var propertyMetadata = new PropertyMetadata - { - IsStatic = false, - Name = context.PropertyName, - ClassMetadata = ClassMetadataHelper.GetOrCreateClassMetadata(context.SourceGeneratedMetadata.ContainingType), - Type = context.PropertyType, - ReflectionInfo = PropertyHelper.GetPropertyInfo(context.SourceGeneratedMetadata.ContainingType, context.PropertyName), - Getter = parent => PropertyHelper.GetPropertyInfo(context.SourceGeneratedMetadata.ContainingType, context.PropertyName).GetValue(parent!)!, - ContainingTypeMetadata = ClassMetadataHelper.GetOrCreateClassMetadata(context.SourceGeneratedMetadata.ContainingType) - }; - - return DataGeneratorMetadataCreator.CreateForPropertyInjection( - propertyMetadata, - context.MethodMetadata, - dataSource, - context.TestContext, - context.TestContext?.Metadata.TestDetails.ClassInstance, - context.Events, - context.ObjectBag); - } - else if (context.PropertyInfo != null) - { - // Reflection mode - return DataGeneratorMetadataCreator.CreateForPropertyInjection( - context.PropertyInfo, - context.PropertyInfo.DeclaringType!, - context.MethodMetadata, - dataSource, - context.TestContext, - context.Instance, - context.Events, - context.ObjectBag); - } - - throw new InvalidOperationException("Cannot create data generator metadata: no property information available"); - } - - /// - /// Resolves value from data source arguments, handling tuples. - /// -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode("Value resolution may create tuple types dynamically")] -#endif - private static object? ResolveValueFromArgs( - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] - Type propertyType, - object?[]? args) - { - return TupleValueResolver.ResolveTupleValue(propertyType, args); - } - - /// - /// Resolves delegate values by invoking them. - /// - private static async ValueTask ResolveDelegateValue(object? value) - { - return await PropertyValueProcessor.ResolveTestDataValueAsync(typeof(object), value); - } -} diff --git a/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs b/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs deleted file mode 100644 index 2b7e3ab34b..0000000000 --- a/TUnit.Engine/Services/PropertyInitializationOrchestrator.cs +++ /dev/null @@ -1,213 +0,0 @@ -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using TUnit.Core; -using TUnit.Core.Interfaces.SourceGenerator; -using TUnit.Core.PropertyInjection; -using TUnit.Core.PropertyInjection.Initialization; - -namespace TUnit.Engine.Services; - -/// -/// Orchestrates the entire property initialization process. -/// Coordinates between different components and manages the initialization flow. -/// -internal sealed class PropertyInitializationOrchestrator -{ - internal readonly DataSourceInitializer _dataSourceInitializer; - private readonly IObjectRegistry _objectRegistry; - - public PropertyInitializationOrchestrator(DataSourceInitializer dataSourceInitializer, IObjectRegistry? objectRegistry) - { - _dataSourceInitializer = dataSourceInitializer ?? throw new ArgumentNullException(nameof(dataSourceInitializer)); - _objectRegistry = objectRegistry!; - } - - /// - /// Initializes all properties for an instance using source-generated metadata. - /// Properties are initialized in parallel for better performance. - /// - private async Task InitializeSourceGeneratedPropertiesAsync( - object instance, - PropertyInjectionMetadata[] properties, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events, - ConcurrentDictionary visitedObjects) - { - if (properties.Length == 0) - { - return; - } - - var tasks = properties.Select(metadata => - InitializeSourceGeneratedPropertyAsync(instance, metadata, objectBag, methodMetadata, events, visitedObjects)); - - await Task.WhenAll(tasks); - } - - /// - /// Initializes all properties for an instance using reflection. - /// Properties are initialized in parallel for better performance. - /// -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode("Reflection-based property initialization uses PropertyInfo")] -#endif - private async Task InitializeReflectionPropertiesAsync( - object instance, - (PropertyInfo Property, IDataSourceAttribute DataSource)[] properties, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events, - ConcurrentDictionary visitedObjects) - { - if (properties.Length == 0) - { - return; - } - - var tasks = properties.Select(pair => - InitializeReflectionPropertyAsync(instance, pair.Property, pair.DataSource, objectBag, methodMetadata, events, visitedObjects)); - - await Task.WhenAll(tasks); - } - - /// - /// Initializes a single property using source-generated metadata. - /// - #if NET6_0_OR_GREATER - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property data resolver is called for source-generated properties which are AOT-safe")] - #endif - private async Task InitializeSourceGeneratedPropertyAsync( - object instance, - PropertyInjectionMetadata metadata, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events, - ConcurrentDictionary visitedObjects) - { - object? resolvedValue = null; - var testContext = TestContext.Current; - - // Check if property was pre-resolved during registration - if (testContext?.Metadata.TestDetails.TestClassInjectedPropertyArguments.TryGetValue(metadata.PropertyName, out resolvedValue) == true) - { - // Use pre-resolved value - it was already initialized during first resolution - } - else - { - // Resolve the property value from the data source - resolvedValue = await PropertyDataResolver.ResolvePropertyDataAsync( - new PropertyInitializationContext - { - Instance = instance, - SourceGeneratedMetadata = metadata, - PropertyName = metadata.PropertyName, - PropertyType = metadata.PropertyType, - PropertySetter = metadata.SetProperty, - ObjectBag = objectBag, - MethodMetadata = methodMetadata, - Events = events, - VisitedObjects = visitedObjects, - TestContext = testContext, - IsNestedProperty = false - }, - _dataSourceInitializer, - _objectRegistry); - - if (resolvedValue == null) - { - return; - } - } - - // Set the property value - metadata.SetProperty(instance, resolvedValue); - - // Store for potential reuse (using TryAdd for thread-safe concurrent access) - if (testContext != null) - { - ((ConcurrentDictionary)testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments) - .TryAdd(metadata.PropertyName, resolvedValue); - } - } - - /// - /// Initializes a single property using reflection. - /// - #if NET6_0_OR_GREATER - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection-based property initialization is only used in reflection mode, not in AOT")] - #endif - private async Task InitializeReflectionPropertyAsync( - object instance, - PropertyInfo property, - IDataSourceAttribute dataSource, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events, - ConcurrentDictionary visitedObjects) - { - var testContext = TestContext.Current; - var propertySetter = PropertySetterFactory.CreateSetter(property); - - // Resolve the property value from the data source - var resolvedValue = await PropertyDataResolver.ResolvePropertyDataAsync( - new PropertyInitializationContext - { - Instance = instance, - PropertyInfo = property, - DataSource = dataSource, - PropertyName = property.Name, - PropertyType = property.PropertyType, - PropertySetter = propertySetter, - ObjectBag = objectBag, - MethodMetadata = methodMetadata, - Events = events, - VisitedObjects = visitedObjects, - TestContext = testContext, - IsNestedProperty = false - }, - _dataSourceInitializer, - _objectRegistry); - - if (resolvedValue == null) - { - return; - } - - // Set the property value - propertySetter(instance, resolvedValue); - } - - /// - /// Handles the complete initialization flow for an object with properties. - /// - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Specific source gen path")] - public async Task InitializeObjectWithPropertiesAsync( - object instance, - PropertyInjectionPlan plan, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events, - ConcurrentDictionary visitedObjects) - { - if (plan.HasProperties == false) - { - return; - } - - // Initialize properties based on what's available in the plan - // For closed generic types, source-gen may not have registered them, so use reflection fallback - if (plan.SourceGeneratedProperties.Length > 0) - { - await InitializeSourceGeneratedPropertiesAsync( - instance, plan.SourceGeneratedProperties, objectBag, methodMetadata, events, visitedObjects); - } - else if (plan.ReflectionProperties.Length > 0) - { - await InitializeReflectionPropertiesAsync( - instance, plan.ReflectionProperties, objectBag, methodMetadata, events, visitedObjects); - } - } - -} diff --git a/TUnit.Engine/Services/PropertyInjectionService.cs b/TUnit.Engine/Services/PropertyInjectionService.cs deleted file mode 100644 index de10b2dfb7..0000000000 --- a/TUnit.Engine/Services/PropertyInjectionService.cs +++ /dev/null @@ -1,206 +0,0 @@ -using System.Collections.Concurrent; -using TUnit.Core; -using TUnit.Core.PropertyInjection; - -namespace TUnit.Engine.Services; - -/// -/// Internal service for property injection. -/// Used by ObjectRegistrationService during registration phase. -/// -internal sealed class PropertyInjectionService -{ - private readonly DataSourceInitializer _dataSourceInitializer; - private PropertyInitializationOrchestrator _orchestrator; - - // Simple object pool for visited objects dictionaries to reduce allocations - private static readonly ConcurrentBag> _visitedObjectsPool = new(); - - public PropertyInjectionService(DataSourceInitializer dataSourceInitializer) - { - _dataSourceInitializer = dataSourceInitializer ?? throw new ArgumentNullException(nameof(dataSourceInitializer)); - _orchestrator = new PropertyInitializationOrchestrator(dataSourceInitializer, null!); - } - - /// - /// Completes initialization by providing the ObjectRegistrationService as IObjectRegistry. - /// This two-phase initialization breaks the circular dependency while maintaining type safety. - /// - public void Initialize(IObjectRegistry objectRegistry) - { - _orchestrator = new PropertyInitializationOrchestrator(_dataSourceInitializer, objectRegistry); - } - - /// - /// Injects properties with data sources into argument objects just before test execution. - /// This ensures properties are only initialized when the test is about to run. - /// Arguments are processed in parallel for better performance. - /// - public async Task InjectPropertiesIntoArgumentsAsync(object?[] arguments, ConcurrentDictionary objectBag, MethodMetadata methodMetadata, TestContextEvents events) - { - if (arguments.Length == 0) - { - return; - } - - var injectableArgs = arguments - .Where(argument => argument != null && PropertyInjectionCache.HasInjectableProperties(argument.GetType())) - .ToArray(); - - if (injectableArgs.Length == 0) - { - return; - } - - var argumentTasks = injectableArgs - .Select(argument => InjectPropertiesIntoObjectAsync(argument!, objectBag, methodMetadata, events)) - .ToArray(); - - await Task.WhenAll(argumentTasks); - } - - - /// - /// Recursively injects properties with data sources into a single object. - /// Uses source generation mode when available, falls back to reflection mode. - /// After injection, handles tracking, initialization, and recursive injection. - /// - /// The object instance to inject properties into. - /// Shared object bag for the test context. Must not be null. - /// Method metadata for the test. Can be null. - /// Test context events for tracking. Must not be null and must be unique per test permutation. - public async Task InjectPropertiesIntoObjectAsync(object instance, ConcurrentDictionary objectBag, MethodMetadata? methodMetadata, TestContextEvents events) - { - if (objectBag == null) - { - throw new ArgumentNullException(nameof(objectBag)); - } - - if (events == null) - { - throw new ArgumentNullException(nameof(events), "TestContextEvents must not be null. Each test permutation must have a unique TestContextEvents instance for proper disposal tracking."); - } - - // Rent dictionary from pool to avoid allocations - if (!_visitedObjectsPool.TryTake(out var visitedObjects)) - { -#if NETSTANDARD2_0 - visitedObjects = new ConcurrentDictionary(); -#else - visitedObjects = new ConcurrentDictionary(ReferenceEqualityComparer.Instance); -#endif - } - - try - { - await InjectPropertiesIntoObjectAsyncCore(instance, objectBag, methodMetadata, events, visitedObjects); - } - finally - { - // Clear and return to pool (reject if too large to avoid memory bloat) - visitedObjects.Clear(); - if (visitedObjects.Count == 0) - { - _visitedObjectsPool.Add(visitedObjects); - } - } - } - - internal async Task InjectPropertiesIntoObjectAsyncCore(object instance, ConcurrentDictionary objectBag, MethodMetadata? methodMetadata, TestContextEvents events, ConcurrentDictionary visitedObjects) - { - if (instance == null) - { - return; - } - - // Prevent cycles - if (!visitedObjects.TryAdd(instance, 0)) - { - return; - } - - try - { - // Use optimized single-lookup pattern with fast-path for already-injected instances - await PropertyInjectionCache.EnsureInjectedAsync(instance, async _ => - { - var plan = PropertyInjectionCache.GetOrCreatePlan(instance.GetType()); - - await _orchestrator.InitializeObjectWithPropertiesAsync( - instance, plan, objectBag, methodMetadata, events, visitedObjects); - }); - - await RecurseIntoNestedPropertiesAsync(instance, objectBag, methodMetadata, events, visitedObjects); - } - catch (Exception ex) - { - var detailedMessage = $"Failed to inject properties for type '{instance.GetType().Name}': {ex.Message}"; - - if (ex.StackTrace != null) - { - detailedMessage += $"\nStack trace: {ex.StackTrace}"; - } - - throw new InvalidOperationException(detailedMessage, ex); - } - } - - /// - /// Recursively injects properties into nested objects that have injectable properties. - /// This is called after the direct properties of an object have been initialized. - /// - private async Task RecurseIntoNestedPropertiesAsync( - object instance, - ConcurrentDictionary objectBag, - MethodMetadata? methodMetadata, - TestContextEvents events, - ConcurrentDictionary visitedObjects) - { - var plan = PropertyInjectionCache.GetOrCreatePlan(instance.GetType()); - if (!plan.HasProperties) - { - return; - } - - // Use whichever properties are available in the plan - // For closed generic types, source-gen may not have registered them, so use reflection fallback - if (plan.SourceGeneratedProperties.Length > 0) - { - foreach (var metadata in plan.SourceGeneratedProperties) - { - var property = metadata.ContainingType.GetProperty(metadata.PropertyName); - if (property == null || !property.CanRead) - { - continue; - } - - var propertyValue = property.GetValue(instance); - if (propertyValue == null) - { - continue; - } - - if (PropertyInjectionCache.HasInjectableProperties(propertyValue.GetType())) - { - await InjectPropertiesIntoObjectAsyncCore(propertyValue, objectBag, methodMetadata, events, visitedObjects); - } - } - } - else if (plan.ReflectionProperties.Length > 0) - { - foreach (var (property, _) in plan.ReflectionProperties) - { - var propertyValue = property.GetValue(instance); - if (propertyValue == null) - { - continue; - } - - if (PropertyInjectionCache.HasInjectableProperties(propertyValue.GetType())) - { - await InjectPropertiesIntoObjectAsyncCore(propertyValue, objectBag, methodMetadata, events, visitedObjects); - } - } - } - } -} diff --git a/TUnit.Engine/Services/PropertyInjector.cs b/TUnit.Engine/Services/PropertyInjector.cs new file mode 100644 index 0000000000..55b6ff5b0c --- /dev/null +++ b/TUnit.Engine/Services/PropertyInjector.cs @@ -0,0 +1,616 @@ +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using TUnit.Core; +using TUnit.Core.Interfaces; +using TUnit.Core.Interfaces.SourceGenerator; +using TUnit.Core.PropertyInjection; +using TUnit.Core.PropertyInjection.Initialization; + +namespace TUnit.Engine.Services; + +/// +/// Pure property injection service. +/// Follows Single Responsibility Principle - only injects property values, doesn't initialize objects. +/// Uses Lazy initialization to break circular dependencies without manual Initialize() calls. +/// +internal sealed class PropertyInjector +{ + private readonly Lazy _objectLifecycleService; + private readonly string _testSessionId; + + // Object pool for visited dictionaries to reduce allocations + private static readonly ConcurrentBag> _visitedObjectsPool = new(); + + public PropertyInjector(Lazy objectLifecycleService, string testSessionId) + { + _objectLifecycleService = objectLifecycleService; + _testSessionId = testSessionId; + } + + /// + /// Resolves and caches property values for a test class type WITHOUT setting them on an instance. + /// Used during registration to create shared objects early and enable proper reference counting. + /// + public async Task ResolveAndCachePropertiesAsync( + Type testClassType, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + var plan = PropertyInjectionCache.GetOrCreatePlan(testClassType); + + if (!plan.HasProperties) + { + return; + } + + // Resolve properties based on what's available in the plan + if (plan.SourceGeneratedProperties.Length > 0) + { + await ResolveAndCacheSourceGeneratedPropertiesAsync( + plan.SourceGeneratedProperties, objectBag, methodMetadata, events, testContext); + } + else if (plan.ReflectionProperties.Length > 0) + { + await ResolveAndCacheReflectionPropertiesAsync( + plan.ReflectionProperties, objectBag, methodMetadata, events, testContext); + } + } + + /// + /// Injects properties into an object and recursively into nested objects. + /// + public async Task InjectPropertiesAsync( + object instance, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events) + { + if (instance == null) + { + throw new ArgumentNullException(nameof(instance)); + } + + if (objectBag == null) + { + throw new ArgumentNullException(nameof(objectBag)); + } + + if (events == null) + { + throw new ArgumentNullException(nameof(events)); + } + + // Rent dictionary from pool + if (!_visitedObjectsPool.TryTake(out var visitedObjects)) + { +#if NETSTANDARD2_0 + visitedObjects = new ConcurrentDictionary(); +#else + visitedObjects = new ConcurrentDictionary(ReferenceEqualityComparer.Instance); +#endif + } + + try + { + await InjectPropertiesRecursiveAsync(instance, objectBag, methodMetadata, events, visitedObjects); + } + finally + { + visitedObjects.Clear(); + _visitedObjectsPool.Add(visitedObjects); + } + } + + /// + /// Injects properties into multiple argument objects in parallel. + /// + public async Task InjectPropertiesIntoArgumentsAsync( + object?[] arguments, + ConcurrentDictionary objectBag, + MethodMetadata methodMetadata, + TestContextEvents events) + { + if (arguments.Length == 0) + { + return; + } + + var injectableArgs = arguments + .Where(arg => arg != null && PropertyInjectionCache.HasInjectableProperties(arg.GetType())) + .ToArray(); + + if (injectableArgs.Length == 0) + { + return; + } + + await Task.WhenAll(injectableArgs.Select(arg => + InjectPropertiesAsync(arg!, objectBag, methodMetadata, events))); + } + + private async Task InjectPropertiesRecursiveAsync( + object instance, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects) + { + if (instance == null) + { + return; + } + + // Prevent cycles + if (!visitedObjects.TryAdd(instance, 0)) + { + return; + } + + try + { + var plan = PropertyInjectionCache.GetOrCreatePlan(instance.GetType()); + + if (plan.HasProperties) + { + // Initialize properties based on what's available in the plan + if (plan.SourceGeneratedProperties.Length > 0) + { + await InjectSourceGeneratedPropertiesAsync( + instance, plan.SourceGeneratedProperties, objectBag, methodMetadata, events, visitedObjects); + } + else if (plan.ReflectionProperties.Length > 0) + { + await InjectReflectionPropertiesAsync( + instance, plan.ReflectionProperties, objectBag, methodMetadata, events, visitedObjects); + } + } + + // Recurse into nested properties + await RecurseIntoNestedPropertiesAsync(instance, plan, objectBag, methodMetadata, events, visitedObjects); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Failed to inject properties for type '{instance.GetType().Name}': {ex.Message}", ex); + } + } + + private async Task InjectSourceGeneratedPropertiesAsync( + object instance, + PropertyInjectionMetadata[] properties, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects) + { + if (properties.Length == 0) + { + return; + } + + // Initialize properties in parallel + await Task.WhenAll(properties.Select(metadata => + InjectSourceGeneratedPropertyAsync(instance, metadata, objectBag, methodMetadata, events, visitedObjects))); + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Source-gen properties are AOT-safe")] + private async Task InjectSourceGeneratedPropertyAsync( + object instance, + PropertyInjectionMetadata metadata, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects) + { + // First check if the property already has a value - skip if it does + // This handles nested objects that were already constructed with their properties set + var property = metadata.ContainingType.GetProperty(metadata.PropertyName); + if (property != null && property.CanRead) + { + var existingValue = property.GetValue(instance); + if (existingValue != null) + { + // Property already has a value, don't overwrite it + return; + } + } + + var testContext = TestContext.Current; + object? resolvedValue = null; + + // Use a composite key to avoid conflicts when nested classes have properties with the same name + var cacheKey = $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + + // Check if property was pre-resolved during registration + if (testContext?.Metadata.TestDetails.TestClassInjectedPropertyArguments.TryGetValue(cacheKey, out resolvedValue) == true) + { + // Use pre-resolved value + } + else + { + // Resolve the property value from the data source + resolvedValue = await ResolvePropertyDataAsync( + new PropertyInitializationContext + { + Instance = instance, + SourceGeneratedMetadata = metadata, + PropertyName = metadata.PropertyName, + PropertyType = metadata.PropertyType, + PropertySetter = metadata.SetProperty, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = visitedObjects, + TestContext = testContext, + IsNestedProperty = false + }); + + if (resolvedValue == null) + { + return; + } + } + + // Set the property value + metadata.SetProperty(instance, resolvedValue); + + // Store for potential reuse with composite key + if (testContext != null) + { + ((ConcurrentDictionary)testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments) + .TryAdd(cacheKey, resolvedValue); + } + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] + private async Task InjectReflectionPropertiesAsync( + object instance, + (PropertyInfo Property, IDataSourceAttribute DataSource)[] properties, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects) + { + if (properties.Length == 0) + { + return; + } + + await Task.WhenAll(properties.Select(pair => + InjectReflectionPropertyAsync(instance, pair.Property, pair.DataSource, objectBag, methodMetadata, events, visitedObjects))); + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] + private async Task InjectReflectionPropertyAsync( + object instance, + PropertyInfo property, + IDataSourceAttribute dataSource, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects) + { + var testContext = TestContext.Current; + var propertySetter = PropertySetterFactory.CreateSetter(property); + + var resolvedValue = await ResolvePropertyDataAsync( + new PropertyInitializationContext + { + Instance = instance, + PropertyInfo = property, + DataSource = dataSource, + PropertyName = property.Name, + PropertyType = property.PropertyType, + PropertySetter = propertySetter, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = visitedObjects, + TestContext = testContext, + IsNestedProperty = false + }); + + if (resolvedValue == null) + { + return; + } + + propertySetter(instance, resolvedValue); + } + + private async Task RecurseIntoNestedPropertiesAsync( + object instance, + PropertyInjectionPlan plan, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects) + { + if (!plan.HasProperties) + { + return; + } + + if (plan.SourceGeneratedProperties.Length > 0) + { + foreach (var metadata in plan.SourceGeneratedProperties) + { + var property = metadata.ContainingType.GetProperty(metadata.PropertyName); + if (property == null || !property.CanRead) + { + continue; + } + + var propertyValue = property.GetValue(instance); + if (propertyValue == null) + { + continue; + } + + if (PropertyInjectionCache.HasInjectableProperties(propertyValue.GetType())) + { + await InjectPropertiesRecursiveAsync(propertyValue, objectBag, methodMetadata, events, visitedObjects); + } + } + } + else if (plan.ReflectionProperties.Length > 0) + { + foreach (var (property, _) in plan.ReflectionProperties) + { + var propertyValue = property.GetValue(instance); + if (propertyValue == null) + { + continue; + } + + if (PropertyInjectionCache.HasInjectableProperties(propertyValue.GetType())) + { + await InjectPropertiesRecursiveAsync(propertyValue, objectBag, methodMetadata, events, visitedObjects); + } + } + } + } + + private async Task ResolveAndCacheSourceGeneratedPropertiesAsync( + PropertyInjectionMetadata[] properties, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + if (properties.Length == 0) + { + return; + } + + // Resolve properties in parallel + await Task.WhenAll(properties.Select(metadata => + ResolveAndCacheSourceGeneratedPropertyAsync(metadata, objectBag, methodMetadata, events, testContext))); + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Source-gen properties are AOT-safe")] + private async Task ResolveAndCacheSourceGeneratedPropertyAsync( + PropertyInjectionMetadata metadata, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + var cacheKey = $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + + // Check if already cached + if (testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments.ContainsKey(cacheKey)) + { + return; + } + + // Resolve the property value from the data source + var resolvedValue = await ResolvePropertyDataAsync( + new PropertyInitializationContext + { + Instance = PlaceholderInstance.Instance, // Use placeholder during registration + SourceGeneratedMetadata = metadata, + PropertyName = metadata.PropertyName, + PropertyType = metadata.PropertyType, + PropertySetter = metadata.SetProperty, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = new ConcurrentDictionary(), // Empty dictionary for cycle detection + TestContext = testContext, + IsNestedProperty = false + }); + + if (resolvedValue != null) + { + // Cache the resolved value + ((ConcurrentDictionary)testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments) + .TryAdd(cacheKey, resolvedValue); + } + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] + private async Task ResolveAndCacheReflectionPropertiesAsync( + (PropertyInfo Property, IDataSourceAttribute DataSource)[] properties, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + if (properties.Length == 0) + { + return; + } + + await Task.WhenAll(properties.Select(pair => + ResolveAndCacheReflectionPropertyAsync(pair.Property, pair.DataSource, objectBag, methodMetadata, events, testContext))); + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] + private async Task ResolveAndCacheReflectionPropertyAsync( + PropertyInfo property, + IDataSourceAttribute dataSource, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + var cacheKey = $"{property.DeclaringType!.FullName}.{property.Name}"; + + // Check if already cached + if (testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments.ContainsKey(cacheKey)) + { + return; + } + + var propertySetter = PropertySetterFactory.CreateSetter(property); + + var resolvedValue = await ResolvePropertyDataAsync( + new PropertyInitializationContext + { + Instance = PlaceholderInstance.Instance, // Use placeholder during registration + PropertyInfo = property, + DataSource = dataSource, + PropertyName = property.Name, + PropertyType = property.PropertyType, + PropertySetter = propertySetter, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = new ConcurrentDictionary(), // Empty dictionary for cycle detection + TestContext = testContext, + IsNestedProperty = false + }); + + if (resolvedValue != null) + { + // Cache the resolved value + ((ConcurrentDictionary)testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments) + .TryAdd(cacheKey, resolvedValue); + } + } + + /// + /// Resolves data from a property's data source. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property data resolution handles both modes")] + [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "PropertyType is properly preserved through source generation")] + private async Task ResolvePropertyDataAsync(PropertyInitializationContext context) + { + var dataSource = await GetInitializedDataSourceAsync(context); + if (dataSource == null) + { + return null; + } + + var dataGeneratorMetadata = CreateDataGeneratorMetadata(context, dataSource); + var dataRows = dataSource.GetDataRowsAsync(dataGeneratorMetadata); + + await foreach (var factory in dataRows) + { + var args = await factory(); + var value = TupleValueResolver.ResolveTupleValue(context.PropertyType, args); + + // Resolve any Func wrappers + value = await PropertyValueProcessor.ResolveTestDataValueAsync(typeof(object), value); + + if (value != null) + { + // Ensure nested objects are initialized + if (PropertyInjectionCache.HasInjectableProperties(value.GetType()) || value is IAsyncInitializer) + { + await _objectLifecycleService.Value.EnsureInitializedAsync( + value, + context.ObjectBag, + context.MethodMetadata, + context.Events); + } + + return value; + } + } + + return null; + } + + private async Task GetInitializedDataSourceAsync(PropertyInitializationContext context) + { + IDataSourceAttribute? dataSource = null; + + if (context.DataSource != null) + { + dataSource = context.DataSource; + } + else if (context.SourceGeneratedMetadata != null) + { + dataSource = context.SourceGeneratedMetadata.CreateDataSource(); + } + + if (dataSource == null) + { + return null; + } + + // Ensure the data source is initialized + return await _objectLifecycleService.Value.EnsureInitializedAsync( + dataSource, + context.ObjectBag, + context.MethodMetadata, + context.Events); + } + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Metadata creation handles both modes")] + [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "ContainingType and PropertyType are preserved through source generation")] + private DataGeneratorMetadata CreateDataGeneratorMetadata( + PropertyInitializationContext context, + IDataSourceAttribute dataSource) + { + if (context.SourceGeneratedMetadata != null) + { + if (context.SourceGeneratedMetadata.ContainingType == null) + { + throw new InvalidOperationException( + $"ContainingType is null for property '{context.PropertyName}'."); + } + + var propertyMetadata = new PropertyMetadata + { + IsStatic = false, + Name = context.PropertyName, + ClassMetadata = ClassMetadataHelper.GetOrCreateClassMetadata(context.SourceGeneratedMetadata.ContainingType), + Type = context.PropertyType, + ReflectionInfo = PropertyHelper.GetPropertyInfo(context.SourceGeneratedMetadata.ContainingType, context.PropertyName), + Getter = parent => PropertyHelper.GetPropertyInfo(context.SourceGeneratedMetadata.ContainingType, context.PropertyName).GetValue(parent!)!, + ContainingTypeMetadata = ClassMetadataHelper.GetOrCreateClassMetadata(context.SourceGeneratedMetadata.ContainingType) + }; + + return DataGeneratorMetadataCreator.CreateForPropertyInjection( + propertyMetadata, + context.MethodMetadata, + dataSource, + _testSessionId, + context.TestContext, + context.TestContext?.Metadata.TestDetails.ClassInstance, + context.Events, + context.ObjectBag); + } + else if (context.PropertyInfo != null) + { + return DataGeneratorMetadataCreator.CreateForPropertyInjection( + context.PropertyInfo, + context.PropertyInfo.DeclaringType!, + context.MethodMetadata, + dataSource, + _testSessionId, + context.TestContext, + context.Instance, + context.Events, + context.ObjectBag); + } + + throw new InvalidOperationException("Cannot create data generator metadata: no property information available"); + } +} diff --git a/TUnit.Engine/Services/TestArgumentRegistrationService.cs b/TUnit.Engine/Services/TestArgumentRegistrationService.cs index dd9c4e10c5..7b4b496658 100644 --- a/TUnit.Engine/Services/TestArgumentRegistrationService.cs +++ b/TUnit.Engine/Services/TestArgumentRegistrationService.cs @@ -1,160 +1,46 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using TUnit.Core; -using TUnit.Core.Data; -using TUnit.Core.Enums; -using TUnit.Core.Interfaces; -using TUnit.Core.Interfaces.SourceGenerator; -using TUnit.Core.PropertyInjection; -using TUnit.Core.Tracking; namespace TUnit.Engine.Services; /// -/// Service that handles registration of test arguments (constructor args, method args) during test discovery. -/// Implements ITestRegisteredEventReceiver to register objects when tests are registered. -/// Renamed from TestArgumentTrackingService to clarify it's for the registration phase. +/// Internal service that handles registration of test arguments during test discovery. +/// Not a user-extensibility point - called directly by TestBuilder. +/// Simplified to use ObjectLifecycleService for all object registration. /// -internal sealed class TestArgumentRegistrationService : ITestRegisteredEventReceiver +internal sealed class TestArgumentRegistrationService { - private readonly ObjectRegistrationService _objectRegistrationService; - private readonly ObjectTracker _objectTracker; + private readonly ObjectLifecycleService _objectLifecycleService; - public TestArgumentRegistrationService(ObjectRegistrationService objectRegistrationService, ObjectTracker objectTracker) + public TestArgumentRegistrationService(ObjectLifecycleService objectLifecycleService) { - _objectRegistrationService = objectRegistrationService; - _objectTracker = objectTracker; + _objectLifecycleService = objectLifecycleService; } - public int Order => int.MinValue; // Run first to ensure registration happens before other event receivers - /// - /// Called when a test is registered. This is the correct time to register constructor and method arguments + /// Called when a test is registered. Registers constructor and method arguments /// for proper reference counting and disposal tracking. + /// Property values are resolved lazily during test execution (not during discovery). /// - public async ValueTask OnTestRegistered(TestRegisteredContext context) + public async ValueTask RegisterTestArgumentsAsync(TestContext testContext) { - var testContext = context.TestContext; var classArguments = testContext.Metadata.TestDetails.TestClassArguments; var methodArguments = testContext.Metadata.TestDetails.TestMethodArguments; - // Register class arguments (registration phase - property injection + tracking, NO IAsyncInitializer) - await _objectRegistrationService.RegisterArgumentsAsync( + // Register class arguments (property injection during registration) + await _objectLifecycleService.RegisterArgumentsAsync( classArguments, testContext.StateBag.Items, testContext.Metadata.TestDetails.MethodMetadata, testContext.InternalEvents); - // Register method arguments (registration phase) - await _objectRegistrationService.RegisterArgumentsAsync( + // Register method arguments + await _objectLifecycleService.RegisterArgumentsAsync( methodArguments, testContext.StateBag.Items, testContext.Metadata.TestDetails.MethodMetadata, testContext.InternalEvents); - // Register properties that will be injected into the test class - await RegisterPropertiesAsync(testContext); - - _objectTracker.TrackObjects(testContext); - } - - /// - /// Registers properties that will be injected into the test class instance. - /// This ensures proper reference counting for all property-injected instances during discovery. - /// Exceptions during data generation will be caught and associated with the test for reporting. - /// - private async ValueTask RegisterPropertiesAsync(TestContext testContext) - { - try - { - var classType = testContext.Metadata.TestDetails.ClassType; - - // Get the property source for the class - var propertySource = PropertySourceRegistry.GetSource(classType); - if (propertySource?.ShouldInitialize != true) - { - // No properties to inject for this class - return; - } - - // Get all properties that need injection - var propertyMetadata = propertySource.GetPropertyMetadata(); - - foreach (var metadata in propertyMetadata) - { - try - { - // Create the data source for this property - var dataSource = metadata.CreateDataSource(); - - // Create minimal DataGeneratorMetadata for property resolution during registration - var testBuilderContext = new TestBuilderContext - { - TestMetadata = testContext.Metadata.TestDetails.MethodMetadata, - DataSourceAttribute = dataSource, - Events = testContext.InternalEvents, - StateBag = testContext.StateBag.Items - }; - - var dataGenMetadata = new DataGeneratorMetadata - { - TestBuilderContext = new TestBuilderContextAccessor(testBuilderContext), - MembersToGenerate = [], // Properties don't use member generation - TestInformation = testContext.Metadata.TestDetails.MethodMetadata, - Type = DataGeneratorType.Property, - TestSessionId = TestSessionContext.Current?.Id ?? "registration", - TestClassInstance = null, // Not available during registration - ClassInstanceArguments = testContext.Metadata.TestDetails.TestClassArguments - }; - - // Get the data rows from the data source - var dataRows = dataSource.GetDataRowsAsync(dataGenMetadata); - - // Get the first data row (properties get single values, not multiple) - await foreach (var dataRowFunc in dataRows) - { - var dataRow = await dataRowFunc(); - if (dataRow is { Length: > 0 }) - { - var data = dataRow[0]; - - if (data != null) - { - // Store for later injection - testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments[metadata.PropertyName] = data; - - // Register the ClassDataSource instance during registration phase - // This does: property injection + tracking (NO IAsyncInitializer - deferred to execution) - await _objectRegistrationService.RegisterObjectAsync( - data, - testContext.StateBag.Items, - testContext.Metadata.TestDetails.MethodMetadata, - testContext.InternalEvents); - } - } - break; // Only take the first result for property injection - } - } - catch (Exception ex) - { - // Capture the exception for this property and re-throw - // The test building process will handle marking it as failed - var exceptionMessage = $"Failed to generate data for property '{metadata.PropertyName}': {ex.Message}"; - var propertyException = new InvalidOperationException(exceptionMessage, ex); - throw propertyException; - } - } - } - catch (Exception ex) - { - // Capture any top-level exceptions (e.g., getting property source) and re-throw - // The test building process will handle marking it as failed - var exceptionMessage = $"Failed to register properties for test '{testContext.Metadata.TestDetails.TestName}': {ex.Message}"; - var registrationException = new InvalidOperationException(exceptionMessage, ex); - throw registrationException; - } + // Register the test for tracking (inject properties and track objects for disposal) + await _objectLifecycleService.RegisterTestAsync(testContext); } } diff --git a/TUnit.Engine/Services/TestFilterService.cs b/TUnit.Engine/Services/TestFilterService.cs index ee091095fd..0c0285ba62 100644 --- a/TUnit.Engine/Services/TestFilterService.cs +++ b/TUnit.Engine/Services/TestFilterService.cs @@ -74,7 +74,7 @@ private async Task RegisterTest(AbstractExecutableTest test) try { - await testArgumentRegistrationService.OnTestRegistered(registeredContext); + await testArgumentRegistrationService.RegisterTestArgumentsAsync(test.Context); } catch (Exception ex) { diff --git a/TUnit.Engine/TestInitializer.cs b/TUnit.Engine/TestInitializer.cs index f9912932e4..de117c6746 100644 --- a/TUnit.Engine/TestInitializer.cs +++ b/TUnit.Engine/TestInitializer.cs @@ -1,71 +1,31 @@ -using System.Collections.Concurrent; using TUnit.Core; -using TUnit.Core.Tracking; -using TUnit.Engine.Extensions; using TUnit.Engine.Services; namespace TUnit.Engine; +/// +/// Simplified test initializer that delegates to ObjectLifecycleService. +/// Follows Single Responsibility Principle - only coordinates test initialization. +/// internal class TestInitializer { private readonly EventReceiverOrchestrator _eventReceiverOrchestrator; - private readonly PropertyInjectionService _propertyInjectionService; - private readonly DataSourceInitializer _dataSourceInitializer; - private readonly ObjectTracker _objectTracker; + private readonly ObjectLifecycleService _objectLifecycleService; - public TestInitializer(EventReceiverOrchestrator eventReceiverOrchestrator, - PropertyInjectionService propertyInjectionService, - DataSourceInitializer dataSourceInitializer, - ObjectTracker objectTracker) + public TestInitializer( + EventReceiverOrchestrator eventReceiverOrchestrator, + ObjectLifecycleService objectLifecycleService) { _eventReceiverOrchestrator = eventReceiverOrchestrator; - _propertyInjectionService = propertyInjectionService; - _dataSourceInitializer = dataSourceInitializer; - _objectTracker = objectTracker; + _objectLifecycleService = objectLifecycleService; } public async ValueTask InitializeTest(AbstractExecutableTest test, CancellationToken cancellationToken) { - var testClassInstance = test.Context.Metadata.TestDetails.ClassInstance; - - await _propertyInjectionService.InjectPropertiesIntoObjectAsync( - testClassInstance, - test.Context.StateBag.Items, - test.Context.Metadata.TestDetails.MethodMetadata, - test.Context.InternalEvents); - + // Register event receivers _eventReceiverOrchestrator.RegisterReceivers(test.Context, cancellationToken); - // Shouldn't retrack already tracked objects, but will track any new ones created during retries / initialization - _objectTracker.TrackObjects(test.Context); - - await InitializeTrackedObjects(test.Context, cancellationToken); - } - - private async Task InitializeTrackedObjects(TestContext testContext, CancellationToken cancellationToken) - { - // Initialize by level (deepest first), with objects at the same level in parallel - // Using DataSourceInitializer ensures property injection + nested objects + IAsyncInitializer - var levels = testContext.TrackedObjects.Keys.OrderByDescending(level => level); - - foreach (var level in levels) - { - var objectsAtLevel = testContext.TrackedObjects[level]; - await Task.WhenAll(objectsAtLevel.Select(obj => - _dataSourceInitializer.EnsureInitializedAsync( - obj, - testContext.StateBag.Items, - testContext.Metadata.TestDetails.MethodMetadata, - testContext.InternalEvents, - cancellationToken).AsTask())); - } - - // Finally, ensure the test class itself is initialized (property injection + IAsyncInitializer) - await _dataSourceInitializer.EnsureInitializedAsync( - testContext.Metadata.TestDetails.ClassInstance, - testContext.StateBag.Items, - testContext.Metadata.TestDetails.MethodMetadata, - testContext.InternalEvents, - cancellationToken); + // Prepare test: inject properties, track objects, initialize (IAsyncInitializer) + await _objectLifecycleService.PrepareTestAsync(test.Context, cancellationToken); } } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index d3d12fecde..a445e9e1f2 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -2494,7 +2494,7 @@ namespace . public sealed class PropertyInjectionMetadata { public PropertyInjectionMetadata() { } - [.(..PublicProperties)] + [.(..None | ..PublicProperties | ..NonPublicProperties)] public required ContainingType { get; init; } public required <.IDataSourceAttribute> CreateDataSource { get; init; } public required string PropertyName { get; init; } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 3d1bb5b556..a1f6b35877 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -2494,7 +2494,7 @@ namespace . public sealed class PropertyInjectionMetadata { public PropertyInjectionMetadata() { } - [.(..PublicProperties)] + [.(..None | ..PublicProperties | ..NonPublicProperties)] public required ContainingType { get; init; } public required <.IDataSourceAttribute> CreateDataSource { get; init; } public required string PropertyName { get; init; } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 7f3054b2c2..e295333e1a 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -2494,7 +2494,7 @@ namespace . public sealed class PropertyInjectionMetadata { public PropertyInjectionMetadata() { } - [.(..PublicProperties)] + [.(..None | ..PublicProperties | ..NonPublicProperties)] public required ContainingType { get; init; } public required <.IDataSourceAttribute> CreateDataSource { get; init; } public required string PropertyName { get; init; } From 2509772753b21ac28ab6bf627cecaad5f59f6381 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:05:18 +0000 Subject: [PATCH 137/192] chore(deps): update dependency fluentvalidation.dependencyinjectionextensions to 12.1.1 (#3973) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d6ce0c4576..49803d2d82 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,7 +12,7 @@ - + From 8f374b712732255390db226cfb6aecd179949de0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:35:56 +0000 Subject: [PATCH 138/192] chore(deps): update tunit to 1.3.25 (#3974) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 49803d2d82..bfe2d3c97c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index c2de3439eb..24b3cf6158 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 05c99383fc..4f4100eb40 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index a57bab985e..9ff018942b 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 3c5a2367c5..b360e877d4 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index ddd9fcfa9a..fa01bb3d55 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index cafacf59ae..250cdeeadd 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 87e25e1506..65dd45b257 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index d878f36905..d18b2c8a1e 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From f14b3ec0ddf63f81b168c4512e88f43c3563f73c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 00:30:03 +0000 Subject: [PATCH 139/192] chore: update benchmark results (#3975) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 44 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 46 +-- .../benchmarks/MassiveParallelTests.json | 46 +-- docs/static/benchmarks/MatrixTests.json | 46 +-- docs/static/benchmarks/ScaleTests.json | 46 +-- .../static/benchmarks/SetupTeardownTests.json | 38 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 292 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 366 insertions(+), 362 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 2752575378..f34c596448 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 576.1 ms | 574.4 ms | 4.53 ms | -| NUnit | 4.4.0 | 684.2 ms | 682.2 ms | 12.67 ms | -| MSTest | 4.0.2 | 645.2 ms | 645.5 ms | 6.97 ms | -| xUnit3 | 3.2.1 | 727.7 ms | 728.8 ms | 10.39 ms | -| **TUnit (AOT)** | 1.3.15 | 123.9 ms | 123.9 ms | 0.37 ms | +| **TUnit** | 1.3.25 | 576.1 ms | 576.6 ms | 4.65 ms | +| NUnit | 4.4.0 | 692.6 ms | 693.9 ms | 5.54 ms | +| MSTest | 4.0.2 | 666.6 ms | 666.1 ms | 3.88 ms | +| xUnit3 | 3.2.1 | 742.9 ms | 743.1 ms | 5.00 ms | +| **TUnit (AOT)** | 1.3.25 | 124.7 ms | 124.8 ms | 0.34 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 874 - bar [576.1, 684.2, 645.2, 727.7, 123.9] + y-axis "Time (ms)" 0 --> 892 + bar [576.1, 692.6, 666.6, 742.9, 124.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.206Z* +*Last generated: 2025-12-04T00:29:39.691Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 45d4aba1bf..ba217cb914 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 1.998 s | 1.993 s | 0.0281 s | -| Build_NUnit | 4.4.0 | 1.644 s | 1.634 s | 0.0247 s | -| Build_MSTest | 4.0.2 | 1.744 s | 1.742 s | 0.0152 s | -| Build_xUnit3 | 3.2.1 | 1.649 s | 1.650 s | 0.0178 s | +| **TUnit** | 1.3.25 | 1.953 s | 1.947 s | 0.0320 s | +| Build_NUnit | 4.4.0 | 1.565 s | 1.570 s | 0.0142 s | +| Build_MSTest | 4.0.2 | 1.629 s | 1.630 s | 0.0192 s | +| Build_xUnit3 | 3.2.1 | 1.536 s | 1.535 s | 0.0308 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [1.998, 1.644, 1.744, 1.649] + bar [1.953, 1.565, 1.629, 1.536] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.208Z* +*Last generated: 2025-12-04T00:29:39.693Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 72eea7cbe6..36d74803cc 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 509.49 ms | 509.23 ms | 4.808 ms | -| NUnit | 4.4.0 | 537.70 ms | 537.50 ms | 7.456 ms | -| MSTest | 4.0.2 | 500.01 ms | 497.41 ms | 13.464 ms | -| xUnit3 | 3.2.1 | 577.92 ms | 575.57 ms | 8.284 ms | -| **TUnit (AOT)** | 1.3.15 | 25.20 ms | 25.22 ms | 0.441 ms | +| **TUnit** | 1.3.25 | 496.15 ms | 494.67 ms | 3.893 ms | +| NUnit | 4.4.0 | 522.76 ms | 522.38 ms | 10.523 ms | +| MSTest | 4.0.2 | 487.01 ms | 484.89 ms | 9.625 ms | +| xUnit3 | 3.2.1 | 568.10 ms | 566.76 ms | 5.464 ms | +| **TUnit (AOT)** | 1.3.25 | 24.17 ms | 24.13 ms | 0.131 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 694 - bar [509.49, 537.7, 500.01, 577.92, 25.2] + y-axis "Time (ms)" 0 --> 682 + bar [496.15, 522.76, 487.01, 568.1, 24.17] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.207Z* +*Last generated: 2025-12-04T00:29:39.692Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index a4bfe3335e..5a62605cb5 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 604.9 ms | 605.1 ms | 3.81 ms | -| NUnit | 4.4.0 | 1,203.3 ms | 1,202.8 ms | 9.59 ms | -| MSTest | 4.0.2 | 2,994.0 ms | 2,994.6 ms | 4.85 ms | -| xUnit3 | 3.2.1 | 3,080.6 ms | 3,077.9 ms | 10.62 ms | -| **TUnit (AOT)** | 1.3.15 | 131.4 ms | 131.4 ms | 0.49 ms | +| **TUnit** | 1.3.25 | 602.1 ms | 601.2 ms | 4.68 ms | +| NUnit | 4.4.0 | 1,211.4 ms | 1,211.3 ms | 4.55 ms | +| MSTest | 4.0.2 | 2,995.8 ms | 2,991.3 ms | 10.78 ms | +| xUnit3 | 3.2.1 | 3,082.3 ms | 3,081.2 ms | 7.17 ms | +| **TUnit (AOT)** | 1.3.25 | 131.0 ms | 131.1 ms | 0.48 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3697 - bar [604.9, 1203.3, 2994, 3080.6, 131.4] + y-axis "Time (ms)" 0 --> 3699 + bar [602.1, 1211.4, 2995.8, 3082.3, 131] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.207Z* +*Last generated: 2025-12-04T00:29:39.692Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 91ee0f7db4..8fd875627b 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 562.20 ms | 562.66 ms | 3.997 ms | -| NUnit | 4.4.0 | 1,535.28 ms | 1,535.46 ms | 8.283 ms | -| MSTest | 4.0.2 | 1,492.91 ms | 1,491.03 ms | 8.601 ms | -| xUnit3 | 3.2.1 | 1,587.83 ms | 1,585.14 ms | 8.779 ms | -| **TUnit (AOT)** | 1.3.15 | 79.07 ms | 79.05 ms | 0.175 ms | +| **TUnit** | 1.3.25 | 557.53 ms | 557.53 ms | 2.946 ms | +| NUnit | 4.4.0 | 1,558.44 ms | 1,556.95 ms | 13.355 ms | +| MSTest | 4.0.2 | 1,511.80 ms | 1,509.38 ms | 11.091 ms | +| xUnit3 | 3.2.1 | 1,593.74 ms | 1,594.00 ms | 10.060 ms | +| **TUnit (AOT)** | 1.3.25 | 78.96 ms | 79.01 ms | 0.180 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1906 - bar [562.2, 1535.28, 1492.91, 1587.83, 79.07] + y-axis "Time (ms)" 0 --> 1913 + bar [557.53, 1558.44, 1511.8, 1593.74, 78.96] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.207Z* +*Last generated: 2025-12-04T00:29:39.692Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 5cc897672b..655bea8b81 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 513.47 ms | 514.37 ms | 2.022 ms | -| NUnit | 4.4.0 | 591.32 ms | 590.12 ms | 9.736 ms | -| MSTest | 4.0.2 | 607.19 ms | 606.33 ms | 10.333 ms | -| xUnit3 | 3.2.1 | 593.97 ms | 594.08 ms | 7.557 ms | -| **TUnit (AOT)** | 1.3.15 | 44.09 ms | 43.81 ms | 3.410 ms | +| **TUnit** | 1.3.25 | 499.23 ms | 499.70 ms | 3.852 ms | +| NUnit | 4.4.0 | 574.82 ms | 574.86 ms | 12.401 ms | +| MSTest | 4.0.2 | 595.53 ms | 596.78 ms | 9.284 ms | +| xUnit3 | 3.2.1 | 586.79 ms | 587.30 ms | 12.456 ms | +| **TUnit (AOT)** | 1.3.25 | 47.71 ms | 47.33 ms | 3.862 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 729 - bar [513.47, 591.32, 607.19, 593.97, 44.09] + y-axis "Time (ms)" 0 --> 715 + bar [499.23, 574.82, 595.53, 586.79, 47.71] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.207Z* +*Last generated: 2025-12-04T00:29:39.692Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index d08f3dcfcb..c647938589 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-03** from the latest CI run. +This benchmark was automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.15 | 576.8 ms | 576.7 ms | 3.50 ms | -| NUnit | 4.4.0 | 1,173.6 ms | 1,173.5 ms | 9.79 ms | -| MSTest | 4.0.2 | 1,153.1 ms | 1,153.5 ms | 10.94 ms | -| xUnit3 | 3.2.1 | 1,218.3 ms | 1,218.1 ms | 7.19 ms | -| **TUnit (AOT)** | 1.3.15 | NA | NA | NA | +| **TUnit** | 1.3.25 | 585.1 ms | 584.9 ms | 4.31 ms | +| NUnit | 4.4.0 | 1,199.4 ms | 1,197.8 ms | 13.70 ms | +| MSTest | 4.0.2 | 1,153.5 ms | 1,153.4 ms | 5.66 ms | +| xUnit3 | 3.2.1 | 1,238.8 ms | 1,239.3 ms | 9.89 ms | +| **TUnit (AOT)** | 1.3.25 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-03** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1462 - bar [576.8, 1173.6, 1153.1, 1218.3, 0] + y-axis "Time (ms)" 0 --> 1487 + bar [585.1, 1199.4, 1153.5, 1238.8, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-03T00:29:03.208Z* +*Last generated: 2025-12-04T00:29:39.693Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index f6d3d565c8..f8577e92f6 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-03** from the latest CI run. +These benchmarks were automatically generated on **2025-12-04** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.3.15 | +| **TUnit** | 1.3.25 | | **xUnit v3** | 3.2.1 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-03T00:29:03.208Z* +*Last generated: 2025-12-04T00:29:39.694Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index b0beb803f1..9af1611b7b 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.206Z", + "timestamp": "2025-12-04T00:29:39.691Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.15", + "Version": "1.3.25", "Mean": "576.1 ms", - "Error": "4.84 ms", - "StdDev": "4.53 ms", - "Median": "574.4 ms" + "Error": "4.97 ms", + "StdDev": "4.65 ms", + "Median": "576.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "684.2 ms", - "Error": "13.55 ms", - "StdDev": "12.67 ms", - "Median": "682.2 ms" + "Mean": "692.6 ms", + "Error": "7.09 ms", + "StdDev": "5.54 ms", + "Median": "693.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "645.2 ms", - "Error": "7.86 ms", - "StdDev": "6.97 ms", - "Median": "645.5 ms" + "Mean": "666.6 ms", + "Error": "4.38 ms", + "StdDev": "3.88 ms", + "Median": "666.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "727.7 ms", - "Error": "11.11 ms", - "StdDev": "10.39 ms", - "Median": "728.8 ms" + "Mean": "742.9 ms", + "Error": "5.99 ms", + "StdDev": "5.00 ms", + "Median": "743.1 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "123.9 ms", - "Error": "0.40 ms", - "StdDev": "0.37 ms", - "Median": "123.9 ms" + "Version": "1.3.25", + "Mean": "124.7 ms", + "Error": "0.36 ms", + "StdDev": "0.34 ms", + "Median": "124.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index d133316d39..022113cda2 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.208Z", + "timestamp": "2025-12-04T00:29:39.693Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,35 +9,35 @@ "results": [ { "Method": "Build_TUnit", - "Version": "1.3.15", - "Mean": "1.998 s", - "Error": "0.0317 s", - "StdDev": "0.0281 s", - "Median": "1.993 s" + "Version": "1.3.25", + "Mean": "1.953 s", + "Error": "0.0361 s", + "StdDev": "0.0320 s", + "Median": "1.947 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.644 s", - "Error": "0.0264 s", - "StdDev": "0.0247 s", - "Median": "1.634 s" + "Mean": "1.565 s", + "Error": "0.0170 s", + "StdDev": "0.0142 s", + "Median": "1.570 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.744 s", - "Error": "0.0163 s", - "StdDev": "0.0152 s", - "Median": "1.742 s" + "Mean": "1.629 s", + "Error": "0.0216 s", + "StdDev": "0.0192 s", + "Median": "1.630 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.649 s", - "Error": "0.0190 s", - "StdDev": "0.0178 s", - "Median": "1.650 s" + "Mean": "1.536 s", + "Error": "0.0288 s", + "StdDev": "0.0308 s", + "Median": "1.535 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 1e39e67d22..4d9a8db751 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.207Z", + "timestamp": "2025-12-04T00:29:39.692Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "509.49 ms", - "Error": "5.424 ms", - "StdDev": "4.808 ms", - "Median": "509.23 ms" + "Version": "1.3.25", + "Mean": "496.15 ms", + "Error": "4.391 ms", + "StdDev": "3.893 ms", + "Median": "494.67 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "537.70 ms", - "Error": "8.411 ms", - "StdDev": "7.456 ms", - "Median": "537.50 ms" + "Mean": "522.76 ms", + "Error": "10.247 ms", + "StdDev": "10.523 ms", + "Median": "522.38 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "500.01 ms", - "Error": "9.836 ms", - "StdDev": "13.464 ms", - "Median": "497.41 ms" + "Mean": "487.01 ms", + "Error": "9.373 ms", + "StdDev": "9.625 ms", + "Median": "484.89 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "577.92 ms", - "Error": "8.856 ms", - "StdDev": "8.284 ms", - "Median": "575.57 ms" + "Mean": "568.10 ms", + "Error": "6.163 ms", + "StdDev": "5.464 ms", + "Median": "566.76 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "25.20 ms", - "Error": "0.471 ms", - "StdDev": "0.441 ms", - "Median": "25.22 ms" + "Version": "1.3.25", + "Mean": "24.17 ms", + "Error": "0.157 ms", + "StdDev": "0.131 ms", + "Median": "24.13 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 7b98dc68cb..35ed85cb4d 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.207Z", + "timestamp": "2025-12-04T00:29:39.692Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "604.9 ms", - "Error": "4.30 ms", - "StdDev": "3.81 ms", - "Median": "605.1 ms" + "Version": "1.3.25", + "Mean": "602.1 ms", + "Error": "5.28 ms", + "StdDev": "4.68 ms", + "Median": "601.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,203.3 ms", - "Error": "12.29 ms", - "StdDev": "9.59 ms", - "Median": "1,202.8 ms" + "Mean": "1,211.4 ms", + "Error": "5.45 ms", + "StdDev": "4.55 ms", + "Median": "1,211.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,994.0 ms", - "Error": "5.18 ms", - "StdDev": "4.85 ms", - "Median": "2,994.6 ms" + "Mean": "2,995.8 ms", + "Error": "11.53 ms", + "StdDev": "10.78 ms", + "Median": "2,991.3 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,080.6 ms", - "Error": "11.35 ms", - "StdDev": "10.62 ms", - "Median": "3,077.9 ms" + "Mean": "3,082.3 ms", + "Error": "8.09 ms", + "StdDev": "7.17 ms", + "Median": "3,081.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "131.4 ms", - "Error": "0.55 ms", - "StdDev": "0.49 ms", - "Median": "131.4 ms" + "Version": "1.3.25", + "Mean": "131.0 ms", + "Error": "0.51 ms", + "StdDev": "0.48 ms", + "Median": "131.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 025d54b8d4..28d73b15c0 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.207Z", + "timestamp": "2025-12-04T00:29:39.692Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "562.20 ms", - "Error": "4.786 ms", - "StdDev": "3.997 ms", - "Median": "562.66 ms" + "Version": "1.3.25", + "Mean": "557.53 ms", + "Error": "3.528 ms", + "StdDev": "2.946 ms", + "Median": "557.53 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,535.28 ms", - "Error": "9.344 ms", - "StdDev": "8.283 ms", - "Median": "1,535.46 ms" + "Mean": "1,558.44 ms", + "Error": "15.065 ms", + "StdDev": "13.355 ms", + "Median": "1,556.95 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,492.91 ms", - "Error": "10.300 ms", - "StdDev": "8.601 ms", - "Median": "1,491.03 ms" + "Mean": "1,511.80 ms", + "Error": "12.512 ms", + "StdDev": "11.091 ms", + "Median": "1,509.38 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,587.83 ms", - "Error": "9.385 ms", - "StdDev": "8.779 ms", - "Median": "1,585.14 ms" + "Mean": "1,593.74 ms", + "Error": "10.755 ms", + "StdDev": "10.060 ms", + "Median": "1,594.00 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "79.07 ms", - "Error": "0.197 ms", - "StdDev": "0.175 ms", - "Median": "79.05 ms" + "Version": "1.3.25", + "Mean": "78.96 ms", + "Error": "0.203 ms", + "StdDev": "0.180 ms", + "Median": "79.01 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index d463427e76..73969613c6 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.208Z", + "timestamp": "2025-12-04T00:29:39.693Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "513.47 ms", - "Error": "2.422 ms", - "StdDev": "2.022 ms", - "Median": "514.37 ms" + "Version": "1.3.25", + "Mean": "499.23 ms", + "Error": "4.613 ms", + "StdDev": "3.852 ms", + "Median": "499.70 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "591.32 ms", - "Error": "10.983 ms", - "StdDev": "9.736 ms", - "Median": "590.12 ms" + "Mean": "574.82 ms", + "Error": "11.157 ms", + "StdDev": "12.401 ms", + "Median": "574.86 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "607.19 ms", - "Error": "11.656 ms", - "StdDev": "10.333 ms", - "Median": "606.33 ms" + "Mean": "595.53 ms", + "Error": "9.925 ms", + "StdDev": "9.284 ms", + "Median": "596.78 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "593.97 ms", - "Error": "8.079 ms", - "StdDev": "7.557 ms", - "Median": "594.08 ms" + "Mean": "586.79 ms", + "Error": "11.641 ms", + "StdDev": "12.456 ms", + "Median": "587.30 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "44.09 ms", - "Error": "1.163 ms", - "StdDev": "3.410 ms", - "Median": "43.81 ms" + "Version": "1.3.25", + "Mean": "47.71 ms", + "Error": "1.310 ms", + "StdDev": "3.862 ms", + "Median": "47.33 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 5f89a598af..38ac8dc8b6 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.208Z", + "timestamp": "2025-12-04T00:29:39.693Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,39 +9,39 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "576.8 ms", - "Error": "3.95 ms", - "StdDev": "3.50 ms", - "Median": "576.7 ms" + "Version": "1.3.25", + "Mean": "585.1 ms", + "Error": "5.16 ms", + "StdDev": "4.31 ms", + "Median": "584.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,173.6 ms", - "Error": "11.05 ms", - "StdDev": "9.79 ms", - "Median": "1,173.5 ms" + "Mean": "1,199.4 ms", + "Error": "15.45 ms", + "StdDev": "13.70 ms", + "Median": "1,197.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,153.1 ms", - "Error": "11.70 ms", - "StdDev": "10.94 ms", - "Median": "1,153.5 ms" + "Mean": "1,153.5 ms", + "Error": "6.05 ms", + "StdDev": "5.66 ms", + "Median": "1,153.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,218.3 ms", - "Error": "8.11 ms", - "StdDev": "7.19 ms", - "Median": "1,218.1 ms" + "Mean": "1,238.8 ms", + "Error": "10.58 ms", + "StdDev": "9.89 ms", + "Median": "1,239.3 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", + "Version": "1.3.25", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 896d2cdb76..70a55c91fe 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -94,5 +94,9 @@ { "date": "2025-12-03", "environment": "Ubuntu" + }, + { + "date": "2025-12-04", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index dafe543240..3320c1c79f 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-03T00:29:03.209Z", + "timestamp": "2025-12-04T00:29:39.694Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.3.15", + "Version": "1.3.25", "Mean": "576.1 ms", - "Error": "4.84 ms", - "StdDev": "4.53 ms", - "Median": "574.4 ms" + "Error": "4.97 ms", + "StdDev": "4.65 ms", + "Median": "576.6 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "684.2 ms", - "Error": "13.55 ms", - "StdDev": "12.67 ms", - "Median": "682.2 ms" + "Mean": "692.6 ms", + "Error": "7.09 ms", + "StdDev": "5.54 ms", + "Median": "693.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "645.2 ms", - "Error": "7.86 ms", - "StdDev": "6.97 ms", - "Median": "645.5 ms" + "Mean": "666.6 ms", + "Error": "4.38 ms", + "StdDev": "3.88 ms", + "Median": "666.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "727.7 ms", - "Error": "11.11 ms", - "StdDev": "10.39 ms", - "Median": "728.8 ms" + "Mean": "742.9 ms", + "Error": "5.99 ms", + "StdDev": "5.00 ms", + "Median": "743.1 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "123.9 ms", - "Error": "0.40 ms", - "StdDev": "0.37 ms", - "Median": "123.9 ms" + "Version": "1.3.25", + "Mean": "124.7 ms", + "Error": "0.36 ms", + "StdDev": "0.34 ms", + "Median": "124.8 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "509.49 ms", - "Error": "5.424 ms", - "StdDev": "4.808 ms", - "Median": "509.23 ms" + "Version": "1.3.25", + "Mean": "496.15 ms", + "Error": "4.391 ms", + "StdDev": "3.893 ms", + "Median": "494.67 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "537.70 ms", - "Error": "8.411 ms", - "StdDev": "7.456 ms", - "Median": "537.50 ms" + "Mean": "522.76 ms", + "Error": "10.247 ms", + "StdDev": "10.523 ms", + "Median": "522.38 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "500.01 ms", - "Error": "9.836 ms", - "StdDev": "13.464 ms", - "Median": "497.41 ms" + "Mean": "487.01 ms", + "Error": "9.373 ms", + "StdDev": "9.625 ms", + "Median": "484.89 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "577.92 ms", - "Error": "8.856 ms", - "StdDev": "8.284 ms", - "Median": "575.57 ms" + "Mean": "568.10 ms", + "Error": "6.163 ms", + "StdDev": "5.464 ms", + "Median": "566.76 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "25.20 ms", - "Error": "0.471 ms", - "StdDev": "0.441 ms", - "Median": "25.22 ms" + "Version": "1.3.25", + "Mean": "24.17 ms", + "Error": "0.157 ms", + "StdDev": "0.131 ms", + "Median": "24.13 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "604.9 ms", - "Error": "4.30 ms", - "StdDev": "3.81 ms", - "Median": "605.1 ms" + "Version": "1.3.25", + "Mean": "602.1 ms", + "Error": "5.28 ms", + "StdDev": "4.68 ms", + "Median": "601.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,203.3 ms", - "Error": "12.29 ms", - "StdDev": "9.59 ms", - "Median": "1,202.8 ms" + "Mean": "1,211.4 ms", + "Error": "5.45 ms", + "StdDev": "4.55 ms", + "Median": "1,211.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,994.0 ms", - "Error": "5.18 ms", - "StdDev": "4.85 ms", - "Median": "2,994.6 ms" + "Mean": "2,995.8 ms", + "Error": "11.53 ms", + "StdDev": "10.78 ms", + "Median": "2,991.3 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,080.6 ms", - "Error": "11.35 ms", - "StdDev": "10.62 ms", - "Median": "3,077.9 ms" + "Mean": "3,082.3 ms", + "Error": "8.09 ms", + "StdDev": "7.17 ms", + "Median": "3,081.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "131.4 ms", - "Error": "0.55 ms", - "StdDev": "0.49 ms", - "Median": "131.4 ms" + "Version": "1.3.25", + "Mean": "131.0 ms", + "Error": "0.51 ms", + "StdDev": "0.48 ms", + "Median": "131.1 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "562.20 ms", - "Error": "4.786 ms", - "StdDev": "3.997 ms", - "Median": "562.66 ms" + "Version": "1.3.25", + "Mean": "557.53 ms", + "Error": "3.528 ms", + "StdDev": "2.946 ms", + "Median": "557.53 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,535.28 ms", - "Error": "9.344 ms", - "StdDev": "8.283 ms", - "Median": "1,535.46 ms" + "Mean": "1,558.44 ms", + "Error": "15.065 ms", + "StdDev": "13.355 ms", + "Median": "1,556.95 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,492.91 ms", - "Error": "10.300 ms", - "StdDev": "8.601 ms", - "Median": "1,491.03 ms" + "Mean": "1,511.80 ms", + "Error": "12.512 ms", + "StdDev": "11.091 ms", + "Median": "1,509.38 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,587.83 ms", - "Error": "9.385 ms", - "StdDev": "8.779 ms", - "Median": "1,585.14 ms" + "Mean": "1,593.74 ms", + "Error": "10.755 ms", + "StdDev": "10.060 ms", + "Median": "1,594.00 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "79.07 ms", - "Error": "0.197 ms", - "StdDev": "0.175 ms", - "Median": "79.05 ms" + "Version": "1.3.25", + "Mean": "78.96 ms", + "Error": "0.203 ms", + "StdDev": "0.180 ms", + "Median": "79.01 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "513.47 ms", - "Error": "2.422 ms", - "StdDev": "2.022 ms", - "Median": "514.37 ms" + "Version": "1.3.25", + "Mean": "499.23 ms", + "Error": "4.613 ms", + "StdDev": "3.852 ms", + "Median": "499.70 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "591.32 ms", - "Error": "10.983 ms", - "StdDev": "9.736 ms", - "Median": "590.12 ms" + "Mean": "574.82 ms", + "Error": "11.157 ms", + "StdDev": "12.401 ms", + "Median": "574.86 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "607.19 ms", - "Error": "11.656 ms", - "StdDev": "10.333 ms", - "Median": "606.33 ms" + "Mean": "595.53 ms", + "Error": "9.925 ms", + "StdDev": "9.284 ms", + "Median": "596.78 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "593.97 ms", - "Error": "8.079 ms", - "StdDev": "7.557 ms", - "Median": "594.08 ms" + "Mean": "586.79 ms", + "Error": "11.641 ms", + "StdDev": "12.456 ms", + "Median": "587.30 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", - "Mean": "44.09 ms", - "Error": "1.163 ms", - "StdDev": "3.410 ms", - "Median": "43.81 ms" + "Version": "1.3.25", + "Mean": "47.71 ms", + "Error": "1.310 ms", + "StdDev": "3.862 ms", + "Median": "47.33 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.3.15", - "Mean": "576.8 ms", - "Error": "3.95 ms", - "StdDev": "3.50 ms", - "Median": "576.7 ms" + "Version": "1.3.25", + "Mean": "585.1 ms", + "Error": "5.16 ms", + "StdDev": "4.31 ms", + "Median": "584.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,173.6 ms", - "Error": "11.05 ms", - "StdDev": "9.79 ms", - "Median": "1,173.5 ms" + "Mean": "1,199.4 ms", + "Error": "15.45 ms", + "StdDev": "13.70 ms", + "Median": "1,197.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,153.1 ms", - "Error": "11.70 ms", - "StdDev": "10.94 ms", - "Median": "1,153.5 ms" + "Mean": "1,153.5 ms", + "Error": "6.05 ms", + "StdDev": "5.66 ms", + "Median": "1,153.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,218.3 ms", - "Error": "8.11 ms", - "StdDev": "7.19 ms", - "Median": "1,218.1 ms" + "Mean": "1,238.8 ms", + "Error": "10.58 ms", + "StdDev": "9.89 ms", + "Median": "1,239.3 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.15", + "Version": "1.3.25", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.3.15", - "Mean": "1.998 s", - "Error": "0.0317 s", - "StdDev": "0.0281 s", - "Median": "1.993 s" + "Version": "1.3.25", + "Mean": "1.953 s", + "Error": "0.0361 s", + "StdDev": "0.0320 s", + "Median": "1.947 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.644 s", - "Error": "0.0264 s", - "StdDev": "0.0247 s", - "Median": "1.634 s" + "Mean": "1.565 s", + "Error": "0.0170 s", + "StdDev": "0.0142 s", + "Median": "1.570 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.744 s", - "Error": "0.0163 s", - "StdDev": "0.0152 s", - "Median": "1.742 s" + "Mean": "1.629 s", + "Error": "0.0216 s", + "StdDev": "0.0192 s", + "Median": "1.630 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.649 s", - "Error": "0.0190 s", - "StdDev": "0.0178 s", - "Median": "1.650 s" + "Mean": "1.536 s", + "Error": "0.0288 s", + "StdDev": "0.0308 s", + "Median": "1.535 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-03T00:29:03.206Z" + "lastUpdated": "2025-12-04T00:29:39.691Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index d001077059..e7d50c07a7 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-03", + "timestamp": "2025-12-04", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 5ac56442c6f7d151e1fef425bdd5d470947f9bf0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 07:08:27 +0000 Subject: [PATCH 140/192] chore(deps): update aspire to 13.0.2 (#3976) Co-authored-by: Renovate Bot --- .../ExampleNamespace.AppHost.csproj | 6 +++--- .../ExampleNamespace.TestProject.csproj | 2 +- .../ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj index 933b33dc7e..dec89856dc 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.AppHost/ExampleNamespace.AppHost.csproj @@ -1,6 +1,6 @@  - + Exe @@ -12,8 +12,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 9ff018942b..872ec211ef 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj index 4c50183a69..659de24086 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj @@ -7,7 +7,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index b360e877d4..1a3e9daad4 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -9,7 +9,7 @@ - + From d686d6489a1dbfebfa1972ff6bb0a1711ad90a60 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:00:03 +0000 Subject: [PATCH 141/192] chore(deps): update dependency microsoft.playwright to 1.57.0 (#3978) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index bfe2d3c97c..d0390420b1 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -35,7 +35,7 @@ - + From 71f644306a298342ef92c7a2caf1f3a3cd5416ad Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:08:50 +0000 Subject: [PATCH 142/192] chore: change pull request trigger to pull_request_target --- .github/workflows/claude-code-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 7c094737ee..8255f03abc 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -1,7 +1,7 @@ name: Claude Code Review on: - pull_request: + pull_request_target: types: [opened, synchronize] # Optional: Only run on specific file changes # paths: From 8734b77bd5809fa69a92ae29f8a4c71797826c00 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:13:34 +0000 Subject: [PATCH 143/192] Add Claude Code GitHub Workflow (#3979) * "Update Claude PR Assistant workflow" * "Update Claude Code Review workflow" --- .github/workflows/claude-code-review.yml | 51 +++++++----------------- .github/workflows/claude.yml | 34 +++++----------- 2 files changed, 25 insertions(+), 60 deletions(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 8255f03abc..8452b0f2ff 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -1,7 +1,7 @@ name: Claude Code Review on: - pull_request_target: + pull_request: types: [opened, synchronize] # Optional: Only run on specific file changes # paths: @@ -17,62 +17,41 @@ jobs: # github.event.pull_request.user.login == 'external-contributor' || # github.event.pull_request.user.login == 'new-developer' || # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' - + runs-on: ubuntu-latest permissions: contents: read pull-requests: read issues: read id-token: write - + steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v4 with: fetch-depth: 1 - name: Run Claude Code Review id: claude-review - uses: anthropics/claude-code-action@beta + uses: anthropics/claude-code-action@v1 with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + prompt: | + REPO: ${{ github.repository }} + PR NUMBER: ${{ github.event.pull_request.number }} - # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) - # model: "claude-opus-4-20250514" - - # Direct prompt for automated review (no @claude mention needed) - direct_prompt: | Please review this pull request and provide feedback on: - Code quality and best practices - Potential bugs or issues - Performance considerations - Security concerns - Test coverage - - Be constructive and helpful in your feedback. - # Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR - # use_sticky_comment: true - - # Optional: Customize review based on file types - # direct_prompt: | - # Review this PR focusing on: - # - For TypeScript files: Type safety and proper interface usage - # - For API endpoints: Security, input validation, and error handling - # - For React components: Performance, accessibility, and best practices - # - For tests: Coverage, edge cases, and test quality - - # Optional: Different prompts for different authors - # direct_prompt: | - # ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' && - # 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' || - # 'Please provide a thorough code review focusing on our coding standards and best practices.' }} - - # Optional: Add specific tools for running tests or linting - # allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)" - - # Optional: Skip review for certain conditions - # if: | - # !contains(github.event.pull_request.title, '[skip-review]') && - # !contains(github.event.pull_request.title, '[WIP]') + Use the repository's CLAUDE.md for guidance on style and conventions. Be constructive and helpful in your feedback. + + Use `gh pr comment` with your Bash tool to leave your review as a comment on the PR. + + # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md + # or https://code.claude.com/docs/en/cli-reference for available options + claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"' diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index dde9e4d915..d300267f18 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -26,39 +26,25 @@ jobs: actions: read # Required for Claude to read CI results on PRs steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v4 with: fetch-depth: 1 - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@beta + uses: anthropics/claude-code-action@v1 with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} # This is an optional setting that allows Claude to read CI results on PRs additional_permissions: | actions: read - - # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) - # model: "claude-opus-4-20250514" - - # Optional: Customize the trigger phrase (default: @claude) - # trigger_phrase: "/claude" - - # Optional: Trigger when specific user is assigned to an issue - # assignee_trigger: "claude-bot" - - # Optional: Allow Claude to run specific commands - allowed_tools: "Bash(pwsh run-all-engine-tests.ps1)" - - # Optional: Add custom instructions for Claude to customize its behavior for your project - # custom_instructions: | - # Follow our coding standards - # Ensure all new code has tests - # Use TypeScript for new files - - # Optional: Custom environment variables for Claude - # claude_env: | - # NODE_ENV: test + + # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it. + # prompt: 'Update the pull request description to include a summary of changes.' + + # Optional: Add claude_args to customize behavior and configuration + # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md + # or https://code.claude.com/docs/en/cli-reference for available options + # claude_args: '--allowed-tools Bash(gh pr:*)' From f48fd663534a9224e95eabe4cde269b6860075a2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:17:06 +0000 Subject: [PATCH 144/192] chore: change pull request event to pull_request_target for Claude Code Review workflow --- .github/workflows/claude-code-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 8452b0f2ff..1fb87df195 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -1,7 +1,7 @@ name: Claude Code Review on: - pull_request: + pull_request_target: types: [opened, synchronize] # Optional: Only run on specific file changes # paths: From bea831308621e2cf0cdf93f0b81631d504cca381 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:18:57 +0000 Subject: [PATCH 145/192] feat: add manual trigger for Claude Code Review workflow with PR number input --- .github/workflows/claude-code-review.yml | 29 +++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 1fb87df195..b6af3e39b5 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -9,6 +9,12 @@ on: # - "src/**/*.tsx" # - "src/**/*.js" # - "src/**/*.jsx" + workflow_dispatch: + inputs: + pr_number: + description: 'PR number to review' + required: true + type: number jobs: claude-review: @@ -26,10 +32,27 @@ jobs: id-token: write steps: - - name: Checkout repository + - name: Get PR info (manual trigger) + if: github.event_name == 'workflow_dispatch' + id: pr-info + uses: actions/github-script@v7 + with: + script: | + const { data: pr } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: ${{ inputs.pr_number }} + }); + core.setOutput('ref', pr.head.ref); + core.setOutput('repo', pr.head.repo.full_name); + return pr; + + - name: Checkout PR branch uses: actions/checkout@v4 with: - fetch-depth: 1 + ref: ${{ github.event_name == 'workflow_dispatch' && steps.pr-info.outputs.ref || github.event.pull_request.head.ref }} + repository: ${{ github.event_name == 'workflow_dispatch' && steps.pr-info.outputs.repo || github.event.pull_request.head.repo.full_name }} + fetch-depth: 0 - name: Run Claude Code Review id: claude-review @@ -38,7 +61,7 @@ jobs: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} prompt: | REPO: ${{ github.repository }} - PR NUMBER: ${{ github.event.pull_request.number }} + PR NUMBER: ${{ inputs.pr_number || github.event.pull_request.number }} Please review this pull request and provide feedback on: - Code quality and best practices From 7b727427eb8cbb94604c895c87e962cc998104b1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:30:32 +0000 Subject: [PATCH 146/192] chore: update benchmark results (#3982) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 40 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 40 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 264 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 336 insertions(+), 332 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index f34c596448..fe1dff9296 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 576.1 ms | 576.6 ms | 4.65 ms | -| NUnit | 4.4.0 | 692.6 ms | 693.9 ms | 5.54 ms | -| MSTest | 4.0.2 | 666.6 ms | 666.1 ms | 3.88 ms | -| xUnit3 | 3.2.1 | 742.9 ms | 743.1 ms | 5.00 ms | -| **TUnit (AOT)** | 1.3.25 | 124.7 ms | 124.8 ms | 0.34 ms | +| **TUnit** | 1.3.25 | 589.8 ms | 589.3 ms | 4.89 ms | +| NUnit | 4.4.0 | 688.2 ms | 688.9 ms | 10.89 ms | +| MSTest | 4.0.2 | 645.1 ms | 643.0 ms | 10.60 ms | +| xUnit3 | 3.2.1 | 724.5 ms | 723.6 ms | 9.69 ms | +| **TUnit (AOT)** | 1.3.25 | 124.7 ms | 124.7 ms | 0.25 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 892 - bar [576.1, 692.6, 666.6, 742.9, 124.7] + y-axis "Time (ms)" 0 --> 870 + bar [589.8, 688.2, 645.1, 724.5, 124.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.691Z* +*Last generated: 2025-12-05T00:30:14.385Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index ba217cb914..610a65280f 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 1.953 s | 1.947 s | 0.0320 s | -| Build_NUnit | 4.4.0 | 1.565 s | 1.570 s | 0.0142 s | -| Build_MSTest | 4.0.2 | 1.629 s | 1.630 s | 0.0192 s | -| Build_xUnit3 | 3.2.1 | 1.536 s | 1.535 s | 0.0308 s | +| **TUnit** | 1.3.25 | 2.066 s | 2.060 s | 0.0353 s | +| Build_NUnit | 4.4.0 | 1.649 s | 1.646 s | 0.0154 s | +| Build_MSTest | 4.0.2 | 1.720 s | 1.713 s | 0.0206 s | +| Build_xUnit3 | 3.2.1 | 1.630 s | 1.630 s | 0.0259 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [1.953, 1.565, 1.629, 1.536] + bar [2.066, 1.649, 1.72, 1.63] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.693Z* +*Last generated: 2025-12-05T00:30:14.387Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 36d74803cc..16b809872e 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 496.15 ms | 494.67 ms | 3.893 ms | -| NUnit | 4.4.0 | 522.76 ms | 522.38 ms | 10.523 ms | -| MSTest | 4.0.2 | 487.01 ms | 484.89 ms | 9.625 ms | -| xUnit3 | 3.2.1 | 568.10 ms | 566.76 ms | 5.464 ms | -| **TUnit (AOT)** | 1.3.25 | 24.17 ms | 24.13 ms | 0.131 ms | +| **TUnit** | 1.3.25 | 490.86 ms | 491.42 ms | 5.726 ms | +| NUnit | 4.4.0 | 517.92 ms | 517.35 ms | 7.205 ms | +| MSTest | 4.0.2 | 489.16 ms | 487.76 ms | 10.467 ms | +| xUnit3 | 3.2.1 | 566.85 ms | 565.79 ms | 6.875 ms | +| **TUnit (AOT)** | 1.3.25 | 23.98 ms | 23.96 ms | 0.185 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 682 - bar [496.15, 522.76, 487.01, 568.1, 24.17] + y-axis "Time (ms)" 0 --> 681 + bar [490.86, 517.92, 489.16, 566.85, 23.98] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.692Z* +*Last generated: 2025-12-05T00:30:14.386Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 5a62605cb5..cfd98fd4cf 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 602.1 ms | 601.2 ms | 4.68 ms | -| NUnit | 4.4.0 | 1,211.4 ms | 1,211.3 ms | 4.55 ms | -| MSTest | 4.0.2 | 2,995.8 ms | 2,991.3 ms | 10.78 ms | -| xUnit3 | 3.2.1 | 3,082.3 ms | 3,081.2 ms | 7.17 ms | -| **TUnit (AOT)** | 1.3.25 | 131.0 ms | 131.1 ms | 0.48 ms | +| **TUnit** | 1.3.25 | 602.6 ms | 603.7 ms | 4.06 ms | +| NUnit | 4.4.0 | 1,191.7 ms | 1,192.7 ms | 6.96 ms | +| MSTest | 4.0.2 | 2,973.0 ms | 2,971.9 ms | 10.85 ms | +| xUnit3 | 3.2.1 | 3,065.1 ms | 3,064.9 ms | 7.78 ms | +| **TUnit (AOT)** | 1.3.25 | 131.1 ms | 131.1 ms | 0.51 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3699 - bar [602.1, 1211.4, 2995.8, 3082.3, 131] + y-axis "Time (ms)" 0 --> 3679 + bar [602.6, 1191.7, 2973, 3065.1, 131.1] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.692Z* +*Last generated: 2025-12-05T00:30:14.386Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 8fd875627b..fea2ebf356 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 557.53 ms | 557.53 ms | 2.946 ms | -| NUnit | 4.4.0 | 1,558.44 ms | 1,556.95 ms | 13.355 ms | -| MSTest | 4.0.2 | 1,511.80 ms | 1,509.38 ms | 11.091 ms | -| xUnit3 | 3.2.1 | 1,593.74 ms | 1,594.00 ms | 10.060 ms | -| **TUnit (AOT)** | 1.3.25 | 78.96 ms | 79.01 ms | 0.180 ms | +| **TUnit** | 1.3.25 | 564.33 ms | 564.92 ms | 3.395 ms | +| NUnit | 4.4.0 | 1,572.46 ms | 1,570.59 ms | 9.247 ms | +| MSTest | 4.0.2 | 1,525.48 ms | 1,525.44 ms | 8.892 ms | +| xUnit3 | 3.2.1 | 1,611.66 ms | 1,608.48 ms | 8.282 ms | +| **TUnit (AOT)** | 1.3.25 | 80.17 ms | 80.12 ms | 0.488 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1913 - bar [557.53, 1558.44, 1511.8, 1593.74, 78.96] + y-axis "Time (ms)" 0 --> 1934 + bar [564.33, 1572.46, 1525.48, 1611.66, 80.17] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.692Z* +*Last generated: 2025-12-05T00:30:14.386Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 655bea8b81..1a3bcf1a97 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 499.23 ms | 499.70 ms | 3.852 ms | -| NUnit | 4.4.0 | 574.82 ms | 574.86 ms | 12.401 ms | -| MSTest | 4.0.2 | 595.53 ms | 596.78 ms | 9.284 ms | -| xUnit3 | 3.2.1 | 586.79 ms | 587.30 ms | 12.456 ms | -| **TUnit (AOT)** | 1.3.25 | 47.71 ms | 47.33 ms | 3.862 ms | +| **TUnit** | 1.3.25 | 520.51 ms | 521.26 ms | 3.185 ms | +| NUnit | 4.4.0 | 601.98 ms | 601.95 ms | 6.523 ms | +| MSTest | 4.0.2 | 614.97 ms | 617.66 ms | 8.666 ms | +| xUnit3 | 3.2.1 | 606.12 ms | 605.35 ms | 9.916 ms | +| **TUnit (AOT)** | 1.3.25 | 42.80 ms | 41.72 ms | 3.704 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 715 - bar [499.23, 574.82, 595.53, 586.79, 47.71] + y-axis "Time (ms)" 0 --> 738 + bar [520.51, 601.98, 614.97, 606.12, 42.8] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.692Z* +*Last generated: 2025-12-05T00:30:14.387Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index c647938589..80a60d1275 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-04** from the latest CI run. +This benchmark was automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 585.1 ms | 584.9 ms | 4.31 ms | -| NUnit | 4.4.0 | 1,199.4 ms | 1,197.8 ms | 13.70 ms | -| MSTest | 4.0.2 | 1,153.5 ms | 1,153.4 ms | 5.66 ms | -| xUnit3 | 3.2.1 | 1,238.8 ms | 1,239.3 ms | 9.89 ms | +| **TUnit** | 1.3.25 | 572.8 ms | 573.2 ms | 3.27 ms | +| NUnit | 4.4.0 | 1,155.8 ms | 1,157.2 ms | 9.08 ms | +| MSTest | 4.0.2 | 1,128.3 ms | 1,126.0 ms | 5.78 ms | +| xUnit3 | 3.2.1 | 1,202.4 ms | 1,203.1 ms | 6.16 ms | | **TUnit (AOT)** | 1.3.25 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-04** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1487 - bar [585.1, 1199.4, 1153.5, 1238.8, 0] + y-axis "Time (ms)" 0 --> 1443 + bar [572.8, 1155.8, 1128.3, 1202.4, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-04T00:29:39.693Z* +*Last generated: 2025-12-05T00:30:14.387Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index f8577e92f6..353b37502a 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-04** from the latest CI run. +These benchmarks were automatically generated on **2025-12-05** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-04T00:29:39.694Z* +*Last generated: 2025-12-05T00:30:14.388Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 9af1611b7b..e073f6ef6a 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.691Z", + "timestamp": "2025-12-05T00:30:14.385Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "576.1 ms", - "Error": "4.97 ms", - "StdDev": "4.65 ms", - "Median": "576.6 ms" + "Mean": "589.8 ms", + "Error": "5.23 ms", + "StdDev": "4.89 ms", + "Median": "589.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "692.6 ms", - "Error": "7.09 ms", - "StdDev": "5.54 ms", - "Median": "693.9 ms" + "Mean": "688.2 ms", + "Error": "11.65 ms", + "StdDev": "10.89 ms", + "Median": "688.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "666.6 ms", - "Error": "4.38 ms", - "StdDev": "3.88 ms", - "Median": "666.1 ms" + "Mean": "645.1 ms", + "Error": "11.95 ms", + "StdDev": "10.60 ms", + "Median": "643.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "742.9 ms", - "Error": "5.99 ms", - "StdDev": "5.00 ms", - "Median": "743.1 ms" + "Mean": "724.5 ms", + "Error": "10.93 ms", + "StdDev": "9.69 ms", + "Median": "723.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", "Mean": "124.7 ms", - "Error": "0.36 ms", - "StdDev": "0.34 ms", - "Median": "124.8 ms" + "Error": "0.26 ms", + "StdDev": "0.25 ms", + "Median": "124.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 022113cda2..85e43cb0dd 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.693Z", + "timestamp": "2025-12-05T00:30:14.388Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "1.953 s", - "Error": "0.0361 s", - "StdDev": "0.0320 s", - "Median": "1.947 s" + "Mean": "2.066 s", + "Error": "0.0377 s", + "StdDev": "0.0353 s", + "Median": "2.060 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.565 s", - "Error": "0.0170 s", - "StdDev": "0.0142 s", - "Median": "1.570 s" + "Mean": "1.649 s", + "Error": "0.0164 s", + "StdDev": "0.0154 s", + "Median": "1.646 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.629 s", - "Error": "0.0216 s", - "StdDev": "0.0192 s", - "Median": "1.630 s" + "Mean": "1.720 s", + "Error": "0.0220 s", + "StdDev": "0.0206 s", + "Median": "1.713 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.536 s", - "Error": "0.0288 s", - "StdDev": "0.0308 s", - "Median": "1.535 s" + "Mean": "1.630 s", + "Error": "0.0277 s", + "StdDev": "0.0259 s", + "Median": "1.630 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 4d9a8db751..397a955877 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.692Z", + "timestamp": "2025-12-05T00:30:14.386Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "496.15 ms", - "Error": "4.391 ms", - "StdDev": "3.893 ms", - "Median": "494.67 ms" + "Mean": "490.86 ms", + "Error": "6.121 ms", + "StdDev": "5.726 ms", + "Median": "491.42 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "522.76 ms", - "Error": "10.247 ms", - "StdDev": "10.523 ms", - "Median": "522.38 ms" + "Mean": "517.92 ms", + "Error": "8.128 ms", + "StdDev": "7.205 ms", + "Median": "517.35 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "487.01 ms", - "Error": "9.373 ms", - "StdDev": "9.625 ms", - "Median": "484.89 ms" + "Mean": "489.16 ms", + "Error": "9.417 ms", + "StdDev": "10.467 ms", + "Median": "487.76 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "568.10 ms", - "Error": "6.163 ms", - "StdDev": "5.464 ms", - "Median": "566.76 ms" + "Mean": "566.85 ms", + "Error": "7.756 ms", + "StdDev": "6.875 ms", + "Median": "565.79 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "24.17 ms", - "Error": "0.157 ms", - "StdDev": "0.131 ms", - "Median": "24.13 ms" + "Mean": "23.98 ms", + "Error": "0.198 ms", + "StdDev": "0.185 ms", + "Median": "23.96 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 35ed85cb4d..432418eb07 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.692Z", + "timestamp": "2025-12-05T00:30:14.386Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,41 +10,41 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "602.1 ms", - "Error": "5.28 ms", - "StdDev": "4.68 ms", - "Median": "601.2 ms" + "Mean": "602.6 ms", + "Error": "4.34 ms", + "StdDev": "4.06 ms", + "Median": "603.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,211.4 ms", - "Error": "5.45 ms", - "StdDev": "4.55 ms", - "Median": "1,211.3 ms" + "Mean": "1,191.7 ms", + "Error": "8.34 ms", + "StdDev": "6.96 ms", + "Median": "1,192.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,995.8 ms", - "Error": "11.53 ms", - "StdDev": "10.78 ms", - "Median": "2,991.3 ms" + "Mean": "2,973.0 ms", + "Error": "11.60 ms", + "StdDev": "10.85 ms", + "Median": "2,971.9 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,082.3 ms", - "Error": "8.09 ms", - "StdDev": "7.17 ms", - "Median": "3,081.2 ms" + "Mean": "3,065.1 ms", + "Error": "8.32 ms", + "StdDev": "7.78 ms", + "Median": "3,064.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "131.0 ms", - "Error": "0.51 ms", - "StdDev": "0.48 ms", + "Mean": "131.1 ms", + "Error": "0.58 ms", + "StdDev": "0.51 ms", "Median": "131.1 ms" } ] diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 28d73b15c0..c68e9911bf 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.692Z", + "timestamp": "2025-12-05T00:30:14.386Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "557.53 ms", - "Error": "3.528 ms", - "StdDev": "2.946 ms", - "Median": "557.53 ms" + "Mean": "564.33 ms", + "Error": "4.065 ms", + "StdDev": "3.395 ms", + "Median": "564.92 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,558.44 ms", - "Error": "15.065 ms", - "StdDev": "13.355 ms", - "Median": "1,556.95 ms" + "Mean": "1,572.46 ms", + "Error": "10.432 ms", + "StdDev": "9.247 ms", + "Median": "1,570.59 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,511.80 ms", - "Error": "12.512 ms", - "StdDev": "11.091 ms", - "Median": "1,509.38 ms" + "Mean": "1,525.48 ms", + "Error": "10.031 ms", + "StdDev": "8.892 ms", + "Median": "1,525.44 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,593.74 ms", - "Error": "10.755 ms", - "StdDev": "10.060 ms", - "Median": "1,594.00 ms" + "Mean": "1,611.66 ms", + "Error": "9.918 ms", + "StdDev": "8.282 ms", + "Median": "1,608.48 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "78.96 ms", - "Error": "0.203 ms", - "StdDev": "0.180 ms", - "Median": "79.01 ms" + "Mean": "80.17 ms", + "Error": "0.521 ms", + "StdDev": "0.488 ms", + "Median": "80.12 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 73969613c6..c4e6488782 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.693Z", + "timestamp": "2025-12-05T00:30:14.387Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "499.23 ms", - "Error": "4.613 ms", - "StdDev": "3.852 ms", - "Median": "499.70 ms" + "Mean": "520.51 ms", + "Error": "3.593 ms", + "StdDev": "3.185 ms", + "Median": "521.26 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "574.82 ms", - "Error": "11.157 ms", - "StdDev": "12.401 ms", - "Median": "574.86 ms" + "Mean": "601.98 ms", + "Error": "7.358 ms", + "StdDev": "6.523 ms", + "Median": "601.95 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "595.53 ms", - "Error": "9.925 ms", - "StdDev": "9.284 ms", - "Median": "596.78 ms" + "Mean": "614.97 ms", + "Error": "9.265 ms", + "StdDev": "8.666 ms", + "Median": "617.66 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "586.79 ms", - "Error": "11.641 ms", - "StdDev": "12.456 ms", - "Median": "587.30 ms" + "Mean": "606.12 ms", + "Error": "11.186 ms", + "StdDev": "9.916 ms", + "Median": "605.35 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "47.71 ms", - "Error": "1.310 ms", - "StdDev": "3.862 ms", - "Median": "47.33 ms" + "Mean": "42.80 ms", + "Error": "1.256 ms", + "StdDev": "3.704 ms", + "Median": "41.72 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 38ac8dc8b6..59dc4cbc8c 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.693Z", + "timestamp": "2025-12-05T00:30:14.387Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "585.1 ms", - "Error": "5.16 ms", - "StdDev": "4.31 ms", - "Median": "584.9 ms" + "Mean": "572.8 ms", + "Error": "3.49 ms", + "StdDev": "3.27 ms", + "Median": "573.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,199.4 ms", - "Error": "15.45 ms", - "StdDev": "13.70 ms", - "Median": "1,197.8 ms" + "Mean": "1,155.8 ms", + "Error": "9.70 ms", + "StdDev": "9.08 ms", + "Median": "1,157.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,153.5 ms", - "Error": "6.05 ms", - "StdDev": "5.66 ms", - "Median": "1,153.4 ms" + "Mean": "1,128.3 ms", + "Error": "6.52 ms", + "StdDev": "5.78 ms", + "Median": "1,126.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,238.8 ms", - "Error": "10.58 ms", - "StdDev": "9.89 ms", - "Median": "1,239.3 ms" + "Mean": "1,202.4 ms", + "Error": "6.94 ms", + "StdDev": "6.16 ms", + "Median": "1,203.1 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 70a55c91fe..708e535311 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -98,5 +98,9 @@ { "date": "2025-12-04", "environment": "Ubuntu" + }, + { + "date": "2025-12-05", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 3320c1c79f..b7fdf2448c 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-04T00:29:39.694Z", + "timestamp": "2025-12-05T00:30:14.388Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,125 +10,125 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "576.1 ms", - "Error": "4.97 ms", - "StdDev": "4.65 ms", - "Median": "576.6 ms" + "Mean": "589.8 ms", + "Error": "5.23 ms", + "StdDev": "4.89 ms", + "Median": "589.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "692.6 ms", - "Error": "7.09 ms", - "StdDev": "5.54 ms", - "Median": "693.9 ms" + "Mean": "688.2 ms", + "Error": "11.65 ms", + "StdDev": "10.89 ms", + "Median": "688.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "666.6 ms", - "Error": "4.38 ms", - "StdDev": "3.88 ms", - "Median": "666.1 ms" + "Mean": "645.1 ms", + "Error": "11.95 ms", + "StdDev": "10.60 ms", + "Median": "643.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "742.9 ms", - "Error": "5.99 ms", - "StdDev": "5.00 ms", - "Median": "743.1 ms" + "Mean": "724.5 ms", + "Error": "10.93 ms", + "StdDev": "9.69 ms", + "Median": "723.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", "Mean": "124.7 ms", - "Error": "0.36 ms", - "StdDev": "0.34 ms", - "Median": "124.8 ms" + "Error": "0.26 ms", + "StdDev": "0.25 ms", + "Median": "124.7 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "496.15 ms", - "Error": "4.391 ms", - "StdDev": "3.893 ms", - "Median": "494.67 ms" + "Mean": "490.86 ms", + "Error": "6.121 ms", + "StdDev": "5.726 ms", + "Median": "491.42 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "522.76 ms", - "Error": "10.247 ms", - "StdDev": "10.523 ms", - "Median": "522.38 ms" + "Mean": "517.92 ms", + "Error": "8.128 ms", + "StdDev": "7.205 ms", + "Median": "517.35 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "487.01 ms", - "Error": "9.373 ms", - "StdDev": "9.625 ms", - "Median": "484.89 ms" + "Mean": "489.16 ms", + "Error": "9.417 ms", + "StdDev": "10.467 ms", + "Median": "487.76 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "568.10 ms", - "Error": "6.163 ms", - "StdDev": "5.464 ms", - "Median": "566.76 ms" + "Mean": "566.85 ms", + "Error": "7.756 ms", + "StdDev": "6.875 ms", + "Median": "565.79 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "24.17 ms", - "Error": "0.157 ms", - "StdDev": "0.131 ms", - "Median": "24.13 ms" + "Mean": "23.98 ms", + "Error": "0.198 ms", + "StdDev": "0.185 ms", + "Median": "23.96 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "602.1 ms", - "Error": "5.28 ms", - "StdDev": "4.68 ms", - "Median": "601.2 ms" + "Mean": "602.6 ms", + "Error": "4.34 ms", + "StdDev": "4.06 ms", + "Median": "603.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,211.4 ms", - "Error": "5.45 ms", - "StdDev": "4.55 ms", - "Median": "1,211.3 ms" + "Mean": "1,191.7 ms", + "Error": "8.34 ms", + "StdDev": "6.96 ms", + "Median": "1,192.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,995.8 ms", - "Error": "11.53 ms", - "StdDev": "10.78 ms", - "Median": "2,991.3 ms" + "Mean": "2,973.0 ms", + "Error": "11.60 ms", + "StdDev": "10.85 ms", + "Median": "2,971.9 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,082.3 ms", - "Error": "8.09 ms", - "StdDev": "7.17 ms", - "Median": "3,081.2 ms" + "Mean": "3,065.1 ms", + "Error": "8.32 ms", + "StdDev": "7.78 ms", + "Median": "3,064.9 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "131.0 ms", - "Error": "0.51 ms", - "StdDev": "0.48 ms", + "Mean": "131.1 ms", + "Error": "0.58 ms", + "StdDev": "0.51 ms", "Median": "131.1 ms" } ], @@ -136,118 +136,118 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "557.53 ms", - "Error": "3.528 ms", - "StdDev": "2.946 ms", - "Median": "557.53 ms" + "Mean": "564.33 ms", + "Error": "4.065 ms", + "StdDev": "3.395 ms", + "Median": "564.92 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,558.44 ms", - "Error": "15.065 ms", - "StdDev": "13.355 ms", - "Median": "1,556.95 ms" + "Mean": "1,572.46 ms", + "Error": "10.432 ms", + "StdDev": "9.247 ms", + "Median": "1,570.59 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,511.80 ms", - "Error": "12.512 ms", - "StdDev": "11.091 ms", - "Median": "1,509.38 ms" + "Mean": "1,525.48 ms", + "Error": "10.031 ms", + "StdDev": "8.892 ms", + "Median": "1,525.44 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,593.74 ms", - "Error": "10.755 ms", - "StdDev": "10.060 ms", - "Median": "1,594.00 ms" + "Mean": "1,611.66 ms", + "Error": "9.918 ms", + "StdDev": "8.282 ms", + "Median": "1,608.48 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "78.96 ms", - "Error": "0.203 ms", - "StdDev": "0.180 ms", - "Median": "79.01 ms" + "Mean": "80.17 ms", + "Error": "0.521 ms", + "StdDev": "0.488 ms", + "Median": "80.12 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "499.23 ms", - "Error": "4.613 ms", - "StdDev": "3.852 ms", - "Median": "499.70 ms" + "Mean": "520.51 ms", + "Error": "3.593 ms", + "StdDev": "3.185 ms", + "Median": "521.26 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "574.82 ms", - "Error": "11.157 ms", - "StdDev": "12.401 ms", - "Median": "574.86 ms" + "Mean": "601.98 ms", + "Error": "7.358 ms", + "StdDev": "6.523 ms", + "Median": "601.95 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "595.53 ms", - "Error": "9.925 ms", - "StdDev": "9.284 ms", - "Median": "596.78 ms" + "Mean": "614.97 ms", + "Error": "9.265 ms", + "StdDev": "8.666 ms", + "Median": "617.66 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "586.79 ms", - "Error": "11.641 ms", - "StdDev": "12.456 ms", - "Median": "587.30 ms" + "Mean": "606.12 ms", + "Error": "11.186 ms", + "StdDev": "9.916 ms", + "Median": "605.35 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "47.71 ms", - "Error": "1.310 ms", - "StdDev": "3.862 ms", - "Median": "47.33 ms" + "Mean": "42.80 ms", + "Error": "1.256 ms", + "StdDev": "3.704 ms", + "Median": "41.72 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "585.1 ms", - "Error": "5.16 ms", - "StdDev": "4.31 ms", - "Median": "584.9 ms" + "Mean": "572.8 ms", + "Error": "3.49 ms", + "StdDev": "3.27 ms", + "Median": "573.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,199.4 ms", - "Error": "15.45 ms", - "StdDev": "13.70 ms", - "Median": "1,197.8 ms" + "Mean": "1,155.8 ms", + "Error": "9.70 ms", + "StdDev": "9.08 ms", + "Median": "1,157.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,153.5 ms", - "Error": "6.05 ms", - "StdDev": "5.66 ms", - "Median": "1,153.4 ms" + "Mean": "1,128.3 ms", + "Error": "6.52 ms", + "StdDev": "5.78 ms", + "Median": "1,126.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,238.8 ms", - "Error": "10.58 ms", - "StdDev": "9.89 ms", - "Median": "1,239.3 ms" + "Mean": "1,202.4 ms", + "Error": "6.94 ms", + "StdDev": "6.16 ms", + "Median": "1,203.1 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "1.953 s", - "Error": "0.0361 s", - "StdDev": "0.0320 s", - "Median": "1.947 s" + "Mean": "2.066 s", + "Error": "0.0377 s", + "StdDev": "0.0353 s", + "Median": "2.060 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.565 s", - "Error": "0.0170 s", - "StdDev": "0.0142 s", - "Median": "1.570 s" + "Mean": "1.649 s", + "Error": "0.0164 s", + "StdDev": "0.0154 s", + "Median": "1.646 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.629 s", - "Error": "0.0216 s", - "StdDev": "0.0192 s", - "Median": "1.630 s" + "Mean": "1.720 s", + "Error": "0.0220 s", + "StdDev": "0.0206 s", + "Median": "1.713 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.536 s", - "Error": "0.0288 s", - "StdDev": "0.0308 s", - "Median": "1.535 s" + "Mean": "1.630 s", + "Error": "0.0277 s", + "StdDev": "0.0259 s", + "Median": "1.630 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-04T00:29:39.691Z" + "lastUpdated": "2025-12-05T00:30:14.385Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index e7d50c07a7..f7a038d08a 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-04", + "timestamp": "2025-12-05", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 9a75b5100c8f1f1e0bdcbb15f166c8ea6175b438 Mon Sep 17 00:00:00 2001 From: Marc Piechura Date: Fri, 5 Dec 2025 18:19:35 +0100 Subject: [PATCH 147/192] add taskAssert computation expression for simplified assertions in F# (#3977) * add taskAssert computation expression for simplified assertions in F# * add test for failing assertion in taskAssert computation expression --- .../TUnit.Assertions.FSharp.fsproj | 1 + TUnit.Assertions.FSharp/TaskAssert.fs | 15 +++++ .../TUnit.TestProject.FSharp.fsproj | 1 + TUnit.TestProject.FSharp/TaskAssertTests.fs | 62 ++++++++++++++++++ docs/docs/assertions/fsharp.md | 65 ++++++++++++------- 5 files changed, 121 insertions(+), 23 deletions(-) create mode 100644 TUnit.Assertions.FSharp/TaskAssert.fs create mode 100644 TUnit.TestProject.FSharp/TaskAssertTests.fs diff --git a/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj b/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj index 7eeceee31c..2c94708a04 100644 --- a/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj +++ b/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj @@ -6,6 +6,7 @@ + diff --git a/TUnit.Assertions.FSharp/TaskAssert.fs b/TUnit.Assertions.FSharp/TaskAssert.fs new file mode 100644 index 0000000000..3689e47d70 --- /dev/null +++ b/TUnit.Assertions.FSharp/TaskAssert.fs @@ -0,0 +1,15 @@ +module TUnit.Assertions.FSharp.TaskAssert + +open TUnit.Assertions.Core + +[] +module TaskAssertBuilder = + let taskAssert = task + +[] +module TaskAssertCEExtensions = + type TaskBuilderBase with + #nowarn "FS1204" + member inline x.Bind(assertion: IAssertion, continuation: Unit -> TaskCode<'TOverall, 'TResult2>) : TaskCode<'TOverall, 'TResult2> = + let task = assertion.AssertAsync() + x.Bind(task, continuation) diff --git a/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj b/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj index 5fce858d96..885b879f6a 100644 --- a/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj +++ b/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj @@ -18,6 +18,7 @@ + diff --git a/TUnit.TestProject.FSharp/TaskAssertTests.fs b/TUnit.TestProject.FSharp/TaskAssertTests.fs new file mode 100644 index 0000000000..21e8fc36cb --- /dev/null +++ b/TUnit.TestProject.FSharp/TaskAssertTests.fs @@ -0,0 +1,62 @@ +namespace TUnit.TestProject + +open System.Threading.Tasks +open TUnit.Assertions +open TUnit.Assertions.Extensions +open TUnit.Assertions.FSharp.TaskAssert +open TUnit.Core +open TUnit.TestProject.Library.Models + +type TaskAssertTests() = + + [] + [)>] + member _.IsInitialized_With_1_ClassDataSource(class1: InitializableClass) : Task = + taskAssert { + do! Assert.That(class1.IsInitialized).IsTrue() + } + + [] + [, typeof)>] + member _.IsInitialized_With_2_ClassDataSources(class1: InitializableClass, class2: InitializableClass) : Task = + taskAssert { + do! Assert.That(class1.IsInitialized).IsTrue() + do! Assert.That(class2.IsInitialized).IsTrue() + } + + [] + [, typeof, typeof)>] + member _.IsInitialized_With_3_ClassDataSources(class1: InitializableClass, class2: InitializableClass, class3: InitializableClass) : Task = + taskAssert { + do! Assert.That(class1.IsInitialized).IsTrue() + do! Assert.That(class2.IsInitialized).IsTrue() + do! Assert.That(class3.IsInitialized).IsTrue() + } + + [] + [, typeof, typeof, typeof)>] + member _.IsInitialized_With_4_ClassDataSources(class1: InitializableClass, class2: InitializableClass, class3: InitializableClass, class4: InitializableClass) : Task = + taskAssert { + do! Assert.That(class1.IsInitialized).IsTrue() + do! Assert.That(class2.IsInitialized).IsTrue() + do! Assert.That(class3.IsInitialized).IsTrue() + do! Assert.That(class4.IsInitialized).IsTrue() + } + + [] + [, typeof, typeof, typeof, typeof)>] + member _.IsInitialized_With_5_ClassDataSources(class1: InitializableClass, class2: InitializableClass, class3: InitializableClass, class4: InitializableClass, class5: InitializableClass) : Task = + taskAssert { + do! Assert.That(class1.IsInitialized).IsTrue() + do! Assert.That(class2.IsInitialized).IsTrue() + do! Assert.That(class3.IsInitialized).IsTrue() + do! Assert.That(class4.IsInitialized).IsTrue() + do! Assert.That(class5.IsInitialized).IsTrue() + } + + [] + [] + member _.FailingAssertion_ThrowsCorrectly() : Task = + taskAssert { + do! Assert.That(1 + 1).IsEqualTo(3) // Should fail + } diff --git a/docs/docs/assertions/fsharp.md b/docs/docs/assertions/fsharp.md index 5b10b7ce84..6709cc0f10 100644 --- a/docs/docs/assertions/fsharp.md +++ b/docs/docs/assertions/fsharp.md @@ -14,9 +14,9 @@ So a test could look like: ```fsharp member this.CheckPositive() = async { - let result = 1 + 1 - do! check (Assert.That(result).IsPositive()) - } + let result = 1 + 1 + do! check (Assert.That(result).IsPositive()) +} ``` F# is a lot more strict with type resolution when it comes to extension methods and method overloads. Because of that you may need to annotate the type for the assertions. @@ -24,23 +24,42 @@ F# is a lot more strict with type resolution when it comes to extension methods For example, ```fsharp - [] - [] - member _.Test3() = async { - let value = "1" - do! check (Assert.That(value).IsEqualTo("1")) - } - - [] - [] - member _.Throws1() = async { - do! check (Assert.That(fun () -> task { return new string([||]) }).ThrowsException()) - } - - [] - [] - member _.Throws4() = async { - do! check (Assert.That(fun () -> Task.FromResult(true)).ThrowsNothing()) - } - -``` \ No newline at end of file +[] +[] +member _.Test3() = async { + let value = "1" + do! check (Assert.That(value).IsEqualTo("1")) +} + +[] +[] +member _.Throws1() = async { + do! check (Assert.That(fun () -> task { return new string([||]) }).ThrowsException()) +} + +[] +[] +member _.Throws4() = async { + do! check (Assert.That(fun () -> Task.FromResult(true)).ThrowsNothing()) +} +``` + +## taskAssert expression + +For Task-based tests you can also use the taskAssert computation expression to avoid wrapping every assertion in check. + +To use it, open the namespace: + +```fsharp +open TUnit.Assertions.FSharp.TaskAssert +``` + +Inside a taskAssert block you can directly do! the assertion: +```fsharp +[] +[] +member _.Test3() = taskAssert { + let value = "1" + do! Assert.That(value).IsEqualTo("1") +} +``` From 5feae08d53084adb4ab04de95360e94cef00a38b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:25:24 +0000 Subject: [PATCH 148/192] test: improve failing assertion test to verify exception handling --- TUnit.TestProject.FSharp/TaskAssertTests.fs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/TUnit.TestProject.FSharp/TaskAssertTests.fs b/TUnit.TestProject.FSharp/TaskAssertTests.fs index 21e8fc36cb..b2597ec104 100644 --- a/TUnit.TestProject.FSharp/TaskAssertTests.fs +++ b/TUnit.TestProject.FSharp/TaskAssertTests.fs @@ -55,8 +55,16 @@ type TaskAssertTests() = } [] - [] member _.FailingAssertion_ThrowsCorrectly() : Task = - taskAssert { - do! Assert.That(1 + 1).IsEqualTo(3) // Should fail + task { + let mutable exceptionThrown = false + try + do! taskAssert { + do! Assert.That(1 + 1).IsEqualTo(3) + } + with + | _ -> exceptionThrown <- true + + if not exceptionThrown then + failwith "Expected an exception to be thrown but none was thrown" } From 557e2b3738710a32bcea0bb08d99be36e2050095 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:32:39 +0000 Subject: [PATCH 149/192] Improve support for F# Async return types (#3986) * Improve support for F# Async return types * refactor: add braces for clarity in ValueTask returns across multiple test files --- .../ArgsAsArrayTests.Test.verified.txt | 126 ++++++++++------ ...thImplicitConverterTests.Test.verified.txt | 12 +- ...hodDataSourceDrivenTests.Test.verified.txt | 28 +++- ...sAndMethodArgumentsTests.Test.verified.txt | 8 +- ...assDataSourceDrivenTests.Test.verified.txt | 32 ++-- ...ceDrivenTestsSharedKeyed.Test.verified.txt | 12 +- ...pleDataSourceDrivenTests.Test.verified.txt | 6 +- .../ConstantArgumentsTests.Test.verified.txt | 28 +++- ...ConstantInBaseClassTests.Test.verified.txt | 4 +- ...InterpolatedStringsTests.Test.verified.txt | 4 +- .../CustomDisplayNameTests.Test.verified.txt | 16 +- .../DataDrivenTests.Test.verified.txt | 60 +++++--- ...ithDataSourceMethodTests.Test.verified.txt | 6 +- ...ataSourceGeneratorTests.Typed.verified.txt | 18 ++- ...aSourceGeneratorTests.Untyped.verified.txt | 4 +- .../DecimalArgumentTests.Test.verified.txt | 52 +++++-- .../EnumMemberNamesTests.Test.verified.txt | 6 +- ...bleDataSourceDrivenTests.Test.verified.txt | 14 +- ...pleDataSourceDrivenTests.Test.verified.txt | 6 +- ...xpectedArgumentTypeTests.Test.verified.txt | 8 +- ...romDifferentProjectTests.Test.verified.txt | 12 +- .../InheritsTestsTests.Test.verified.txt | 16 +- .../MatrixTests.Test.verified.txt | 48 ++++-- ...hodDataSourceDrivenTests.Test.verified.txt | 40 +++-- ...thCancellationTokenTests.Test.verified.txt | 6 +- .../NameOfArgumentTests.Test.verified.txt | 4 +- ...ullableByteArgumentTests.Test.verified.txt | 12 +- .../NumberArgumentTests.Test.verified.txt | 36 +++-- .../NumberArgumentTests.TestDE.verified.txt | 36 +++-- .../StringArgumentTests.Test.verified.txt | 12 +- .../Tests.Test.verified.txt | 12 +- .../Tests1538.Test.verified.txt | 12 +- .../Tests1603.Test.verified.txt | 8 +- .../Tests1692.Test.verified.txt | 4 +- .../Tests1821.Test.verified.txt | 8 +- .../Tests1889.Test.DotNet10_0.verified.txt | 12 +- .../Tests1889.Test.DotNet8_0.verified.txt | 12 +- .../Tests1889.Test.DotNet9_0.verified.txt | 12 +- .../Tests1889.Test.Net4_7.verified.txt | 12 +- .../Tests2083.Test.verified.txt | 6 +- .../Tests2085.Test.verified.txt | 8 +- .../Tests2112.Test.verified.txt | 84 +++++++---- ...utCancellationTokenTests.Test.verified.txt | 12 +- ...pleDataSourceDrivenTests.Test.verified.txt | 6 +- ...st_AotSafeDataSourceFactories.verified.txt | 6 +- .../Generators/TestMetadataGenerator.cs | 140 +++++++++--------- .../Discovery/ReflectionTestDataCollector.cs | 3 +- TUnit.TestProject.FSharp/AsyncTests.fs | 51 +++++++ .../TUnit.TestProject.FSharp.fsproj | 1 + 49 files changed, 740 insertions(+), 341 deletions(-) create mode 100644 TUnit.TestProject.FSharp/AsyncTests.fs diff --git a/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt index adcb5e7769..7cb140d823 100644 --- a/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt @@ -74,26 +74,40 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Params__string___TestSo switch (args.Length) { case 0: - instance.Params(new string[0]); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params(new string[0]); + return default(global::System.Threading.Tasks.ValueTask); + } case 1: - instance.Params((args[0] is null ? null : args[0] is string[] arr ? arr : new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]) })); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params((args[0] is null ? null : args[0] is string[] arr ? arr : new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]) })); + return default(global::System.Threading.Tasks.ValueTask); + } case 2: - instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 3: - instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 4: - instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 5: - instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 6: - instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) }); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected between 0 and 1 arguments, but got {args.Length}"); } @@ -197,26 +211,40 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_ParamsEnumerable__IEnum switch (args.Length) { case 0: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } case 1: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } case 2: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } case 3: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } case 4: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } case 5: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } case 6: - instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected between 0 and 1 arguments, but got {args.Length}"); } @@ -327,26 +355,40 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Following_Non_Params__i switch (args.Length) { case 1: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } case 2: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } case 3: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } case 4: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } case 5: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } case 6: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } case 7: - instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected between 1 and 2 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt index e574acda8e..bb479a9d9d 100644 --- a/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt @@ -77,8 +77,10 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Expli switch (args.Length) { case 1: - instance.Explicit(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Explicit(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -185,8 +187,10 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Impli switch (args.Length) { case 1: - instance.Implicit(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Implicit(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/AsyncMethodDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/AsyncMethodDataSourceDrivenTests.Test.verified.txt index a4e5d2b5ae..aeee5efd13 100644 --- a/TUnit.Core.SourceGenerator.Tests/AsyncMethodDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AsyncMethodDataSourceDrivenTests.Test.verified.txt @@ -96,7 +96,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_AsyncMe switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_SingleValue(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_SingleValue(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -229,7 +231,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_AsyncMe switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_Tuples(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_Tuples(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -355,7 +359,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_AsyncMe switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_Enumerable(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_Enumerable(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -481,7 +487,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_AsyncMe switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_Func(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_Func(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -607,7 +615,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_AsyncMe switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_WithArguments(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_WithArguments(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -733,7 +743,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_AsyncMe switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_ExternalClass(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AsyncMethodDataSource_ExternalClass(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -859,7 +871,9 @@ internal sealed class TUnit_TestProject_AsyncMethodDataSourceDrivenTests_ValueTa switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.ValueTaskMethodDataSource_SingleValue(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.ValueTaskMethodDataSource_SingleValue(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt index 9354f67153..1d7ccc4407 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt @@ -197,7 +197,9 @@ internal sealed class TUnit_TestProject_ClassAndMethodArgumentsTests_WithMethodL switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.WithMethodLevel(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.WithMethodLevel(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -320,7 +322,9 @@ internal sealed class TUnit_TestProject_ClassAndMethodArgumentsTests_IgnoreParam switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.IgnoreParameters(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.IgnoreParameters(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt index 3187ccef56..01fcc949d8 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt @@ -75,8 +75,10 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_DataSource_Cl switch (args.Length) { case 1: - instance.DataSource_Class(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Class(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -181,8 +183,10 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_DataSource_Cl switch (args.Length) { case 1: - instance.DataSource_Class_Generic(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Class_Generic(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -287,7 +291,9 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_IsInitialized switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_1_ClassDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_1_ClassDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -399,7 +405,9 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_IsInitialized switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_2_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_2_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -518,7 +526,9 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_IsInitialized switch (args.Length) { case 3: - return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_3_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_3_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } @@ -644,7 +654,9 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_IsInitialized switch (args.Length) { case 4: - return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_4_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_4_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]))); + } default: throw new global::System.ArgumentException($"Expected exactly 4 arguments, but got {args.Length}"); } @@ -777,7 +789,9 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTests_IsInitialized switch (args.Length) { case 5: - return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_5_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.IsInitialized_With_5_ClassDataSources(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]))); + } default: throw new global::System.ArgumentException($"Expected exactly 5 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt index 23866673ce..0ed69b261f 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt @@ -76,8 +76,10 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTestsSharedKeyed_Da switch (args.Length) { case 1: - instance.DataSource_Class(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Class(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -183,8 +185,10 @@ internal sealed class TUnit_TestProject_ClassDataSourceDrivenTestsSharedKeyed_Da switch (args.Length) { case 1: - instance.DataSource_Class_Generic(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Class_Generic(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt index dd7c2f5de3..d5dd55b3e5 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt @@ -364,8 +364,10 @@ internal sealed class TUnit_TestProject_ClassTupleDataSourceDrivenTests_DataSour switch (args.Length) { case 3: - instance.DataSource_TupleMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_TupleMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ConstantArgumentsTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConstantArgumentsTests.Test.verified.txt index 582a7cb6ec..1f18d3968c 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConstantArgumentsTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConstantArgumentsTests.Test.verified.txt @@ -75,7 +75,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_String1__string_T switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.String1(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.String1(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -180,7 +182,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_Int__int_TestSour switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Int(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Int(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -285,7 +289,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_Double__double_Te switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Double(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Double(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -390,7 +396,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_Float__float_Test switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Float(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Float(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -495,7 +503,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_Long__long_TestSo switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Long(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Long(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -600,7 +610,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_UInt__uint_TestSo switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.UInt(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.UInt(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -705,7 +717,9 @@ internal sealed class TUnit_TestProject_ConstantArgumentsTests_ULong__ulong_Test switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.ULong(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.ULong(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ConstantInBaseClassTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConstantInBaseClassTests.Test.verified.txt index 33ca6c1b5e..823766c246 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConstantInBaseClassTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConstantInBaseClassTests.Test.verified.txt @@ -75,7 +75,9 @@ internal sealed class TUnit_TestProject_Bugs__1432_ConstantInBaseClassTests_Some switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.SomeTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.SomeTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ConstantsInInterpolatedStringsTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConstantsInInterpolatedStringsTests.Test.verified.txt index 92048fa458..640e00c2d5 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConstantsInInterpolatedStringsTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConstantsInInterpolatedStringsTests.Test.verified.txt @@ -75,7 +75,9 @@ internal sealed class TUnit_TestProject_Bugs__1432_ConstantsInInterpolatedString switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.SomeTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.SomeTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/CustomDisplayNameTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/CustomDisplayNameTests.Test.verified.txt index f28457c175..f5b91c08ec 100644 --- a/TUnit.Core.SourceGenerator.Tests/CustomDisplayNameTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/CustomDisplayNameTests.Test.verified.txt @@ -306,7 +306,9 @@ internal sealed class TUnit_TestProject_CustomDisplayNameTests_Test3__string_int switch (args.Length) { case 3: - return new global::System.Threading.Tasks.ValueTask(instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } @@ -436,7 +438,9 @@ internal sealed class TUnit_TestProject_CustomDisplayNameTests_MethodDataSourceT switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.MethodDataSourceTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MethodDataSourceTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -564,7 +568,9 @@ internal sealed class TUnit_TestProject_CustomDisplayNameTests_TestParameterName switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.TestParameterNamePrefixBug(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.TestParameterNamePrefixBug(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -682,7 +688,9 @@ internal sealed class TUnit_TestProject_CustomDisplayNameTests_PasswordTest__str switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.PasswordTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.PasswordTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt index c49443a6ac..75c55bca72 100644 --- a/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt @@ -77,8 +77,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_DataSource_Method__int_T switch (args.Length) { case 1: - instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -192,8 +194,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_DataSource_Method__int_s switch (args.Length) { case 2: - instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -300,8 +304,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_EnumValue__TestEnum_Test switch (args.Length) { case 1: - instance.EnumValue(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.EnumValue(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -406,8 +412,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_NullValue__string__TestS switch (args.Length) { case 1: - instance.NullValue(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.NullValue(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -512,8 +520,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_EmptyString__string__Tes switch (args.Length) { case 1: - instance.EmptyString(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.EmptyString(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -618,8 +628,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_NonEmptyString__string__ switch (args.Length) { case 1: - instance.NonEmptyString(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.NonEmptyString(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -726,8 +738,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_BooleanString__bool__Tes switch (args.Length) { case 1: - instance.BooleanString(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.BooleanString(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -832,8 +846,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_Type__Type_TestSource : switch (args.Length) { case 1: - instance.Type(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Type(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -938,8 +954,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_IntegerArray__int___Test switch (args.Length) { case 1: - instance.IntegerArray(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.IntegerArray(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -1044,8 +1062,10 @@ internal sealed class TUnit_TestProject_DataDrivenTests_IntMaxValue__int_TestSou switch (args.Length) { case 1: - instance.IntMaxValue(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.IntMaxValue(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt index f3385cb194..e7e7b03dce 100644 --- a/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt @@ -163,8 +163,10 @@ internal sealed class TUnit_TestProject_DataSourceClassCombinedWithDataSourceMet switch (args.Length) { case 1: - instance.DataSourceClassCombinedWithDataSourceMethodTest(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSourceClassCombinedWithDataSourceMethodTest(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt index 9bd5b95edd..85fe8ddee5 100644 --- a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt @@ -107,8 +107,10 @@ internal sealed class TUnit_TestProject_DataSourceGeneratorTests_GeneratedData_M switch (args.Length) { case 1: - instance.GeneratedData_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.GeneratedData_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -259,8 +261,10 @@ internal sealed class TUnit_TestProject_DataSourceGeneratorTests_GeneratedData_M switch (args.Length) { case 3: - instance.GeneratedData_Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.GeneratedData_Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } @@ -411,8 +415,10 @@ internal sealed class TUnit_TestProject_DataSourceGeneratorTests_GeneratedData_M switch (args.Length) { case 3: - instance.GeneratedData_Method3(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.GeneratedData_Method3(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Untyped.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Untyped.verified.txt index bd26b22a7c..5a4bbdb52f 100644 --- a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Untyped.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Untyped.verified.txt @@ -95,7 +95,9 @@ internal sealed class TUnit_TestProject_AutoDataTests_Test1__string_int_double_b switch (args.Length) { case 4: - return new global::System.Threading.Tasks.ValueTask(instance.Test1(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Test1(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]))); + } default: throw new global::System.ArgumentException($"Expected exactly 4 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/DecimalArgumentTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/DecimalArgumentTests.Test.verified.txt index 894195d62b..f10cb90061 100644 --- a/TUnit.Core.SourceGenerator.Tests/DecimalArgumentTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/DecimalArgumentTests.Test.verified.txt @@ -84,7 +84,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_Transfer__decimal_d switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.Transfer(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Transfer(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -189,7 +191,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_SimpleDecimal__deci switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.SimpleDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.SimpleDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -294,7 +298,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_SmallDecimal__decim switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.SmallDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.SmallDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -399,7 +405,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_MaxDecimal__decimal switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.MaxDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MaxDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -504,7 +512,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_MinDecimal__decimal switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.MinDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MinDecimal(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -609,7 +619,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_ExplicitDecimalValu switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.ExplicitDecimalValue(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.ExplicitDecimalValue(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -728,7 +740,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_MultipleDecimals__d switch (args.Length) { case 3: - return new global::System.Threading.Tasks.ValueTask(instance.MultipleDecimals(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MultipleDecimals(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } @@ -835,8 +849,10 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_Test__decimal_TestS switch (args.Length) { case 1: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -978,8 +994,10 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_TransactionDiscount switch (args.Length) { case 6: - instance.TransactionDiscountCalculations(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.TransactionDiscountCalculations(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 6 arguments, but got {args.Length}"); } @@ -1084,7 +1102,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_Equality3__decimal_ switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Equality3(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Equality3(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -1189,7 +1209,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_Equality4__decimal_ switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Equality4(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Equality4(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -1294,7 +1316,9 @@ internal sealed class TUnit_TestProject_DecimalArgumentTests_TestMethod__decimal switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.TestMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.TestMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/EnumMemberNamesTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/EnumMemberNamesTests.Test.verified.txt index 7b793e1562..208b4be63b 100644 --- a/TUnit.Core.SourceGenerator.Tests/EnumMemberNamesTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/EnumMemberNamesTests.Test.verified.txt @@ -77,8 +77,10 @@ internal sealed class TUnit_TestProject_Bugs__1432_EnumMemberNamesTests_SomeTest switch (args.Length) { case 1: - instance.SomeTest(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.SomeTest(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/EnumerableDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/EnumerableDataSourceDrivenTests.Test.verified.txt index 6ba8139e62..1dbabb774a 100644 --- a/TUnit.Core.SourceGenerator.Tests/EnumerableDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/EnumerableDataSourceDrivenTests.Test.verified.txt @@ -96,7 +96,9 @@ internal sealed class TUnit_TestProject_EnumerableDataSourceDrivenTests_DataSour switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -222,7 +224,9 @@ internal sealed class TUnit_TestProject_EnumerableDataSourceDrivenTests_DataSour switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.DataSource_Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.DataSource_Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -348,8 +352,10 @@ internal sealed class TUnit_TestProject_EnumerableDataSourceDrivenTests_DataSour switch (args.Length) { case 1: - instance.DataSource_WithBaseReturn(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_WithBaseReturn(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/EnumerableTupleDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/EnumerableTupleDataSourceDrivenTests.Test.verified.txt index 3a9a293f16..798797ad0e 100644 --- a/TUnit.Core.SourceGenerator.Tests/EnumerableTupleDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/EnumerableTupleDataSourceDrivenTests.Test.verified.txt @@ -132,8 +132,10 @@ internal sealed class TUnit_TestProject_EnumerableTupleDataSourceDrivenTests_Dat switch (args.Length) { case 3: - instance.DataSource_TupleMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_TupleMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/ExpectedArgumentTypeTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ExpectedArgumentTypeTests.Test.verified.txt index bda4e49e2b..d7b8d38a28 100644 --- a/TUnit.Core.SourceGenerator.Tests/ExpectedArgumentTypeTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ExpectedArgumentTypeTests.Test.verified.txt @@ -94,7 +94,9 @@ internal sealed class TUnit_TestProject_ExpectedArgumentTypeTests_TypedArguments switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.TypedArguments(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.TypedArguments(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -220,7 +222,9 @@ internal sealed class TUnit_TestProject_ExpectedArgumentTypeTests_EnumTypes__obj switch (args.Length) { case 3: - return new global::System.Threading.Tasks.ValueTask(instance.EnumTypes(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.EnumTypes(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/InheritedTestsFromDifferentProjectTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/InheritedTestsFromDifferentProjectTests.Test.verified.txt index 2994f8ddff..219be38513 100644 --- a/TUnit.Core.SourceGenerator.Tests/InheritedTestsFromDifferentProjectTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/InheritedTestsFromDifferentProjectTests.Test.verified.txt @@ -167,8 +167,10 @@ internal sealed class TUnit_TestProject_InheritedTestsFromDifferentProjectTests_ switch (args.Length) { case 1: - instance.GenericMethodDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.GenericMethodDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -286,8 +288,10 @@ internal sealed class TUnit_TestProject_InheritedTestsFromDifferentProjectTests_ switch (args.Length) { case 1: - instance.NonGenericMethodDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.NonGenericMethodDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt index 94339aecb1..0f192ff3f5 100644 --- a/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt @@ -125,7 +125,9 @@ internal sealed class TUnit_TestProject_Bugs__1924_None_BaseClass_Test__int_Test switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -268,7 +270,9 @@ internal sealed class TUnit_TestProject_Bugs__1924_None_Tests_Test__int_TestSour switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -411,7 +415,9 @@ internal sealed class TUnit_TestProject_Bugs__1924_None_Tests2_Test__int_TestSou switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -554,7 +560,9 @@ internal sealed class TUnit_TestProject_Bugs__1924_None_Tests3_Test__int_TestSou switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/MatrixTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/MatrixTests.Test.verified.txt index f3e953ed52..ea365df2ae 100644 --- a/TUnit.Core.SourceGenerator.Tests/MatrixTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/MatrixTests.Test.verified.txt @@ -89,7 +89,9 @@ internal sealed class TUnit_TestProject_MatrixTests_MatrixTest_One__string_int_b switch (args.Length) { case 3: - return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest_One(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest_One(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } @@ -215,7 +217,9 @@ internal sealed class TUnit_TestProject_MatrixTests_MatrixTest_Two__int_int_int_ switch (args.Length) { case 4: - return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest_Two(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest_Two(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]))); + } default: throw new global::System.ArgumentException($"Expected exactly 4 arguments, but got {args.Length}"); } @@ -334,7 +338,9 @@ internal sealed class TUnit_TestProject_MatrixTests_MatrixTest_Enum__int_TestEnu switch (args.Length) { case 3: - return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest_Enum(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest_Enum(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]))); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } @@ -446,7 +452,9 @@ internal sealed class TUnit_TestProject_MatrixTests_AutoGenerateBools__string_bo switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.AutoGenerateBools(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AutoGenerateBools(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -558,7 +566,9 @@ internal sealed class TUnit_TestProject_MatrixTests_AutoGenerateBools2__string_b switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.AutoGenerateBools2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.AutoGenerateBools2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -670,7 +680,9 @@ internal sealed class TUnit_TestProject_MatrixTests_ImplicitConversion__OneOf_Te switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.ImplicitConversion(TUnit.Core.Helpers.CastHelper.Cast>(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.ImplicitConversion(TUnit.Core.Helpers.CastHelper.Cast>(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -782,7 +794,9 @@ internal sealed class TUnit_TestProject_MatrixTests_ExcludingAutoGeneratedMatrix switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.ExcludingAutoGeneratedMatrixValues(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.ExcludingAutoGeneratedMatrixValues(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } @@ -887,7 +901,9 @@ internal sealed class TUnit_TestProject_MatrixTests_Method1__int_TestSource : gl switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Method1(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Method1(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -992,7 +1008,9 @@ internal sealed class TUnit_TestProject_MatrixTests_Method2__int_TestSource : gl switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -1097,7 +1115,9 @@ internal sealed class TUnit_TestProject_MatrixTests_Method3__int_TestSource : gl switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Method3(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Method3(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -1202,7 +1222,9 @@ internal sealed class TUnit_TestProject_MatrixTests_Method4__int_TestSource : gl switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Method4(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Method4(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -1317,7 +1339,9 @@ internal sealed class TUnit_TestProject_MatrixTests_Exclusion__int_int_TestSourc switch (args.Length) { case 2: - return new global::System.Threading.Tasks.ValueTask(instance.Exclusion(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Exclusion(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]))); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt index 4ac45b08bb..beb11429e7 100644 --- a/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt @@ -86,8 +86,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_DataSource_M switch (args.Length) { case 1: - instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -203,8 +205,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_DataSource_M switch (args.Length) { case 1: - instance.DataSource_Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -320,8 +324,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_DataSource_M switch (args.Length) { case 1: - instance.DataSource_Method_WithAction(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method_WithAction(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -452,8 +458,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_DataSource_M switch (args.Length) { case 1: - instance.DataSource_Method3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -611,8 +619,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_DataSource_M switch (args.Length) { case 1: - instance.DataSource_Method4(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_Method4(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -728,8 +738,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_DataSource_W switch (args.Length) { case 1: - instance.DataSource_WithBaseReturn(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_WithBaseReturn(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -855,7 +867,9 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenTests_EnumerableFu switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenWithCancellationTokenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenWithCancellationTokenTests.Test.verified.txt index a842404390..0a25276f19 100644 --- a/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenWithCancellationTokenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenWithCancellationTokenTests.Test.verified.txt @@ -195,8 +195,10 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenWithCancellationTo switch (args.Length) { case 1: - instance.MyTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.MyTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/NameOfArgumentTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/NameOfArgumentTests.Test.verified.txt index a89cf44b80..9bb78eda2d 100644 --- a/TUnit.Core.SourceGenerator.Tests/NameOfArgumentTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/NameOfArgumentTests.Test.verified.txt @@ -75,7 +75,9 @@ internal sealed class TUnit_TestProject_NameOfArgumentTests_TestName__string_Tes switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.TestName(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.TestName(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/NullableByteArgumentTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/NullableByteArgumentTests.Test.verified.txt index 7683db8709..60b1e9ef0e 100644 --- a/TUnit.Core.SourceGenerator.Tests/NullableByteArgumentTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/NullableByteArgumentTests.Test.verified.txt @@ -76,8 +76,10 @@ internal sealed class TUnit_TestProject_NullableByteArgumentTests_Test__byte__Te switch (args.Length) { case 1: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -190,8 +192,10 @@ internal sealed class TUnit_TestProject_NullableByteArgumentTests_Test2__byte_by switch (args.Length) { case 2: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 2 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.Test.verified.txt index f953755712..ba3b1e1df9 100644 --- a/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.Test.verified.txt @@ -75,8 +75,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Int__int_TestSource switch (args.Length) { case 1: - instance.Int(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Int(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -181,8 +183,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Double__double_TestS switch (args.Length) { case 1: - instance.Double(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Double(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -287,8 +291,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Float__float_TestSou switch (args.Length) { case 1: - instance.Float(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Float(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -393,8 +399,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Long__long_TestSourc switch (args.Length) { case 1: - instance.Long(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Long(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -499,8 +507,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_ULong__ulong_TestSou switch (args.Length) { case 1: - instance.ULong(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ULong(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -605,8 +615,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_UInt__uint_TestSourc switch (args.Length) { case 1: - instance.UInt(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.UInt(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.TestDE.verified.txt b/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.TestDE.verified.txt index f953755712..ba3b1e1df9 100644 --- a/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.TestDE.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/NumberArgumentTests.TestDE.verified.txt @@ -75,8 +75,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Int__int_TestSource switch (args.Length) { case 1: - instance.Int(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Int(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -181,8 +183,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Double__double_TestS switch (args.Length) { case 1: - instance.Double(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Double(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -287,8 +291,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Float__float_TestSou switch (args.Length) { case 1: - instance.Float(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Float(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -393,8 +399,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_Long__long_TestSourc switch (args.Length) { case 1: - instance.Long(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Long(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -499,8 +507,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_ULong__ulong_TestSou switch (args.Length) { case 1: - instance.ULong(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.ULong(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -605,8 +615,10 @@ internal sealed class TUnit_TestProject_NumberArgumentTests_UInt__uint_TestSourc switch (args.Length) { case 1: - instance.UInt(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.UInt(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/StringArgumentTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/StringArgumentTests.Test.verified.txt index ddf79f8751..6e12c5b360 100644 --- a/TUnit.Core.SourceGenerator.Tests/StringArgumentTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/StringArgumentTests.Test.verified.txt @@ -86,8 +86,10 @@ internal sealed class TUnit_TestProject_StringArgumentTests_Normal__string_TestS switch (args.Length) { case 1: - instance.Normal(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Normal(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -199,8 +201,10 @@ internal sealed class TUnit_TestProject_StringArgumentTests_Nullable__string__Te switch (args.Length) { case 1: - instance.Nullable(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Nullable(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests.Test.verified.txt index ae338ab8db..b14aa06aac 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests.Test.verified.txt @@ -87,7 +87,9 @@ internal sealed class TUnit_TestProject_Bugs__1304_Tests_TryParse_InvalidString_ switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.TryParse_InvalidString_ReturnsFailure(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + { + return new global::System.Threading.Tasks.ValueTask(instance.TryParse_InvalidString_ReturnsFailure(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -196,7 +198,9 @@ internal sealed class TUnit_TestProject_Bugs__1304_Tests_Parse_InvalidString_Thr switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Parse_InvalidString_ThrowsException(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Parse_InvalidString_ThrowsException(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -302,7 +306,9 @@ internal sealed class TUnit_TestProject_Bugs__1304_Tests_TryParse_ValidString_Re switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.TryParse_ValidString_ReturnsAccountId(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.TryParse_ValidString_ReturnsAccountId(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1538.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1538.Test.verified.txt index f58a3c0aac..8851e6d423 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1538.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1538.Test.verified.txt @@ -145,8 +145,10 @@ internal sealed class TUnit_TestProject_Bugs__1538_Tests_Eight_Args__bool_string switch (args.Length) { case 8: - instance.Eight_Args(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]), TUnit.Core.Helpers.CastHelper.Cast(args[7])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Eight_Args(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]), TUnit.Core.Helpers.CastHelper.Cast(args[7])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 8 arguments, but got {args.Length}"); } @@ -377,8 +379,10 @@ internal sealed class TUnit_TestProject_Bugs__1538_Tests_SixteenArgs__bool_strin switch (args.Length) { case 16: - instance.SixteenArgs(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]), TUnit.Core.Helpers.CastHelper.Cast(args[7]), TUnit.Core.Helpers.CastHelper.Cast(args[8]), TUnit.Core.Helpers.CastHelper.Cast(args[9]), TUnit.Core.Helpers.CastHelper.Cast(args[10]), TUnit.Core.Helpers.CastHelper.Cast(args[11]), TUnit.Core.Helpers.CastHelper.Cast(args[12]), TUnit.Core.Helpers.CastHelper.Cast(args[13]), TUnit.Core.Helpers.CastHelper.Cast(args[14]), TUnit.Core.Helpers.CastHelper.Cast(args[15])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.SixteenArgs(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]), TUnit.Core.Helpers.CastHelper.Cast(args[7]), TUnit.Core.Helpers.CastHelper.Cast(args[8]), TUnit.Core.Helpers.CastHelper.Cast(args[9]), TUnit.Core.Helpers.CastHelper.Cast(args[10]), TUnit.Core.Helpers.CastHelper.Cast(args[11]), TUnit.Core.Helpers.CastHelper.Cast(args[12]), TUnit.Core.Helpers.CastHelper.Cast(args[13]), TUnit.Core.Helpers.CastHelper.Cast(args[14]), TUnit.Core.Helpers.CastHelper.Cast(args[15])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 16 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1603.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1603.Test.verified.txt index 3a4cae1c70..1dbf27639e 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1603.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1603.Test.verified.txt @@ -75,7 +75,9 @@ internal sealed class TUnit_TestProject_Bugs__1603_Tests_Casted_Integer_To_Short switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Casted_Integer_To_Short_Converts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Casted_Integer_To_Short_Converts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -180,7 +182,9 @@ internal sealed class TUnit_TestProject_Bugs__1603_Tests_Integer_To_Short_Conver switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Integer_To_Short_Converts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Integer_To_Short_Converts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1692.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1692.Test.verified.txt index dc434877b6..e33251f183 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1692.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1692.Test.verified.txt @@ -76,7 +76,9 @@ internal sealed class TUnit_TestProject_Bugs__1692_Tests_NullTest__string__TestS switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.NullTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.NullTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt index 13a93df557..2c961017ad 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt @@ -91,7 +91,9 @@ internal sealed class TUnit_TestProject_Bugs__1821_Tests_MethodDataSource__strin switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.MethodDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MethodDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -212,7 +214,9 @@ internal sealed class TUnit_TestProject_Bugs__1821_Tests_MatrixDataSource__strin switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.MatrixDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.MatrixDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt index 65d6193dd3..d867b43a61 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt @@ -165,8 +165,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test2__bool_TestS switch (args.Length) { case 1: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -273,8 +275,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test3__bool_TestS switch (args.Length) { case 1: - instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet8_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet8_0.verified.txt index 65d6193dd3..d867b43a61 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet8_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet8_0.verified.txt @@ -165,8 +165,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test2__bool_TestS switch (args.Length) { case 1: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -273,8 +275,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test3__bool_TestS switch (args.Length) { case 1: - instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet9_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet9_0.verified.txt index 65d6193dd3..d867b43a61 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet9_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet9_0.verified.txt @@ -165,8 +165,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test2__bool_TestS switch (args.Length) { case 1: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -273,8 +275,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test3__bool_TestS switch (args.Length) { case 1: - instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.Net4_7.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.Net4_7.verified.txt index aabb7073ca..eab0c4bca0 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.Net4_7.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.Net4_7.verified.txt @@ -165,8 +165,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test2__bool_TestS switch (args.Length) { case 1: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -273,8 +275,10 @@ internal sealed class TUnit_TestProject_Bugs__1889_DerivedTest_Test3__bool_TestS switch (args.Length) { case 1: - instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test3(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests2083.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests2083.Test.verified.txt index 7106ee7e81..38dbc9f180 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests2083.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests2083.Test.verified.txt @@ -80,8 +80,10 @@ internal sealed class TUnit_TestProject_Bugs__2083_Tests_MyTest__long_TestSource switch (args.Length) { case 1: - instance.MyTest(TUnit.Core.Helpers.CastHelper.Cast(args[0])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.MyTest(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests2085.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests2085.Test.verified.txt index aa612dac45..c5d52626cf 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests2085.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests2085.Test.verified.txt @@ -75,7 +75,9 @@ internal sealed class TUnit_TestProject_Bugs__2085_Tests_Double_SpecialConsts__d switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Double_SpecialConsts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Double_SpecialConsts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -180,7 +182,9 @@ internal sealed class TUnit_TestProject_Bugs__2085_Tests_Float_SpecialConsts__fl switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.Float_SpecialConsts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + { + return new global::System.Threading.Tasks.ValueTask(instance.Float_SpecialConsts(TUnit.Core.Helpers.CastHelper.Cast(args[0]))); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt index 8d2e037a83..269c08b65f 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt @@ -83,26 +83,40 @@ internal sealed class TUnit_TestProject_Bugs__2112_Tests_Test__int_long___TestSo switch (args.Length) { case 1: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[0]); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[0]); + return default(global::System.Threading.Tasks.ValueTask); + } case 2: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args[1] is null ? null : args[1] is long[] arr ? arr : new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]) })); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args[1] is null ? null : args[1] is long[] arr ? arr : new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]) })); + return default(global::System.Threading.Tasks.ValueTask); + } case 3: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 4: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 5: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 6: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 7: - instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]) }); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected between 1 and 2 arguments, but got {args.Length}"); } @@ -215,26 +229,40 @@ internal sealed class TUnit_TestProject_Bugs__2112_Tests_Test2__int_long___TestS switch (args.Length) { case 1: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[0]); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[0]); + return default(global::System.Threading.Tasks.ValueTask); + } case 2: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args[1] is null ? null : args[1] is long[] arr ? arr : new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]) })); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args[1] is null ? null : args[1] is long[] arr ? arr : new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]) })); + return default(global::System.Threading.Tasks.ValueTask); + } case 3: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 4: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 5: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 6: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) }); + return default(global::System.Threading.Tasks.ValueTask); + } case 7: - instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]) }); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.Test2(TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[] { TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]), TUnit.Core.Helpers.CastHelper.Cast(args[6]) }); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected between 1 and 2 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt index 85223a7c65..b4e8b9f589 100644 --- a/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt @@ -527,7 +527,9 @@ internal sealed class TUnit_TestProject_TimeoutCancellationTokenTests_DataTest__ switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.DataTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + { + return new global::System.Threading.Tasks.ValueTask(instance.DataTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -700,7 +702,9 @@ internal sealed class TUnit_TestProject_TimeoutCancellationTokenTests_DataSource switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.DataSourceTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + { + return new global::System.Threading.Tasks.ValueTask(instance.DataSourceTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } @@ -853,7 +857,9 @@ internal sealed class TUnit_TestProject_TimeoutCancellationTokenTests_MatrixTest switch (args.Length) { case 1: - return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + { + return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest(TUnit.Core.Helpers.CastHelper.Cast(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None)); + } default: throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/TupleDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/TupleDataSourceDrivenTests.Test.verified.txt index 11251b1886..581ace613b 100644 --- a/TUnit.Core.SourceGenerator.Tests/TupleDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/TupleDataSourceDrivenTests.Test.verified.txt @@ -100,8 +100,10 @@ internal sealed class TUnit_TestProject_TupleDataSourceDrivenTests_DataSource_Tu switch (args.Length) { case 3: - instance.DataSource_TupleMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.DataSource_TupleMethod(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.Test_AotSafeDataSourceFactories.verified.txt b/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.Test_AotSafeDataSourceFactories.verified.txt index c8205e4f6e..7190aae3f4 100644 --- a/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.Test_AotSafeDataSourceFactories.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/UnifiedReflectionFreeTests.Test_AotSafeDataSourceFactories.verified.txt @@ -89,8 +89,10 @@ internal sealed class TUnit_TestProject_AotDataSourceTest_TestWithDataSource__in switch (args.Length) { case 3: - instance.TestWithDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); - return default(global::System.Threading.Tasks.ValueTask); + { + instance.TestWithDataSource(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2])); + return default(global::System.Threading.Tasks.ValueTask); + } default: throw new global::System.ArgumentException($"Expected exactly 3 arguments, but got {args.Length}"); } diff --git a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs index be1bbd1320..8e2e044856 100644 --- a/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs +++ b/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs @@ -1884,16 +1884,15 @@ private static void GenerateTypedInvokers(CodeWriter writer, TestMethodMetadata InstanceFactoryGenerator.GenerateInstanceFactory(writer, testMethod.TypeSymbol, testMethod); // Generate InvokeTypedTest for non-generic tests - var isAsync = IsAsyncMethod(testMethod.MethodSymbol); - var returnsValueTask = ReturnsValueTask(testMethod.MethodSymbol); + var returnPattern = GetReturnPattern(testMethod.MethodSymbol); if (testMethod is { IsGenericType: false, IsGenericMethod: false }) { - GenerateConcreteTestInvoker(writer, testMethod, className, methodName, isAsync, returnsValueTask, hasCancellationToken, parametersFromArgs); + GenerateConcreteTestInvoker(writer, testMethod, className, methodName, returnPattern, hasCancellationToken, parametersFromArgs); } } - private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMetadata testMethod, string className, string methodName, bool isAsync, bool returnsValueTask, bool hasCancellationToken, IParameterSymbol[] parametersFromArgs) + private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMetadata testMethod, string className, string methodName, TestReturnPattern returnPattern, bool hasCancellationToken, IParameterSymbol[] parametersFromArgs) { // Generate InvokeTypedTest which is required by CreateExecutableTestFactory writer.AppendLine("InvokeTypedTest = static (instance, args, cancellationToken) =>"); @@ -1933,22 +1932,7 @@ private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMet var methodCallReconstructed = hasCancellationToken ? $"instance.{methodName}({tupleConstruction}, cancellationToken)" : $"instance.{methodName}({tupleConstruction})"; - if (isAsync) - { - if (returnsValueTask) - { - writer.AppendLine($"return {methodCallReconstructed};"); - } - else - { - writer.AppendLine($"return new global::System.Threading.Tasks.ValueTask({methodCallReconstructed});"); - } - } - else - { - writer.AppendLine($"{methodCallReconstructed};"); - writer.AppendLine("return default(global::System.Threading.Tasks.ValueTask);"); - } + GenerateReturnHandling(writer, methodCallReconstructed, returnPattern); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine("else if (args.Length == 1 && global::TUnit.Core.Helpers.DataSourceHelpers.IsTuple(args[0]))"); @@ -1958,22 +1942,7 @@ private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMet var methodCallDirect = hasCancellationToken ? $"instance.{methodName}(TUnit.Core.Helpers.CastHelper.Cast<{singleTupleParam.GloballyQualified()}>(args[0]), cancellationToken)" : $"instance.{methodName}(TUnit.Core.Helpers.CastHelper.Cast<{singleTupleParam.GloballyQualified()}>(args[0]))"; - if (isAsync) - { - if (returnsValueTask) - { - writer.AppendLine($"return {methodCallDirect};"); - } - else - { - writer.AppendLine($"return new global::System.Threading.Tasks.ValueTask({methodCallDirect});"); - } - } - else - { - writer.AppendLine($"{methodCallDirect};"); - writer.AppendLine("return default(global::System.Threading.Tasks.ValueTask);"); - } + GenerateReturnHandling(writer, methodCallDirect, returnPattern); writer.Unindent(); writer.AppendLine("}"); writer.AppendLine("else"); @@ -1988,22 +1957,7 @@ private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMet var typedMethodCall = hasCancellationToken ? $"instance.{methodName}(cancellationToken)" : $"instance.{methodName}()"; - if (isAsync) - { - if (returnsValueTask) - { - writer.AppendLine($"return {typedMethodCall};"); - } - else - { - writer.AppendLine($"return new global::System.Threading.Tasks.ValueTask({typedMethodCall});"); - } - } - else - { - writer.AppendLine($"{typedMethodCall};"); - writer.AppendLine("return default(global::System.Threading.Tasks.ValueTask);"); - } + GenerateReturnHandling(writer, typedMethodCall, returnPattern); } else { @@ -2028,6 +1982,8 @@ private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMet var argCount = requiredParamCount + i; writer.AppendLine($"case {argCount}:"); writer.Indent(); + writer.AppendLine("{"); + writer.Indent(); // Build the arguments to pass, handling params arrays correctly var argsToPass = TupleArgumentHelper.GenerateArgumentAccessWithParams(parametersFromArgs, "args", argCount); @@ -2039,23 +1995,9 @@ private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMet } var typedMethodCall = $"instance.{methodName}({string.Join(", ", argsToPass)})"; - - if (isAsync) - { - if (returnsValueTask) - { - writer.AppendLine($"return {typedMethodCall};"); - } - else - { - writer.AppendLine($"return new global::System.Threading.Tasks.ValueTask({typedMethodCall});"); - } - } - else - { - writer.AppendLine($"{typedMethodCall};"); - writer.AppendLine("return default(global::System.Threading.Tasks.ValueTask);"); - } + GenerateReturnHandling(writer, typedMethodCall, returnPattern); + writer.Unindent(); + writer.AppendLine("}"); writer.Unindent(); } @@ -2123,6 +2065,66 @@ private static bool ReturnsValueTask(IMethodSymbol method) return returnTypeName.StartsWith("System.Threading.Tasks.ValueTask"); } + private enum TestReturnPattern + { + Void, // void methods + ValueTask, // ValueTask or ValueTask + Task, // Task or Task + Unknown // F# Async, custom awaitables, etc. + } + + private static TestReturnPattern GetReturnPattern(IMethodSymbol method) + { + if (method.ReturnType.SpecialType == SpecialType.System_Void) + { + return TestReturnPattern.Void; + } + + var returnTypeName = method.ReturnType.ToDisplayString(); + + if (returnTypeName.StartsWith("System.Threading.Tasks.ValueTask")) + { + return TestReturnPattern.ValueTask; + } + + if (returnTypeName.StartsWith("System.Threading.Tasks.Task") || + returnTypeName.StartsWith("Task<")) + { + return TestReturnPattern.Task; + } + + return TestReturnPattern.Unknown; + } + + private static void GenerateReturnHandling( + CodeWriter writer, + string methodCall, + TestReturnPattern returnPattern) + { + switch (returnPattern) + { + case TestReturnPattern.Void: + writer.AppendLine($"{methodCall};"); + writer.AppendLine("return default(global::System.Threading.Tasks.ValueTask);"); + break; + + case TestReturnPattern.ValueTask: + writer.AppendLine($"return {methodCall};"); + break; + + case TestReturnPattern.Task: + writer.AppendLine($"return new global::System.Threading.Tasks.ValueTask({methodCall});"); + break; + + case TestReturnPattern.Unknown: + // F# Async, custom awaitables + writer.AppendLine($"var methodResult = {methodCall};"); + writer.AppendLine("if (methodResult == null) return default(global::System.Threading.Tasks.ValueTask);"); + writer.AppendLine("return global::TUnit.Core.AsyncConvert.ConvertObject(methodResult);"); + break; + } + } + private static void GenerateDependencies(CodeWriter writer, Compilation compilation, IMethodSymbol methodSymbol) { var dependsOnAttributes = methodSymbol.GetAttributes() diff --git a/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs b/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs index e0e541f163..86b942be33 100644 --- a/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs +++ b/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs @@ -1603,7 +1603,8 @@ private static bool IsCovariantCompatible(Type paramType, [DynamicallyAccessedMe { return valueTask.AsTask(); } - return Task.CompletedTask; + // F# Async support (reuses existing AsyncConvert logic) + return AsyncConvert.ConvertObject(result).AsTask(); } catch (TargetInvocationException tie) { diff --git a/TUnit.TestProject.FSharp/AsyncTests.fs b/TUnit.TestProject.FSharp/AsyncTests.fs new file mode 100644 index 0000000000..675fc756d0 --- /dev/null +++ b/TUnit.TestProject.FSharp/AsyncTests.fs @@ -0,0 +1,51 @@ +namespace TUnit.TestProject.FSharp + +open System.Threading.Tasks +open TUnit.Assertions +open TUnit.Assertions.Extensions +open TUnit.Assertions.FSharp.Operations +open TUnit.Core + +/// Tests to verify F# Async<'T> return types are properly executed +type AsyncTests() = + + /// Static tracker to verify tests actually execute + static member val private ExecutionCount = 0 with get, set + + [] + member _.FSharpAsync_BasicExecution() : Async = async { + AsyncTests.ExecutionCount <- 1 + do! Async.Sleep 10 + } + + [] + [] + member _.VerifyFSharpAsyncExecuted() = + // This test depends on the previous one and verifies it actually ran + if AsyncTests.ExecutionCount = 0 then + failwith "F# Async test did not execute!" + Task.CompletedTask + + [] + member _.FSharpAsync_WithReturnValue() : Async = async { + do! Async.Sleep 10 + return 42 + } + + [] + member _.FSharpAsync_WithAsyncSleep() : Async = async { + // Verify async operations work correctly + do! Async.Sleep 50 + } + + [] + member _.FSharpAsync_CallingTask() : Async = async { + // F# Async calling Task-based API + do! Task.Delay(10) |> Async.AwaitTask + } + + [] + member _.FSharpAsync_WithAssertion() : Async = async { + let result = 1 + 1 + do! check (Assert.That(result).IsEqualTo(2)) + } diff --git a/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj b/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj index 885b879f6a..a2eb49b6c7 100644 --- a/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj +++ b/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj @@ -19,6 +19,7 @@ + From dd65654a45a487f9e28729772d61025653509f65 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:55:37 +0000 Subject: [PATCH 150/192] +semver:minor - feat: add JUnit reporter and command provider for test results output (#3987) * feat: add JUnit reporter and command provider for test results output * refactor: simplify JUnit reporter's disable checks and clean up tests * refactor: replace EnvironmentVariableCache with direct Environment calls for improved clarity --- TUnit.Engine.Tests/JUnitReporterTests.cs | 120 ++++++ .../JUnitReporterCommandProvider.cs | 45 +++ .../TestApplicationBuilderExtensions.cs | 18 + .../Helpers/EnvironmentVariableCache.cs | 192 ---------- TUnit.Engine/Helpers/ExecutionModeHelper.cs | 2 +- TUnit.Engine/Reporters/GitHubReporter.cs | 11 +- TUnit.Engine/Reporters/JUnitReporter.cs | 160 ++++++++ TUnit.Engine/Services/VerbosityService.cs | 7 +- TUnit.Engine/Xml/JUnitXmlWriter.cs | 352 ++++++++++++++++++ 9 files changed, 703 insertions(+), 204 deletions(-) create mode 100644 TUnit.Engine.Tests/JUnitReporterTests.cs create mode 100644 TUnit.Engine/CommandLineProviders/JUnitReporterCommandProvider.cs delete mode 100644 TUnit.Engine/Helpers/EnvironmentVariableCache.cs create mode 100644 TUnit.Engine/Reporters/JUnitReporter.cs create mode 100644 TUnit.Engine/Xml/JUnitXmlWriter.cs diff --git a/TUnit.Engine.Tests/JUnitReporterTests.cs b/TUnit.Engine.Tests/JUnitReporterTests.cs new file mode 100644 index 0000000000..9320db65d6 --- /dev/null +++ b/TUnit.Engine.Tests/JUnitReporterTests.cs @@ -0,0 +1,120 @@ +using Microsoft.Testing.Platform.Extensions; +using TUnit.Core; +using TUnit.Engine.Reporters; + +namespace TUnit.Engine.Tests; + +[NotInParallel] +public class JUnitReporterTests +{ + private sealed class MockExtension : IExtension + { + public string Uid => "MockExtension"; + public string DisplayName => "Mock"; + public string Version => "1.0.0"; + public string Description => "Mock Extension"; + public Task IsEnabledAsync() => Task.FromResult(true); + } + + [After(Test)] + public void Cleanup() + { + // Clean up environment variables after each test + Environment.SetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER", null); + Environment.SetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER", null); + Environment.SetEnvironmentVariable("GITLAB_CI", null); + Environment.SetEnvironmentVariable("CI_SERVER", null); + Environment.SetEnvironmentVariable("JUNIT_XML_OUTPUT_PATH", null); + } + + [Test] + public async Task IsEnabledAsync_Should_Return_False_When_TUNIT_DISABLE_JUNIT_REPORTER_Is_Set() + { + // Arrange + Environment.SetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER", "true"); + Environment.SetEnvironmentVariable("GITLAB_CI", "true"); // Even with GitLab CI, should be disabled + var extension = new MockExtension(); + var reporter = new JUnitReporter(extension); + + // Act + var isEnabled = await reporter.IsEnabledAsync(); + + // Assert + await Assert.That(isEnabled).IsFalse(); + } + + [Test] + public async Task IsEnabledAsync_Should_Return_True_When_GITLAB_CI_Is_Set() + { + // Arrange + Environment.SetEnvironmentVariable("GITLAB_CI", "true"); + var extension = new MockExtension(); + var reporter = new JUnitReporter(extension); + + // Act + var isEnabled = await reporter.IsEnabledAsync(); + + // Assert + await Assert.That(isEnabled).IsTrue(); + } + + [Test] + public async Task IsEnabledAsync_Should_Return_True_When_CI_SERVER_Is_Set() + { + // Arrange + Environment.SetEnvironmentVariable("CI_SERVER", "yes"); + var extension = new MockExtension(); + var reporter = new JUnitReporter(extension); + + // Act + var isEnabled = await reporter.IsEnabledAsync(); + + // Assert + await Assert.That(isEnabled).IsTrue(); + } + + [Test] + public async Task IsEnabledAsync_Should_Return_True_When_TUNIT_ENABLE_JUNIT_REPORTER_Is_Set() + { + // Arrange + Environment.SetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER", "true"); + var extension = new MockExtension(); + var reporter = new JUnitReporter(extension); + + // Act + var isEnabled = await reporter.IsEnabledAsync(); + + // Assert + await Assert.That(isEnabled).IsTrue(); + } + + [Test] + public async Task IsEnabledAsync_Should_Return_False_When_No_Environment_Variables_Are_Set() + { + // Arrange + var extension = new MockExtension(); + var reporter = new JUnitReporter(extension); + + // Act + var isEnabled = await reporter.IsEnabledAsync(); + + // Assert + await Assert.That(isEnabled).IsFalse(); + } + + [Test] + public async Task IsEnabledAsync_Should_Prefer_Disable_Over_Enable() + { + // Arrange + Environment.SetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER", "true"); + Environment.SetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER", "true"); + var extension = new MockExtension(); + var reporter = new JUnitReporter(extension); + + // Act + var isEnabled = await reporter.IsEnabledAsync(); + + // Assert + await Assert.That(isEnabled).IsFalse(); + } +} diff --git a/TUnit.Engine/CommandLineProviders/JUnitReporterCommandProvider.cs b/TUnit.Engine/CommandLineProviders/JUnitReporterCommandProvider.cs new file mode 100644 index 0000000000..39977ee5d6 --- /dev/null +++ b/TUnit.Engine/CommandLineProviders/JUnitReporterCommandProvider.cs @@ -0,0 +1,45 @@ +using Microsoft.Testing.Platform.CommandLine; +using Microsoft.Testing.Platform.Extensions; +using Microsoft.Testing.Platform.Extensions.CommandLine; + +namespace TUnit.Engine.CommandLineProviders; + +internal class JUnitReporterCommandProvider(IExtension extension) : ICommandLineOptionsProvider +{ + public const string JUnitOutputPathOption = "junit-output-path"; + + public Task IsEnabledAsync() => extension.IsEnabledAsync(); + + public string Uid => extension.Uid; + + public string Version => extension.Version; + + public string DisplayName => extension.DisplayName; + + public string Description => extension.Description; + + public IReadOnlyCollection GetCommandLineOptions() + { + return + [ + new CommandLineOption( + JUnitOutputPathOption, + "Path to output JUnit XML file (default: TestResults/{AssemblyName}-junit.xml)", + ArgumentArity.ExactlyOne, + false) + ]; + } + + public Task ValidateOptionArgumentsAsync( + CommandLineOption commandOption, + string[] arguments) + { + return ValidationResult.ValidTask; + } + + public Task ValidateCommandLineOptionsAsync( + ICommandLineOptions commandLineOptions) + { + return ValidationResult.ValidTask; + } +} diff --git a/TUnit.Engine/Extensions/TestApplicationBuilderExtensions.cs b/TUnit.Engine/Extensions/TestApplicationBuilderExtensions.cs index 83b7f0c98e..435894225f 100644 --- a/TUnit.Engine/Extensions/TestApplicationBuilderExtensions.cs +++ b/TUnit.Engine/Extensions/TestApplicationBuilderExtensions.cs @@ -21,6 +21,9 @@ public static void AddTUnit(this ITestApplicationBuilder testApplicationBuilder) var githubReporter = new GitHubReporter(extension); var githubReporterCommandProvider = new GitHubReporterCommandProvider(extension); + var junitReporter = new JUnitReporter(extension); + var junitReporterCommandProvider = new JUnitReporterCommandProvider(extension); + testApplicationBuilder.RegisterTestFramework( serviceProvider => new TestFrameworkCapabilities(CreateCapabilities(serviceProvider)), (capabilities, serviceProvider) => new TUnitTestFramework(extension, serviceProvider, capabilities)); @@ -46,6 +49,9 @@ public static void AddTUnit(this ITestApplicationBuilder testApplicationBuilder) // GitHub reporter configuration testApplicationBuilder.CommandLine.AddProvider(() => githubReporterCommandProvider); + // JUnit reporter configuration + testApplicationBuilder.CommandLine.AddProvider(() => junitReporterCommandProvider); + testApplicationBuilder.TestHost.AddDataConsumer(serviceProvider => { // Apply command-line configuration if provided @@ -58,6 +64,18 @@ public static void AddTUnit(this ITestApplicationBuilder testApplicationBuilder) return githubReporter; }); testApplicationBuilder.TestHost.AddTestHostApplicationLifetime(_ => githubReporter); + + testApplicationBuilder.TestHost.AddDataConsumer(serviceProvider => + { + // Apply command-line configuration if provided + var commandLineOptions = serviceProvider.GetRequiredService(); + if (commandLineOptions.TryGetOptionArgumentList(JUnitReporterCommandProvider.JUnitOutputPathOption, out var pathArgs)) + { + junitReporter.SetOutputPath(pathArgs[0]); + } + return junitReporter; + }); + testApplicationBuilder.TestHost.AddTestHostApplicationLifetime(_ => junitReporter); } private static IReadOnlyCollection CreateCapabilities(IServiceProvider serviceProvider) diff --git a/TUnit.Engine/Helpers/EnvironmentVariableCache.cs b/TUnit.Engine/Helpers/EnvironmentVariableCache.cs deleted file mode 100644 index ce0a3ddf70..0000000000 --- a/TUnit.Engine/Helpers/EnvironmentVariableCache.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System.Collections.Concurrent; - -namespace TUnit.Engine.Helpers; - -/// -/// Centralized cache for environment variables to avoid repeated system calls -/// Initializes all environment variables on first access and caches them for the lifetime of the application -/// -internal static class EnvironmentVariableCache -{ - private static readonly ConcurrentDictionary _cache = new(); - private static readonly object _initLock = new(); - private static bool _initialized = false; - - /// - /// All environment variable keys that TUnit cares about - /// This helps us cache only the variables we need rather than all environment variables - /// - private static readonly string[] _tunitEnvironmentVariables = - [ - // TUnit specific variables - "TUNIT_DISCOVERY_DIAGNOSTICS", - "TUNIT_DISCOVERY_TIMEOUT_SECONDS", - "TUNIT_DATA_SOURCE_TIMEOUT_SECONDS", - "TUNIT_EXECUTION_MODE", - "TUNIT_ADAPTIVE_MIN_PARALLELISM", - "TUNIT_ADAPTIVE_MAX_PARALLELISM", - "TUNIT_ADAPTIVE_METRICS", - "TUNIT_DISABLE_GITHUB_REPORTER", - "TUNIT_GITHUB_REPORTER_STYLE", - - // CI environment detection variables - "CI", - "CONTINUOUS_INTEGRATION", - "BUILD_ID", - "BUILD_NUMBER", - "GITHUB_ACTIONS", - "GITLAB_CI", - "AZURE_PIPELINES", - "JENKINS_URL", - "TEAMCITY_VERSION", - "APPVEYOR", - "CIRCLECI", - "TRAVIS", - - // Container detection variables - "DOTNET_RUNNING_IN_CONTAINER", - "CONTAINER", - "KUBERNETES_SERVICE_HOST", - - // GitHub specific variables - "DISABLE_GITHUB_REPORTER", - "GITHUB_STEP_SUMMARY" - ]; - - /// - /// Gets the cached value of an environment variable - /// Initializes the cache on first call - /// - /// The name of the environment variable - /// The environment variable value or null if not set - public static string? Get(string variableName) - { - EnsureInitialized(); - _cache.TryGetValue(variableName, out var value); - return value; - } - - /// - /// Gets multiple cached environment variable values - /// Useful for checking multiple CI or container detection variables - /// - /// The names of the environment variables to retrieve - /// An array of environment variable values (nulls for unset variables) - public static string?[] GetMultiple(params string[] variableNames) - { - EnsureInitialized(); - var result = new string?[variableNames.Length]; - for (var i = 0; i < variableNames.Length; i++) - { - _cache.TryGetValue(variableNames[i], out var value); - result[i] = value; - } - return result; - } - - /// - /// Checks if any of the specified environment variables have non-empty values - /// Useful for CI and container detection - /// - /// The environment variable names to check - /// True if any of the variables have non-empty values - public static bool HasAnyNonEmpty(params string[] variableNames) - { - EnsureInitialized(); - for (var i = 0; i < variableNames.Length; i++) - { - _cache.TryGetValue(variableNames[i], out var value); - if (!string.IsNullOrEmpty(value)) - { - return true; - } - } - return false; - } - - /// - /// CI environment variables for quick access - /// - public static readonly string[] CiVariables = - [ - "CI", - "CONTINUOUS_INTEGRATION", - "BUILD_ID", - "BUILD_NUMBER", - "GITHUB_ACTIONS", - "GITLAB_CI", - "AZURE_PIPELINES", - "JENKINS_URL", - "TEAMCITY_VERSION", - "APPVEYOR", - "CIRCLECI", - "TRAVIS" - ]; - - /// - /// Container environment variables for quick access - /// - public static readonly string[] ContainerVariables = - [ - "DOTNET_RUNNING_IN_CONTAINER", - "CONTAINER", - "KUBERNETES_SERVICE_HOST" - ]; - - /// - /// Convenience method to check if running in a CI environment - /// - public static bool IsRunningInCI() - { - return HasAnyNonEmpty(CiVariables); - } - - /// - /// Convenience method to check if running in a container - /// - public static bool IsRunningInContainer() - { - return HasAnyNonEmpty(ContainerVariables); - } - - /// - /// Initializes the cache with all TUnit environment variables - /// Thread-safe and only runs once - /// - private static void EnsureInitialized() - { - if (_initialized) - { - return; - } - - lock (_initLock) - { - if (_initialized) - { - return; - } - - // Cache all TUnit-related environment variables - foreach (var variableName in _tunitEnvironmentVariables) - { - var value = Environment.GetEnvironmentVariable(variableName); - _cache.TryAdd(variableName, value); - } - - _initialized = true; - } - } - - /// - /// For testing purposes - allows clearing and reinitializing the cache - /// - internal static void ClearCache() - { - lock (_initLock) - { - _cache.Clear(); - _initialized = false; - } - } -} \ No newline at end of file diff --git a/TUnit.Engine/Helpers/ExecutionModeHelper.cs b/TUnit.Engine/Helpers/ExecutionModeHelper.cs index bc654ca3cf..6364fceffd 100644 --- a/TUnit.Engine/Helpers/ExecutionModeHelper.cs +++ b/TUnit.Engine/Helpers/ExecutionModeHelper.cs @@ -67,7 +67,7 @@ public static bool IsSourceGenerationMode(ICommandLineOptions commandLineOptions } // Check environment variable - var envMode = EnvironmentVariableCache.Get("TUNIT_EXECUTION_MODE"); + var envMode = Environment.GetEnvironmentVariable("TUNIT_EXECUTION_MODE"); if (!string.IsNullOrEmpty(envMode)) { var mode = envMode!.ToLowerInvariant(); diff --git a/TUnit.Engine/Reporters/GitHubReporter.cs b/TUnit.Engine/Reporters/GitHubReporter.cs index ab8a2ace43..f7c37ef5c0 100644 --- a/TUnit.Engine/Reporters/GitHubReporter.cs +++ b/TUnit.Engine/Reporters/GitHubReporter.cs @@ -7,7 +7,6 @@ using Microsoft.Testing.Platform.Extensions.Messages; using Microsoft.Testing.Platform.Extensions.TestHost; using TUnit.Engine.Framework; -using TUnit.Engine.Helpers; namespace TUnit.Engine.Reporters; @@ -25,18 +24,18 @@ public class GitHubReporter(IExtension extension) : IDataConsumer, ITestHostAppl public async Task IsEnabledAsync() { - if (EnvironmentVariableCache.Get("TUNIT_DISABLE_GITHUB_REPORTER") is not null || - EnvironmentVariableCache.Get("DISABLE_GITHUB_REPORTER") is not null) + if (Environment.GetEnvironmentVariable("TUNIT_DISABLE_GITHUB_REPORTER") is not null || + Environment.GetEnvironmentVariable("DISABLE_GITHUB_REPORTER") is not null) { return false; } - if (EnvironmentVariableCache.Get("GITHUB_ACTIONS") is null) + if (Environment.GetEnvironmentVariable("GITHUB_ACTIONS") is null) { return false; } - if (EnvironmentVariableCache.Get("GITHUB_STEP_SUMMARY") is not { } fileName + if (Environment.GetEnvironmentVariable("GITHUB_STEP_SUMMARY") is not { } fileName || !File.Exists(fileName)) { return false; @@ -45,7 +44,7 @@ public async Task IsEnabledAsync() _outputSummaryFilePath = fileName; // Determine reporter style from environment variable or default to collapsible - var styleEnv = EnvironmentVariableCache.Get("TUNIT_GITHUB_REPORTER_STYLE"); + var styleEnv = Environment.GetEnvironmentVariable("TUNIT_GITHUB_REPORTER_STYLE"); if (!string.IsNullOrEmpty(styleEnv)) { _reporterStyle = styleEnv!.ToLowerInvariant() switch diff --git a/TUnit.Engine/Reporters/JUnitReporter.cs b/TUnit.Engine/Reporters/JUnitReporter.cs new file mode 100644 index 0000000000..2a34661558 --- /dev/null +++ b/TUnit.Engine/Reporters/JUnitReporter.cs @@ -0,0 +1,160 @@ +using System.Collections.Concurrent; +using System.Reflection; +using System.Text; +using Microsoft.Testing.Platform.Extensions; +using Microsoft.Testing.Platform.Extensions.Messages; +using Microsoft.Testing.Platform.Extensions.TestHost; +using TUnit.Engine.Framework; +using TUnit.Engine.Xml; + +namespace TUnit.Engine.Reporters; + +public class JUnitReporter(IExtension extension) : IDataConsumer, ITestHostApplicationLifetime, IFilterReceiver +{ + private string _outputPath = null!; + private bool _isEnabled; + + public async Task IsEnabledAsync() + { + // Check if explicitly disabled + if (Environment.GetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER") is not null) + { + return false; + } + + // Check if explicitly enabled OR running in GitLab CI + var explicitlyEnabled = Environment.GetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER") is not null; + var runningInGitLab = Environment.GetEnvironmentVariable("GITLAB_CI") is not null || + Environment.GetEnvironmentVariable("CI_SERVER") is not null; + + if (!explicitlyEnabled && !runningInGitLab) + { + return false; + } + + // Determine output path + _outputPath = Environment.GetEnvironmentVariable("JUNIT_XML_OUTPUT_PATH") + ?? GetDefaultOutputPath(); + + _isEnabled = true; + return await extension.IsEnabledAsync(); + } + + public string Uid { get; } = $"{extension.Uid}JUnitReporter"; + + public string Version => extension.Version; + + public string DisplayName => extension.DisplayName; + + public string Description => extension.Description; + + private readonly ConcurrentDictionary> _updates = []; + + public Task ConsumeAsync(IDataProducer dataProducer, IData value, CancellationToken cancellationToken) + { + var testNodeUpdateMessage = (TestNodeUpdateMessage)value; + + _updates.GetOrAdd(testNodeUpdateMessage.TestNode.Uid.Value, []).Add(testNodeUpdateMessage); + + return Task.CompletedTask; + } + + public Type[] DataTypesConsumed { get; } = [typeof(TestNodeUpdateMessage)]; + + public Task BeforeRunAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + public async Task AfterRunAsync(int exitCode, CancellationToken cancellation) + { + if (!_isEnabled || _updates.Count == 0) + { + return; + } + + // Get the last update for each test + var lastUpdates = new List(_updates.Count); + foreach (var kvp in _updates.Where(kvp => kvp.Value.Count > 0)) + { + lastUpdates.Add(kvp.Value[kvp.Value.Count - 1]); + } + + // Generate JUnit XML + var xmlContent = JUnitXmlWriter.GenerateXml(lastUpdates, Filter); + + if (string.IsNullOrEmpty(xmlContent)) + { + return; + } + + // Write to file with retry logic + await WriteXmlFileAsync(_outputPath, xmlContent, cancellation); + } + + public string? Filter { get; set; } + + internal void SetOutputPath(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException("Output path cannot be null or empty", nameof(path)); + } + + _outputPath = path; + } + + private static string GetDefaultOutputPath() + { + var assemblyName = Assembly.GetEntryAssembly()?.GetName().Name ?? "TestResults"; + return Path.Combine("TestResults", $"{assemblyName}-junit.xml"); + } + + private static async Task WriteXmlFileAsync(string path, string content, CancellationToken cancellationToken) + { + // Ensure directory exists + var directory = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + const int maxAttempts = 5; + + for (int attempt = 1; attempt <= maxAttempts; attempt++) + { + try + { +#if NET + await File.WriteAllTextAsync(path, content, Encoding.UTF8, cancellationToken); +#else + File.WriteAllText(path, content, Encoding.UTF8); +#endif + Console.WriteLine($"JUnit XML report written to: {path}"); + return; + } + catch (IOException ex) when (attempt < maxAttempts && IsFileLocked(ex)) + { + var baseDelay = 50 * Math.Pow(2, attempt - 1); + var jitter = Random.Shared.Next(0, 50); + var delay = (int)(baseDelay + jitter); + + Console.WriteLine($"JUnit XML file is locked, retrying in {delay}ms (attempt {attempt}/{maxAttempts})"); + await Task.Delay(delay, cancellationToken); + } + } + + Console.WriteLine($"Failed to write JUnit XML report to: {path} after {maxAttempts} attempts"); + } + + private static bool IsFileLocked(IOException exception) + { + // Check if the exception is due to the file being locked/in use + // HResult 0x80070020 is ERROR_SHARING_VIOLATION on Windows + // HResult 0x80070021 is ERROR_LOCK_VIOLATION on Windows + var errorCode = exception.HResult & 0xFFFF; + return errorCode == 0x20 || errorCode == 0x21 || + exception.Message.Contains("being used by another process") || + exception.Message.Contains("access denied", StringComparison.OrdinalIgnoreCase); + } +} diff --git a/TUnit.Engine/Services/VerbosityService.cs b/TUnit.Engine/Services/VerbosityService.cs index 18c36aacc2..f297c026bd 100644 --- a/TUnit.Engine/Services/VerbosityService.cs +++ b/TUnit.Engine/Services/VerbosityService.cs @@ -1,7 +1,6 @@ using Microsoft.Testing.Platform.CommandLine; using Microsoft.Testing.Platform.Services; using TUnit.Engine.CommandLineProviders; -using TUnit.Engine.Helpers; using LogLevel = TUnit.Core.Logging.LogLevel; #pragma warning disable TPEXP @@ -42,8 +41,6 @@ public string CreateVerbositySummary() $"(Stack traces: {ShowDetailedStackTrace}, "; } - // Use centralized environment variable cache - private static bool GetOutputLevel(ICommandLineOptions commandLineOptions, IServiceProvider serviceProvider) { // Check for --output flag (Microsoft.Testing.Platform extension) @@ -64,8 +61,8 @@ private static LogLevel GetLogLevel(ICommandLineOptions commandLineOptions) return LogLevelCommandProvider.ParseLogLevel(args); } - // Check cached legacy environment variable for backwards compatibility - if (EnvironmentVariableCache.Get("TUNIT_DISCOVERY_DIAGNOSTICS") == "1") + // Check legacy environment variable for backwards compatibility + if (Environment.GetEnvironmentVariable("TUNIT_DISCOVERY_DIAGNOSTICS") == "1") { return LogLevel.Debug; } diff --git a/TUnit.Engine/Xml/JUnitXmlWriter.cs b/TUnit.Engine/Xml/JUnitXmlWriter.cs new file mode 100644 index 0000000000..185674ec85 --- /dev/null +++ b/TUnit.Engine/Xml/JUnitXmlWriter.cs @@ -0,0 +1,352 @@ +using System.Globalization; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; +using System.Text; +using System.Xml; +using Microsoft.Testing.Platform.Extensions.Messages; + +namespace TUnit.Engine.Xml; + +internal static class JUnitXmlWriter +{ + public static string GenerateXml( + IEnumerable testUpdates, + string? filter) + { + // Get the last state for each test + var lastStates = GetLastStates(testUpdates); + + if (lastStates.Count == 0) + { + return string.Empty; + } + + // Calculate summary statistics + var summary = CalculateSummary(lastStates.Values); + + // Get assembly and framework information + var assemblyName = Assembly.GetEntryAssembly()?.GetName().Name ?? "TestResults"; + var targetFramework = Assembly.GetExecutingAssembly() + .GetCustomAttributes() + .SingleOrDefault() + ?.FrameworkDisplayName + ?? RuntimeInformation.FrameworkDescription; + + using var stringWriter = new StringWriter(); + var settings = new XmlWriterSettings + { + Indent = true, + Encoding = Encoding.UTF8, + OmitXmlDeclaration = false, + NewLineOnAttributes = false + }; + + using var xmlWriter = XmlWriter.Create(stringWriter, settings); + + // Write XML structure + xmlWriter.WriteStartDocument(); + + // + xmlWriter.WriteStartElement("testsuites"); + xmlWriter.WriteAttributeString("name", assemblyName); + xmlWriter.WriteAttributeString("tests", summary.Total.ToString(CultureInfo.InvariantCulture)); + xmlWriter.WriteAttributeString("failures", summary.Failures.ToString(CultureInfo.InvariantCulture)); + xmlWriter.WriteAttributeString("errors", summary.Errors.ToString(CultureInfo.InvariantCulture)); + xmlWriter.WriteAttributeString("skipped", summary.Skipped.ToString(CultureInfo.InvariantCulture)); + xmlWriter.WriteAttributeString("time", summary.TotalTime.TotalSeconds.ToString("F3", CultureInfo.InvariantCulture)); + xmlWriter.WriteAttributeString("timestamp", summary.Timestamp.ToString("o", CultureInfo.InvariantCulture)); + + // Write test suite + WriteTestSuite(xmlWriter, lastStates.Values, assemblyName, targetFramework, summary, filter); + + xmlWriter.WriteEndElement(); // testsuites + xmlWriter.WriteEndDocument(); + + return stringWriter.ToString(); + } + + private static void WriteTestSuite( + XmlWriter writer, + IEnumerable tests, + string assemblyName, + string targetFramework, + TestSummary summary, + string? filter) + { + writer.WriteStartElement("testsuite"); + writer.WriteAttributeString("name", assemblyName); + writer.WriteAttributeString("tests", summary.Total.ToString(CultureInfo.InvariantCulture)); + writer.WriteAttributeString("failures", summary.Failures.ToString(CultureInfo.InvariantCulture)); + writer.WriteAttributeString("errors", summary.Errors.ToString(CultureInfo.InvariantCulture)); + writer.WriteAttributeString("skipped", summary.Skipped.ToString(CultureInfo.InvariantCulture)); + writer.WriteAttributeString("time", summary.TotalTime.TotalSeconds.ToString("F3", CultureInfo.InvariantCulture)); + writer.WriteAttributeString("timestamp", summary.Timestamp.ToString("o", CultureInfo.InvariantCulture)); + writer.WriteAttributeString("hostname", Environment.MachineName); + + // Write properties + WriteProperties(writer, targetFramework, filter); + + // Write test cases + foreach (var test in tests) + { + WriteTestCase(writer, test); + } + + writer.WriteEndElement(); // testsuite + } + + private static void WriteProperties(XmlWriter writer, string targetFramework, string? filter) + { + writer.WriteStartElement("properties"); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "framework"); + writer.WriteAttributeString("value", targetFramework); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "platform"); + writer.WriteAttributeString("value", RuntimeInformation.OSDescription); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "runtime"); + writer.WriteAttributeString("value", RuntimeInformation.FrameworkDescription); + writer.WriteEndElement(); + + if (!string.IsNullOrEmpty(filter)) + { + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "filter"); + writer.WriteAttributeString("value", filter); + writer.WriteEndElement(); + } + + writer.WriteEndElement(); // properties + } + + private static void WriteTestCase(XmlWriter writer, TestNodeUpdateMessage test) + { + var testNode = test.TestNode; + + // Get test state + var stateProperty = testNode.Properties.AsEnumerable() + .OfType() + .FirstOrDefault(); + + // Get timing + var timingProperty = testNode.Properties.AsEnumerable() + .OfType() + .FirstOrDefault(); + + var duration = timingProperty?.GlobalTiming.Duration is { } d ? d : TimeSpan.Zero; + + // Get class and method names + var testMethodIdentifier = testNode.Properties.AsEnumerable() + .OfType() + .FirstOrDefault(); + + var className = testMethodIdentifier?.TypeName ?? "UnknownClass"; + var testName = testNode.DisplayName; + + // Write testcase element + writer.WriteStartElement("testcase"); + writer.WriteAttributeString("name", testName); + writer.WriteAttributeString("classname", className); + writer.WriteAttributeString("time", duration.TotalSeconds.ToString("F3", CultureInfo.InvariantCulture)); + + // Write state-specific child elements + switch (stateProperty) + { + case FailedTestNodeStateProperty failed: + WriteFailure(writer, failed); + break; + + case ErrorTestNodeStateProperty error: + WriteError(writer, error); + break; + + case TimeoutTestNodeStateProperty timeout: + WriteTimeoutError(writer, timeout); + break; + + case CancelledTestNodeStateProperty: + WriteCancellationError(writer); + break; + + case SkippedTestNodeStateProperty skipped: + WriteSkipped(writer, skipped); + break; + + case InProgressTestNodeStateProperty: + WriteInProgressError(writer); + break; + + case PassedTestNodeStateProperty: + // No child element for passed tests + break; + } + + writer.WriteEndElement(); // testcase + } + + private static void WriteFailure(XmlWriter writer, FailedTestNodeStateProperty failed) + { + writer.WriteStartElement("failure"); + + var exception = failed.Exception; + if (exception != null) + { + writer.WriteAttributeString("message", exception.Message); + writer.WriteAttributeString("type", exception.GetType().FullName ?? "AssertionException"); + writer.WriteString(exception.ToString()); + } + else + { + var message = failed.Explanation ?? "Test failed"; + writer.WriteAttributeString("message", message); + writer.WriteAttributeString("type", "TestFailedException"); + writer.WriteString(message); + } + + writer.WriteEndElement(); // failure + } + + private static void WriteError(XmlWriter writer, ErrorTestNodeStateProperty error) + { + writer.WriteStartElement("error"); + + var exception = error.Exception; + if (exception != null) + { + writer.WriteAttributeString("message", exception.Message); + writer.WriteAttributeString("type", exception.GetType().FullName ?? "Exception"); + writer.WriteString(exception.ToString()); + } + else + { + var message = error.Explanation ?? "Test error"; + writer.WriteAttributeString("message", message); + writer.WriteAttributeString("type", "TestErrorException"); + writer.WriteString(message); + } + + writer.WriteEndElement(); // error + } + + private static void WriteTimeoutError(XmlWriter writer, TimeoutTestNodeStateProperty timeout) + { + writer.WriteStartElement("error"); + var message = timeout.Explanation ?? "Test timed out"; + writer.WriteAttributeString("message", message); + writer.WriteAttributeString("type", "TimeoutException"); + writer.WriteString(message); + writer.WriteEndElement(); // error + } + + private static void WriteCancellationError(XmlWriter writer) + { + writer.WriteStartElement("error"); + writer.WriteAttributeString("message", "Test was cancelled"); + writer.WriteAttributeString("type", "CancelledException"); + writer.WriteString("Test was cancelled"); + writer.WriteEndElement(); // error + } + + private static void WriteInProgressError(XmlWriter writer) + { + writer.WriteStartElement("error"); + writer.WriteAttributeString("message", "Test never finished"); + writer.WriteAttributeString("type", "InProgressException"); + writer.WriteString("Test never finished"); + writer.WriteEndElement(); // error + } + + private static void WriteSkipped(XmlWriter writer, SkippedTestNodeStateProperty skipped) + { + writer.WriteStartElement("skipped"); + var message = skipped.Explanation ?? "Test skipped"; + writer.WriteAttributeString("message", message); + writer.WriteString(message); + writer.WriteEndElement(); // skipped + } + + private static Dictionary GetLastStates( + IEnumerable tests) + { + var lastStates = new Dictionary(); + + foreach (var test in tests) + { + lastStates[test.TestNode.Uid.Value] = test; + } + + return lastStates; + } + + private static TestSummary CalculateSummary(IEnumerable tests) + { + DateTimeOffset? earliestStartTime = null; + + var summary = new TestSummary(); + + foreach (var test in tests) + { + summary.Total++; + + var stateProperty = test.TestNode.Properties.AsEnumerable() + .OfType() + .FirstOrDefault(); + + var timing = test.TestNode.Properties.AsEnumerable() + .OfType() + .FirstOrDefault(); + + if (timing?.GlobalTiming.Duration is { } durationValue) + { + summary.TotalTime += durationValue; + + // Track the earliest start time from actual test execution + if (timing.GlobalTiming.StartTime is { } startTime) + { + if (earliestStartTime is null || startTime < earliestStartTime) + { + earliestStartTime = startTime; + } + } + } + + switch (stateProperty) + { + case FailedTestNodeStateProperty: + summary.Failures++; + break; + case ErrorTestNodeStateProperty: + case TimeoutTestNodeStateProperty: + case CancelledTestNodeStateProperty: + case InProgressTestNodeStateProperty: + summary.Errors++; + break; + case SkippedTestNodeStateProperty: + summary.Skipped++; + break; + } + } + + // Use earliest test start time, fallback to current time if no timing data available + summary.Timestamp = earliestStartTime ?? DateTimeOffset.Now; + + return summary; + } +} + +internal sealed class TestSummary +{ + public int Total { get; set; } + public int Failures { get; set; } + public int Errors { get; set; } + public int Skipped { get; set; } + public TimeSpan TotalTime { get; set; } + public DateTimeOffset Timestamp { get; set; } +} From 17e4643c2c52d5d810a596df8ea3c911760b37be Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 00:27:58 +0000 Subject: [PATCH 151/192] chore: update benchmark results (#3989) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index fe1dff9296..e54f78b894 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 589.8 ms | 589.3 ms | 4.89 ms | -| NUnit | 4.4.0 | 688.2 ms | 688.9 ms | 10.89 ms | -| MSTest | 4.0.2 | 645.1 ms | 643.0 ms | 10.60 ms | -| xUnit3 | 3.2.1 | 724.5 ms | 723.6 ms | 9.69 ms | -| **TUnit (AOT)** | 1.3.25 | 124.7 ms | 124.7 ms | 0.25 ms | +| **TUnit** | 1.3.25 | 579.9 ms | 579.1 ms | 2.78 ms | +| NUnit | 4.4.0 | 666.7 ms | 666.3 ms | 6.70 ms | +| MSTest | 4.0.2 | 639.7 ms | 634.5 ms | 8.95 ms | +| xUnit3 | 3.2.1 | 730.4 ms | 732.8 ms | 13.59 ms | +| **TUnit (AOT)** | 1.3.25 | 124.3 ms | 124.3 ms | 0.60 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 870 - bar [589.8, 688.2, 645.1, 724.5, 124.7] + y-axis "Time (ms)" 0 --> 877 + bar [579.9, 666.7, 639.7, 730.4, 124.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.385Z* +*Last generated: 2025-12-06T00:27:43.842Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 610a65280f..ddef73e3dc 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 2.066 s | 2.060 s | 0.0353 s | -| Build_NUnit | 4.4.0 | 1.649 s | 1.646 s | 0.0154 s | -| Build_MSTest | 4.0.2 | 1.720 s | 1.713 s | 0.0206 s | -| Build_xUnit3 | 3.2.1 | 1.630 s | 1.630 s | 0.0259 s | +| **TUnit** | 1.3.25 | 2.098 s | 2.091 s | 0.0329 s | +| Build_NUnit | 4.4.0 | 1.681 s | 1.679 s | 0.0149 s | +| Build_MSTest | 4.0.2 | 1.799 s | 1.792 s | 0.0238 s | +| Build_xUnit3 | 3.2.1 | 1.721 s | 1.723 s | 0.0235 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.066, 1.649, 1.72, 1.63] + bar [2.098, 1.681, 1.799, 1.721] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.387Z* +*Last generated: 2025-12-06T00:27:43.843Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 16b809872e..e9e9e922dc 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 490.86 ms | 491.42 ms | 5.726 ms | -| NUnit | 4.4.0 | 517.92 ms | 517.35 ms | 7.205 ms | -| MSTest | 4.0.2 | 489.16 ms | 487.76 ms | 10.467 ms | -| xUnit3 | 3.2.1 | 566.85 ms | 565.79 ms | 6.875 ms | -| **TUnit (AOT)** | 1.3.25 | 23.98 ms | 23.96 ms | 0.185 ms | +| **TUnit** | 1.3.25 | 526.18 ms | 525.63 ms | 9.733 ms | +| NUnit | 4.4.0 | 686.15 ms | 686.99 ms | 11.238 ms | +| MSTest | 4.0.2 | 681.30 ms | 682.63 ms | 10.257 ms | +| xUnit3 | 3.2.1 | 686.97 ms | 687.69 ms | 8.584 ms | +| **TUnit (AOT)** | 1.3.25 | 25.63 ms | 25.66 ms | 0.203 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 681 - bar [490.86, 517.92, 489.16, 566.85, 23.98] + y-axis "Time (ms)" 0 --> 825 + bar [526.18, 686.15, 681.3, 686.97, 25.63] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.386Z* +*Last generated: 2025-12-06T00:27:43.842Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index cfd98fd4cf..36215e7bd6 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 602.6 ms | 603.7 ms | 4.06 ms | -| NUnit | 4.4.0 | 1,191.7 ms | 1,192.7 ms | 6.96 ms | -| MSTest | 4.0.2 | 2,973.0 ms | 2,971.9 ms | 10.85 ms | -| xUnit3 | 3.2.1 | 3,065.1 ms | 3,064.9 ms | 7.78 ms | -| **TUnit (AOT)** | 1.3.25 | 131.1 ms | 131.1 ms | 0.51 ms | +| **TUnit** | 1.3.25 | 608.9 ms | 607.5 ms | 5.48 ms | +| NUnit | 4.4.0 | 1,220.5 ms | 1,222.7 ms | 9.63 ms | +| MSTest | 4.0.2 | 3,006.2 ms | 3,002.3 ms | 10.16 ms | +| xUnit3 | 3.2.1 | 3,087.9 ms | 3,085.6 ms | 11.40 ms | +| **TUnit (AOT)** | 1.3.25 | 132.7 ms | 132.7 ms | 0.62 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3679 - bar [602.6, 1191.7, 2973, 3065.1, 131.1] + y-axis "Time (ms)" 0 --> 3706 + bar [608.9, 1220.5, 3006.2, 3087.9, 132.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.386Z* +*Last generated: 2025-12-06T00:27:43.842Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index fea2ebf356..6c0e74844c 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 564.33 ms | 564.92 ms | 3.395 ms | -| NUnit | 4.4.0 | 1,572.46 ms | 1,570.59 ms | 9.247 ms | -| MSTest | 4.0.2 | 1,525.48 ms | 1,525.44 ms | 8.892 ms | -| xUnit3 | 3.2.1 | 1,611.66 ms | 1,608.48 ms | 8.282 ms | -| **TUnit (AOT)** | 1.3.25 | 80.17 ms | 80.12 ms | 0.488 ms | +| **TUnit** | 1.3.25 | 562.41 ms | 563.18 ms | 3.971 ms | +| NUnit | 4.4.0 | 1,574.15 ms | 1,574.97 ms | 5.369 ms | +| MSTest | 4.0.2 | 1,534.37 ms | 1,529.84 ms | 10.972 ms | +| xUnit3 | 3.2.1 | 1,618.66 ms | 1,618.07 ms | 8.934 ms | +| **TUnit (AOT)** | 1.3.25 | 80.00 ms | 80.17 ms | 0.512 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1934 - bar [564.33, 1572.46, 1525.48, 1611.66, 80.17] + y-axis "Time (ms)" 0 --> 1943 + bar [562.41, 1574.15, 1534.37, 1618.66, 80] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.386Z* +*Last generated: 2025-12-06T00:27:43.843Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 1a3bcf1a97..84498e4301 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 520.51 ms | 521.26 ms | 3.185 ms | -| NUnit | 4.4.0 | 601.98 ms | 601.95 ms | 6.523 ms | -| MSTest | 4.0.2 | 614.97 ms | 617.66 ms | 8.666 ms | -| xUnit3 | 3.2.1 | 606.12 ms | 605.35 ms | 9.916 ms | -| **TUnit (AOT)** | 1.3.25 | 42.80 ms | 41.72 ms | 3.704 ms | +| **TUnit** | 1.3.25 | 512.28 ms | 512.24 ms | 2.035 ms | +| NUnit | 4.4.0 | 587.13 ms | 584.27 ms | 10.483 ms | +| MSTest | 4.0.2 | 603.13 ms | 603.16 ms | 7.120 ms | +| xUnit3 | 3.2.1 | 594.15 ms | 593.03 ms | 8.717 ms | +| **TUnit (AOT)** | 1.3.25 | 42.78 ms | 43.30 ms | 2.821 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 738 - bar [520.51, 601.98, 614.97, 606.12, 42.8] + y-axis "Time (ms)" 0 --> 724 + bar [512.28, 587.13, 603.13, 594.15, 42.78] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.387Z* +*Last generated: 2025-12-06T00:27:43.843Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 80a60d1275..86d251675e 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-05** from the latest CI run. +This benchmark was automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 572.8 ms | 573.2 ms | 3.27 ms | -| NUnit | 4.4.0 | 1,155.8 ms | 1,157.2 ms | 9.08 ms | -| MSTest | 4.0.2 | 1,128.3 ms | 1,126.0 ms | 5.78 ms | -| xUnit3 | 3.2.1 | 1,202.4 ms | 1,203.1 ms | 6.16 ms | +| **TUnit** | 1.3.25 | 571.1 ms | 570.1 ms | 5.82 ms | +| NUnit | 4.4.0 | 1,138.6 ms | 1,138.2 ms | 5.49 ms | +| MSTest | 4.0.2 | 1,112.2 ms | 1,111.1 ms | 8.69 ms | +| xUnit3 | 3.2.1 | 1,197.6 ms | 1,196.2 ms | 5.01 ms | | **TUnit (AOT)** | 1.3.25 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-05** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1443 - bar [572.8, 1155.8, 1128.3, 1202.4, 0] + y-axis "Time (ms)" 0 --> 1438 + bar [571.1, 1138.6, 1112.2, 1197.6, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-05T00:30:14.387Z* +*Last generated: 2025-12-06T00:27:43.843Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 353b37502a..907cf0f89c 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-05** from the latest CI run. +These benchmarks were automatically generated on **2025-12-06** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-05T00:30:14.388Z* +*Last generated: 2025-12-06T00:27:43.843Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index e073f6ef6a..f6fc6fac1c 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.385Z", + "timestamp": "2025-12-06T00:27:43.842Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "589.8 ms", - "Error": "5.23 ms", - "StdDev": "4.89 ms", - "Median": "589.3 ms" + "Mean": "579.9 ms", + "Error": "2.98 ms", + "StdDev": "2.78 ms", + "Median": "579.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "688.2 ms", - "Error": "11.65 ms", - "StdDev": "10.89 ms", - "Median": "688.9 ms" + "Mean": "666.7 ms", + "Error": "8.02 ms", + "StdDev": "6.70 ms", + "Median": "666.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "645.1 ms", - "Error": "11.95 ms", - "StdDev": "10.60 ms", - "Median": "643.0 ms" + "Mean": "639.7 ms", + "Error": "9.57 ms", + "StdDev": "8.95 ms", + "Median": "634.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "724.5 ms", - "Error": "10.93 ms", - "StdDev": "9.69 ms", - "Median": "723.6 ms" + "Mean": "730.4 ms", + "Error": "14.53 ms", + "StdDev": "13.59 ms", + "Median": "732.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "124.7 ms", - "Error": "0.26 ms", - "StdDev": "0.25 ms", - "Median": "124.7 ms" + "Mean": "124.3 ms", + "Error": "0.64 ms", + "StdDev": "0.60 ms", + "Median": "124.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 85e43cb0dd..524f25cdac 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.388Z", + "timestamp": "2025-12-06T00:27:43.843Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "2.066 s", - "Error": "0.0377 s", - "StdDev": "0.0353 s", - "Median": "2.060 s" + "Mean": "2.098 s", + "Error": "0.0335 s", + "StdDev": "0.0329 s", + "Median": "2.091 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.649 s", - "Error": "0.0164 s", - "StdDev": "0.0154 s", - "Median": "1.646 s" + "Mean": "1.681 s", + "Error": "0.0168 s", + "StdDev": "0.0149 s", + "Median": "1.679 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.720 s", - "Error": "0.0220 s", - "StdDev": "0.0206 s", - "Median": "1.713 s" + "Mean": "1.799 s", + "Error": "0.0255 s", + "StdDev": "0.0238 s", + "Median": "1.792 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.630 s", - "Error": "0.0277 s", - "StdDev": "0.0259 s", - "Median": "1.630 s" + "Mean": "1.721 s", + "Error": "0.0252 s", + "StdDev": "0.0235 s", + "Median": "1.723 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 397a955877..69eb85655b 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.386Z", + "timestamp": "2025-12-06T00:27:43.842Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "490.86 ms", - "Error": "6.121 ms", - "StdDev": "5.726 ms", - "Median": "491.42 ms" + "Mean": "526.18 ms", + "Error": "10.406 ms", + "StdDev": "9.733 ms", + "Median": "525.63 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "517.92 ms", - "Error": "8.128 ms", - "StdDev": "7.205 ms", - "Median": "517.35 ms" + "Mean": "686.15 ms", + "Error": "12.014 ms", + "StdDev": "11.238 ms", + "Median": "686.99 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "489.16 ms", - "Error": "9.417 ms", - "StdDev": "10.467 ms", - "Median": "487.76 ms" + "Mean": "681.30 ms", + "Error": "11.571 ms", + "StdDev": "10.257 ms", + "Median": "682.63 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "566.85 ms", - "Error": "7.756 ms", - "StdDev": "6.875 ms", - "Median": "565.79 ms" + "Mean": "686.97 ms", + "Error": "9.684 ms", + "StdDev": "8.584 ms", + "Median": "687.69 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "23.98 ms", - "Error": "0.198 ms", - "StdDev": "0.185 ms", - "Median": "23.96 ms" + "Mean": "25.63 ms", + "Error": "0.229 ms", + "StdDev": "0.203 ms", + "Median": "25.66 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 432418eb07..36dad2721c 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.386Z", + "timestamp": "2025-12-06T00:27:43.842Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "602.6 ms", - "Error": "4.34 ms", - "StdDev": "4.06 ms", - "Median": "603.7 ms" + "Mean": "608.9 ms", + "Error": "6.56 ms", + "StdDev": "5.48 ms", + "Median": "607.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,191.7 ms", - "Error": "8.34 ms", - "StdDev": "6.96 ms", - "Median": "1,192.7 ms" + "Mean": "1,220.5 ms", + "Error": "11.53 ms", + "StdDev": "9.63 ms", + "Median": "1,222.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,973.0 ms", - "Error": "11.60 ms", - "StdDev": "10.85 ms", - "Median": "2,971.9 ms" + "Mean": "3,006.2 ms", + "Error": "10.86 ms", + "StdDev": "10.16 ms", + "Median": "3,002.3 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,065.1 ms", - "Error": "8.32 ms", - "StdDev": "7.78 ms", - "Median": "3,064.9 ms" + "Mean": "3,087.9 ms", + "Error": "12.19 ms", + "StdDev": "11.40 ms", + "Median": "3,085.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "131.1 ms", - "Error": "0.58 ms", - "StdDev": "0.51 ms", - "Median": "131.1 ms" + "Mean": "132.7 ms", + "Error": "0.70 ms", + "StdDev": "0.62 ms", + "Median": "132.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index c68e9911bf..f4a3c2132f 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.386Z", + "timestamp": "2025-12-06T00:27:43.843Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "564.33 ms", - "Error": "4.065 ms", - "StdDev": "3.395 ms", - "Median": "564.92 ms" + "Mean": "562.41 ms", + "Error": "4.480 ms", + "StdDev": "3.971 ms", + "Median": "563.18 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,572.46 ms", - "Error": "10.432 ms", - "StdDev": "9.247 ms", - "Median": "1,570.59 ms" + "Mean": "1,574.15 ms", + "Error": "5.740 ms", + "StdDev": "5.369 ms", + "Median": "1,574.97 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,525.48 ms", - "Error": "10.031 ms", - "StdDev": "8.892 ms", - "Median": "1,525.44 ms" + "Mean": "1,534.37 ms", + "Error": "12.377 ms", + "StdDev": "10.972 ms", + "Median": "1,529.84 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,611.66 ms", - "Error": "9.918 ms", - "StdDev": "8.282 ms", - "Median": "1,608.48 ms" + "Mean": "1,618.66 ms", + "Error": "9.551 ms", + "StdDev": "8.934 ms", + "Median": "1,618.07 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "80.17 ms", - "Error": "0.521 ms", - "StdDev": "0.488 ms", - "Median": "80.12 ms" + "Mean": "80.00 ms", + "Error": "0.547 ms", + "StdDev": "0.512 ms", + "Median": "80.17 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index c4e6488782..0199984182 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.387Z", + "timestamp": "2025-12-06T00:27:43.843Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "520.51 ms", - "Error": "3.593 ms", - "StdDev": "3.185 ms", - "Median": "521.26 ms" + "Mean": "512.28 ms", + "Error": "2.295 ms", + "StdDev": "2.035 ms", + "Median": "512.24 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "601.98 ms", - "Error": "7.358 ms", - "StdDev": "6.523 ms", - "Median": "601.95 ms" + "Mean": "587.13 ms", + "Error": "11.206 ms", + "StdDev": "10.483 ms", + "Median": "584.27 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "614.97 ms", - "Error": "9.265 ms", - "StdDev": "8.666 ms", - "Median": "617.66 ms" + "Mean": "603.13 ms", + "Error": "8.032 ms", + "StdDev": "7.120 ms", + "Median": "603.16 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "606.12 ms", - "Error": "11.186 ms", - "StdDev": "9.916 ms", - "Median": "605.35 ms" + "Mean": "594.15 ms", + "Error": "10.439 ms", + "StdDev": "8.717 ms", + "Median": "593.03 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "42.80 ms", - "Error": "1.256 ms", - "StdDev": "3.704 ms", - "Median": "41.72 ms" + "Mean": "42.78 ms", + "Error": "0.972 ms", + "StdDev": "2.821 ms", + "Median": "43.30 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 59dc4cbc8c..271d8ba78e 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.387Z", + "timestamp": "2025-12-06T00:27:43.843Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "572.8 ms", - "Error": "3.49 ms", - "StdDev": "3.27 ms", - "Median": "573.2 ms" + "Mean": "571.1 ms", + "Error": "6.22 ms", + "StdDev": "5.82 ms", + "Median": "570.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,155.8 ms", - "Error": "9.70 ms", - "StdDev": "9.08 ms", - "Median": "1,157.2 ms" + "Mean": "1,138.6 ms", + "Error": "5.87 ms", + "StdDev": "5.49 ms", + "Median": "1,138.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,128.3 ms", - "Error": "6.52 ms", - "StdDev": "5.78 ms", - "Median": "1,126.0 ms" + "Mean": "1,112.2 ms", + "Error": "9.29 ms", + "StdDev": "8.69 ms", + "Median": "1,111.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,202.4 ms", - "Error": "6.94 ms", - "StdDev": "6.16 ms", - "Median": "1,203.1 ms" + "Mean": "1,197.6 ms", + "Error": "6.00 ms", + "StdDev": "5.01 ms", + "Median": "1,196.2 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 708e535311..ea54305513 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -102,5 +102,9 @@ { "date": "2025-12-05", "environment": "Ubuntu" + }, + { + "date": "2025-12-06", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index b7fdf2448c..2cd4c49e55 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-05T00:30:14.388Z", + "timestamp": "2025-12-06T00:27:43.844Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "589.8 ms", - "Error": "5.23 ms", - "StdDev": "4.89 ms", - "Median": "589.3 ms" + "Mean": "579.9 ms", + "Error": "2.98 ms", + "StdDev": "2.78 ms", + "Median": "579.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "688.2 ms", - "Error": "11.65 ms", - "StdDev": "10.89 ms", - "Median": "688.9 ms" + "Mean": "666.7 ms", + "Error": "8.02 ms", + "StdDev": "6.70 ms", + "Median": "666.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "645.1 ms", - "Error": "11.95 ms", - "StdDev": "10.60 ms", - "Median": "643.0 ms" + "Mean": "639.7 ms", + "Error": "9.57 ms", + "StdDev": "8.95 ms", + "Median": "634.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "724.5 ms", - "Error": "10.93 ms", - "StdDev": "9.69 ms", - "Median": "723.6 ms" + "Mean": "730.4 ms", + "Error": "14.53 ms", + "StdDev": "13.59 ms", + "Median": "732.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "124.7 ms", - "Error": "0.26 ms", - "StdDev": "0.25 ms", - "Median": "124.7 ms" + "Mean": "124.3 ms", + "Error": "0.64 ms", + "StdDev": "0.60 ms", + "Median": "124.3 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "490.86 ms", - "Error": "6.121 ms", - "StdDev": "5.726 ms", - "Median": "491.42 ms" + "Mean": "526.18 ms", + "Error": "10.406 ms", + "StdDev": "9.733 ms", + "Median": "525.63 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "517.92 ms", - "Error": "8.128 ms", - "StdDev": "7.205 ms", - "Median": "517.35 ms" + "Mean": "686.15 ms", + "Error": "12.014 ms", + "StdDev": "11.238 ms", + "Median": "686.99 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "489.16 ms", - "Error": "9.417 ms", - "StdDev": "10.467 ms", - "Median": "487.76 ms" + "Mean": "681.30 ms", + "Error": "11.571 ms", + "StdDev": "10.257 ms", + "Median": "682.63 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "566.85 ms", - "Error": "7.756 ms", - "StdDev": "6.875 ms", - "Median": "565.79 ms" + "Mean": "686.97 ms", + "Error": "9.684 ms", + "StdDev": "8.584 ms", + "Median": "687.69 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "23.98 ms", - "Error": "0.198 ms", - "StdDev": "0.185 ms", - "Median": "23.96 ms" + "Mean": "25.63 ms", + "Error": "0.229 ms", + "StdDev": "0.203 ms", + "Median": "25.66 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "602.6 ms", - "Error": "4.34 ms", - "StdDev": "4.06 ms", - "Median": "603.7 ms" + "Mean": "608.9 ms", + "Error": "6.56 ms", + "StdDev": "5.48 ms", + "Median": "607.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,191.7 ms", - "Error": "8.34 ms", - "StdDev": "6.96 ms", - "Median": "1,192.7 ms" + "Mean": "1,220.5 ms", + "Error": "11.53 ms", + "StdDev": "9.63 ms", + "Median": "1,222.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,973.0 ms", - "Error": "11.60 ms", - "StdDev": "10.85 ms", - "Median": "2,971.9 ms" + "Mean": "3,006.2 ms", + "Error": "10.86 ms", + "StdDev": "10.16 ms", + "Median": "3,002.3 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,065.1 ms", - "Error": "8.32 ms", - "StdDev": "7.78 ms", - "Median": "3,064.9 ms" + "Mean": "3,087.9 ms", + "Error": "12.19 ms", + "StdDev": "11.40 ms", + "Median": "3,085.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "131.1 ms", - "Error": "0.58 ms", - "StdDev": "0.51 ms", - "Median": "131.1 ms" + "Mean": "132.7 ms", + "Error": "0.70 ms", + "StdDev": "0.62 ms", + "Median": "132.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "564.33 ms", - "Error": "4.065 ms", - "StdDev": "3.395 ms", - "Median": "564.92 ms" + "Mean": "562.41 ms", + "Error": "4.480 ms", + "StdDev": "3.971 ms", + "Median": "563.18 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,572.46 ms", - "Error": "10.432 ms", - "StdDev": "9.247 ms", - "Median": "1,570.59 ms" + "Mean": "1,574.15 ms", + "Error": "5.740 ms", + "StdDev": "5.369 ms", + "Median": "1,574.97 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,525.48 ms", - "Error": "10.031 ms", - "StdDev": "8.892 ms", - "Median": "1,525.44 ms" + "Mean": "1,534.37 ms", + "Error": "12.377 ms", + "StdDev": "10.972 ms", + "Median": "1,529.84 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,611.66 ms", - "Error": "9.918 ms", - "StdDev": "8.282 ms", - "Median": "1,608.48 ms" + "Mean": "1,618.66 ms", + "Error": "9.551 ms", + "StdDev": "8.934 ms", + "Median": "1,618.07 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "80.17 ms", - "Error": "0.521 ms", - "StdDev": "0.488 ms", - "Median": "80.12 ms" + "Mean": "80.00 ms", + "Error": "0.547 ms", + "StdDev": "0.512 ms", + "Median": "80.17 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "520.51 ms", - "Error": "3.593 ms", - "StdDev": "3.185 ms", - "Median": "521.26 ms" + "Mean": "512.28 ms", + "Error": "2.295 ms", + "StdDev": "2.035 ms", + "Median": "512.24 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "601.98 ms", - "Error": "7.358 ms", - "StdDev": "6.523 ms", - "Median": "601.95 ms" + "Mean": "587.13 ms", + "Error": "11.206 ms", + "StdDev": "10.483 ms", + "Median": "584.27 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "614.97 ms", - "Error": "9.265 ms", - "StdDev": "8.666 ms", - "Median": "617.66 ms" + "Mean": "603.13 ms", + "Error": "8.032 ms", + "StdDev": "7.120 ms", + "Median": "603.16 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "606.12 ms", - "Error": "11.186 ms", - "StdDev": "9.916 ms", - "Median": "605.35 ms" + "Mean": "594.15 ms", + "Error": "10.439 ms", + "StdDev": "8.717 ms", + "Median": "593.03 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "42.80 ms", - "Error": "1.256 ms", - "StdDev": "3.704 ms", - "Median": "41.72 ms" + "Mean": "42.78 ms", + "Error": "0.972 ms", + "StdDev": "2.821 ms", + "Median": "43.30 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "572.8 ms", - "Error": "3.49 ms", - "StdDev": "3.27 ms", - "Median": "573.2 ms" + "Mean": "571.1 ms", + "Error": "6.22 ms", + "StdDev": "5.82 ms", + "Median": "570.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,155.8 ms", - "Error": "9.70 ms", - "StdDev": "9.08 ms", - "Median": "1,157.2 ms" + "Mean": "1,138.6 ms", + "Error": "5.87 ms", + "StdDev": "5.49 ms", + "Median": "1,138.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,128.3 ms", - "Error": "6.52 ms", - "StdDev": "5.78 ms", - "Median": "1,126.0 ms" + "Mean": "1,112.2 ms", + "Error": "9.29 ms", + "StdDev": "8.69 ms", + "Median": "1,111.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,202.4 ms", - "Error": "6.94 ms", - "StdDev": "6.16 ms", - "Median": "1,203.1 ms" + "Mean": "1,197.6 ms", + "Error": "6.00 ms", + "StdDev": "5.01 ms", + "Median": "1,196.2 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "2.066 s", - "Error": "0.0377 s", - "StdDev": "0.0353 s", - "Median": "2.060 s" + "Mean": "2.098 s", + "Error": "0.0335 s", + "StdDev": "0.0329 s", + "Median": "2.091 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.649 s", - "Error": "0.0164 s", - "StdDev": "0.0154 s", - "Median": "1.646 s" + "Mean": "1.681 s", + "Error": "0.0168 s", + "StdDev": "0.0149 s", + "Median": "1.679 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.720 s", - "Error": "0.0220 s", - "StdDev": "0.0206 s", - "Median": "1.713 s" + "Mean": "1.799 s", + "Error": "0.0255 s", + "StdDev": "0.0238 s", + "Median": "1.792 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.630 s", - "Error": "0.0277 s", - "StdDev": "0.0259 s", - "Median": "1.630 s" + "Mean": "1.721 s", + "Error": "0.0252 s", + "StdDev": "0.0235 s", + "Median": "1.723 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-05T00:30:14.385Z" + "lastUpdated": "2025-12-06T00:27:43.841Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index f7a038d08a..1caf3539f1 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-05", + "timestamp": "2025-12-06", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From ef5a6a07871ae71dbd24f310f59a05195a462eff Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 09:58:47 +0000 Subject: [PATCH 152/192] chore(deps): update dependency publicapigenerator to 11.5.4 (#3994) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d0390420b1..e16059c17f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -60,7 +60,7 @@ - + From 64e794e441da39c583b91ac8f526b3259bee81d8 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 10:39:57 +0000 Subject: [PATCH 153/192] test: add regression test for TestContext.Current null issue during property injection (#3995) --- .../TestArgumentRegistrationService.cs | 2 + .../PropertyDataSourceInjectionTests.cs | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/TUnit.Engine/Services/TestArgumentRegistrationService.cs b/TUnit.Engine/Services/TestArgumentRegistrationService.cs index 7b4b496658..407df90e4e 100644 --- a/TUnit.Engine/Services/TestArgumentRegistrationService.cs +++ b/TUnit.Engine/Services/TestArgumentRegistrationService.cs @@ -23,6 +23,8 @@ public TestArgumentRegistrationService(ObjectLifecycleService objectLifecycleSer /// public async ValueTask RegisterTestArgumentsAsync(TestContext testContext) { + TestContext.Current = testContext; + var classArguments = testContext.Metadata.TestDetails.TestClassArguments; var methodArguments = testContext.Metadata.TestDetails.TestMethodArguments; diff --git a/TUnit.UnitTests/PropertyDataSourceInjectionTests.cs b/TUnit.UnitTests/PropertyDataSourceInjectionTests.cs index 75dffd84e0..4bb4388a3c 100644 --- a/TUnit.UnitTests/PropertyDataSourceInjectionTests.cs +++ b/TUnit.UnitTests/PropertyDataSourceInjectionTests.cs @@ -227,3 +227,49 @@ public string GetDeepData() } } +// Regression test for Issue #3991: TestContext.Current is null during property injection +public class TestContextAvailabilityDuringPropertyInjectionTests +{ + [TestContextDataSource] + public required TestContextCapture? ContextCapture { get; set; } + + [Test] + public async Task PropertyInjection_CanAccessTestContext_DuringDiscoveryPhase() + { + // This test verifies that TestContext.Current is available during property injection + // in the discovery/registration phase (Issue #3991) + await Assert.That(ContextCapture).IsNotNull(); + await Assert.That(ContextCapture!.TestContextWasAvailable).IsTrue(); + await Assert.That(ContextCapture.CapturedTestContextId).IsNotNull(); + } +} + +// Data source that accesses TestContext.Current during initialization +// This reproduces the bug from Issue #3991 +public class TestContextDataSourceAttribute : AsyncDataSourceGeneratorAttribute +{ + protected override async IAsyncEnumerable>> GenerateDataSourcesAsync(DataGeneratorMetadata dataGeneratorMetadata) + { + yield return async () => + { + // This is where the bug occurs: TestContext.Current is null during discovery + var testContext = TestContext.Current; + + return new TestContextCapture + { + TestContextWasAvailable = testContext != null, + CapturedTestContextId = testContext?.Id, + CapturedCancellationToken = testContext?.CancellationToken ?? default + }; + }; + await Task.CompletedTask; + } +} + +public class TestContextCapture +{ + public bool TestContextWasAvailable { get; set; } + public string? CapturedTestContextId { get; set; } + public CancellationToken CapturedCancellationToken { get; set; } +} + From 60b47d0e9c3d6e2ecd0931fdbf9ce8687f949810 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 11:24:45 +0000 Subject: [PATCH 154/192] feat: don't run IAsyncInitializer during discovery phase (#3996) --- TUnit.Engine/Building/TestBuilder.cs | 20 ++++----- .../Services/ObjectLifecycleService.cs | 24 +++++++++++ .../3992/IAsyncInitializerDiscoveryTests.cs | 41 +++++++++++++++++++ 3 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3992/IAsyncInitializerDiscoveryTests.cs diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index 38cf785996..628c8e6449 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -766,10 +766,10 @@ private async Task GetDataSourcesAsync(IDataSourceAttrib return [NoDataSource.Instance]; } - // Initialize all data sources to ensure properties are injected + // Inject properties into data sources during discovery (IAsyncInitializer deferred to execution) foreach (var dataSource in dataSources) { - await _objectLifecycleService.EnsureInitializedAsync(dataSource); + await _objectLifecycleService.InjectPropertiesAsync(dataSource); } return dataSources; @@ -783,16 +783,15 @@ private async Task GetDataSourcesAsync(IDataSourceAttrib IDataSourceAttribute dataSource, DataGeneratorMetadata dataGeneratorMetadata) { - // Ensure the data source is fully initialized before getting data rows - // This includes property injection and IAsyncInitializer.InitializeAsync - var initializedDataSource = await _objectLifecycleService.EnsureInitializedAsync( + // Inject properties into data source during discovery (IAsyncInitializer deferred to execution) + var propertyInjectedDataSource = await _objectLifecycleService.InjectPropertiesAsync( dataSource, dataGeneratorMetadata.TestBuilderContext.Current.StateBag, dataGeneratorMetadata.TestInformation, dataGeneratorMetadata.TestBuilderContext.Current.Events); - // Now get data rows from the initialized data source - await foreach (var dataRow in initializedDataSource.GetDataRowsAsync(dataGeneratorMetadata)) + // Now get data rows from the property-injected data source + await foreach (var dataRow in propertyInjectedDataSource.GetDataRowsAsync(dataGeneratorMetadata)) { yield return dataRow; } @@ -1017,14 +1016,13 @@ private async Task CreateFailedTestDetails(TestMetadata metadata, s private async Task InitializeAttributesAsync(Attribute[] attributes) { - // Initialize any attributes that need property injection or implement IAsyncInitializer - // This ensures they're fully initialized before being used + // Inject properties into data source attributes during discovery + // IAsyncInitializer.InitializeAsync is deferred to execution time foreach (var attribute in attributes) { if (attribute is IDataSourceAttribute dataSource) { - // Data source attributes need to be initialized with property injection - await _objectLifecycleService.EnsureInitializedAsync(dataSource); + await _objectLifecycleService.InjectPropertiesAsync(dataSource); } } diff --git a/TUnit.Engine/Services/ObjectLifecycleService.cs b/TUnit.Engine/Services/ObjectLifecycleService.cs index f554d07ea0..33d50d9b08 100644 --- a/TUnit.Engine/Services/ObjectLifecycleService.cs +++ b/TUnit.Engine/Services/ObjectLifecycleService.cs @@ -207,6 +207,30 @@ await EnsureInitializedAsync( #region Phase 3: Object Initialization + /// + /// Injects properties into an object without calling IAsyncInitializer. + /// Used during test discovery to prepare data sources without triggering async initialization. + /// + public async ValueTask InjectPropertiesAsync( + T obj, + ConcurrentDictionary? objectBag = null, + MethodMetadata? methodMetadata = null, + TestContextEvents? events = null) where T : notnull + { + if (obj == null) + { + throw new ArgumentNullException(nameof(obj)); + } + + objectBag ??= new ConcurrentDictionary(); + events ??= new TestContextEvents(); + + // Only inject properties, do not call IAsyncInitializer + await PropertyInjector.InjectPropertiesAsync(obj, objectBag, methodMetadata, events); + + return obj; + } + /// /// Ensures an object is fully initialized (property injection + IAsyncInitializer). /// Thread-safe with fast-path for already-initialized objects. diff --git a/TUnit.TestProject/Bugs/3992/IAsyncInitializerDiscoveryTests.cs b/TUnit.TestProject/Bugs/3992/IAsyncInitializerDiscoveryTests.cs new file mode 100644 index 0000000000..b0c579b0ac --- /dev/null +++ b/TUnit.TestProject/Bugs/3992/IAsyncInitializerDiscoveryTests.cs @@ -0,0 +1,41 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3992; + +/// +/// Regression test for issue #3992: IAsyncInitializer should not run during test discovery. +/// Verifies that IAsyncInitializer.InitializeAsync() is only called during test execution, +/// not during the discovery phase. +/// +[EngineTest(ExpectedResult.Pass)] +public class IAsyncInitializerDiscoveryTests +{ + private static int _initializationCount = 0; + + public class DataSourceWithAsyncInit : IAsyncInitializer + { + public bool IsInitialized { get; private set; } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializationCount); + IsInitialized = true; + Console.WriteLine($"InitializeAsync called (count: {_initializationCount})"); + return Task.CompletedTask; + } + } + + [Test] + [ClassDataSource] + public async Task DataSource_InitializeAsync_OnlyCalledDuringExecution(DataSourceWithAsyncInit dataSource) + { + // Verify that the data source was initialized + await Assert.That(dataSource.IsInitialized).IsTrue(); + + // Verify that InitializeAsync was called (at least once during execution) + await Assert.That(_initializationCount).IsGreaterThan(0); + + Console.WriteLine($"Test execution confirmed: InitializeAsync was called {_initializationCount} time(s)"); + } +} From d06474b8f6247f443c1482e2777b5eefc2a3bda0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 12:51:59 +0000 Subject: [PATCH 155/192] feat: add support for reusing discovery instances in test building and property resolution (#3998) * feat: don't run IAsyncInitializer during discovery phase * feat: optimize property resolution by skipping for reused discovery instances and add regression test for IAsyncInitializer calls * feat: add support for reusing discovery instances in test building and property resolution --- TUnit.Core/TestContext.cs | 6 ++ .../Building/Interfaces/ITestBuilder.cs | 3 +- TUnit.Engine/Building/TestBuilder.cs | 19 +++++- TUnit.Engine/Services/PropertyInjector.cs | 6 ++ .../Bugs/3993/IAsyncInitializerTests.cs | 62 +++++++++++++++++++ 5 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3993/IAsyncInitializerTests.cs diff --git a/TUnit.Core/TestContext.cs b/TUnit.Core/TestContext.cs index 61ce4b2571..af1b1710d9 100644 --- a/TUnit.Core/TestContext.cs +++ b/TUnit.Core/TestContext.cs @@ -138,6 +138,12 @@ internal override void SetAsyncLocalContext() internal bool RunOnTestDiscovery { get; set; } + /// + /// Indicates whether this test is reusing the discovery-time instance instead of creating a new instance. + /// When true, property resolution and initialization should be skipped since the instance is already prepared. + /// + internal bool IsDiscoveryInstanceReused { get; set; } + public object Lock { get; } = new(); diff --git a/TUnit.Engine/Building/Interfaces/ITestBuilder.cs b/TUnit.Engine/Building/Interfaces/ITestBuilder.cs index c50bda428e..8f75be2a0e 100644 --- a/TUnit.Engine/Building/Interfaces/ITestBuilder.cs +++ b/TUnit.Engine/Building/Interfaces/ITestBuilder.cs @@ -14,8 +14,9 @@ internal interface ITestBuilder /// The test metadata /// The test data /// + /// Whether this test is reusing the discovery instance /// An executable test ready for execution - Task BuildTestAsync(TestMetadata metadata, TestBuilder.TestData testData, TestBuilderContext testBuilderContext); + Task BuildTestAsync(TestMetadata metadata, TestBuilder.TestData testData, TestBuilderContext testBuilderContext, bool isReusingDiscoveryInstance = false); /// /// Builds all executable tests from a single TestMetadata using its DataCombinationGenerator delegate. diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index 628c8e6449..b3ef936b88 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -209,6 +209,7 @@ public async Task> BuildTestsFromMetadataAsy var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData); object? instanceForMethodDataSources = null; + var discoveryInstanceUsed = false; if (needsInstanceForMethodDataSources) { @@ -382,10 +383,21 @@ await _objectLifecycleService.RegisterObjectAsync( var basicSkipReason = GetBasicSkipReason(metadata, attributes); Func> instanceFactory; + bool isReusingDiscoveryInstance = false; + if (basicSkipReason is { Length: > 0 }) { instanceFactory = () => Task.FromResult(SkippedTestInstance.Instance); } + else if (methodDataLoopIndex == 1 && i == 0 && instanceForMethodDataSources != null && !discoveryInstanceUsed) + { + // Reuse the discovery instance for the first test to avoid duplicate initialization + var capturedInstance = instanceForMethodDataSources; + discoveryInstanceUsed = true; + isReusingDiscoveryInstance = true; + + instanceFactory = () => Task.FromResult(capturedInstance); + } else { var capturedMetadata = metadata; @@ -420,7 +432,7 @@ await _objectLifecycleService.RegisterObjectAsync( InitializedAttributes = attributes }; - var test = await BuildTestAsync(metadata, testData, testSpecificContext); + var test = await BuildTestAsync(metadata, testData, testSpecificContext, isReusingDiscoveryInstance); // If we have a basic skip reason, set it immediately if (!string.IsNullOrEmpty(basicSkipReason)) @@ -799,7 +811,7 @@ private async Task GetDataSourcesAsync(IDataSourceAttrib [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Hook discovery service handles mode-specific logic; reflection calls suppressed in AOT mode")] [UnconditionalSuppressMessage("AOT", "IL3050", Justification = "Hook discovery service handles mode-specific logic; dynamic code suppressed in AOT mode")] - public async Task BuildTestAsync(TestMetadata metadata, TestData testData, TestBuilderContext testBuilderContext) + public async Task BuildTestAsync(TestMetadata metadata, TestData testData, TestBuilderContext testBuilderContext, bool isReusingDiscoveryInstance = false) { // Discover instance hooks for closed generic types (no-op in source gen mode) if (metadata.TestClassType is { IsGenericType: true, IsGenericTypeDefinition: false }) @@ -811,6 +823,9 @@ public async Task BuildTestAsync(TestMetadata metadata, var context = await CreateTestContextAsync(testId, metadata, testData, testBuilderContext); + // Mark if this test is reusing the discovery instance (already initialized) + context.IsDiscoveryInstanceReused = isReusingDiscoveryInstance; + context.Metadata.TestDetails.ClassInstance = PlaceholderInstance.Instance; // Arguments will be tracked by TestArgumentTrackingService during TestRegistered event diff --git a/TUnit.Engine/Services/PropertyInjector.cs b/TUnit.Engine/Services/PropertyInjector.cs index 55b6ff5b0c..249f19207b 100644 --- a/TUnit.Engine/Services/PropertyInjector.cs +++ b/TUnit.Engine/Services/PropertyInjector.cs @@ -39,6 +39,12 @@ public async Task ResolveAndCachePropertiesAsync( TestContextEvents events, TestContext testContext) { + // Skip property resolution if this test is reusing the discovery instance (already initialized) + if (testContext.IsDiscoveryInstanceReused) + { + return; + } + var plan = PropertyInjectionCache.GetOrCreatePlan(testClassType); if (!plan.HasProperties) diff --git a/TUnit.TestProject/Bugs/3993/IAsyncInitializerTests.cs b/TUnit.TestProject/Bugs/3993/IAsyncInitializerTests.cs new file mode 100644 index 0000000000..58b07b362a --- /dev/null +++ b/TUnit.TestProject/Bugs/3993/IAsyncInitializerTests.cs @@ -0,0 +1,62 @@ +using System.Collections.Concurrent; +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3993; + +/// +/// Regression test for issue #3993: IAsyncInitializer called 4 times instead of 3 +/// when using ClassDataSource with MethodDataSource that accesses instance properties. +/// +[EngineTest(ExpectedResult.Pass)] +public class IAsyncInitializerTests +{ + [ClassDataSource(Shared = SharedType.None)] + public required PerTestCaseSource PerTestCaseSource { get; init; } + + public IEnumerable PerTestCaseStrings() => PerTestCaseSource.MyString; + + [Test] + [MethodDataSource(nameof(PerTestCaseStrings))] + public async Task ForNTestCases_ShouldInitNTimes(string s) + { + await Assert.That(s).IsNotNull(); + + // Each of the 3 test cases should have its own isolated PerTestCaseSource instance + // Since Shared = SharedType.None, each test gets a new instance + // Therefore, InitializeAsync should be called exactly 3 times (once per test) + // NOT 4 times (which would include the discovery instance) + await Assert + .That(PerTestCaseSource.SetUps) + .IsEqualTo(3) + .Because("each of the 3 test cases should be wrapped in its own isolated test class, " + + "causing a call to async init, but no more than those three calls should be needed. " + + "The discovery-time instance should NOT be initialized."); + } + + [After(Class)] + public static void ResetCounter() + { + // Reset for next run + PerTestCaseSource.Reset(); + } +} + +public class PerTestCaseSource : IAsyncInitializer +{ + public string[] MyString = []; + private static int _setUps = 0; + public static int SetUps => _setUps; + + public Task InitializeAsync() + { + Interlocked.Increment(ref _setUps); + MyString = ["123", "321", "9210"]; + return Task.CompletedTask; + } + + public static void Reset() + { + _setUps = 0; + } +} From b9b4f7aa372daa8c14f534135ed552e154eae53a Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 13:42:24 +0000 Subject: [PATCH 156/192] Change trigger from pull_request_target to pull_request --- .github/workflows/claude-code-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index b6af3e39b5..7b5ae6cac4 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -1,7 +1,7 @@ name: Claude Code Review on: - pull_request_target: + pull_request: types: [opened, synchronize] # Optional: Only run on specific file changes # paths: From f8d9e790cc6af91508718f69f7fb97b047b2fe1d Mon Sep 17 00:00:00 2001 From: Robin Choffardet Date: Sat, 6 Dec 2025 15:24:05 +0100 Subject: [PATCH 157/192] fix: JUnit reporter (#3999) --- TUnit.Engine/Xml/JUnitXmlWriter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Engine/Xml/JUnitXmlWriter.cs b/TUnit.Engine/Xml/JUnitXmlWriter.cs index 185674ec85..aaf13ef28e 100644 --- a/TUnit.Engine/Xml/JUnitXmlWriter.cs +++ b/TUnit.Engine/Xml/JUnitXmlWriter.cs @@ -62,7 +62,7 @@ public static string GenerateXml( xmlWriter.WriteEndElement(); // testsuites xmlWriter.WriteEndDocument(); - + xmlWriter.Flush(); return stringWriter.ToString(); } From eeea4768c34701ac20da5293d57ff5dee47861ed Mon Sep 17 00:00:00 2001 From: Robin Choffardet Date: Sat, 6 Dec 2025 17:03:57 +0100 Subject: [PATCH 158/192] fix: JUnit reporter was encoding xml files in UTF-16 instead of UTF-8 (#4001) * fix: JUnit reporter * Enforce UTF-8 instead of UTF-16 --- TUnit.Engine/Xml/JUnitXmlWriter.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/TUnit.Engine/Xml/JUnitXmlWriter.cs b/TUnit.Engine/Xml/JUnitXmlWriter.cs index aaf13ef28e..1c9156d241 100644 --- a/TUnit.Engine/Xml/JUnitXmlWriter.cs +++ b/TUnit.Engine/Xml/JUnitXmlWriter.cs @@ -33,7 +33,7 @@ public static string GenerateXml( ?.FrameworkDisplayName ?? RuntimeInformation.FrameworkDescription; - using var stringWriter = new StringWriter(); + using var stringWriter = new Utf8StringWriter(); var settings = new XmlWriterSettings { Indent = true, @@ -341,6 +341,11 @@ private static TestSummary CalculateSummary(IEnumerable t } } +file sealed class Utf8StringWriter : StringWriter +{ + public override Encoding Encoding => Encoding.UTF8; +} + internal sealed class TestSummary { public int Total { get; set; } From fdbf6a1df9c70494e5f365ae03b3271e9ed07f83 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 16:52:29 +0000 Subject: [PATCH 159/192] +semver:minor - feat: add IAsyncDiscoveryInitializer for asynchronous initialization during test discovery (#4000) * feat: add IAsyncDiscoveryInitializer for asynchronous initialization during test discovery * feat: initialize IAsyncDiscoveryInitializer instances during test execution --- .../Interfaces/IAsyncDiscoveryInitializer.cs | 28 +++++++++ TUnit.Engine/Building/TestBuilder.cs | 50 ++++++++++++++++ ...Has_No_API_Changes.DotNet10_0.verified.txt | 1 + ..._Has_No_API_Changes.DotNet8_0.verified.txt | 1 + ..._Has_No_API_Changes.DotNet9_0.verified.txt | 1 + ...ary_Has_No_API_Changes.Net4_7.verified.txt | 1 + TUnit.TestProject/Bugs/3997/Tests.cs | 58 +++++++++++++++++++ 7 files changed, 140 insertions(+) create mode 100644 TUnit.Core/Interfaces/IAsyncDiscoveryInitializer.cs create mode 100644 TUnit.TestProject/Bugs/3997/Tests.cs diff --git a/TUnit.Core/Interfaces/IAsyncDiscoveryInitializer.cs b/TUnit.Core/Interfaces/IAsyncDiscoveryInitializer.cs new file mode 100644 index 0000000000..8c9f4f1dfb --- /dev/null +++ b/TUnit.Core/Interfaces/IAsyncDiscoveryInitializer.cs @@ -0,0 +1,28 @@ +namespace TUnit.Core.Interfaces; + +/// +/// Defines a contract for types that require asynchronous initialization during test discovery. +/// +/// +/// +/// Unlike which runs during test execution, +/// implementations of this interface are initialized during the test discovery phase. +/// This enables data sources (such as InstanceMethodDataSource) to access +/// fully-initialized objects when generating test cases. +/// +/// +/// Common use cases include: +/// +/// Starting Docker containers before test case enumeration +/// Connecting to databases to discover parameterized test data +/// Initializing fixtures that provide data for test case generation +/// +/// +/// +/// This interface extends , meaning the same +/// method is used. The framework +/// guarantees exactly-once initialization semantics - objects will not be +/// re-initialized during test execution. +/// +/// +public interface IAsyncDiscoveryInitializer : IAsyncInitializer; diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index b3ef936b88..30dc1bcb7e 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -66,6 +66,30 @@ private async Task InitializeDeferredClassDataAsync(object?[] classData) } } + /// + /// Initializes any IAsyncDiscoveryInitializer objects in class data during test discovery. + /// This is called BEFORE method data sources are evaluated, enabling data sources + /// to access initialized shared objects (like Docker containers). + /// + private static async Task InitializeDiscoveryObjectsAsync(object?[] classData) + { + if (classData == null || classData.Length == 0) + { + return; + } + + foreach (var data in classData) + { + if (data is IAsyncDiscoveryInitializer) + { + // Uses ObjectInitializer which handles deduplication. + // This also prevents double-init during execution since ObjectInitializer + // tracks initialized objects. + await ObjectInitializer.InitializeAsync(data); + } + } + } + private async Task CreateInstance(TestMetadata metadata, Type[] resolvedClassGenericArgs, object?[] classData, TestBuilderContext builderContext) { // Initialize any deferred IAsyncInitializer objects in class data @@ -206,6 +230,10 @@ public async Task> BuildTestsFromMetadataAsy var classDataResult = await classDataFactory() ?? []; var classData = DataUnwrapper.Unwrap(classDataResult); + // Initialize IAsyncDiscoveryInitializer objects before method data sources are evaluated. + // This enables InstanceMethodDataSource to access initialized shared objects. + await InitializeDiscoveryObjectsAsync(classData); + var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData); object? instanceForMethodDataSources = null; @@ -265,6 +293,12 @@ await _objectLifecycleService.RegisterObjectAsync( tempObjectBag, metadata.MethodMetadata, tempEvents); + + // Initialize the test class instance if it implements IAsyncDiscoveryInitializer + if (instanceForMethodDataSources is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(instanceForMethodDataSources); + } } } catch (Exception ex) @@ -313,6 +347,9 @@ await _objectLifecycleService.RegisterObjectAsync( classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); var methodData = DataUnwrapper.UnwrapWithTypes(await methodDataFactory() ?? [], metadata.MethodMetadata.Parameters); + // Initialize any IAsyncDiscoveryInitializer objects in method data + await InitializeDiscoveryObjectsAsync(methodData); + // For concrete generic instantiations, check if the data is compatible with the expected types if (metadata.GenericMethodTypeArguments is { Length: > 0 }) { @@ -1386,6 +1423,10 @@ public async IAsyncEnumerable BuildTestsStreamingAsync( var classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); + // Initialize IAsyncDiscoveryInitializer objects before method data sources are evaluated. + // This enables InstanceMethodDataSource to access initialized shared objects. + await InitializeDiscoveryObjectsAsync(classData); + // Handle instance creation for method data sources var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData); object? instanceForMethodDataSources = null; @@ -1410,6 +1451,12 @@ await _objectLifecycleService.RegisterObjectAsync( tempObjectBag, metadata.MethodMetadata, tempEvents); + + // Initialize the test class instance if it implements IAsyncDiscoveryInitializer + if (instanceForMethodDataSources is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(instanceForMethodDataSources); + } } // Stream through method data sources @@ -1520,6 +1567,9 @@ await _objectLifecycleService.RegisterObjectAsync( var methodData = DataUnwrapper.UnwrapWithTypes(await methodDataFactory() ?? [], metadata.MethodMetadata.Parameters); + // Initialize any IAsyncDiscoveryInitializer objects in method data + await InitializeDiscoveryObjectsAsync(methodData); + // Check data compatibility for generic methods if (metadata.GenericMethodTypeArguments is { Length: > 0 }) { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index a445e9e1f2..33684f6146 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -2199,6 +2199,7 @@ namespace .Interfaces { .<> GenerateDataFactoriesAsync(.DataSourceContext context, .CancellationToken cancellationToken = default); } + public interface IAsyncDiscoveryInitializer : . { } public interface IAsyncInitializer { . InitializeAsync(); diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index a1f6b35877..d97c4f38b5 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -2199,6 +2199,7 @@ namespace .Interfaces { .<> GenerateDataFactoriesAsync(.DataSourceContext context, .CancellationToken cancellationToken = default); } + public interface IAsyncDiscoveryInitializer : . { } public interface IAsyncInitializer { . InitializeAsync(); diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index e295333e1a..5280c9595c 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -2199,6 +2199,7 @@ namespace .Interfaces { .<> GenerateDataFactoriesAsync(.DataSourceContext context, .CancellationToken cancellationToken = default); } + public interface IAsyncDiscoveryInitializer : . { } public interface IAsyncInitializer { . InitializeAsync(); diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index ee302f89a4..538bd3ca00 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -2131,6 +2131,7 @@ namespace .Interfaces { .<> GenerateDataFactoriesAsync(.DataSourceContext context, .CancellationToken cancellationToken = default); } + public interface IAsyncDiscoveryInitializer : . { } public interface IAsyncInitializer { . InitializeAsync(); diff --git a/TUnit.TestProject/Bugs/3997/Tests.cs b/TUnit.TestProject/Bugs/3997/Tests.cs new file mode 100644 index 0000000000..9fe62ef189 --- /dev/null +++ b/TUnit.TestProject/Bugs/3997/Tests.cs @@ -0,0 +1,58 @@ +using TUnit.Core; +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3997; + +/// +/// Simulates a data source (like a Docker container) that needs initialization during test discovery +/// so that InstanceMethodDataSource can access its data when generating test cases. +/// +public class SimulatedContainer : IAsyncDiscoveryInitializer +{ + private readonly List _data = []; + public bool IsInitialized { get; private set; } + + public IReadOnlyList Data => _data; + + public Task InitializeAsync() + { + if (IsInitialized) + { + throw new InvalidOperationException("Container already initialized! InitializeAsync should only be called once."); + } + + // Simulate container startup and data population + _data.AddRange(["TestCase1", "TestCase2", "TestCase3"]); + IsInitialized = true; + return Task.CompletedTask; + } +} + +/// +/// Tests that IAsyncDiscoveryInitializer is called during test discovery, +/// allowing InstanceMethodDataSource to access initialized data. +/// +[EngineTest(ExpectedResult.Pass)] +public class DiscoveryInitializerTests +{ + [ClassDataSource(Shared = SharedType.PerClass)] + public required SimulatedContainer Container { get; init; } + + /// + /// This property provides test data from the initialized container. + /// The container MUST be initialized during discovery before this is evaluated. + /// + public IEnumerable TestCases => Container.Data; + + [Test] + [InstanceMethodDataSource(nameof(TestCases))] + public async Task TestWithContainerData(string testCase) + { + // Container should be initialized + await Assert.That(Container.IsInitialized).IsTrue(); + + // testCase should be one of the container's data items + await Assert.That(Container.Data).Contains(testCase); + } +} From c69e2e5541f8a5c1ae8cc82ba2d69903946e313b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 20:06:58 +0000 Subject: [PATCH 160/192] fix: prevent IAsyncInitializer from running during test discovery when using InstanceMethodDataSource (#4002) * fix: prevent IAsyncInitializer from running during test discovery when using InstanceMethodDataSource * fix: prevent IAsyncInitializer from running during test discovery by using predefined test case identifiers --- TUnit.Core/Helpers/DataSourceHelpers.cs | 37 +++-- ...thodDataSourceWithAsyncInitializerTests.cs | 132 ++++++++++++++++++ 2 files changed, 161 insertions(+), 8 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3992/InstanceMethodDataSourceWithAsyncInitializerTests.cs diff --git a/TUnit.Core/Helpers/DataSourceHelpers.cs b/TUnit.Core/Helpers/DataSourceHelpers.cs index 001fb6077b..6802e5add5 100644 --- a/TUnit.Core/Helpers/DataSourceHelpers.cs +++ b/TUnit.Core/Helpers/DataSourceHelpers.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; +using TUnit.Core.Interfaces; namespace TUnit.Core.Helpers; @@ -177,8 +178,12 @@ public static T InvokeIfFunc(object? value) // If it's a Func, invoke it first var actualData = InvokeIfFunc(data); - // Initialize the object if it implements IAsyncInitializer - await ObjectInitializer.InitializeAsync(actualData); + // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer + // Regular IAsyncInitializer objects are initialized during test execution by ObjectLifecycleService + if (actualData is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(actualData); + } return actualData; } @@ -197,7 +202,11 @@ public static T InvokeIfFunc(object? value) if (enumerator.MoveNext()) { var value = enumerator.Current; - await ObjectInitializer.InitializeAsync(value); + // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer + if (value is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(value); + } return value; } @@ -224,14 +233,22 @@ public static T InvokeIfFunc(object? value) if (enumerator.MoveNext()) { var value = enumerator.Current; - await ObjectInitializer.InitializeAsync(value); + // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer + if (value is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(value); + } return value; } return null; } - // For non-enumerable types, just initialize and return - await ObjectInitializer.InitializeAsync(actualData); + // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer + // Regular IAsyncInitializer objects are initialized during test execution by ObjectLifecycleService + if (actualData is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(actualData); + } return actualData; } @@ -579,8 +596,12 @@ public static void RegisterTypeCreator(Func> { var value = args[0]; - // Initialize the value if it implements IAsyncInitializer - await ObjectInitializer.InitializeAsync(value); + // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer + // Regular IAsyncInitializer objects are initialized during test execution by ObjectLifecycleService + if (value is IAsyncDiscoveryInitializer) + { + await ObjectInitializer.InitializeAsync(value); + } return value; } diff --git a/TUnit.TestProject/Bugs/3992/InstanceMethodDataSourceWithAsyncInitializerTests.cs b/TUnit.TestProject/Bugs/3992/InstanceMethodDataSourceWithAsyncInitializerTests.cs new file mode 100644 index 0000000000..733b3b6b72 --- /dev/null +++ b/TUnit.TestProject/Bugs/3992/InstanceMethodDataSourceWithAsyncInitializerTests.cs @@ -0,0 +1,132 @@ +using System.Collections.Concurrent; +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3992; + +/// +/// Regression test for issue #3992: IAsyncInitializer should not run during test discovery +/// when using InstanceMethodDataSource with ClassDataSource. +/// +/// This test replicates the user's scenario where: +/// 1. A ClassDataSource fixture implements IAsyncInitializer (e.g., starts Docker containers) +/// 2. An InstanceMethodDataSource returns predefined test case identifiers +/// 3. The fixture should NOT be initialized during discovery - only during execution +/// +/// The key insight is that test case IDENTIFIERS are known ahead of time (predefined), +/// but the actual fixture initialization (Docker containers, DB connections, etc.) +/// should only happen when tests actually execute. +/// +/// The bug caused Docker containers to start during test discovery (e.g., in IDE or --list-tests), +/// which was unexpected and resource-intensive. +/// +[EngineTest(ExpectedResult.Pass)] +public class InstanceMethodDataSourceWithAsyncInitializerTests +{ + private static int _initializationCount; + private static int _testExecutionCount; + private static readonly ConcurrentBag _observedInstanceIds = []; + + /// + /// Simulates a fixture like ClientServiceFixture that starts Docker containers. + /// Implements IAsyncInitializer (NOT IAsyncDiscoveryInitializer) because the user + /// does not want initialization during discovery. + /// + public class SimulatedContainerFixture : IAsyncInitializer + { + /// + /// Test case identifiers are PREDEFINED - they don't depend on initialization. + /// This allows discovery to enumerate test cases without initializing the fixture. + /// + private static readonly string[] PredefinedTestCases = ["TestCase1", "TestCase2", "TestCase3"]; + + /// + /// Unique identifier for this instance to verify sharing behavior. + /// + public Guid InstanceId { get; } = Guid.NewGuid(); + + public bool IsInitialized { get; private set; } + + /// + /// Returns predefined test case identifiers. These are available during discovery + /// WITHOUT requiring initialization. + /// + public IEnumerable GetTestCases() => PredefinedTestCases; + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializationCount); + Console.WriteLine($"[SimulatedContainerFixture] InitializeAsync called on instance {InstanceId} (count: {_initializationCount})"); + + // Simulate expensive container startup - this should NOT happen during discovery + IsInitialized = true; + + return Task.CompletedTask; + } + } + + [ClassDataSource(Shared = SharedType.PerClass)] + public required SimulatedContainerFixture Fixture { get; init; } + + /// + /// This property is accessed by InstanceMethodDataSource during discovery. + /// It returns predefined test case identifiers that don't require initialization. + /// The bug was that accessing this would trigger InitializeAsync() during discovery. + /// After the fix, InitializeAsync() should only be called during test execution. + /// + public IEnumerable TestExecutions => Fixture.GetTestCases(); + + [Test] + [InstanceMethodDataSource(nameof(TestExecutions))] + public async Task Test_WithInstanceMethodDataSource_DoesNotInitializeDuringDiscovery(string testCase) + { + Interlocked.Increment(ref _testExecutionCount); + + // Track this instance to verify sharing + _observedInstanceIds.Add(Fixture.InstanceId); + + // The fixture should be initialized by the time the test runs + await Assert.That(Fixture.IsInitialized) + .IsTrue() + .Because("the fixture should be initialized before test execution"); + + await Assert.That(testCase) + .IsNotNullOrEmpty() + .Because("the test case data should be available"); + + Console.WriteLine($"[Test] Executed with testCase='{testCase}', instanceId={Fixture.InstanceId}, " + + $"initCount={_initializationCount}, execCount={_testExecutionCount}"); + } + + [After(Class)] + public static async Task VerifyInitializationAndSharing() + { + // With SharedType.PerClass, the fixture should be initialized exactly ONCE + // during test execution, NOT during discovery. + // + // Before the fix: _initializationCount would be 2+ (discovery + execution) + // After the fix: _initializationCount should be exactly 1 (execution only) + + Console.WriteLine($"[After(Class)] Final counts - init: {_initializationCount}, exec: {_testExecutionCount}"); + Console.WriteLine($"[After(Class)] Unique instance IDs observed: {_observedInstanceIds.Distinct().Count()}"); + + await Assert.That(_initializationCount) + .IsEqualTo(1) + .Because("IAsyncInitializer should only be called once during execution, not during discovery"); + + await Assert.That(_testExecutionCount) + .IsEqualTo(3) + .Because("there should be 3 test executions (one per test case)"); + + // Verify that all tests used the SAME fixture instance (SharedType.PerClass) + var uniqueInstanceIds = _observedInstanceIds.Distinct().ToList(); + await Assert.That(uniqueInstanceIds) + .HasCount().EqualTo(1) + .Because("with SharedType.PerClass, all tests should share the same fixture instance"); + + // Reset for next run + _initializationCount = 0; + _testExecutionCount = 0; + _observedInstanceIds.Clear(); + } +} From 7759c2800ab02ed0639da7cecde77df7015f3ca0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sat, 6 Dec 2025 21:00:32 +0000 Subject: [PATCH 161/192] chore(deps): update dependency nunit3testadapter to v6 (#4004) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index e16059c17f..286884119a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -55,7 +55,7 @@ - + From 1b7cfcc9e19edfaa1b2af2f959ba987d604b987e Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 7 Dec 2025 00:32:05 +0000 Subject: [PATCH 162/192] chore: update benchmark results (#4005) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 34 +-- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 268 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 340 insertions(+), 336 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index e54f78b894..e244cce428 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 579.9 ms | 579.1 ms | 2.78 ms | -| NUnit | 4.4.0 | 666.7 ms | 666.3 ms | 6.70 ms | -| MSTest | 4.0.2 | 639.7 ms | 634.5 ms | 8.95 ms | -| xUnit3 | 3.2.1 | 730.4 ms | 732.8 ms | 13.59 ms | -| **TUnit (AOT)** | 1.3.25 | 124.3 ms | 124.3 ms | 0.60 ms | +| **TUnit** | 1.3.25 | 568.5 ms | 568.2 ms | 2.94 ms | +| NUnit | 4.4.0 | 787.8 ms | 785.5 ms | 7.98 ms | +| MSTest | 4.0.2 | 674.0 ms | 673.4 ms | 4.57 ms | +| xUnit3 | 3.2.1 | 751.1 ms | 750.7 ms | 6.33 ms | +| **TUnit (AOT)** | 1.3.25 | 124.7 ms | 124.8 ms | 0.19 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 877 - bar [579.9, 666.7, 639.7, 730.4, 124.3] + y-axis "Time (ms)" 0 --> 946 + bar [568.5, 787.8, 674, 751.1, 124.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.842Z* +*Last generated: 2025-12-07T00:31:50.679Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index ddef73e3dc..952ba578ec 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 2.098 s | 2.091 s | 0.0329 s | -| Build_NUnit | 4.4.0 | 1.681 s | 1.679 s | 0.0149 s | -| Build_MSTest | 4.0.2 | 1.799 s | 1.792 s | 0.0238 s | -| Build_xUnit3 | 3.2.1 | 1.721 s | 1.723 s | 0.0235 s | +| **TUnit** | 1.3.25 | 2.046 s | 2.052 s | 0.0208 s | +| Build_NUnit | 4.4.0 | 1.643 s | 1.643 s | 0.0154 s | +| Build_MSTest | 4.0.2 | 1.708 s | 1.705 s | 0.0136 s | +| Build_xUnit3 | 3.2.1 | 1.621 s | 1.618 s | 0.0193 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.098, 1.681, 1.799, 1.721] + bar [2.046, 1.643, 1.708, 1.621] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.843Z* +*Last generated: 2025-12-07T00:31:50.681Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index e9e9e922dc..1d5d13ffe1 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 526.18 ms | 525.63 ms | 9.733 ms | -| NUnit | 4.4.0 | 686.15 ms | 686.99 ms | 11.238 ms | -| MSTest | 4.0.2 | 681.30 ms | 682.63 ms | 10.257 ms | -| xUnit3 | 3.2.1 | 686.97 ms | 687.69 ms | 8.584 ms | -| **TUnit (AOT)** | 1.3.25 | 25.63 ms | 25.66 ms | 0.203 ms | +| **TUnit** | 1.3.25 | 501.49 ms | 500.65 ms | 4.437 ms | +| NUnit | 4.4.0 | 649.96 ms | 648.29 ms | 6.379 ms | +| MSTest | 4.0.2 | 621.30 ms | 619.30 ms | 7.369 ms | +| xUnit3 | 3.2.1 | 614.67 ms | 612.39 ms | 6.589 ms | +| **TUnit (AOT)** | 1.3.25 | 25.06 ms | 25.16 ms | 0.372 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 825 - bar [526.18, 686.15, 681.3, 686.97, 25.63] + y-axis "Time (ms)" 0 --> 780 + bar [501.49, 649.96, 621.3, 614.67, 25.06] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.842Z* +*Last generated: 2025-12-07T00:31:50.679Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 36215e7bd6..5f44cc88d5 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 608.9 ms | 607.5 ms | 5.48 ms | -| NUnit | 4.4.0 | 1,220.5 ms | 1,222.7 ms | 9.63 ms | -| MSTest | 4.0.2 | 3,006.2 ms | 3,002.3 ms | 10.16 ms | -| xUnit3 | 3.2.1 | 3,087.9 ms | 3,085.6 ms | 11.40 ms | -| **TUnit (AOT)** | 1.3.25 | 132.7 ms | 132.7 ms | 0.62 ms | +| **TUnit** | 1.3.25 | 581.1 ms | 580.1 ms | 4.80 ms | +| NUnit | 4.4.0 | 1,280.5 ms | 1,281.2 ms | 6.21 ms | +| MSTest | 4.0.2 | 3,004.7 ms | 3,003.7 ms | 6.26 ms | +| xUnit3 | 3.2.1 | 3,078.4 ms | 3,073.8 ms | 15.95 ms | +| **TUnit (AOT)** | 1.3.25 | 130.0 ms | 129.9 ms | 0.54 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3706 - bar [608.9, 1220.5, 3006.2, 3087.9, 132.7] + y-axis "Time (ms)" 0 --> 3695 + bar [581.1, 1280.5, 3004.7, 3078.4, 130] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.842Z* +*Last generated: 2025-12-07T00:31:50.679Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 6c0e74844c..664923eef0 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 562.41 ms | 563.18 ms | 3.971 ms | -| NUnit | 4.4.0 | 1,574.15 ms | 1,574.97 ms | 5.369 ms | -| MSTest | 4.0.2 | 1,534.37 ms | 1,529.84 ms | 10.972 ms | -| xUnit3 | 3.2.1 | 1,618.66 ms | 1,618.07 ms | 8.934 ms | -| **TUnit (AOT)** | 1.3.25 | 80.00 ms | 80.17 ms | 0.512 ms | +| **TUnit** | 1.3.25 | 572.59 ms | 571.95 ms | 4.628 ms | +| NUnit | 4.4.0 | 1,671.90 ms | 1,667.50 ms | 13.020 ms | +| MSTest | 4.0.2 | 1,530.26 ms | 1,527.81 ms | 9.974 ms | +| xUnit3 | 3.2.1 | 1,617.37 ms | 1,619.54 ms | 6.699 ms | +| **TUnit (AOT)** | 1.3.25 | 80.09 ms | 80.13 ms | 0.250 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1943 - bar [562.41, 1574.15, 1534.37, 1618.66, 80] + y-axis "Time (ms)" 0 --> 2007 + bar [572.59, 1671.9, 1530.26, 1617.37, 80.09] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.843Z* +*Last generated: 2025-12-07T00:31:50.680Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 84498e4301..2b5c1331cc 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 512.28 ms | 512.24 ms | 2.035 ms | -| NUnit | 4.4.0 | 587.13 ms | 584.27 ms | 10.483 ms | -| MSTest | 4.0.2 | 603.13 ms | 603.16 ms | 7.120 ms | -| xUnit3 | 3.2.1 | 594.15 ms | 593.03 ms | 8.717 ms | -| **TUnit (AOT)** | 1.3.25 | 42.78 ms | 43.30 ms | 2.821 ms | +| **TUnit** | 1.3.25 | 524.64 ms | 525.21 ms | 3.822 ms | +| NUnit | 4.4.0 | 668.92 ms | 668.72 ms | 9.454 ms | +| MSTest | 4.0.2 | 505.87 ms | 506.54 ms | 14.411 ms | +| xUnit3 | 3.2.1 | 588.42 ms | 585.27 ms | 13.938 ms | +| **TUnit (AOT)** | 1.3.25 | 45.69 ms | 45.54 ms | 3.688 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 724 - bar [512.28, 587.13, 603.13, 594.15, 42.78] + y-axis "Time (ms)" 0 --> 803 + bar [524.64, 668.92, 505.87, 588.42, 45.69] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.843Z* +*Last generated: 2025-12-07T00:31:50.680Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 86d251675e..a34853e837 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-06** from the latest CI run. +This benchmark was automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 571.1 ms | 570.1 ms | 5.82 ms | -| NUnit | 4.4.0 | 1,138.6 ms | 1,138.2 ms | 5.49 ms | -| MSTest | 4.0.2 | 1,112.2 ms | 1,111.1 ms | 8.69 ms | -| xUnit3 | 3.2.1 | 1,197.6 ms | 1,196.2 ms | 5.01 ms | +| **TUnit** | 1.3.25 | 574.5 ms | 572.8 ms | 6.91 ms | +| NUnit | 4.4.0 | 1,290.0 ms | 1,292.3 ms | 13.26 ms | +| MSTest | 4.0.2 | 1,123.5 ms | 1,125.0 ms | 8.70 ms | +| xUnit3 | 3.2.1 | 1,208.5 ms | 1,208.1 ms | 14.62 ms | | **TUnit (AOT)** | 1.3.25 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-06** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1438 - bar [571.1, 1138.6, 1112.2, 1197.6, 0] + y-axis "Time (ms)" 0 --> 1548 + bar [574.5, 1290, 1123.5, 1208.5, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-06T00:27:43.843Z* +*Last generated: 2025-12-07T00:31:50.680Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 907cf0f89c..7a7950cd8a 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-06** from the latest CI run. +These benchmarks were automatically generated on **2025-12-07** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-06T00:27:43.843Z* +*Last generated: 2025-12-07T00:31:50.681Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index f6fc6fac1c..1e72945257 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.842Z", + "timestamp": "2025-12-07T00:31:50.679Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "579.9 ms", - "Error": "2.98 ms", - "StdDev": "2.78 ms", - "Median": "579.1 ms" + "Mean": "568.5 ms", + "Error": "3.15 ms", + "StdDev": "2.94 ms", + "Median": "568.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "666.7 ms", - "Error": "8.02 ms", - "StdDev": "6.70 ms", - "Median": "666.3 ms" + "Mean": "787.8 ms", + "Error": "9.56 ms", + "StdDev": "7.98 ms", + "Median": "785.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "639.7 ms", - "Error": "9.57 ms", - "StdDev": "8.95 ms", - "Median": "634.5 ms" + "Mean": "674.0 ms", + "Error": "5.85 ms", + "StdDev": "4.57 ms", + "Median": "673.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "730.4 ms", - "Error": "14.53 ms", - "StdDev": "13.59 ms", - "Median": "732.8 ms" + "Mean": "751.1 ms", + "Error": "7.14 ms", + "StdDev": "6.33 ms", + "Median": "750.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "124.3 ms", - "Error": "0.64 ms", - "StdDev": "0.60 ms", - "Median": "124.3 ms" + "Mean": "124.7 ms", + "Error": "0.22 ms", + "StdDev": "0.19 ms", + "Median": "124.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 524f25cdac..6a9484442d 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.843Z", + "timestamp": "2025-12-07T00:31:50.681Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "2.098 s", - "Error": "0.0335 s", - "StdDev": "0.0329 s", - "Median": "2.091 s" + "Mean": "2.046 s", + "Error": "0.0222 s", + "StdDev": "0.0208 s", + "Median": "2.052 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.681 s", - "Error": "0.0168 s", - "StdDev": "0.0149 s", - "Median": "1.679 s" + "Mean": "1.643 s", + "Error": "0.0165 s", + "StdDev": "0.0154 s", + "Median": "1.643 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.799 s", - "Error": "0.0255 s", - "StdDev": "0.0238 s", - "Median": "1.792 s" + "Mean": "1.708 s", + "Error": "0.0145 s", + "StdDev": "0.0136 s", + "Median": "1.705 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.721 s", - "Error": "0.0252 s", - "StdDev": "0.0235 s", - "Median": "1.723 s" + "Mean": "1.621 s", + "Error": "0.0206 s", + "StdDev": "0.0193 s", + "Median": "1.618 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 69eb85655b..54667a4388 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.842Z", + "timestamp": "2025-12-07T00:31:50.679Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "526.18 ms", - "Error": "10.406 ms", - "StdDev": "9.733 ms", - "Median": "525.63 ms" + "Mean": "501.49 ms", + "Error": "4.743 ms", + "StdDev": "4.437 ms", + "Median": "500.65 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "686.15 ms", - "Error": "12.014 ms", - "StdDev": "11.238 ms", - "Median": "686.99 ms" + "Mean": "649.96 ms", + "Error": "6.819 ms", + "StdDev": "6.379 ms", + "Median": "648.29 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "681.30 ms", - "Error": "11.571 ms", - "StdDev": "10.257 ms", - "Median": "682.63 ms" + "Mean": "621.30 ms", + "Error": "8.824 ms", + "StdDev": "7.369 ms", + "Median": "619.30 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "686.97 ms", - "Error": "9.684 ms", - "StdDev": "8.584 ms", - "Median": "687.69 ms" + "Mean": "614.67 ms", + "Error": "7.433 ms", + "StdDev": "6.589 ms", + "Median": "612.39 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "25.63 ms", - "Error": "0.229 ms", - "StdDev": "0.203 ms", - "Median": "25.66 ms" + "Mean": "25.06 ms", + "Error": "0.397 ms", + "StdDev": "0.372 ms", + "Median": "25.16 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 36dad2721c..94638c698c 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.842Z", + "timestamp": "2025-12-07T00:31:50.679Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "608.9 ms", - "Error": "6.56 ms", - "StdDev": "5.48 ms", - "Median": "607.5 ms" + "Mean": "581.1 ms", + "Error": "5.13 ms", + "StdDev": "4.80 ms", + "Median": "580.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,220.5 ms", - "Error": "11.53 ms", - "StdDev": "9.63 ms", - "Median": "1,222.7 ms" + "Mean": "1,280.5 ms", + "Error": "6.64 ms", + "StdDev": "6.21 ms", + "Median": "1,281.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,006.2 ms", - "Error": "10.86 ms", - "StdDev": "10.16 ms", - "Median": "3,002.3 ms" + "Mean": "3,004.7 ms", + "Error": "6.69 ms", + "StdDev": "6.26 ms", + "Median": "3,003.7 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,087.9 ms", - "Error": "12.19 ms", - "StdDev": "11.40 ms", - "Median": "3,085.6 ms" + "Mean": "3,078.4 ms", + "Error": "17.05 ms", + "StdDev": "15.95 ms", + "Median": "3,073.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "132.7 ms", - "Error": "0.70 ms", - "StdDev": "0.62 ms", - "Median": "132.7 ms" + "Mean": "130.0 ms", + "Error": "0.58 ms", + "StdDev": "0.54 ms", + "Median": "129.9 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index f4a3c2132f..703af38565 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.843Z", + "timestamp": "2025-12-07T00:31:50.680Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "562.41 ms", - "Error": "4.480 ms", - "StdDev": "3.971 ms", - "Median": "563.18 ms" + "Mean": "572.59 ms", + "Error": "4.948 ms", + "StdDev": "4.628 ms", + "Median": "571.95 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,574.15 ms", - "Error": "5.740 ms", - "StdDev": "5.369 ms", - "Median": "1,574.97 ms" + "Mean": "1,671.90 ms", + "Error": "14.687 ms", + "StdDev": "13.020 ms", + "Median": "1,667.50 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,534.37 ms", - "Error": "12.377 ms", - "StdDev": "10.972 ms", - "Median": "1,529.84 ms" + "Mean": "1,530.26 ms", + "Error": "10.662 ms", + "StdDev": "9.974 ms", + "Median": "1,527.81 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,618.66 ms", - "Error": "9.551 ms", - "StdDev": "8.934 ms", - "Median": "1,618.07 ms" + "Mean": "1,617.37 ms", + "Error": "8.022 ms", + "StdDev": "6.699 ms", + "Median": "1,619.54 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "80.00 ms", - "Error": "0.547 ms", - "StdDev": "0.512 ms", - "Median": "80.17 ms" + "Mean": "80.09 ms", + "Error": "0.282 ms", + "StdDev": "0.250 ms", + "Median": "80.13 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 0199984182..b11706a144 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.843Z", + "timestamp": "2025-12-07T00:31:50.680Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "512.28 ms", - "Error": "2.295 ms", - "StdDev": "2.035 ms", - "Median": "512.24 ms" + "Mean": "524.64 ms", + "Error": "4.312 ms", + "StdDev": "3.822 ms", + "Median": "525.21 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "587.13 ms", - "Error": "11.206 ms", - "StdDev": "10.483 ms", - "Median": "584.27 ms" + "Mean": "668.92 ms", + "Error": "10.107 ms", + "StdDev": "9.454 ms", + "Median": "668.72 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "603.13 ms", - "Error": "8.032 ms", - "StdDev": "7.120 ms", - "Median": "603.16 ms" + "Mean": "505.87 ms", + "Error": "10.049 ms", + "StdDev": "14.411 ms", + "Median": "506.54 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "594.15 ms", - "Error": "10.439 ms", - "StdDev": "8.717 ms", - "Median": "593.03 ms" + "Mean": "588.42 ms", + "Error": "11.349 ms", + "StdDev": "13.938 ms", + "Median": "585.27 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "42.78 ms", - "Error": "0.972 ms", - "StdDev": "2.821 ms", - "Median": "43.30 ms" + "Mean": "45.69 ms", + "Error": "1.251 ms", + "StdDev": "3.688 ms", + "Median": "45.54 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 271d8ba78e..2a53f21d33 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.843Z", + "timestamp": "2025-12-07T00:31:50.680Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "571.1 ms", - "Error": "6.22 ms", - "StdDev": "5.82 ms", - "Median": "570.1 ms" + "Mean": "574.5 ms", + "Error": "7.39 ms", + "StdDev": "6.91 ms", + "Median": "572.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,138.6 ms", - "Error": "5.87 ms", - "StdDev": "5.49 ms", - "Median": "1,138.2 ms" + "Mean": "1,290.0 ms", + "Error": "14.17 ms", + "StdDev": "13.26 ms", + "Median": "1,292.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,112.2 ms", - "Error": "9.29 ms", - "StdDev": "8.69 ms", - "Median": "1,111.1 ms" + "Mean": "1,123.5 ms", + "Error": "9.30 ms", + "StdDev": "8.70 ms", + "Median": "1,125.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,197.6 ms", - "Error": "6.00 ms", - "StdDev": "5.01 ms", - "Median": "1,196.2 ms" + "Mean": "1,208.5 ms", + "Error": "16.50 ms", + "StdDev": "14.62 ms", + "Median": "1,208.1 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index ea54305513..598ddeb015 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -106,5 +106,9 @@ { "date": "2025-12-06", "environment": "Ubuntu" + }, + { + "date": "2025-12-07", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 2cd4c49e55..75481d1843 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-06T00:27:43.844Z", + "timestamp": "2025-12-07T00:31:50.681Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "579.9 ms", - "Error": "2.98 ms", - "StdDev": "2.78 ms", - "Median": "579.1 ms" + "Mean": "568.5 ms", + "Error": "3.15 ms", + "StdDev": "2.94 ms", + "Median": "568.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "666.7 ms", - "Error": "8.02 ms", - "StdDev": "6.70 ms", - "Median": "666.3 ms" + "Mean": "787.8 ms", + "Error": "9.56 ms", + "StdDev": "7.98 ms", + "Median": "785.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "639.7 ms", - "Error": "9.57 ms", - "StdDev": "8.95 ms", - "Median": "634.5 ms" + "Mean": "674.0 ms", + "Error": "5.85 ms", + "StdDev": "4.57 ms", + "Median": "673.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "730.4 ms", - "Error": "14.53 ms", - "StdDev": "13.59 ms", - "Median": "732.8 ms" + "Mean": "751.1 ms", + "Error": "7.14 ms", + "StdDev": "6.33 ms", + "Median": "750.7 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "124.3 ms", - "Error": "0.64 ms", - "StdDev": "0.60 ms", - "Median": "124.3 ms" + "Mean": "124.7 ms", + "Error": "0.22 ms", + "StdDev": "0.19 ms", + "Median": "124.8 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "526.18 ms", - "Error": "10.406 ms", - "StdDev": "9.733 ms", - "Median": "525.63 ms" + "Mean": "501.49 ms", + "Error": "4.743 ms", + "StdDev": "4.437 ms", + "Median": "500.65 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "686.15 ms", - "Error": "12.014 ms", - "StdDev": "11.238 ms", - "Median": "686.99 ms" + "Mean": "649.96 ms", + "Error": "6.819 ms", + "StdDev": "6.379 ms", + "Median": "648.29 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "681.30 ms", - "Error": "11.571 ms", - "StdDev": "10.257 ms", - "Median": "682.63 ms" + "Mean": "621.30 ms", + "Error": "8.824 ms", + "StdDev": "7.369 ms", + "Median": "619.30 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "686.97 ms", - "Error": "9.684 ms", - "StdDev": "8.584 ms", - "Median": "687.69 ms" + "Mean": "614.67 ms", + "Error": "7.433 ms", + "StdDev": "6.589 ms", + "Median": "612.39 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "25.63 ms", - "Error": "0.229 ms", - "StdDev": "0.203 ms", - "Median": "25.66 ms" + "Mean": "25.06 ms", + "Error": "0.397 ms", + "StdDev": "0.372 ms", + "Median": "25.16 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "608.9 ms", - "Error": "6.56 ms", - "StdDev": "5.48 ms", - "Median": "607.5 ms" + "Mean": "581.1 ms", + "Error": "5.13 ms", + "StdDev": "4.80 ms", + "Median": "580.1 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,220.5 ms", - "Error": "11.53 ms", - "StdDev": "9.63 ms", - "Median": "1,222.7 ms" + "Mean": "1,280.5 ms", + "Error": "6.64 ms", + "StdDev": "6.21 ms", + "Median": "1,281.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,006.2 ms", - "Error": "10.86 ms", - "StdDev": "10.16 ms", - "Median": "3,002.3 ms" + "Mean": "3,004.7 ms", + "Error": "6.69 ms", + "StdDev": "6.26 ms", + "Median": "3,003.7 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,087.9 ms", - "Error": "12.19 ms", - "StdDev": "11.40 ms", - "Median": "3,085.6 ms" + "Mean": "3,078.4 ms", + "Error": "17.05 ms", + "StdDev": "15.95 ms", + "Median": "3,073.8 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "132.7 ms", - "Error": "0.70 ms", - "StdDev": "0.62 ms", - "Median": "132.7 ms" + "Mean": "130.0 ms", + "Error": "0.58 ms", + "StdDev": "0.54 ms", + "Median": "129.9 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "562.41 ms", - "Error": "4.480 ms", - "StdDev": "3.971 ms", - "Median": "563.18 ms" + "Mean": "572.59 ms", + "Error": "4.948 ms", + "StdDev": "4.628 ms", + "Median": "571.95 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,574.15 ms", - "Error": "5.740 ms", - "StdDev": "5.369 ms", - "Median": "1,574.97 ms" + "Mean": "1,671.90 ms", + "Error": "14.687 ms", + "StdDev": "13.020 ms", + "Median": "1,667.50 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,534.37 ms", - "Error": "12.377 ms", - "StdDev": "10.972 ms", - "Median": "1,529.84 ms" + "Mean": "1,530.26 ms", + "Error": "10.662 ms", + "StdDev": "9.974 ms", + "Median": "1,527.81 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,618.66 ms", - "Error": "9.551 ms", - "StdDev": "8.934 ms", - "Median": "1,618.07 ms" + "Mean": "1,617.37 ms", + "Error": "8.022 ms", + "StdDev": "6.699 ms", + "Median": "1,619.54 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "80.00 ms", - "Error": "0.547 ms", - "StdDev": "0.512 ms", - "Median": "80.17 ms" + "Mean": "80.09 ms", + "Error": "0.282 ms", + "StdDev": "0.250 ms", + "Median": "80.13 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "512.28 ms", - "Error": "2.295 ms", - "StdDev": "2.035 ms", - "Median": "512.24 ms" + "Mean": "524.64 ms", + "Error": "4.312 ms", + "StdDev": "3.822 ms", + "Median": "525.21 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "587.13 ms", - "Error": "11.206 ms", - "StdDev": "10.483 ms", - "Median": "584.27 ms" + "Mean": "668.92 ms", + "Error": "10.107 ms", + "StdDev": "9.454 ms", + "Median": "668.72 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "603.13 ms", - "Error": "8.032 ms", - "StdDev": "7.120 ms", - "Median": "603.16 ms" + "Mean": "505.87 ms", + "Error": "10.049 ms", + "StdDev": "14.411 ms", + "Median": "506.54 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "594.15 ms", - "Error": "10.439 ms", - "StdDev": "8.717 ms", - "Median": "593.03 ms" + "Mean": "588.42 ms", + "Error": "11.349 ms", + "StdDev": "13.938 ms", + "Median": "585.27 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "42.78 ms", - "Error": "0.972 ms", - "StdDev": "2.821 ms", - "Median": "43.30 ms" + "Mean": "45.69 ms", + "Error": "1.251 ms", + "StdDev": "3.688 ms", + "Median": "45.54 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "571.1 ms", - "Error": "6.22 ms", - "StdDev": "5.82 ms", - "Median": "570.1 ms" + "Mean": "574.5 ms", + "Error": "7.39 ms", + "StdDev": "6.91 ms", + "Median": "572.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,138.6 ms", - "Error": "5.87 ms", - "StdDev": "5.49 ms", - "Median": "1,138.2 ms" + "Mean": "1,290.0 ms", + "Error": "14.17 ms", + "StdDev": "13.26 ms", + "Median": "1,292.3 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,112.2 ms", - "Error": "9.29 ms", - "StdDev": "8.69 ms", - "Median": "1,111.1 ms" + "Mean": "1,123.5 ms", + "Error": "9.30 ms", + "StdDev": "8.70 ms", + "Median": "1,125.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,197.6 ms", - "Error": "6.00 ms", - "StdDev": "5.01 ms", - "Median": "1,196.2 ms" + "Mean": "1,208.5 ms", + "Error": "16.50 ms", + "StdDev": "14.62 ms", + "Median": "1,208.1 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "2.098 s", - "Error": "0.0335 s", - "StdDev": "0.0329 s", - "Median": "2.091 s" + "Mean": "2.046 s", + "Error": "0.0222 s", + "StdDev": "0.0208 s", + "Median": "2.052 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.681 s", - "Error": "0.0168 s", - "StdDev": "0.0149 s", - "Median": "1.679 s" + "Mean": "1.643 s", + "Error": "0.0165 s", + "StdDev": "0.0154 s", + "Median": "1.643 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.799 s", - "Error": "0.0255 s", - "StdDev": "0.0238 s", - "Median": "1.792 s" + "Mean": "1.708 s", + "Error": "0.0145 s", + "StdDev": "0.0136 s", + "Median": "1.705 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.721 s", - "Error": "0.0252 s", - "StdDev": "0.0235 s", - "Median": "1.723 s" + "Mean": "1.621 s", + "Error": "0.0206 s", + "StdDev": "0.0193 s", + "Median": "1.618 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-06T00:27:43.841Z" + "lastUpdated": "2025-12-07T00:31:50.678Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 1caf3539f1..ea3d1c35d1 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-06", + "timestamp": "2025-12-07", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 4922be1137adf10e090885ce9a78c2c20102c527 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 7 Dec 2025 22:57:07 +0000 Subject: [PATCH 163/192] refactor: Consolidate initialisation logic (#4006) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: enhance type handling and object tracking with custom primitives and improved disposal logic * feat: improve disposal callback registration logic to handle untracked objects and enhance error handling during initialization * feat: change visibility of object graph related classes and interfaces to internal for encapsulation * feat: implement IAsyncDiscoveryInitializer and related classes for improved test discovery handling * feat: skip PlaceholderInstance during data source class resolution for improved test instance handling * fix: normalize line endings in exception message assertions for consistency * fix: normalize line endings in exception messages for consistency across tests * fix: remove premature cache removal for shared data sources The ObjectTracker.OnDisposed callback was removing shared objects from the ScopedDictionary cache when disposed, causing SharedType.PerTestSession and other shared containers to be recreated for each test instead of being reused across the session. This fixes Bug 3803 where PerTestSession containers were instantiated multiple times (once per test) instead of once for the entire session. šŸ¤– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat: enable parallel initialization of tracked objects during test execution --------- Co-authored-by: Claude Opus 4.5 --- .../AssertConditions/BecauseTests.cs | 6 +- .../Delegates/Throws.ExactlyTests.cs | 27 +- .../Delegates/Throws.ExceptionTests.cs | 6 +- .../Delegates/Throws.NothingTests.cs | 6 +- .../Delegates/Throws.OfTypeTests.cs | 18 +- .../Throws.WithInnerExceptionTests.cs | 6 +- .../Throws.WithMessageMatchingTests.cs | 6 +- .../Delegates/Throws.WithMessageTests.cs | 6 +- .../Throws.WithParameterNameTests.cs | 6 +- TUnit.Assertions.Tests/Bugs/Tests2117.cs | 14 +- .../Helpers/StringDifferenceTests.cs | 24 +- .../Old/AssertMultipleTests.cs | 34 +- .../Old/EquivalentAssertionTests.cs | 4 +- .../Old/StringRegexAssertionTests.cs | 24 +- .../ThrowInDelegateValueAssertionTests.cs | 13 +- .../Conditions/EqualsAssertion.cs | 14 +- .../Conditions/Helpers/ExpressionHelper.cs | 43 ++ .../Conditions/Helpers/ReflectionHelper.cs | 63 +++ .../Helpers/StructuralEqualityComparer.cs | 54 +- .../Conditions/Helpers/TypeHelper.cs | 84 +++ .../NotStructuralEquivalencyAssertion.cs | 39 +- .../StructuralEquivalencyAssertion.cs | 123 ++--- .../TestData/MethodDataSourceAttribute.cs | 5 +- TUnit.Core/Data/ScopedDictionary.cs | 14 +- TUnit.Core/Discovery/ObjectGraph.cs | 124 +++++ TUnit.Core/Discovery/ObjectGraphDiscoverer.cs | 516 ++++++++++++++++++ TUnit.Core/Discovery/PropertyCacheManager.cs | 116 ++++ TUnit.Core/Helpers/Counter.cs | 74 ++- TUnit.Core/Helpers/DataSourceHelpers.cs | 40 +- TUnit.Core/Helpers/Disposer.cs | 18 +- TUnit.Core/Helpers/ParallelTaskHelper.cs | 165 ++++++ .../Helpers/ReferenceEqualityComparer.cs | 35 +- TUnit.Core/Interfaces/IDisposer.cs | 16 + .../Interfaces/IInitializationCallback.cs | 33 ++ .../Interfaces/IObjectGraphDiscoverer.cs | 132 +++++ .../IObjectInitializationService.cs | 67 +++ TUnit.Core/ObjectInitializer.cs | 133 ++++- .../PropertyInitializationContext.cs | 121 ++++ .../PropertyCacheKeyGenerator.cs | 36 ++ .../PropertyInjectionPlanBuilder.cs | 129 ++++- .../PropertySetterFactory.cs | 39 +- .../Services/ObjectInitializationService.cs | 40 ++ TUnit.Core/TestBuilderContext.cs | 3 +- TUnit.Core/TestContext.cs | 26 +- TUnit.Core/Tracking/ObjectTracker.cs | 262 +++++++-- .../Tracking/TrackableObjectGraphProvider.cs | 133 +---- TUnit.Engine/Building/TestBuilder.cs | 75 +-- .../Framework/TUnitServiceProvider.cs | 6 +- .../Services/ObjectGraphDiscoveryService.cs | 185 +------ .../Services/ObjectLifecycleService.cs | 206 +++++-- TUnit.Engine/Services/PropertyInjector.cs | 108 ++-- .../Services/TestExecution/TestCoordinator.cs | 4 +- TUnit.Engine/TestExecutor.cs | 8 +- TUnit.Engine/TestInitializer.cs | 13 +- ...Has_No_API_Changes.DotNet10_0.verified.txt | 29 +- ..._Has_No_API_Changes.DotNet8_0.verified.txt | 29 +- ..._Has_No_API_Changes.DotNet9_0.verified.txt | 29 +- ...ary_Has_No_API_Changes.Net4_7.verified.txt | 29 +- .../Bugs/3992/RuntimeInitializeTests.cs | 56 ++ .../Bugs/3992/RuntimeInitializeTests2.cs | 56 ++ .../TestBuildContextOutputCaptureTests.cs | 12 +- 61 files changed, 2869 insertions(+), 873 deletions(-) create mode 100644 TUnit.Assertions/Conditions/Helpers/ExpressionHelper.cs create mode 100644 TUnit.Assertions/Conditions/Helpers/ReflectionHelper.cs create mode 100644 TUnit.Assertions/Conditions/Helpers/TypeHelper.cs create mode 100644 TUnit.Core/Discovery/ObjectGraph.cs create mode 100644 TUnit.Core/Discovery/ObjectGraphDiscoverer.cs create mode 100644 TUnit.Core/Discovery/PropertyCacheManager.cs create mode 100644 TUnit.Core/Helpers/ParallelTaskHelper.cs create mode 100644 TUnit.Core/Interfaces/IDisposer.cs create mode 100644 TUnit.Core/Interfaces/IInitializationCallback.cs create mode 100644 TUnit.Core/Interfaces/IObjectGraphDiscoverer.cs create mode 100644 TUnit.Core/Interfaces/IObjectInitializationService.cs create mode 100644 TUnit.Core/PropertyInjection/PropertyCacheKeyGenerator.cs create mode 100644 TUnit.Core/Services/ObjectInitializationService.cs create mode 100644 TUnit.TestProject/Bugs/3992/RuntimeInitializeTests.cs create mode 100644 TUnit.TestProject/Bugs/3992/RuntimeInitializeTests2.cs diff --git a/TUnit.Assertions.Tests/AssertConditions/BecauseTests.cs b/TUnit.Assertions.Tests/AssertConditions/BecauseTests.cs index 1d44b17e48..0c4c88137f 100644 --- a/TUnit.Assertions.Tests/AssertConditions/BecauseTests.cs +++ b/TUnit.Assertions.Tests/AssertConditions/BecauseTests.cs @@ -1,4 +1,4 @@ -namespace TUnit.Assertions.Tests.AssertConditions; +namespace TUnit.Assertions.Tests.AssertConditions; public class BecauseTests { @@ -68,7 +68,7 @@ at Assert.That(variable).IsFalse() }; var exception = await Assert.ThrowsAsync(action); - await Assert.That(exception.Message).IsEqualTo(expectedMessage); + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage.NormalizeLineEndings()); } [Test] @@ -91,7 +91,7 @@ await Assert.That(variable).IsTrue().Because(because) }; var exception = await Assert.ThrowsAsync(action); - await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage.NormalizeLineEndings()); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExactlyTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExactlyTests.cs index c3292ec78e..35d744499e 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExactlyTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExactlyTests.cs @@ -13,15 +13,15 @@ public async Task Fails_For_Code_With_Other_Exceptions() but threw TUnit.Assertions.Tests.Assertions.Delegates.Throws+OtherException at Assert.That(action).ThrowsExactly() - """; + """.NormalizeLineEndings(); Exception exception = CreateOtherException(); Action action = () => throw exception; var sut = async () => await Assert.That(action).ThrowsExactly(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -32,15 +32,15 @@ public async Task Fails_For_Code_With_Subtype_Exceptions() but wrong exception type: SubCustomException instead of exactly CustomException at Assert.That(action).ThrowsExactly() - """; + """.NormalizeLineEndings(); Exception exception = CreateSubCustomException(); Action action = () => throw exception; var sut = async () => await Assert.That(action).ThrowsExactly(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -51,14 +51,14 @@ public async Task Fails_For_Code_Without_Exceptions() but no exception was thrown at Assert.That(action).ThrowsExactly() - """; + """.NormalizeLineEndings(); var action = () => { }; var sut = async () => await Assert.That(action).ThrowsExactly(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -117,10 +117,11 @@ public async Task Conversion_To_Value_Assertion_Builder_On_Casted_Exception_Type await Assert.That((object)ex).IsAssignableTo(); }); - await Assert.That(assertionException).HasMessageStartingWith(""" - Expected to throw exactly Exception - but wrong exception type: CustomException instead of exactly Exception - """); + var expectedPrefix = """ + Expected to throw exactly Exception + but wrong exception type: CustomException instead of exactly Exception + """.NormalizeLineEndings(); + await Assert.That(assertionException.Message.NormalizeLineEndings()).StartsWith(expectedPrefix); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExceptionTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExceptionTests.cs index cedfa0b176..3b51f1e29e 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExceptionTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.ExceptionTests.cs @@ -14,14 +14,14 @@ public async Task Fails_For_Code_Without_Exceptions() but no exception was thrown at Assert.That(action).ThrowsException() - """; + """.NormalizeLineEndings(); var action = () => { }; var sut = async () => await Assert.That(action).ThrowsException(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.NothingTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.NothingTests.cs index 48077a848d..29fc9e7d33 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.NothingTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.NothingTests.cs @@ -12,15 +12,15 @@ public async Task Fails_For_Code_With_Exceptions() but threw TUnit.Assertions.Tests.Assertions.Delegates.Throws+CustomException: {nameof(Fails_For_Code_With_Exceptions)} at Assert.That(action).ThrowsNothing() - """; + """.NormalizeLineEndings(); Exception exception = CreateCustomException(); Action action = () => throw exception; var sut = async () => await Assert.That(action).ThrowsNothing(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.OfTypeTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.OfTypeTests.cs index a900ceaff2..ef4c853221 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.OfTypeTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.OfTypeTests.cs @@ -13,15 +13,15 @@ public async Task Fails_For_Code_With_Other_Exceptions() but threw TUnit.Assertions.Tests.Assertions.Delegates.Throws+OtherException at Assert.That(action).Throws() - """; + """.NormalizeLineEndings(); Exception exception = CreateOtherException(); Action action = () => throw exception; var sut = async () => await Assert.That(action).Throws(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -32,15 +32,15 @@ public async Task Fails_For_Code_With_Supertype_Exceptions() but threw TUnit.Assertions.Tests.Assertions.Delegates.Throws+CustomException at Assert.That(action).Throws() - """; + """.NormalizeLineEndings(); Exception exception = CreateCustomException(); Action action = () => throw exception; var sut = async () => await Assert.That(action).Throws(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -51,14 +51,14 @@ public async Task Fails_For_Code_Without_Exceptions() but no exception was thrown at Assert.That(action).Throws() - """; + """.NormalizeLineEndings(); var action = () => { }; var sut = async () => await Assert.That(action).Throws(); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithInnerExceptionTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithInnerExceptionTests.cs index 88386844cd..2b167014c5 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithInnerExceptionTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithInnerExceptionTests.cs @@ -15,7 +15,7 @@ Expected exception message to equal "bar" but exception message was "some different inner message" at Assert.That(action).ThrowsException().WithInnerException().WithMessage("bar") - """; + """.NormalizeLineEndings(); Exception exception = CreateCustomException(outerMessage, CreateCustomException("some different inner message")); Action action = () => throw exception; @@ -24,8 +24,8 @@ at Assert.That(action).ThrowsException().WithInnerException().WithMessage("bar") => await Assert.That(action).ThrowsException() .WithInnerException().WithMessage(expectedInnerMessage); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageMatchingTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageMatchingTests.cs index 8401907110..0d8e0b37ff 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageMatchingTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageMatchingTests.cs @@ -42,15 +42,15 @@ Expected exception message to match pattern "bar" but exception message "foo" does not match pattern "bar" at Assert.That(action).ThrowsExactly().WithMessageMatching("bar") - """; + """.NormalizeLineEndings(); Exception exception = CreateCustomException(message1); Action action = () => throw exception; var sut = async () => await Assert.That(action).ThrowsExactly().WithMessageMatching(message2); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageTests.cs index d444dc3372..293d109d1e 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithMessageTests.cs @@ -15,15 +15,15 @@ Expected exception message to equal "bar" but exception message was "foo" at Assert.That(action).ThrowsExactly().WithMessage("bar") - """; + """.NormalizeLineEndings(); Exception exception = CreateCustomException(message1); Action action = () => throw exception; var sut = async () => await Assert.That(action).ThrowsExactly().WithMessage(message2); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithParameterNameTests.cs b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithParameterNameTests.cs index 41c2ca56c0..70c0c658f9 100644 --- a/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithParameterNameTests.cs +++ b/TUnit.Assertions.Tests/Assertions/Delegates/Throws.WithParameterNameTests.cs @@ -15,15 +15,15 @@ public async Task Fails_For_Different_Parameter_Name() but ArgumentException parameter name was "foo" at Assert.That(action).ThrowsExactly().WithParameterName("bar") - """; + """.NormalizeLineEndings(); ArgumentException exception = new(string.Empty, paramName1); Action action = () => throw exception; var sut = async () => await Assert.That(action).ThrowsExactly().WithParameterName(paramName2); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var thrownException = await Assert.That(sut).ThrowsException(); + await Assert.That(thrownException.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] diff --git a/TUnit.Assertions.Tests/Bugs/Tests2117.cs b/TUnit.Assertions.Tests/Bugs/Tests2117.cs index df5fcad7cb..6fe04798e3 100644 --- a/TUnit.Assertions.Tests/Bugs/Tests2117.cs +++ b/TUnit.Assertions.Tests/Bugs/Tests2117.cs @@ -28,12 +28,13 @@ at Assert.That(a).IsEquivalentTo(b) """)] public async Task IsEquivalent_Fail(int[] a, int[] b, CollectionOrdering? collectionOrdering, string expectedError) { - await Assert.That(async () => + var exception = await Assert.That(async () => await (collectionOrdering is null ? Assert.That(a).IsEquivalentTo(b) : Assert.That(a).IsEquivalentTo(b, collectionOrdering.Value)) - ).Throws() - .WithMessage(expectedError); + ).Throws(); + + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedError.NormalizeLineEndings()); } [Test] @@ -60,11 +61,12 @@ at Assert.That(a).IsNotEquivalentTo(b) """)] public async Task IsNotEquivalent_Fail(int[] a, int[] b, CollectionOrdering? collectionOrdering, string expectedError) { - await Assert.That(async () => + var exception = await Assert.That(async () => await (collectionOrdering is null ? Assert.That(a).IsNotEquivalentTo(b) : Assert.That(a).IsNotEquivalentTo(b, collectionOrdering.Value)) - ).Throws() - .WithMessage(expectedError); + ).Throws(); + + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedError.NormalizeLineEndings()); } } diff --git a/TUnit.Assertions.Tests/Helpers/StringDifferenceTests.cs b/TUnit.Assertions.Tests/Helpers/StringDifferenceTests.cs index 8aee42cc8e..18d1ef01d7 100644 --- a/TUnit.Assertions.Tests/Helpers/StringDifferenceTests.cs +++ b/TUnit.Assertions.Tests/Helpers/StringDifferenceTests.cs @@ -10,15 +10,15 @@ Expected to be equal to "some text" but found "" at Assert.That(actual).IsEqualTo(expected) - """; + """.NormalizeLineEndings(); var actual = ""; var expected = "some text"; var sut = async () => await Assert.That(actual).IsEqualTo(expected); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var exception = await Assert.That(sut).ThrowsException(); + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -29,15 +29,15 @@ Expected to be equal to "" but found "actual text" at Assert.That(actual).IsEqualTo(expected) - """; + """.NormalizeLineEndings(); var actual = "actual text"; var expected = ""; var sut = async () => await Assert.That(actual).IsEqualTo(expected); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var exception = await Assert.That(sut).ThrowsException(); + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -48,15 +48,15 @@ Expected to be equal to "some text" but found "some" at Assert.That(actual).IsEqualTo(expected) - """; + """.NormalizeLineEndings(); var actual = "some"; var expected = "some text"; var sut = async () => await Assert.That(actual).IsEqualTo(expected); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var exception = await Assert.That(sut).ThrowsException(); + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } [Test] @@ -67,14 +67,14 @@ Expected to be equal to "some" but found "some text" at Assert.That(actual).IsEqualTo(expected) - """; + """.NormalizeLineEndings(); var actual = "some text"; var expected = "some"; var sut = async () => await Assert.That(actual).IsEqualTo(expected); - await Assert.That(sut).ThrowsException() - .WithMessage(expectedMessage); + var exception = await Assert.That(sut).ThrowsException(); + await Assert.That(exception.Message.NormalizeLineEndings()).IsEqualTo(expectedMessage); } } diff --git a/TUnit.Assertions.Tests/Old/AssertMultipleTests.cs b/TUnit.Assertions.Tests/Old/AssertMultipleTests.cs index a12e4a5421..8f7ff94050 100644 --- a/TUnit.Assertions.Tests/Old/AssertMultipleTests.cs +++ b/TUnit.Assertions.Tests/Old/AssertMultipleTests.cs @@ -33,35 +33,35 @@ Expected to be 2 but found 1 at Assert.That(1).IsEqualTo(2) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception2.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 3 but found 2 at Assert.That(2).IsEqualTo(3) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception3.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 4 but found 3 at Assert.That(3).IsEqualTo(4) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception4.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 5 but found 4 at Assert.That(4).IsEqualTo(5) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception5.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 6 but found 5 at Assert.That(5).IsEqualTo(6) - """); + """.NormalizeLineEndings()); } [Test] @@ -93,7 +93,7 @@ or to be 3 but found 1 at Assert.That(1).IsEqualTo(2).Or.IsEqualTo(3) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception2.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 3 @@ -101,7 +101,7 @@ and to be 4 but found 2 at Assert.That(2).IsEqualTo(3).And.IsEqualTo(4) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception3.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 4 @@ -109,7 +109,7 @@ or to be 5 but found 3 at Assert.That(3).IsEqualTo(4).Or.IsEqualTo(5) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception4.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 5 @@ -117,7 +117,7 @@ and to be 6 but found 4 at Assert.That(4).IsEqualTo(5).And.IsEqualTo(6) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(exception5.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 6 @@ -125,7 +125,7 @@ or to be 7 but found 5 at Assert.That(5).IsEqualTo(6).Or.IsEqualTo(7) - """); + """.NormalizeLineEndings()); } [Test] @@ -176,48 +176,48 @@ Expected to be 2 but found 1 at Assert.That(1).IsEqualTo(2) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(assertionException2.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 3 but found 2 at Assert.That(2).IsEqualTo(3) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(assertionException3.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 4 but found 3 at Assert.That(3).IsEqualTo(4) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(assertionException4.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 5 but found 4 at Assert.That(4).IsEqualTo(5) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(assertionException5.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 6 but found 5 at Assert.That(5).IsEqualTo(6) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(assertionException6.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 7 but found 6 at Assert.That(6).IsEqualTo(7) - """); + """.NormalizeLineEndings()); await TUnitAssert.That(assertionException7.Message.NormalizeLineEndings()).IsEqualTo(""" Expected to be 8 but found 7 at Assert.That(7).IsEqualTo(8) - """); + """.NormalizeLineEndings()); } } diff --git a/TUnit.Assertions.Tests/Old/EquivalentAssertionTests.cs b/TUnit.Assertions.Tests/Old/EquivalentAssertionTests.cs index 841660fe8d..a420ea73d1 100644 --- a/TUnit.Assertions.Tests/Old/EquivalentAssertionTests.cs +++ b/TUnit.Assertions.Tests/Old/EquivalentAssertionTests.cs @@ -136,7 +136,7 @@ await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( but collection item at index 1 does not match: expected 2, but was 5 at Assert.That(array).IsEquivalentTo(list, CollectionOrdering.Matching) - """ + """.NormalizeLineEndings() ); } @@ -155,7 +155,7 @@ await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( but collection item at index 1 does not match: expected 2, but was 5 at Assert.That(array).IsEquivalentTo(list, CollectionOrdering.Matching) - """ + """.NormalizeLineEndings() ); } diff --git a/TUnit.Assertions.Tests/Old/StringRegexAssertionTests.cs b/TUnit.Assertions.Tests/Old/StringRegexAssertionTests.cs index 3c1bffb616..98b2bcae9f 100644 --- a/TUnit.Assertions.Tests/Old/StringRegexAssertionTests.cs +++ b/TUnit.Assertions.Tests/Old/StringRegexAssertionTests.cs @@ -56,13 +56,13 @@ public async Task Matches_WithInvalidPattern_StringPattern_Throws(Type exception return; } - await TUnitAssert.That(exception!.Message).IsEqualTo( + await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( $""" Expected text match pattern but The regex "^\d+$" does not match with "{text}" at Assert.That(text).Matches(pattern) - """ + """.NormalizeLineEndings() ); } @@ -81,13 +81,13 @@ public async Task Matches_WithInvalidPattern_RegexPattern_Throws(Type exceptionT return; } - await TUnitAssert.That(exception!.Message).IsEqualTo( + await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( $""" Expected text match pattern but The regex "^\d+$" does not match with "{text}" at Assert.That(text).Matches(pattern) - """ + """.NormalizeLineEndings() ); } @@ -110,13 +110,13 @@ public async Task Matches_WithInvalidPattern_GeneratedRegexPattern_Throws(Type e return; } - await TUnitAssert.That(exception!.Message).IsEqualTo( + await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( $""" Expected text match regex but The regex "^\d+$" does not match with "Hello123World" at Assert.That(text).Matches(regex) - """ + """.NormalizeLineEndings() ); } #endif @@ -192,13 +192,13 @@ public async Task DoesNotMatch_WithInvalidPattern_StringPattern_Throws(Type exce return; } - await TUnitAssert.That(exception!.Message).IsEqualTo( + await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( $""" Expected text to not match with pattern but The regex "^\d+$" matches with "{text}" at Assert.That(text).DoesNotMatch(pattern) - """ + """.NormalizeLineEndings() ); } @@ -217,13 +217,13 @@ public async Task DoesNotMatch_WithInvalidPattern_RegexPattern_Throws(Type excep return; } - await TUnitAssert.That(exception!.Message).IsEqualTo( + await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( $""" Expected text to not match with pattern but The regex "^\d+$" matches with "{text}" at Assert.That(text).DoesNotMatch(pattern) - """ + """.NormalizeLineEndings() ); } @@ -246,13 +246,13 @@ public async Task DoesNotMatch_WithInvalidPattern_GeneratedRegexPattern_Throws(T return; } - await TUnitAssert.That(exception!.Message).IsEqualTo( + await TUnitAssert.That(exception!.Message.NormalizeLineEndings()).IsEqualTo( $""" Expected text to not match with regex but The regex "^\d+$" matches with "{text}" at Assert.That(text).DoesNotMatch(regex) - """ + """.NormalizeLineEndings() ); } #endif diff --git a/TUnit.Assertions.Tests/ThrowInDelegateValueAssertionTests.cs b/TUnit.Assertions.Tests/ThrowInDelegateValueAssertionTests.cs index 86cec759e2..c776362562 100644 --- a/TUnit.Assertions.Tests/ThrowInDelegateValueAssertionTests.cs +++ b/TUnit.Assertions.Tests/ThrowInDelegateValueAssertionTests.cs @@ -5,18 +5,19 @@ public class ThrowInDelegateValueAssertionTests [Test] public async Task ThrowInDelegateValueAssertion_ReturnsExpectedErrorMessage() { + var expectedContains = """ + Expected to be equal to True + but threw System.Exception + """.NormalizeLineEndings(); var assertion = async () => await Assert.That(() => { throw new Exception("No"); return true; }).IsEqualTo(true); - await Assert.That(assertion) - .Throws() - .WithMessageContaining(""" - Expected to be equal to True - but threw System.Exception - """); + var exception = await Assert.That(assertion) + .Throws(); + await Assert.That(exception.Message.NormalizeLineEndings()).Contains(expectedContains); } [Test] diff --git a/TUnit.Assertions/Conditions/EqualsAssertion.cs b/TUnit.Assertions/Conditions/EqualsAssertion.cs index 821a2b4e7f..350c439fad 100644 --- a/TUnit.Assertions/Conditions/EqualsAssertion.cs +++ b/TUnit.Assertions/Conditions/EqualsAssertion.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Text; using TUnit.Assertions.Attributes; +using TUnit.Assertions.Conditions.Helpers; using TUnit.Assertions.Core; namespace TUnit.Assertions.Conditions; @@ -84,7 +85,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (_ignoredTypes.Count > 0) { // Use reference-based tracking to detect cycles - var visited = new HashSet(new ReferenceEqualityComparer()); + var visited = new HashSet(ReferenceEqualityComparer.Instance); var result = DeepEquals(value, _expected, _ignoredTypes, visited); if (result.IsSuccess) { @@ -213,15 +214,4 @@ private static (bool IsSuccess, string? Message) DeepEquals(object? actual, obje } protected override string GetExpectation() => $"to be equal to {(_expected is string s ? $"\"{s}\"" : _expected)}"; - - /// - /// Comparer that uses reference equality instead of value equality. - /// Used for cycle detection in deep comparison. - /// - private sealed class ReferenceEqualityComparer : IEqualityComparer - { - public new bool Equals(object? x, object? y) => ReferenceEquals(x, y); - - public int GetHashCode(object obj) => System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj); - } } diff --git a/TUnit.Assertions/Conditions/Helpers/ExpressionHelper.cs b/TUnit.Assertions/Conditions/Helpers/ExpressionHelper.cs new file mode 100644 index 0000000000..4070c1c6a5 --- /dev/null +++ b/TUnit.Assertions/Conditions/Helpers/ExpressionHelper.cs @@ -0,0 +1,43 @@ +namespace TUnit.Assertions.Conditions.Helpers; + +/// +/// Helper methods for parsing and extracting information from assertion expressions. +/// Consolidates expression parsing logic to ensure consistent behavior across assertion classes. +/// +internal static class ExpressionHelper +{ + /// + /// Extracts the source variable name from an assertion expression string. + /// + /// The expression string, e.g., "Assert.That(variableName).IsEquivalentTo(...)" + /// The variable name, or "value" if it cannot be extracted or is a lambda expression. + /// + /// Input: "Assert.That(myObject).IsEquivalentTo(expected)" + /// Output: "myObject" + /// + /// Input: "Assert.That(async () => GetValue()).IsEquivalentTo(expected)" + /// Output: "value" + /// + public static string ExtractSourceVariable(string expression) + { + // Extract variable name from "Assert.That(variableName)" or similar + var thatIndex = expression.IndexOf(".That(", StringComparison.Ordinal); + if (thatIndex >= 0) + { + var startIndex = thatIndex + 6; // Length of ".That(" + var endIndex = expression.IndexOf(')', startIndex); + if (endIndex > startIndex) + { + var variable = expression.Substring(startIndex, endIndex - startIndex); + // Handle lambda expressions like "async () => ..." by returning "value" + if (variable.Contains("=>") || variable.StartsWith("()", StringComparison.Ordinal)) + { + return "value"; + } + return variable; + } + } + + return "value"; + } +} diff --git a/TUnit.Assertions/Conditions/Helpers/ReflectionHelper.cs b/TUnit.Assertions/Conditions/Helpers/ReflectionHelper.cs new file mode 100644 index 0000000000..c6c53162c5 --- /dev/null +++ b/TUnit.Assertions/Conditions/Helpers/ReflectionHelper.cs @@ -0,0 +1,63 @@ +using System.Diagnostics.CodeAnalysis; +using System.Reflection; + +namespace TUnit.Assertions.Conditions.Helpers; + +/// +/// Helper methods for reflection-based member access. +/// Consolidates reflection logic to ensure consistent behavior and reduce code duplication. +/// +internal static class ReflectionHelper +{ + /// + /// Gets all public instance properties and fields to compare for structural equivalency. + /// + /// The type to get members from. + /// A list of PropertyInfo and FieldInfo members. + public static List GetMembersToCompare( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields)] + Type type) + { + var members = new List(); + members.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance)); + members.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.Instance)); + return members; + } + + /// + /// Gets the value of a member (property or field) from an object. + /// + /// The object to get the value from. + /// The member (PropertyInfo or FieldInfo) to read. + /// The value of the member. + /// Thrown if the member is not a PropertyInfo or FieldInfo. + public static object? GetMemberValue(object obj, MemberInfo member) + { + return member switch + { + PropertyInfo prop => prop.GetValue(obj), + FieldInfo field => field.GetValue(obj), + _ => throw new InvalidOperationException($"Unknown member type: {member.GetType()}") + }; + } + + /// + /// Gets a member (property or field) by name from a type. + /// + /// The type to search. + /// The member name to find. + /// The MemberInfo if found; null otherwise. + public static MemberInfo? GetMemberInfo( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields)] + Type type, + string name) + { + var property = type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); + if (property != null) + { + return property; + } + + return type.GetField(name, BindingFlags.Public | BindingFlags.Instance); + } +} diff --git a/TUnit.Assertions/Conditions/Helpers/StructuralEqualityComparer.cs b/TUnit.Assertions/Conditions/Helpers/StructuralEqualityComparer.cs index af1a1876e9..13273b4a45 100644 --- a/TUnit.Assertions/Conditions/Helpers/StructuralEqualityComparer.cs +++ b/TUnit.Assertions/Conditions/Helpers/StructuralEqualityComparer.cs @@ -1,6 +1,5 @@ using System.Collections; using System.Diagnostics.CodeAnalysis; -using System.Reflection; namespace TUnit.Assertions.Conditions.Helpers; @@ -36,12 +35,12 @@ public bool Equals(T? x, T? y) var type = typeof(T); - if (IsPrimitiveType(type)) + if (TypeHelper.IsPrimitiveOrWellKnownType(type)) { return EqualityComparer.Default.Equals(x, y); } - return CompareStructurally(x, y, new HashSet(new ReferenceEqualityComparer())); + return CompareStructurally(x, y, new HashSet(ReferenceEqualityComparer.Instance)); } public int GetHashCode(T obj) @@ -54,23 +53,6 @@ public int GetHashCode(T obj) return EqualityComparer.Default.GetHashCode(obj); } - private static bool IsPrimitiveType(Type type) - { - return type.IsPrimitive - || type.IsEnum - || type == typeof(string) - || type == typeof(decimal) - || type == typeof(DateTime) - || type == typeof(DateTimeOffset) - || type == typeof(TimeSpan) - || type == typeof(Guid) -#if NET6_0_OR_GREATER - || type == typeof(DateOnly) - || type == typeof(TimeOnly) -#endif - ; - } - [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "GetType() is acceptable for runtime structural comparison")] private bool CompareStructurally(object? x, object? y, HashSet visited) { @@ -87,7 +69,7 @@ private bool CompareStructurally(object? x, object? y, HashSet visited) var xType = x.GetType(); var yType = y.GetType(); - if (IsPrimitiveType(xType)) + if (TypeHelper.IsPrimitiveOrWellKnownType(xType)) { return Equals(x, y); } @@ -121,12 +103,12 @@ private bool CompareStructurally(object? x, object? y, HashSet visited) return true; } - var members = GetMembersToCompare(xType); + var members = ReflectionHelper.GetMembersToCompare(xType); foreach (var member in members) { - var xValue = GetMemberValue(x, member); - var yValue = GetMemberValue(y, member); + var xValue = ReflectionHelper.GetMemberValue(x, member); + var yValue = ReflectionHelper.GetMemberValue(y, member); if (!CompareStructurally(xValue, yValue, visited)) { @@ -136,28 +118,4 @@ private bool CompareStructurally(object? x, object? y, HashSet visited) return true; } - - private static List GetMembersToCompare([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields)] Type type) - { - var members = new List(); - members.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance)); - members.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.Instance)); - return members; - } - - private static object? GetMemberValue(object obj, MemberInfo member) - { - return member switch - { - PropertyInfo prop => prop.GetValue(obj), - FieldInfo field => field.GetValue(obj), - _ => throw new InvalidOperationException($"Unknown member type: {member.GetType()}") - }; - } - - private sealed class ReferenceEqualityComparer : IEqualityComparer - { - public new bool Equals(object? x, object? y) => ReferenceEquals(x, y); - public int GetHashCode(object obj) => System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj); - } } diff --git a/TUnit.Assertions/Conditions/Helpers/TypeHelper.cs b/TUnit.Assertions/Conditions/Helpers/TypeHelper.cs new file mode 100644 index 0000000000..856a05d9e6 --- /dev/null +++ b/TUnit.Assertions/Conditions/Helpers/TypeHelper.cs @@ -0,0 +1,84 @@ +using System.Collections.Concurrent; + +namespace TUnit.Assertions.Conditions.Helpers; + +/// +/// Helper methods for type checking and classification. +/// Consolidates type checking logic to ensure consistent behavior across assertion classes. +/// +internal static class TypeHelper +{ + /// + /// Thread-safe registry of user-defined types that should be treated as primitives + /// (using value equality rather than structural comparison). + /// + private static readonly ConcurrentDictionary CustomPrimitiveTypes = new(); + + /// + /// Registers a type to be treated as a primitive for structural equivalency comparisons. + /// Once registered, instances of this type will use value equality (via Equals) rather + /// than having their properties compared individually. + /// + /// The type to register as a primitive. + public static void RegisterAsPrimitive() + { + CustomPrimitiveTypes.TryAdd(typeof(T), 0); + } + + /// + /// Registers a type to be treated as a primitive for structural equivalency comparisons. + /// + /// The type to register as a primitive. + public static void RegisterAsPrimitive(Type type) + { + CustomPrimitiveTypes.TryAdd(type, 0); + } + + /// + /// Removes a previously registered custom primitive type. + /// + /// The type to unregister. + /// True if the type was removed; false if it wasn't registered. + public static bool UnregisterPrimitive() + { + return CustomPrimitiveTypes.TryRemove(typeof(T), out _); + } + + /// + /// Clears all registered custom primitive types. + /// Useful for test cleanup between tests. + /// + public static void ClearCustomPrimitives() + { + CustomPrimitiveTypes.Clear(); + } + + /// + /// Determines if a type is a primitive or well-known immutable type that should use + /// value equality rather than structural comparison. + /// + /// The type to check. + /// True if the type should use value equality; false for structural comparison. + public static bool IsPrimitiveOrWellKnownType(Type type) + { + // Check user-defined primitives first (fast path for common case) + if (CustomPrimitiveTypes.ContainsKey(type)) + { + return true; + } + + return type.IsPrimitive + || type.IsEnum + || type == typeof(string) + || type == typeof(decimal) + || type == typeof(DateTime) + || type == typeof(DateTimeOffset) + || type == typeof(TimeSpan) + || type == typeof(Guid) +#if NET6_0_OR_GREATER + || type == typeof(DateOnly) + || type == typeof(TimeOnly) +#endif + ; + } +} diff --git a/TUnit.Assertions/Conditions/NotStructuralEquivalencyAssertion.cs b/TUnit.Assertions/Conditions/NotStructuralEquivalencyAssertion.cs index 4e58fd0bb6..2d8c30306a 100644 --- a/TUnit.Assertions/Conditions/NotStructuralEquivalencyAssertion.cs +++ b/TUnit.Assertions/Conditions/NotStructuralEquivalencyAssertion.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Text; +using TUnit.Assertions.Conditions.Helpers; using TUnit.Assertions.Core; namespace TUnit.Assertions.Conditions; @@ -90,7 +91,12 @@ protected override Task CheckAsync(EvaluationMetadata m foreach (var type in _ignoredTypes) tempAssertion.IgnoringType(type); - var result = tempAssertion.CompareObjects(value, _notExpected, "", new HashSet(new ReferenceEqualityComparer())); + var result = tempAssertion.CompareObjects( + value, + _notExpected, + "", + new HashSet(ReferenceEqualityComparer.Instance), + new HashSet(ReferenceEqualityComparer.Instance)); // Invert the result - we want them to NOT be equivalent if (result.IsPassed) @@ -101,43 +107,14 @@ protected override Task CheckAsync(EvaluationMetadata m return Task.FromResult(AssertionResult.Passed); } - private sealed class ReferenceEqualityComparer : IEqualityComparer - { - public new bool Equals(object? x, object? y) => ReferenceEquals(x, y); - public int GetHashCode(object obj) => System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj); - } - protected override string GetExpectation() { // Extract the source variable name from the expression builder // Format: "Assert.That(variableName).IsNotEquivalentTo(...)" var expressionString = Context.ExpressionBuilder.ToString(); - var sourceVariable = ExtractSourceVariable(expressionString); + var sourceVariable = ExpressionHelper.ExtractSourceVariable(expressionString); var notExpectedDesc = _notExpectedExpression ?? "expected value"; return $"{sourceVariable} to not be equivalent to {notExpectedDesc}"; } - - private static string ExtractSourceVariable(string expression) - { - // Extract variable name from "Assert.That(variableName)" or similar - var thatIndex = expression.IndexOf(".That("); - if (thatIndex >= 0) - { - var startIndex = thatIndex + 6; // Length of ".That(" - var endIndex = expression.IndexOf(')', startIndex); - if (endIndex > startIndex) - { - var variable = expression.Substring(startIndex, endIndex - startIndex); - // Handle lambda expressions like "async () => ..." by returning "value" - if (variable.Contains("=>") || variable.StartsWith("()")) - { - return "value"; - } - return variable; - } - } - - return "value"; - } } diff --git a/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs b/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs index 8591bf4da9..2f1086a1a7 100644 --- a/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs +++ b/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs @@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Text; +using TUnit.Assertions.Conditions.Helpers; using TUnit.Assertions.Core; namespace TUnit.Assertions.Conditions; @@ -77,11 +78,21 @@ protected override Task CheckAsync(EvaluationMetadata m return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); } - var result = CompareObjects(value, _expected, "", new HashSet(new ReferenceEqualityComparer())); + var result = CompareObjects( + value, + _expected, + "", + new HashSet(ReferenceEqualityComparer.Instance), + new HashSet(ReferenceEqualityComparer.Instance)); return Task.FromResult(result); } - internal AssertionResult CompareObjects(object? actual, object? expected, string path, HashSet visited) + internal AssertionResult CompareObjects( + object? actual, + object? expected, + string path, + HashSet visitedActual, + HashSet? visitedExpected = null) { // Check for ignored paths if (_ignoredMembers.Contains(path)) @@ -109,7 +120,7 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string var expectedType = expected.GetType(); // Handle primitive types and strings - if (IsPrimitiveType(actualType)) + if (TypeHelper.IsPrimitiveOrWellKnownType(actualType)) { if (!Equals(actual, expected)) { @@ -118,13 +129,25 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string return AssertionResult.Passed; } - // Handle cycles - if (visited.Contains(actual)) + // Handle cycles - check both actual and expected to prevent infinite recursion + // from cycles in either object graph + if (visitedActual.Contains(actual)) { return AssertionResult.Passed; } - visited.Add(actual); + visitedActual.Add(actual); + + // Also track expected objects to handle cycles in the expected graph + if (visitedExpected != null) + { + if (visitedExpected.Contains(expected)) + { + return AssertionResult.Passed; + } + + visitedExpected.Add(expected); + } // Handle enumerables if (actual is IEnumerable actualEnumerable && expected is IEnumerable expectedEnumerable @@ -156,7 +179,7 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string return AssertionResult.Failed($"{itemPath} did not match{Environment.NewLine}Expected: null{Environment.NewLine}Received: {FormatValue(actualList[i])}"); } - var result = CompareObjects(actualList[i], expectedList[i], itemPath, visited); + var result = CompareObjects(actualList[i], expectedList[i], itemPath, visitedActual, visitedExpected); if (!result.IsPassed) { return result; @@ -167,7 +190,7 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string } // Compare properties and fields - var expectedMembers = GetMembersToCompare(expectedType); + var expectedMembers = ReflectionHelper.GetMembersToCompare(expectedType); foreach (var member in expectedMembers) { @@ -178,7 +201,7 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string continue; } - var expectedValue = GetMemberValue(expected, member); + var expectedValue = ReflectionHelper.GetMemberValue(expected, member); // Check if this member's type should be ignored var memberType = member switch @@ -198,25 +221,25 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string // In partial equivalency mode, skip members that don't exist on actual if (_usePartialEquivalency) { - var actualMember = GetMemberInfo(actualType, member.Name); + var actualMember = ReflectionHelper.GetMemberInfo(actualType, member.Name); if (actualMember == null) { continue; } - actualValue = GetMemberValue(actual, actualMember); + actualValue = ReflectionHelper.GetMemberValue(actual, actualMember); } else { - var actualMember = GetMemberInfo(actualType, member.Name); + var actualMember = ReflectionHelper.GetMemberInfo(actualType, member.Name); if (actualMember == null) { return AssertionResult.Failed($"Property {memberPath} did not match{Environment.NewLine}Expected: {FormatValue(expectedValue)}{Environment.NewLine}Received: null"); } - actualValue = GetMemberValue(actual, actualMember); + actualValue = ReflectionHelper.GetMemberValue(actual, actualMember); } - var result = CompareObjects(actualValue, expectedValue, memberPath, visited); + var result = CompareObjects(actualValue, expectedValue, memberPath, visitedActual, visitedExpected); if (!result.IsPassed) { return result; @@ -226,7 +249,7 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string // In non-partial mode, check for extra properties on actual if (!_usePartialEquivalency) { - var actualMembers = GetMembersToCompare(actualType); + var actualMembers = ReflectionHelper.GetMembersToCompare(actualType); var expectedMemberNames = new HashSet(expectedMembers.Select(m => m.Name)); foreach (var member in actualMembers) @@ -247,7 +270,7 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string } var memberPath = string.IsNullOrEmpty(path) ? member.Name : $"{path}.{member.Name}"; - var actualValue = GetMemberValue(actual, member); + var actualValue = ReflectionHelper.GetMemberValue(actual, member); // Skip properties with null values - they're equivalent to not having the property if (actualValue == null) @@ -263,13 +286,6 @@ internal AssertionResult CompareObjects(object? actual, object? expected, string return AssertionResult.Passed; } - private static bool IsPrimitiveType(Type type) - { - return type.IsPrimitive || type.IsEnum || type == typeof(string) || type == typeof(decimal) - || type == typeof(DateTime) || type == typeof(DateTimeOffset) || type == typeof(TimeSpan) - || type == typeof(Guid); - } - private bool ShouldIgnoreType(Type type) { // Check if the type itself should be ignored @@ -288,36 +304,6 @@ private bool ShouldIgnoreType(Type type) return false; } - private static List GetMembersToCompare([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields)] Type type) - { - var members = new List(); - members.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance)); - members.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.Instance)); - return members; - } - - private static MemberInfo? GetMemberInfo([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields)] Type type, string name) - { - var property = type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); - if (property != null) - { - return property; - } - - var field = type.GetField(name, BindingFlags.Public | BindingFlags.Instance); - return field; - } - - private static object? GetMemberValue(object obj, MemberInfo member) - { - return member switch - { - PropertyInfo prop => prop.GetValue(obj), - FieldInfo field => field.GetValue(obj), - _ => throw new InvalidOperationException($"Unknown member type: {member.GetType()}") - }; - } - private static string FormatValue(object? value) { if (value == null) @@ -338,38 +324,9 @@ protected override string GetExpectation() // Extract the source variable name from the expression builder // Format: "Assert.That(variableName).IsEquivalentTo(...)" var expressionString = Context.ExpressionBuilder.ToString(); - var sourceVariable = ExtractSourceVariable(expressionString); + var sourceVariable = ExpressionHelper.ExtractSourceVariable(expressionString); var expectedDesc = _expectedExpression ?? "expected value"; return $"{sourceVariable} to be equivalent to {expectedDesc}"; } - - private static string ExtractSourceVariable(string expression) - { - // Extract variable name from "Assert.That(variableName)" or similar - var thatIndex = expression.IndexOf(".That("); - if (thatIndex >= 0) - { - var startIndex = thatIndex + 6; // Length of ".That(" - var endIndex = expression.IndexOf(')', startIndex); - if (endIndex > startIndex) - { - var variable = expression.Substring(startIndex, endIndex - startIndex); - // Handle lambda expressions like "async () => ..." by returning "value" - if (variable.Contains("=>") || variable.StartsWith("()")) - { - return "value"; - } - return variable; - } - } - - return "value"; - } - - private sealed class ReferenceEqualityComparer : IEqualityComparer - { - public new bool Equals(object? x, object? y) => ReferenceEquals(x, y); - public int GetHashCode(object obj) => System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj); - } } diff --git a/TUnit.Core/Attributes/TestData/MethodDataSourceAttribute.cs b/TUnit.Core/Attributes/TestData/MethodDataSourceAttribute.cs index efa53d7741..c6bd260fe0 100644 --- a/TUnit.Core/Attributes/TestData/MethodDataSourceAttribute.cs +++ b/TUnit.Core/Attributes/TestData/MethodDataSourceAttribute.cs @@ -82,7 +82,10 @@ public MethodDataSourceAttribute( // If we have a test class instance and no explicit class was provided, // use the instance's actual type (which will be the constructed generic type) - if (ClassProvidingDataSource == null && dataGeneratorMetadata.TestClassInstance != null) + // Skip PlaceholderInstance as it's used during discovery when the actual instance isn't created yet + if (ClassProvidingDataSource == null + && dataGeneratorMetadata.TestClassInstance != null + && dataGeneratorMetadata.TestClassInstance is not PlaceholderInstance) { targetType = dataGeneratorMetadata.TestClassInstance.GetType(); } diff --git a/TUnit.Core/Data/ScopedDictionary.cs b/TUnit.Core/Data/ScopedDictionary.cs index 7a751429ff..e5766792b0 100644 --- a/TUnit.Core/Data/ScopedDictionary.cs +++ b/TUnit.Core/Data/ScopedDictionary.cs @@ -1,6 +1,4 @@ -using TUnit.Core.Tracking; - -namespace TUnit.Core.Data; +namespace TUnit.Core.Data; public class ScopedDictionary where TScope : notnull @@ -11,14 +9,6 @@ public class ScopedDictionary { var innerDictionary = _scopedContainers.GetOrAdd(scope, static _ => new ThreadSafeDictionary()); - var obj = innerDictionary.GetOrAdd(type, factory); - - ObjectTracker.OnDisposed(obj, () => - { - innerDictionary.Remove(type); - }); - - return obj; + return innerDictionary.GetOrAdd(type, factory); } - } diff --git a/TUnit.Core/Discovery/ObjectGraph.cs b/TUnit.Core/Discovery/ObjectGraph.cs new file mode 100644 index 0000000000..85a1b6f960 --- /dev/null +++ b/TUnit.Core/Discovery/ObjectGraph.cs @@ -0,0 +1,124 @@ +using System.Collections.Concurrent; +using System.Collections.ObjectModel; +using TUnit.Core.Interfaces; + +namespace TUnit.Core.Discovery; + +/// +/// Represents a discovered object graph organized by depth level. +/// +/// +/// Internal collections are stored privately and exposed as read-only views +/// to prevent callers from corrupting internal state. +/// Uses Lazy<T> for thread-safe lazy initialization of read-only views. +/// +internal sealed class ObjectGraph : IObjectGraph +{ + private readonly ConcurrentDictionary> _objectsByDepth; + private readonly HashSet _allObjects; + + // Thread-safe lazy initialization of read-only views + private readonly Lazy>> _lazyReadOnlyObjectsByDepth; + private readonly Lazy> _lazyReadOnlyAllObjects; + + // Cached sorted depths (computed once in constructor) + private readonly int[] _sortedDepthsDescending; + + /// + /// Creates a new object graph from the discovered objects. + /// + /// Objects organized by depth level. + /// All unique objects in the graph. + public ObjectGraph(ConcurrentDictionary> objectsByDepth, HashSet allObjects) + { + _objectsByDepth = objectsByDepth; + _allObjects = allObjects; + + // Compute MaxDepth and sorted depths without LINQ to reduce allocations + var keyCount = objectsByDepth.Count; + if (keyCount == 0) + { + MaxDepth = -1; + _sortedDepthsDescending = []; + } + else + { + var keys = new int[keyCount]; + objectsByDepth.Keys.CopyTo(keys, 0); + + // Find max manually + var maxDepth = int.MinValue; + foreach (var key in keys) + { + if (key > maxDepth) + { + maxDepth = key; + } + } + MaxDepth = maxDepth; + + // Sort in descending order using Array.Sort with reverse comparison + Array.Sort(keys, (a, b) => b.CompareTo(a)); + _sortedDepthsDescending = keys; + } + + // Use Lazy with ExecutionAndPublication for thread-safe single initialization + _lazyReadOnlyObjectsByDepth = new Lazy>>( + CreateReadOnlyObjectsByDepth, + LazyThreadSafetyMode.ExecutionAndPublication); + + _lazyReadOnlyAllObjects = new Lazy>( + () => _allObjects.ToArray(), + LazyThreadSafetyMode.ExecutionAndPublication); + } + + /// + public IReadOnlyDictionary> ObjectsByDepth => _lazyReadOnlyObjectsByDepth.Value; + + /// + public IReadOnlyCollection AllObjects => _lazyReadOnlyAllObjects.Value; + + /// + public int MaxDepth { get; } + + /// + public IEnumerable GetObjectsAtDepth(int depth) + { + if (!_objectsByDepth.TryGetValue(depth, out var objects)) + { + return []; + } + + // Lock and copy to prevent concurrent modification issues + lock (objects) + { + return objects.ToArray(); + } + } + + /// + public IEnumerable GetDepthsDescending() + { + // Return cached sorted depths (computed once in constructor) + return _sortedDepthsDescending; + } + + /// + /// Creates a thread-safe read-only snapshot of objects by depth. + /// + private IReadOnlyDictionary> CreateReadOnlyObjectsByDepth() + { + var dict = new Dictionary>(_objectsByDepth.Count); + + foreach (var kvp in _objectsByDepth) + { + // Lock each HashSet while copying to ensure consistency + lock (kvp.Value) + { + dict[kvp.Key] = kvp.Value.ToArray(); + } + } + + return new ReadOnlyDictionary>(dict); + } +} diff --git a/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs b/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs new file mode 100644 index 0000000000..f2389fda28 --- /dev/null +++ b/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs @@ -0,0 +1,516 @@ +using System.Collections.Concurrent; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using TUnit.Core.Helpers; +using TUnit.Core.Interfaces; +using TUnit.Core.Interfaces.SourceGenerator; +using TUnit.Core.PropertyInjection; + +namespace TUnit.Core.Discovery; + +/// +/// Represents an error that occurred during object graph discovery. +/// +/// The name of the type being inspected. +/// The name of the property that failed to access. +/// The error message. +/// The exception that occurred. +internal readonly record struct DiscoveryError(string TypeName, string PropertyName, string ErrorMessage, Exception Exception); + +/// +/// Centralized service for discovering and organizing object graphs. +/// Consolidates duplicate graph traversal logic from ObjectGraphDiscoveryService and TrackableObjectGraphProvider. +/// Follows Single Responsibility Principle - only discovers objects, doesn't modify them. +/// +/// +/// +/// This class is thread-safe and uses cached reflection for performance. +/// Objects are organized by their nesting depth in the hierarchy: +/// +/// +/// Depth 0: Root objects (class args, method args, property values) +/// Depth 1+: Nested objects found in properties of objects at previous depth +/// +/// +/// Discovery errors (e.g., property access failures) are collected in +/// rather than thrown, allowing discovery to continue despite individual property failures. +/// +/// +internal sealed class ObjectGraphDiscoverer : IObjectGraphTracker +{ + /// + /// Maximum recursion depth for object graph discovery. + /// Prevents stack overflow on deep or circular object graphs. + /// + private const int MaxRecursionDepth = 50; + + // Reference equality comparer for object tracking (ignores Equals overrides) + private static readonly Helpers.ReferenceEqualityComparer ReferenceComparer = Helpers.ReferenceEqualityComparer.Instance; + + // Types to skip during discovery (primitives, strings, system types) + private static readonly HashSet SkipTypes = + [ + typeof(string), + typeof(decimal), + typeof(DateTime), + typeof(DateTimeOffset), + typeof(TimeSpan), + typeof(Guid) + ]; + + // Thread-safe collection of discovery errors for diagnostics + private static readonly ConcurrentBag DiscoveryErrors = []; + + /// + /// Gets all discovery errors that occurred during object graph traversal. + /// Useful for debugging and diagnostics when property access fails. + /// + /// A read-only list of discovery errors. + public static IReadOnlyList GetDiscoveryErrors() + { + return DiscoveryErrors.ToArray(); + } + + /// + /// Clears all recorded discovery errors. Call at end of test session. + /// + public static void ClearDiscoveryErrors() + { + DiscoveryErrors.Clear(); + } + + /// + /// Delegate for adding discovered objects to collections. + /// Returns true if the object was newly added (not a duplicate). + /// + private delegate bool TryAddObjectFunc(object obj, int depth); + + /// + /// Delegate for recursive discovery after an object is added. + /// + private delegate void RecurseFunc(object obj, int depth); + + /// + /// Delegate for processing a root object after it's been added. + /// + private delegate void RootObjectCallback(object obj); + + /// + public IObjectGraph DiscoverObjectGraph(TestContext testContext, CancellationToken cancellationToken = default) + { + var objectsByDepth = new ConcurrentDictionary>(); + var allObjects = new HashSet(ReferenceComparer); + var allObjectsLock = new object(); // Thread-safety for allObjects HashSet + var visitedObjects = new ConcurrentDictionary(ReferenceComparer); + + // Standard mode add callback (thread-safe) + bool TryAddStandard(object obj, int depth) + { + if (!visitedObjects.TryAdd(obj, 0)) + { + return false; + } + + AddToDepth(objectsByDepth, depth, obj); + lock (allObjectsLock) + { + allObjects.Add(obj); + } + + return true; + } + + // Collect root-level objects and discover nested objects + CollectRootObjects( + testContext.Metadata.TestDetails, + TryAddStandard, + obj => DiscoverNestedObjects(obj, objectsByDepth, visitedObjects, allObjects, allObjectsLock, currentDepth: 1, cancellationToken), + cancellationToken); + + return new ObjectGraph(objectsByDepth, allObjects); + } + + /// + public IObjectGraph DiscoverNestedObjectGraph(object rootObject, CancellationToken cancellationToken = default) + { + var objectsByDepth = new ConcurrentDictionary>(); + var allObjects = new HashSet(ReferenceComparer); + var allObjectsLock = new object(); // Thread-safety for allObjects HashSet + var visitedObjects = new ConcurrentDictionary(ReferenceComparer); + + if (visitedObjects.TryAdd(rootObject, 0)) + { + AddToDepth(objectsByDepth, 0, rootObject); + lock (allObjectsLock) + { + allObjects.Add(rootObject); + } + + DiscoverNestedObjects(rootObject, objectsByDepth, visitedObjects, allObjects, allObjectsLock, currentDepth: 1, cancellationToken); + } + + return new ObjectGraph(objectsByDepth, allObjects); + } + + /// + /// Discovers objects and adds them to the existing tracked objects dictionary. + /// Used by TrackableObjectGraphProvider to populate TestContext.TrackedObjects. + /// + /// The test context to discover objects from. + /// Cancellation token for the operation. + /// The tracked objects dictionary (same as testContext.TrackedObjects). + public ConcurrentDictionary> DiscoverAndTrackObjects(TestContext testContext, CancellationToken cancellationToken = default) + { + var visitedObjects = testContext.TrackedObjects; + + // Collect root-level objects and discover nested objects for tracking + CollectRootObjects( + testContext.Metadata.TestDetails, + (obj, depth) => TryAddToHashSet(visitedObjects, depth, obj), + obj => DiscoverNestedObjectsForTracking(obj, visitedObjects, 1, cancellationToken), + cancellationToken); + + return visitedObjects; + } + + /// + /// Recursively discovers nested objects that have injectable properties OR implement IAsyncInitializer. + /// Uses consolidated TraverseInjectableProperties and TraverseInitializerProperties methods. + /// + private void DiscoverNestedObjects( + object obj, + ConcurrentDictionary> objectsByDepth, + ConcurrentDictionary visitedObjects, + HashSet allObjects, + object allObjectsLock, + int currentDepth, + CancellationToken cancellationToken) + { + if (!CheckRecursionDepth(obj, currentDepth)) + { + return; + } + + cancellationToken.ThrowIfCancellationRequested(); + + // Standard mode add callback: visitedObjects + objectsByDepth + allObjects (thread-safe) + bool TryAddStandard(object value, int depth) + { + if (!visitedObjects.TryAdd(value, 0)) + { + return false; + } + + AddToDepth(objectsByDepth, depth, value); + lock (allObjectsLock) + { + allObjects.Add(value); + } + + return true; + } + + // Recursive callback + void Recurse(object value, int depth) + { + DiscoverNestedObjects(value, objectsByDepth, visitedObjects, allObjects, allObjectsLock, depth, cancellationToken); + } + + // Traverse injectable properties (useSourceRegistrarCheck = false) + TraverseInjectableProperties(obj, TryAddStandard, Recurse, currentDepth, cancellationToken, useSourceRegistrarCheck: false); + + // Also discover nested IAsyncInitializer objects from ALL properties + TraverseInitializerProperties(obj, TryAddStandard, Recurse, currentDepth, cancellationToken); + } + + /// + /// Discovers nested objects for tracking (uses HashSet pattern for compatibility with TestContext.TrackedObjects). + /// Uses consolidated TraverseInjectableProperties and TraverseInitializerProperties methods. + /// + private void DiscoverNestedObjectsForTracking( + object obj, + ConcurrentDictionary> visitedObjects, + int currentDepth, + CancellationToken cancellationToken) + { + if (!CheckRecursionDepth(obj, currentDepth)) + { + return; + } + + cancellationToken.ThrowIfCancellationRequested(); + + // Tracking mode add callback: TryAddToHashSet only + bool TryAddTracking(object value, int depth) + { + return TryAddToHashSet(visitedObjects, depth, value); + } + + // Recursive callback + void Recurse(object value, int depth) + { + DiscoverNestedObjectsForTracking(value, visitedObjects, depth, cancellationToken); + } + + // Traverse injectable properties (useSourceRegistrarCheck = true for tracking mode) + TraverseInjectableProperties(obj, TryAddTracking, Recurse, currentDepth, cancellationToken, useSourceRegistrarCheck: true); + + // Also discover nested IAsyncInitializer objects from ALL properties + TraverseInitializerProperties(obj, TryAddTracking, Recurse, currentDepth, cancellationToken); + } + + /// + /// Clears all caches. Called at end of test session to release memory. + /// + public static void ClearCache() + { + PropertyCacheManager.ClearCache(); + ClearDiscoveryErrors(); + } + + /// + /// Checks if a type should be skipped during discovery. + /// + private static bool ShouldSkipType(Type type) + { + return type.IsPrimitive || + SkipTypes.Contains(type) || + type.Namespace?.StartsWith("System") == true; + } + + /// + /// Adds an object to the specified depth level. + /// Thread-safe: uses lock to protect HashSet modifications. + /// + private static void AddToDepth(ConcurrentDictionary> objectsByDepth, int depth, object obj) + { + var hashSet = objectsByDepth.GetOrAdd(depth, _ => new HashSet(ReferenceComparer)); + lock (hashSet) + { + hashSet.Add(obj); + } + } + + /// + /// Thread-safe add to HashSet at specified depth. Returns true if added (not duplicate). + /// + private static bool TryAddToHashSet(ConcurrentDictionary> dict, int depth, object obj) + { + var hashSet = dict.GetOrAdd(depth, _ => new HashSet(ReferenceComparer)); + lock (hashSet) + { + return hashSet.Add(obj); + } + } + + #region Consolidated Traversal Methods (DRY) + + /// + /// Checks recursion depth guard. Returns false if depth exceeded (caller should return early). + /// + private static bool CheckRecursionDepth(object obj, int currentDepth) + { + if (currentDepth > MaxRecursionDepth) + { +#if DEBUG + Debug.WriteLine($"[ObjectGraphDiscoverer] Max recursion depth ({MaxRecursionDepth}) reached for type '{obj.GetType().Name}'"); +#endif + return false; + } + + return true; + } + + /// + /// Unified traversal for injectable properties (from PropertyInjectionCache). + /// Eliminates duplicate code between DiscoverNestedObjects and DiscoverNestedObjectsForTracking. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property discovery handles both AOT and reflection modes")] + private static void TraverseInjectableProperties( + object obj, + TryAddObjectFunc tryAdd, + RecurseFunc recurse, + int currentDepth, + CancellationToken cancellationToken, + bool useSourceRegistrarCheck) + { + var plan = PropertyInjectionCache.GetOrCreatePlan(obj.GetType()); + + if (!plan.HasProperties && !useSourceRegistrarCheck) + { + return; + } + + // The two modes differ in how they choose source-gen vs reflection: + // - Standard mode: Uses plan.SourceGeneratedProperties.Length > 0 + // - Tracking mode: Uses SourceRegistrar.IsEnabled + bool useSourceGen = useSourceRegistrarCheck + ? SourceRegistrar.IsEnabled + : plan.SourceGeneratedProperties.Length > 0; + + if (useSourceGen) + { + TraverseSourceGeneratedProperties(obj, plan.SourceGeneratedProperties, tryAdd, recurse, currentDepth, cancellationToken); + } + else + { + var reflectionProps = useSourceRegistrarCheck + ? plan.ReflectionProperties + : (plan.ReflectionProperties.Length > 0 ? plan.ReflectionProperties : []); + + TraverseReflectionProperties(obj, reflectionProps, tryAdd, recurse, currentDepth, cancellationToken); + } + } + + /// + /// Traverses source-generated properties and discovers nested objects. + /// Extracted for reduced complexity in TraverseInjectableProperties. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property discovery handles both AOT and reflection modes")] + private static void TraverseSourceGeneratedProperties( + object obj, + PropertyInjectionMetadata[] sourceGeneratedProperties, + TryAddObjectFunc tryAdd, + RecurseFunc recurse, + int currentDepth, + CancellationToken cancellationToken) + { + foreach (var metadata in sourceGeneratedProperties) + { + cancellationToken.ThrowIfCancellationRequested(); + var property = metadata.ContainingType.GetProperty(metadata.PropertyName); + if (property == null || !property.CanRead) + { + continue; + } + + var value = property.GetValue(obj); + if (value != null && tryAdd(value, currentDepth)) + { + recurse(value, currentDepth + 1); + } + } + } + + /// + /// Traverses reflection-based properties and discovers nested objects. + /// Extracted for reduced complexity in TraverseInjectableProperties. + /// + private static void TraverseReflectionProperties( + object obj, + (PropertyInfo Property, IDataSourceAttribute DataSource)[] reflectionProperties, + TryAddObjectFunc tryAdd, + RecurseFunc recurse, + int currentDepth, + CancellationToken cancellationToken) + { + foreach (var prop in reflectionProperties) + { + cancellationToken.ThrowIfCancellationRequested(); + var value = prop.Property.GetValue(obj); + if (value != null && tryAdd(value, currentDepth)) + { + recurse(value, currentDepth + 1); + } + } + } + + /// + /// Unified traversal for IAsyncInitializer objects (from all properties). + /// Eliminates duplicate code between DiscoverNestedInitializerObjects and DiscoverNestedInitializerObjectsForTracking. + /// + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection fallback for nested initializers. In AOT, source-gen handles primary discovery.")] + [UnconditionalSuppressMessage("Trimming", "IL2070", Justification = "Reflection fallback for nested initializers. In AOT, source-gen handles primary discovery.")] + [UnconditionalSuppressMessage("Trimming", "IL2075", Justification = "Reflection fallback for nested initializers. In AOT, source-gen handles primary discovery.")] + private static void TraverseInitializerProperties( + object obj, + TryAddObjectFunc tryAdd, + RecurseFunc recurse, + int currentDepth, + CancellationToken cancellationToken) + { + var type = obj.GetType(); + + if (ShouldSkipType(type)) + { + return; + } + + var properties = PropertyCacheManager.GetCachedProperties(type); + + foreach (var property in properties) + { + cancellationToken.ThrowIfCancellationRequested(); + try + { + var value = property.GetValue(obj); + if (value == null) + { + continue; + } + + // Only discover IAsyncInitializer objects + if (value is IAsyncInitializer && tryAdd(value, currentDepth)) + { + recurse(value, currentDepth + 1); + } + } + catch (OperationCanceledException) + { + throw; // Propagate cancellation + } + catch (Exception ex) + { + // Record error for diagnostics (available via GetDiscoveryErrors()) + DiscoveryErrors.Add(new DiscoveryError(type.Name, property.Name, ex.Message, ex)); +#if DEBUG + Debug.WriteLine($"[ObjectGraphDiscoverer] Failed to access property '{property.Name}' on type '{type.Name}': {ex.Message}"); +#endif + // Continue discovery despite property access failures + } + } + } + + /// + /// Collects root-level objects (class args, method args, properties) from test details. + /// Eliminates duplicate loops in DiscoverObjectGraph and DiscoverAndTrackObjects. + /// + private static void CollectRootObjects( + TestDetails testDetails, + TryAddObjectFunc tryAdd, + RootObjectCallback onRootObjectAdded, + CancellationToken cancellationToken) + { + // Process class arguments + ProcessRootCollection(testDetails.TestClassArguments, tryAdd, onRootObjectAdded, cancellationToken); + + // Process method arguments + ProcessRootCollection(testDetails.TestMethodArguments, tryAdd, onRootObjectAdded, cancellationToken); + + // Process injected property values + ProcessRootCollection(testDetails.TestClassInjectedPropertyArguments.Values, tryAdd, onRootObjectAdded, cancellationToken); + } + + /// + /// Processes a collection of root objects, adding them to the graph and invoking callback. + /// Extracted to eliminate duplicate iteration patterns in CollectRootObjects. + /// + private static void ProcessRootCollection( + IEnumerable collection, + TryAddObjectFunc tryAdd, + RootObjectCallback onRootObjectAdded, + CancellationToken cancellationToken) + { + foreach (var item in collection) + { + cancellationToken.ThrowIfCancellationRequested(); + if (item != null && tryAdd(item, 0)) + { + onRootObjectAdded(item); + } + } + } + + #endregion +} diff --git a/TUnit.Core/Discovery/PropertyCacheManager.cs b/TUnit.Core/Discovery/PropertyCacheManager.cs new file mode 100644 index 0000000000..12319608cc --- /dev/null +++ b/TUnit.Core/Discovery/PropertyCacheManager.cs @@ -0,0 +1,116 @@ +using System.Collections.Concurrent; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; + +namespace TUnit.Core.Discovery; + +/// +/// Manages cached property reflection results for object graph discovery. +/// Extracted from ObjectGraphDiscoverer to follow Single Responsibility Principle. +/// +/// +/// +/// This class caches arrays per type to avoid repeated reflection calls. +/// Includes automatic cache cleanup when size exceeds to prevent memory leaks. +/// +/// +/// Thread-safe: Uses and for coordination. +/// +/// +internal static class PropertyCacheManager +{ + /// + /// Maximum size for the property cache before cleanup is triggered. + /// Prevents unbounded memory growth in long-running test sessions. + /// + private const int MaxCacheSize = 10000; + + // Cache for GetProperties() results per type - eliminates repeated reflection calls + private static readonly ConcurrentDictionary PropertyCache = new(); + + // Flag to coordinate cache cleanup (prevents multiple threads cleaning simultaneously) + private static int _cleanupInProgress; + + /// + /// Gets cached properties for a type, filtering to only readable non-indexed properties. + /// Includes periodic cache cleanup to prevent unbounded memory growth. + /// + /// The type to get properties for. + /// An array of readable, non-indexed properties for the type. + [UnconditionalSuppressMessage("Trimming", "IL2070", Justification = "Reflection fallback for nested initializers. In AOT, source-gen handles primary discovery.")] + public static PropertyInfo[] GetCachedProperties(Type type) + { + // Periodic cleanup if cache grows too large to prevent memory leaks + // Use Interlocked to ensure only one thread performs cleanup at a time + if (PropertyCache.Count > MaxCacheSize && + Interlocked.CompareExchange(ref _cleanupInProgress, 1, 0) == 0) + { + try + { + // Double-check after acquiring cleanup flag + if (PropertyCache.Count > MaxCacheSize) + { + // Use ToArray() to get a true snapshot for thread-safe enumeration + // This prevents issues with concurrent modifications during iteration + var allKeys = PropertyCache.Keys.ToArray(); + var removeCount = Math.Min(allKeys.Length / 2, MaxCacheSize / 2); + + for (var i = 0; i < removeCount; i++) + { + PropertyCache.TryRemove(allKeys[i], out _); + } +#if DEBUG + Debug.WriteLine($"[PropertyCacheManager] PropertyCache exceeded {MaxCacheSize} entries, cleared {removeCount} entries"); +#endif + } + } + finally + { + Interlocked.Exchange(ref _cleanupInProgress, 0); + } + } + + return PropertyCache.GetOrAdd(type, static t => + { + // Use explicit loops instead of LINQ to avoid allocations in hot path + var allProps = t.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + + // First pass: count eligible properties + var eligibleCount = 0; + foreach (var p in allProps) + { + if (p.CanRead && p.GetIndexParameters().Length == 0) + { + eligibleCount++; + } + } + + // Second pass: fill result array + var result = new PropertyInfo[eligibleCount]; + var i = 0; + foreach (var p in allProps) + { + if (p.CanRead && p.GetIndexParameters().Length == 0) + { + result[i++] = p; + } + } + + return result; + }); + } + + /// + /// Clears the property cache. Called at end of test session to release memory. + /// + public static void ClearCache() + { + PropertyCache.Clear(); + } + + /// + /// Gets the current number of cached types. Useful for diagnostics. + /// + public static int CacheCount => PropertyCache.Count; +} diff --git a/TUnit.Core/Helpers/Counter.cs b/TUnit.Core/Helpers/Counter.cs index d3df14af6f..e4ca4b759a 100644 --- a/TUnit.Core/Helpers/Counter.cs +++ b/TUnit.Core/Helpers/Counter.cs @@ -2,6 +2,11 @@ namespace TUnit.Core.Helpers; +/// +/// Thread-safe counter with event notification. +/// Captures event handler BEFORE state change to prevent race conditions +/// where subscribers miss notifications that occur during subscription. +/// [DebuggerDisplay("Count = {CurrentCount}")] public class Counter { @@ -11,34 +16,91 @@ public class Counter public int Increment() { + // Capture handler BEFORE state change to ensure all subscribers + // at the time of the change are notified (prevents TOCTOU race) + var handler = _onCountChanged; var newCount = Interlocked.Increment(ref _count); - var handler = _onCountChanged; - handler?.Invoke(this, newCount); + RaiseEventSafely(handler, newCount); return newCount; } public int Decrement() { + // Capture handler BEFORE state change to ensure all subscribers + // at the time of the change are notified (prevents TOCTOU race) + var handler = _onCountChanged; var newCount = Interlocked.Decrement(ref _count); - var handler = _onCountChanged; - handler?.Invoke(this, newCount); + RaiseEventSafely(handler, newCount); return newCount; } + /// + /// Adds a value to the counter. Use Increment/Decrement for single-step changes. + /// + /// The value to add (can be positive or negative). + /// The new count after the addition. + /// Thrown if the resulting count is negative, indicating a logic error. public int Add(int value) { + // Capture handler BEFORE state change to ensure all subscribers + // at the time of the change are notified (prevents TOCTOU race) + var handler = _onCountChanged; var newCount = Interlocked.Add(ref _count, value); - var handler = _onCountChanged; - handler?.Invoke(this, newCount); + // Guard against reference count going negative - indicates a bug in calling code + if (newCount < 0) + { + throw new InvalidOperationException( + $"Counter went below zero (result: {newCount}). This indicates a bug in the reference counting logic."); + } + + RaiseEventSafely(handler, newCount); return newCount; } + /// + /// Raises the event safely, ensuring all subscribers are notified even if some throw exceptions. + /// Collects all exceptions and throws AggregateException if any occurred. + /// + private void RaiseEventSafely(EventHandler? handler, int newCount) + { + if (handler == null) + { + return; + } + + var invocationList = handler.GetInvocationList(); + List? exceptions = null; + + foreach (var subscriber in invocationList) + { + try + { + ((EventHandler)subscriber).Invoke(this, newCount); + } + catch (Exception ex) + { + exceptions ??= []; + exceptions.Add(ex); + +#if DEBUG + Debug.WriteLine($"[Counter] Exception in OnCountChanged subscriber: {ex.Message}"); +#endif + } + } + + // If any subscribers threw, aggregate and rethrow after all are notified + if (exceptions?.Count > 0) + { + throw new AggregateException("One or more OnCountChanged subscribers threw an exception.", exceptions); + } + } + public int CurrentCount => Interlocked.CompareExchange(ref _count, 0, 0); public event EventHandler? OnCountChanged diff --git a/TUnit.Core/Helpers/DataSourceHelpers.cs b/TUnit.Core/Helpers/DataSourceHelpers.cs index 6802e5add5..fc7ba158e6 100644 --- a/TUnit.Core/Helpers/DataSourceHelpers.cs +++ b/TUnit.Core/Helpers/DataSourceHelpers.cs @@ -178,12 +178,9 @@ public static T InvokeIfFunc(object? value) // If it's a Func, invoke it first var actualData = InvokeIfFunc(data); - // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer - // Regular IAsyncInitializer objects are initialized during test execution by ObjectLifecycleService - if (actualData is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(actualData); - } + // During discovery, only IAsyncDiscoveryInitializer objects are initialized. + // Regular IAsyncInitializer objects are deferred to Execution phase. + await ObjectInitializer.InitializeForDiscoveryAsync(actualData); return actualData; } @@ -202,11 +199,8 @@ public static T InvokeIfFunc(object? value) if (enumerator.MoveNext()) { var value = enumerator.Current; - // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer - if (value is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(value); - } + // Discovery: only IAsyncDiscoveryInitializer + await ObjectInitializer.InitializeForDiscoveryAsync(value); return value; } @@ -233,22 +227,16 @@ public static T InvokeIfFunc(object? value) if (enumerator.MoveNext()) { var value = enumerator.Current; - // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer - if (value is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(value); - } + // Discovery: only IAsyncDiscoveryInitializer + await ObjectInitializer.InitializeForDiscoveryAsync(value); return value; } return null; } - // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer - // Regular IAsyncInitializer objects are initialized during test execution by ObjectLifecycleService - if (actualData is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(actualData); - } + // During discovery, only IAsyncDiscoveryInitializer objects are initialized. + // Regular IAsyncInitializer objects are deferred to Execution phase. + await ObjectInitializer.InitializeForDiscoveryAsync(actualData); return actualData; } @@ -596,12 +584,8 @@ public static void RegisterTypeCreator(Func> { var value = args[0]; - // Only initialize during discovery if explicitly opted-in via IAsyncDiscoveryInitializer - // Regular IAsyncInitializer objects are initialized during test execution by ObjectLifecycleService - if (value is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(value); - } + // Discovery: only IAsyncDiscoveryInitializer + await ObjectInitializer.InitializeForDiscoveryAsync(value); return value; } diff --git a/TUnit.Core/Helpers/Disposer.cs b/TUnit.Core/Helpers/Disposer.cs index 772b49de07..a70033bb79 100644 --- a/TUnit.Core/Helpers/Disposer.cs +++ b/TUnit.Core/Helpers/Disposer.cs @@ -1,9 +1,18 @@ -using TUnit.Core.Logging; +using TUnit.Core.Interfaces; +using TUnit.Core.Logging; namespace TUnit.Core.Helpers; -internal class Disposer(ILogger logger) +/// +/// Disposes objects asynchronously with logging. +/// Implements IDisposer for Dependency Inversion Principle compliance. +/// +internal class Disposer(ILogger logger) : IDisposer { + /// + /// Disposes an object and propagates any exceptions. + /// Exceptions are logged but NOT swallowed - callers must handle them. + /// public async ValueTask DisposeAsync(object? obj) { try @@ -19,10 +28,15 @@ public async ValueTask DisposeAsync(object? obj) } catch (Exception e) { + // Log the error for diagnostics if (logger != null) { await logger.LogErrorAsync(e); } + + // Propagate the exception - don't silently swallow disposal failures + // Callers can catch and aggregate if disposing multiple objects + throw; } } } diff --git a/TUnit.Core/Helpers/ParallelTaskHelper.cs b/TUnit.Core/Helpers/ParallelTaskHelper.cs new file mode 100644 index 0000000000..81f05f06d4 --- /dev/null +++ b/TUnit.Core/Helpers/ParallelTaskHelper.cs @@ -0,0 +1,165 @@ +namespace TUnit.Core.Helpers; + +/// +/// Helper methods for parallel task execution without LINQ allocations. +/// Provides optimized patterns for executing async operations in parallel. +/// Exceptions are aggregated in AggregateException when multiple tasks fail. +/// +public static class ParallelTaskHelper +{ + /// + /// Executes an async action for each item in an array, in parallel. + /// Uses pre-allocated task array to avoid LINQ allocations. + /// + /// The type of items to process. + /// The array of items to process. + /// The async action to execute for each item. + /// A task that completes when all items have been processed. + public static async Task ForEachAsync(T[] items, Func action) + { + if (items.Length == 0) + { + return; + } + + var tasks = new Task[items.Length]; + for (var i = 0; i < items.Length; i++) + { + tasks[i] = action(items[i]); + } + + await Task.WhenAll(tasks); + } + + /// + /// Executes an async action for each item in an array, in parallel, with cancellation support. + /// Uses pre-allocated task array to avoid LINQ allocations. + /// + /// The type of items to process. + /// The array of items to process. + /// The async action to execute for each item. + /// Token to cancel the operation. + /// A task that completes when all items have been processed. + public static async Task ForEachAsync(T[] items, Func action, CancellationToken cancellationToken) + { + if (items.Length == 0) + { + return; + } + + cancellationToken.ThrowIfCancellationRequested(); + + var tasks = new Task[items.Length]; + for (var i = 0; i < items.Length; i++) + { + cancellationToken.ThrowIfCancellationRequested(); + tasks[i] = action(items[i], cancellationToken); + } + + await Task.WhenAll(tasks); + } + + /// + /// Executes an async action for each item in an array, in parallel, with an index. + /// Uses pre-allocated task array to avoid LINQ allocations. + /// + /// The type of items to process. + /// The array of items to process. + /// The async action to execute for each item with its index. + /// A task that completes when all items have been processed. + public static async Task ForEachWithIndexAsync(T[] items, Func action) + { + if (items.Length == 0) + { + return; + } + + var tasks = new Task[items.Length]; + for (var i = 0; i < items.Length; i++) + { + tasks[i] = action(items[i], i); + } + + await Task.WhenAll(tasks); + } + + /// + /// Executes an async action for each item in an array, in parallel, with an index and cancellation support. + /// Uses pre-allocated task array to avoid LINQ allocations. + /// + /// The type of items to process. + /// The array of items to process. + /// The async action to execute for each item with its index. + /// Token to cancel the operation. + /// A task that completes when all items have been processed. + public static async Task ForEachWithIndexAsync(T[] items, Func action, CancellationToken cancellationToken) + { + if (items.Length == 0) + { + return; + } + + cancellationToken.ThrowIfCancellationRequested(); + + var tasks = new Task[items.Length]; + for (var i = 0; i < items.Length; i++) + { + cancellationToken.ThrowIfCancellationRequested(); + tasks[i] = action(items[i], i, cancellationToken); + } + + await Task.WhenAll(tasks); + } + + /// + /// Executes an async action for each item in a list, in parallel. + /// Uses pre-allocated task array to avoid LINQ allocations. + /// + /// The type of items to process. + /// The list of items to process. + /// The async action to execute for each item. + /// A task that completes when all items have been processed. + public static async Task ForEachAsync(IReadOnlyList items, Func action) + { + if (items.Count == 0) + { + return; + } + + var tasks = new Task[items.Count]; + for (var i = 0; i < items.Count; i++) + { + tasks[i] = action(items[i]); + } + + await Task.WhenAll(tasks); + } + + /// + /// Executes an async action for each item in a list, in parallel, with cancellation support. + /// Uses pre-allocated task array to avoid LINQ allocations. + /// + /// The type of items to process. + /// The list of items to process. + /// The async action to execute for each item. + /// Token to cancel the operation. + /// A task that completes when all items have been processed. + public static async Task ForEachAsync(IReadOnlyList items, Func action, CancellationToken cancellationToken) + { + if (items.Count == 0) + { + return; + } + + cancellationToken.ThrowIfCancellationRequested(); + + var tasks = new Task[items.Count]; + for (var i = 0; i < items.Count; i++) + { + cancellationToken.ThrowIfCancellationRequested(); + tasks[i] = action(items[i], cancellationToken); + } + + await Task.WhenAll(tasks); + } +} diff --git a/TUnit.Core/Helpers/ReferenceEqualityComparer.cs b/TUnit.Core/Helpers/ReferenceEqualityComparer.cs index 2c26bfb5d1..16da75d77b 100644 --- a/TUnit.Core/Helpers/ReferenceEqualityComparer.cs +++ b/TUnit.Core/Helpers/ReferenceEqualityComparer.cs @@ -1,7 +1,34 @@ -namespace TUnit.Core.Helpers; +using System.Runtime.CompilerServices; -public class ReferenceEqualityComparer : IEqualityComparer +namespace TUnit.Core.Helpers; + +/// +/// Compares objects by reference identity, not value equality. +/// Uses RuntimeHelpers.GetHashCode to get identity-based hash codes. +/// +public sealed class ReferenceEqualityComparer : IEqualityComparer { + /// + /// Singleton instance to avoid repeated allocations. + /// + public static readonly ReferenceEqualityComparer Instance = new(); + + /// + /// Private constructor to enforce singleton pattern. + /// + private ReferenceEqualityComparer() + { + } + + /// + /// Compares two objects by reference identity. + /// + /// + /// The 'new' keyword is used because this method explicitly implements + /// IEqualityComparer<object>.Equals with nullable parameters, which + /// hides the inherited static Object.Equals(object?, object?) method. + /// This is intentional and provides the correct behavior for reference equality. + /// public new bool Equals(object? x, object? y) { return ReferenceEquals(x, y); @@ -9,6 +36,8 @@ public class ReferenceEqualityComparer : IEqualityComparer public int GetHashCode(object obj) { - return obj.GetHashCode(); + // Use RuntimeHelpers.GetHashCode for identity-based hash code + // This returns the same value as Object.GetHashCode() would if not overridden + return RuntimeHelpers.GetHashCode(obj); } } diff --git a/TUnit.Core/Interfaces/IDisposer.cs b/TUnit.Core/Interfaces/IDisposer.cs new file mode 100644 index 0000000000..039665dbae --- /dev/null +++ b/TUnit.Core/Interfaces/IDisposer.cs @@ -0,0 +1,16 @@ +namespace TUnit.Core.Interfaces; + +/// +/// Interface for disposing objects. +/// Follows Dependency Inversion Principle - high-level modules depend on this abstraction. +/// +public interface IDisposer +{ + /// + /// Disposes an object asynchronously. + /// Implementations should propagate exceptions - callers handle aggregation. + /// + /// The object to dispose. + /// A task representing the disposal operation. + ValueTask DisposeAsync(object? obj); +} diff --git a/TUnit.Core/Interfaces/IInitializationCallback.cs b/TUnit.Core/Interfaces/IInitializationCallback.cs new file mode 100644 index 0000000000..4e6449dd6e --- /dev/null +++ b/TUnit.Core/Interfaces/IInitializationCallback.cs @@ -0,0 +1,33 @@ +using System.Collections.Concurrent; + +namespace TUnit.Core.Interfaces; + +/// +/// Defines a callback interface for object initialization during property injection. +/// +/// +/// +/// This interface is used to break circular dependencies between property injection +/// and initialization services. Property injectors can call back to the initialization +/// service without directly depending on it. +/// +/// +internal interface IInitializationCallback +{ + /// + /// Ensures an object is fully initialized (property injection + IAsyncInitializer). + /// + /// The type of object to initialize. + /// The object to initialize. + /// Shared object bag for the test context. + /// Method metadata for the test. Can be null. + /// Test context events for tracking. + /// A token to monitor for cancellation requests. + /// The initialized object. + ValueTask EnsureInitializedAsync( + T obj, + ConcurrentDictionary? objectBag = null, + MethodMetadata? methodMetadata = null, + TestContextEvents? events = null, + CancellationToken cancellationToken = default) where T : notnull; +} diff --git a/TUnit.Core/Interfaces/IObjectGraphDiscoverer.cs b/TUnit.Core/Interfaces/IObjectGraphDiscoverer.cs new file mode 100644 index 0000000000..8ac4586be3 --- /dev/null +++ b/TUnit.Core/Interfaces/IObjectGraphDiscoverer.cs @@ -0,0 +1,132 @@ +using System.Collections.Concurrent; + +namespace TUnit.Core.Interfaces; + +/// +/// Defines a contract for discovering object graphs from test contexts. +/// Pure query interface - only reads and returns data, does not modify state. +/// +/// +/// +/// Object graph discovery is used to find all objects that need initialization or disposal, +/// organized by their nesting depth in the object hierarchy. +/// +/// +/// The discoverer traverses: +/// +/// Test class constructor arguments +/// Test method arguments +/// Injected property values +/// Nested objects that implement +/// +/// +/// +/// For tracking operations that modify TestContext.TrackedObjects, see . +/// +/// +internal interface IObjectGraphDiscoverer +{ + /// + /// Discovers all objects from a test context, organized by depth level. + /// + /// The test context to discover objects from. + /// Optional cancellation token for long-running discovery. + /// + /// An containing all discovered objects organized by depth. + /// Depth 0 contains root objects (arguments and property values). + /// Higher depths contain nested objects. + /// + IObjectGraph DiscoverObjectGraph(TestContext testContext, CancellationToken cancellationToken = default); + + /// + /// Discovers nested objects from a single root object, organized by depth. + /// + /// The root object to discover nested objects from. + /// Optional cancellation token for long-running discovery. + /// + /// An containing all discovered objects organized by depth. + /// Depth 0 contains the root object itself. + /// Higher depths contain nested objects. + /// + IObjectGraph DiscoverNestedObjectGraph(object rootObject, CancellationToken cancellationToken = default); + + /// + /// Discovers objects and populates the test context's tracked objects dictionary directly. + /// Used for efficient object tracking without intermediate allocations. + /// + /// The test context to discover objects from and populate. + /// Optional cancellation token for long-running discovery. + /// + /// The tracked objects dictionary (same as testContext.TrackedObjects) populated with discovered objects. + /// + /// + /// This method modifies testContext.TrackedObjects directly. For pure query operations, + /// use instead. + /// + ConcurrentDictionary> DiscoverAndTrackObjects(TestContext testContext, CancellationToken cancellationToken = default); +} + +/// +/// Marker interface for object graph tracking operations. +/// Extends with operations that modify state. +/// +/// +/// +/// This interface exists to support Interface Segregation Principle: +/// clients that only need query operations can depend on , +/// while clients that need tracking can depend on . +/// +/// +/// Currently inherits all methods from . +/// The distinction exists for semantic clarity and future extensibility. +/// +/// +internal interface IObjectGraphTracker : IObjectGraphDiscoverer +{ + // All methods inherited from IObjectGraphDiscoverer + // This interface provides semantic clarity for tracking operations +} + +/// +/// Represents a discovered object graph organized by depth level. +/// +/// +/// Collections are exposed as read-only to prevent callers from corrupting internal state. +/// Use and for safe iteration. +/// +internal interface IObjectGraph +{ + /// + /// Gets objects organized by depth (0 = root arguments, 1+ = nested). + /// + /// + /// Returns a read-only view. Use for iteration. + /// + IReadOnlyDictionary> ObjectsByDepth { get; } + + /// + /// Gets all unique objects in the graph. + /// + /// + /// Returns a read-only view to prevent modification. + /// + IReadOnlyCollection AllObjects { get; } + + /// + /// Gets the maximum nesting depth (-1 if empty). + /// + int MaxDepth { get; } + + /// + /// Gets objects at a specific depth level. + /// + /// The depth level to retrieve objects from. + /// An enumerable of objects at the specified depth, or empty if none exist. + IEnumerable GetObjectsAtDepth(int depth); + + /// + /// Gets depth levels in descending order (deepest first). + /// + /// An enumerable of depth levels ordered from deepest to shallowest. + IEnumerable GetDepthsDescending(); +} diff --git a/TUnit.Core/Interfaces/IObjectInitializationService.cs b/TUnit.Core/Interfaces/IObjectInitializationService.cs new file mode 100644 index 0000000000..6e5eb70338 --- /dev/null +++ b/TUnit.Core/Interfaces/IObjectInitializationService.cs @@ -0,0 +1,67 @@ +namespace TUnit.Core.Interfaces; + +/// +/// Defines a contract for managing object initialization with phase awareness. +/// +/// +/// +/// This service provides thread-safe, deduplicated initialization of objects that implement +/// or . +/// +/// +/// The service supports two initialization phases: +/// +/// Discovery phase: Only objects are initialized +/// Execution phase: All objects are initialized +/// +/// +/// +internal interface IObjectInitializationService +{ + /// + /// Initializes an object during the execution phase. + /// + /// The object to initialize. If null or not an , no action is taken. + /// A token to monitor for cancellation requests. + /// A representing the asynchronous operation. + /// + /// + /// This method is thread-safe and ensures that each object is initialized exactly once. + /// Multiple concurrent calls for the same object will share the same initialization task. + /// + /// + ValueTask InitializeAsync(object? obj, CancellationToken cancellationToken = default); + + /// + /// Initializes an object during the discovery phase. + /// + /// The object to initialize. If null or not an , no action is taken. + /// A token to monitor for cancellation requests. + /// A representing the asynchronous operation. + /// + /// + /// Only objects implementing are initialized during discovery. + /// Regular objects are deferred to execution phase. + /// + /// + ValueTask InitializeForDiscoveryAsync(object? obj, CancellationToken cancellationToken = default); + + /// + /// Checks if an object has been successfully initialized. + /// + /// The object to check. + /// True if the object has been initialized successfully; otherwise, false. + /// + /// Returns false if the object is null, not an , + /// has not been initialized yet, or if initialization failed. + /// + bool IsInitialized(object? obj); + + /// + /// Clears the initialization cache. + /// + /// + /// Called at the end of a test session to release resources. + /// + void ClearCache(); +} diff --git a/TUnit.Core/ObjectInitializer.cs b/TUnit.Core/ObjectInitializer.cs index 362445816e..46c52923e8 100644 --- a/TUnit.Core/ObjectInitializer.cs +++ b/TUnit.Core/ObjectInitializer.cs @@ -1,52 +1,131 @@ -using System.Runtime.CompilerServices; +using System.Collections.Concurrent; +using TUnit.Core.Helpers; using TUnit.Core.Interfaces; +using TUnit.Core.Services; namespace TUnit.Core; -public static class ObjectInitializer +/// +/// Static facade for initializing objects that implement . +/// Provides thread-safe, deduplicated initialization with explicit phase control. +/// +/// +/// +/// Use during test discovery - only objects are initialized. +/// Use during test execution - all objects are initialized. +/// +/// +/// For dependency injection scenarios, use directly. +/// +/// +internal static class ObjectInitializer { - private static readonly ConditionalWeakTable _initializationTasks = new(); - private static readonly Lock _lock = new(); + // Use Lazy pattern to ensure InitializeAsync is called exactly once per object, + // even under contention. GetOrAdd's factory can be called multiple times, but with + // Lazy + ExecutionAndPublication mode, only one initialization actually runs. + private static readonly ConcurrentDictionary> InitializationTasks = + new(Helpers.ReferenceEqualityComparer.Instance); - internal static bool IsInitialized(object? obj) + /// + /// Initializes an object during the discovery phase. + /// Only objects implementing IAsyncDiscoveryInitializer are initialized. + /// Regular IAsyncInitializer objects are skipped (deferred to execution phase). + /// Thread-safe with deduplication - safe to call multiple times. + /// + /// The object to potentially initialize. + /// Cancellation token. + internal static ValueTask InitializeForDiscoveryAsync(object? obj, CancellationToken cancellationToken = default) { - if (obj is not IAsyncInitializer) + // During discovery, only initialize IAsyncDiscoveryInitializer + if (obj is not IAsyncDiscoveryInitializer asyncDiscoveryInitializer) { - return false; + return default; } - lock (_lock) + return InitializeCoreAsync(obj, asyncDiscoveryInitializer, cancellationToken); + } + + /// + /// Initializes an object during the execution phase. + /// All objects implementing IAsyncInitializer are initialized. + /// Thread-safe with deduplication - safe to call multiple times. + /// + /// The object to potentially initialize. + /// Cancellation token. + internal static ValueTask InitializeAsync(object? obj, CancellationToken cancellationToken = default) + { + if (obj is not IAsyncInitializer asyncInitializer) { - return _initializationTasks.TryGetValue(obj, out var task) && task.IsCompleted; + return default; } + + return InitializeCoreAsync(obj, asyncInitializer, cancellationToken); } - public static async ValueTask InitializeAsync(object? obj, CancellationToken cancellationToken = default) + /// + /// Checks if an object has been successfully initialized by ObjectInitializer. + /// + /// The object to check. + /// True if the object has been initialized successfully; otherwise, false. + /// + /// Returns false if the object is null, not an , + /// has not been initialized yet, or if initialization failed. + /// + internal static bool IsInitialized(object? obj) { - if (obj is IAsyncInitializer asyncInitializer) + if (obj is not IAsyncInitializer) { - await GetInitializationTask(obj, asyncInitializer, cancellationToken); + return false; } + + // Use Status == RanToCompletion to ensure we don't return true for faulted/canceled tasks + // (IsCompletedSuccessfully is not available in netstandard2.0) + // With Lazy, we need to check if the Lazy has a value AND that value completed successfully + return InitializationTasks.TryGetValue(obj, out var lazyTask) && + lazyTask.IsValueCreated && + lazyTask.Value.Status == TaskStatus.RanToCompletion; } - private static async Task GetInitializationTask(object obj, IAsyncInitializer asyncInitializer, CancellationToken cancellationToken) + /// + /// Clears the initialization cache. + /// + /// + /// Called at the end of a test session to release resources. + /// + internal static void ClearCache() { - Task initializationTask; + InitializationTasks.Clear(); + } - lock (_lock) + private static async ValueTask InitializeCoreAsync( + object obj, + IAsyncInitializer asyncInitializer, + CancellationToken cancellationToken) + { + // Use Lazy with ExecutionAndPublication mode to ensure InitializeAsync + // is called exactly once, even under contention. GetOrAdd's factory may be + // called multiple times, but Lazy ensures only one initialization runs. + var lazyTask = InitializationTasks.GetOrAdd(obj, + _ => new Lazy( + () => asyncInitializer.InitializeAsync(), + LazyThreadSafetyMode.ExecutionAndPublication)); + + try { - if (_initializationTasks.TryGetValue(obj, out var existingTask)) - { - initializationTask = existingTask; - } - else - { - initializationTask = asyncInitializer.InitializeAsync(); - _initializationTasks.Add(obj, initializationTask); - } + // Wait for initialization with cancellation support + await lazyTask.Value.WaitAsync(cancellationToken); + } + catch (OperationCanceledException) + { + // Propagate cancellation without modification + throw; + } + catch + { + // Remove failed initialization from cache to allow retry + // This is important for transient failures that may succeed on retry + InitializationTasks.TryRemove(obj, out _); + throw; } - - // Wait for initialization with cancellation support - await initializationTask.WaitAsync(cancellationToken); } } diff --git a/TUnit.Core/PropertyInjection/Initialization/PropertyInitializationContext.cs b/TUnit.Core/PropertyInjection/Initialization/PropertyInitializationContext.cs index 12aef89941..85d4f6ae80 100644 --- a/TUnit.Core/PropertyInjection/Initialization/PropertyInitializationContext.cs +++ b/TUnit.Core/PropertyInjection/Initialization/PropertyInitializationContext.cs @@ -7,6 +7,7 @@ namespace TUnit.Core.PropertyInjection.Initialization; /// /// Encapsulates all context needed for property initialization. /// Follows Single Responsibility Principle by being a pure data container. +/// Provides factory methods to reduce duplication when creating contexts (DRY). /// internal sealed class PropertyInitializationContext { @@ -84,4 +85,124 @@ internal sealed class PropertyInitializationContext /// Parent object for nested properties. /// public object? ParentInstance { get; init; } + + #region Factory Methods (DRY) + + /// + /// Creates a context for source-generated property injection. + /// + public static PropertyInitializationContext ForSourceGenerated( + object instance, + PropertyInjectionMetadata metadata, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects, + TestContext? testContext, + bool isNestedProperty = false) + { + return new PropertyInitializationContext + { + Instance = instance, + SourceGeneratedMetadata = metadata, + PropertyName = metadata.PropertyName, + PropertyType = metadata.PropertyType, + PropertySetter = metadata.SetProperty, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = visitedObjects, + TestContext = testContext, + IsNestedProperty = isNestedProperty + }; + } + + /// + /// Creates a context for reflection-based property injection. + /// + public static PropertyInitializationContext ForReflection( + object instance, + PropertyInfo property, + IDataSourceAttribute dataSource, + Action propertySetter, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + ConcurrentDictionary visitedObjects, + TestContext? testContext, + bool isNestedProperty = false) + { + return new PropertyInitializationContext + { + Instance = instance, + PropertyInfo = property, + DataSource = dataSource, + PropertyName = property.Name, + PropertyType = property.PropertyType, + PropertySetter = propertySetter, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = visitedObjects, + TestContext = testContext, + IsNestedProperty = isNestedProperty + }; + } + + /// + /// Creates a context for caching during registration (uses placeholder instance). + /// + public static PropertyInitializationContext ForCaching( + PropertyInjectionMetadata metadata, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + return new PropertyInitializationContext + { + Instance = PlaceholderInstance.Instance, + SourceGeneratedMetadata = metadata, + PropertyName = metadata.PropertyName, + PropertyType = metadata.PropertyType, + PropertySetter = metadata.SetProperty, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = new ConcurrentDictionary(), + TestContext = testContext, + IsNestedProperty = false + }; + } + + /// + /// Creates a context for reflection caching during registration (uses placeholder instance). + /// + public static PropertyInitializationContext ForReflectionCaching( + PropertyInfo property, + IDataSourceAttribute dataSource, + Action propertySetter, + ConcurrentDictionary objectBag, + MethodMetadata? methodMetadata, + TestContextEvents events, + TestContext testContext) + { + return new PropertyInitializationContext + { + Instance = PlaceholderInstance.Instance, + PropertyInfo = property, + DataSource = dataSource, + PropertyName = property.Name, + PropertyType = property.PropertyType, + PropertySetter = propertySetter, + ObjectBag = objectBag, + MethodMetadata = methodMetadata, + Events = events, + VisitedObjects = new ConcurrentDictionary(), + TestContext = testContext, + IsNestedProperty = false + }; + } + + #endregion } \ No newline at end of file diff --git a/TUnit.Core/PropertyInjection/PropertyCacheKeyGenerator.cs b/TUnit.Core/PropertyInjection/PropertyCacheKeyGenerator.cs new file mode 100644 index 0000000000..c98abadadb --- /dev/null +++ b/TUnit.Core/PropertyInjection/PropertyCacheKeyGenerator.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using TUnit.Core.Interfaces.SourceGenerator; + +namespace TUnit.Core.PropertyInjection; + +/// +/// Generates consistent cache keys for property injection values. +/// Centralizes cache key generation to ensure consistency across the codebase (DRY principle). +/// +/// +/// Cache keys are formatted as "{DeclaringTypeName}.{PropertyName}" to uniquely identify +/// properties across different types. This format is used for storing and retrieving +/// injected property values in test contexts. +/// +public static class PropertyCacheKeyGenerator +{ + /// + /// Generates a cache key from source-generated property metadata. + /// + /// The property injection metadata from source generation. + /// A unique cache key string for the property. + public static string GetCacheKey(PropertyInjectionMetadata metadata) + { + return $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + } + + /// + /// Generates a cache key from a PropertyInfo (reflection-based properties). + /// + /// The PropertyInfo from reflection. + /// A unique cache key string for the property. + public static string GetCacheKey(PropertyInfo property) + { + return $"{property.DeclaringType!.FullName}.{property.Name}"; + } +} diff --git a/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs b/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs index c0251ce158..9c950da9c5 100644 --- a/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs +++ b/TUnit.Core/PropertyInjection/PropertyInjectionPlanBuilder.cs @@ -10,6 +10,22 @@ namespace TUnit.Core.PropertyInjection; /// internal static class PropertyInjectionPlanBuilder { + /// + /// Walks up the inheritance chain from the given type to typeof(object), + /// invoking the action for each type in the hierarchy. + /// + /// The starting type. + /// The action to invoke for each type in the inheritance chain. + private static void WalkInheritanceChain(Type type, Action action) + { + var currentType = type; + while (currentType != null && currentType != typeof(object)) + { + action(currentType); + currentType = currentType.BaseType; + } + } + /// /// Creates an injection plan for source-generated mode. /// Walks the inheritance chain to include all injectable properties from base classes. @@ -20,8 +36,7 @@ public static PropertyInjectionPlan BuildSourceGeneratedPlan(Type type) var processedProperties = new HashSet(); // Walk up the inheritance chain to find all properties with data sources - var currentType = type; - while (currentType != null && currentType != typeof(object)) + WalkInheritanceChain(type, currentType => { var propertySource = PropertySourceRegistry.GetSource(currentType); if (propertySource?.ShouldInitialize == true) @@ -35,9 +50,7 @@ public static PropertyInjectionPlan BuildSourceGeneratedPlan(Type type) } } } - - currentType = currentType.BaseType; - } + }); var sourceGenProps = allProperties.ToArray(); @@ -62,8 +75,7 @@ public static PropertyInjectionPlan BuildReflectionPlan(Type type) var processedProperties = new HashSet(); // Walk up the inheritance chain to find all properties with data source attributes - var currentType = type; - while (currentType != null && currentType != typeof(object)) + WalkInheritanceChain(type, currentType => { var properties = currentType.GetProperties( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly) @@ -87,9 +99,7 @@ public static PropertyInjectionPlan BuildReflectionPlan(Type type) } } } - - currentType = currentType.BaseType; - } + }); return new PropertyInjectionPlan { @@ -106,7 +116,7 @@ public static PropertyInjectionPlan BuildReflectionPlan(Type type) /// This handles generic types like ErrFixture<MyType> where the source generator /// couldn't register a property source for the closed generic type. /// - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Source gen mode has its own path>")] + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Source gen mode has its own path")] public static PropertyInjectionPlan Build(Type type) { if (!SourceRegistrar.IsEnabled) @@ -134,6 +144,7 @@ public static PropertyInjectionPlan Build(Type type) /// /// Represents a plan for injecting properties into an object. +/// Provides iterator methods to abstract source-gen vs reflection branching (DRY). /// internal sealed class PropertyInjectionPlan { @@ -141,4 +152,100 @@ internal sealed class PropertyInjectionPlan public required PropertyInjectionMetadata[] SourceGeneratedProperties { get; init; } public required (PropertyInfo Property, IDataSourceAttribute DataSource)[] ReflectionProperties { get; init; } public required bool HasProperties { get; init; } + + /// + /// Iterates over all properties in the plan, abstracting source-gen vs reflection. + /// Call the appropriate callback based on which mode has properties. + /// + /// Action to invoke for each source-generated property. + /// Action to invoke for each reflection property. + public void ForEachProperty( + Action onSourceGenerated, + Action<(PropertyInfo Property, IDataSourceAttribute DataSource)> onReflection) + { + if (SourceGeneratedProperties.Length > 0) + { + foreach (var metadata in SourceGeneratedProperties) + { + onSourceGenerated(metadata); + } + } + else if (ReflectionProperties.Length > 0) + { + foreach (var prop in ReflectionProperties) + { + onReflection(prop); + } + } + } + + /// + /// Iterates over all properties in the plan asynchronously. + /// + public async Task ForEachPropertyAsync( + Func onSourceGenerated, + Func<(PropertyInfo Property, IDataSourceAttribute DataSource), Task> onReflection) + { + if (SourceGeneratedProperties.Length > 0) + { + foreach (var metadata in SourceGeneratedProperties) + { + await onSourceGenerated(metadata); + } + } + else if (ReflectionProperties.Length > 0) + { + foreach (var prop in ReflectionProperties) + { + await onReflection(prop); + } + } + } + + /// + /// Executes actions for all properties in parallel. + /// + public Task ForEachPropertyParallelAsync( + Func onSourceGenerated, + Func<(PropertyInfo Property, IDataSourceAttribute DataSource), Task> onReflection) + { + if (SourceGeneratedProperties.Length > 0) + { + return Helpers.ParallelTaskHelper.ForEachAsync(SourceGeneratedProperties, onSourceGenerated); + } + else if (ReflectionProperties.Length > 0) + { + return Helpers.ParallelTaskHelper.ForEachAsync(ReflectionProperties, onReflection); + } + + return Task.CompletedTask; + } + + /// + /// Gets property values from an instance, abstracting source-gen vs reflection. + /// + public IEnumerable GetPropertyValues(object instance) + { + if (SourceGeneratedProperties.Length > 0) + { + foreach (var metadata in SourceGeneratedProperties) + { + var property = metadata.ContainingType.GetProperty(metadata.PropertyName); + if (property?.CanRead == true) + { + yield return property.GetValue(instance); + } + } + } + else if (ReflectionProperties.Length > 0) + { + foreach (var (property, _) in ReflectionProperties) + { + if (property.CanRead) + { + yield return property.GetValue(instance); + } + } + } + } } diff --git a/TUnit.Core/PropertyInjection/PropertySetterFactory.cs b/TUnit.Core/PropertyInjection/PropertySetterFactory.cs index 3d9dce651d..8bc1662cdf 100644 --- a/TUnit.Core/PropertyInjection/PropertySetterFactory.cs +++ b/TUnit.Core/PropertyInjection/PropertySetterFactory.cs @@ -1,21 +1,56 @@ -using System.Diagnostics.CodeAnalysis; +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; using System.Reflection; namespace TUnit.Core.PropertyInjection; /// -/// Factory for creating property setters. +/// Factory for creating property setters with caching for performance. /// Consolidates all property setter creation logic in one place following DRY principle. /// +/// +/// Setters are cached using the PropertyInfo as the key to avoid repeated reflection calls. +/// This significantly improves performance when the same property is accessed multiple times +/// (e.g., in test retries or shared test data scenarios). +/// internal static class PropertySetterFactory { + // Cache setters per PropertyInfo to avoid repeated reflection + private static readonly ConcurrentDictionary> SetterCache = new(); + + /// + /// Gets or creates a setter delegate for the given property. + /// Uses caching to avoid repeated reflection calls. + /// + #if NET6_0_OR_GREATER + [RequiresUnreferencedCode("Backing field access for init-only properties requires reflection")] + #endif + public static Action GetOrCreateSetter(PropertyInfo property) + { + return SetterCache.GetOrAdd(property, CreateSetterCore); + } + /// /// Creates a setter delegate for the given property. + /// Consider using for better performance through caching. /// #if NET6_0_OR_GREATER [RequiresUnreferencedCode("Backing field access for init-only properties requires reflection")] #endif public static Action CreateSetter(PropertyInfo property) + { + // Delegate to cached version for consistency + return GetOrCreateSetter(property); + } + + /// + /// Core implementation for creating a setter delegate. + /// Called by GetOrCreateSetter for caching. + /// + #if NET6_0_OR_GREATER + [RequiresUnreferencedCode("Backing field access for init-only properties requires reflection")] + #endif + private static Action CreateSetterCore(PropertyInfo property) { if (property.CanWrite && property.SetMethod != null) { diff --git a/TUnit.Core/Services/ObjectInitializationService.cs b/TUnit.Core/Services/ObjectInitializationService.cs new file mode 100644 index 0000000000..a18845001c --- /dev/null +++ b/TUnit.Core/Services/ObjectInitializationService.cs @@ -0,0 +1,40 @@ +using TUnit.Core.Interfaces; + +namespace TUnit.Core.Services; + +/// +/// Thread-safe service for initializing objects that implement . +/// Provides deduplicated initialization with explicit phase control. +/// +/// +/// +/// This service delegates to the static to ensure consistent +/// behavior and avoid duplicate caches. This consolidates initialization tracking in one place. +/// +/// +internal sealed class ObjectInitializationService : IObjectInitializationService +{ + /// + /// Creates a new instance of the initialization service. + /// + public ObjectInitializationService() + { + // No local cache needed - delegates to static ObjectInitializer + } + + /// + public ValueTask InitializeForDiscoveryAsync(object? obj, CancellationToken cancellationToken = default) + => ObjectInitializer.InitializeForDiscoveryAsync(obj, cancellationToken); + + /// + public ValueTask InitializeAsync(object? obj, CancellationToken cancellationToken = default) + => ObjectInitializer.InitializeAsync(obj, cancellationToken); + + /// + public bool IsInitialized(object? obj) + => ObjectInitializer.IsInitialized(obj); + + /// + public void ClearCache() + => ObjectInitializer.ClearCache(); +} diff --git a/TUnit.Core/TestBuilderContext.cs b/TUnit.Core/TestBuilderContext.cs index 25b20c65d4..f6ec4b0eef 100644 --- a/TUnit.Core/TestBuilderContext.cs +++ b/TUnit.Core/TestBuilderContext.cs @@ -49,7 +49,8 @@ public void RegisterForInitialization(object? obj) { Events.OnInitialize += async (sender, args) => { - await ObjectInitializer.InitializeAsync(obj); + // Discovery: only IAsyncDiscoveryInitializer + await ObjectInitializer.InitializeForDiscoveryAsync(obj); }; } diff --git a/TUnit.Core/TestContext.cs b/TUnit.Core/TestContext.cs index af1b1710d9..6ef95724de 100644 --- a/TUnit.Core/TestContext.cs +++ b/TUnit.Core/TestContext.cs @@ -49,7 +49,8 @@ public TestContext(string testName, IServiceProvider serviceProvider, ClassHookC private static readonly AsyncLocal TestContexts = new(); - internal static readonly Dictionary> InternalParametersDictionary = new(); + // Use ConcurrentDictionary for thread-safe access during parallel test discovery + internal static readonly ConcurrentDictionary> InternalParametersDictionary = new(); private StringWriter? _outputWriter; @@ -72,7 +73,21 @@ internal set public static IReadOnlyDictionary> Parameters => InternalParametersDictionary; - public static IConfiguration Configuration { get; internal set; } = null!; + private static IConfiguration? _configuration; + + /// + /// Gets the test configuration. Throws a descriptive exception if accessed before initialization. + /// + /// Thrown if Configuration is accessed before the test engine initializes it. + public static IConfiguration Configuration + { + get => _configuration ?? throw new InvalidOperationException( + "TestContext.Configuration has not been initialized. " + + "This property is only available after the TUnit test engine has started. " + + "If you are accessing this from a static constructor or field initializer, " + + "consider moving the code to a test setup method or test body instead."); + internal set => _configuration = value; + } public static string? OutputDirectory { @@ -158,8 +173,13 @@ internal override void SetAsyncLocalContext() internal AbstractExecutableTest InternalExecutableTest { get; set; } = null!; private ConcurrentDictionary>? _trackedObjects; + + /// + /// Thread-safe lazy initialization of TrackedObjects using LazyInitializer + /// to prevent race conditions when multiple threads access this property simultaneously. + /// internal ConcurrentDictionary> TrackedObjects => - _trackedObjects ??= new(); + LazyInitializer.EnsureInitialized(ref _trackedObjects)!; /// /// Sets the output captured during test building phase. diff --git a/TUnit.Core/Tracking/ObjectTracker.cs b/TUnit.Core/Tracking/ObjectTracker.cs index 8e702a6262..bb273255c5 100644 --- a/TUnit.Core/Tracking/ObjectTracker.cs +++ b/TUnit.Core/Tracking/ObjectTracker.cs @@ -7,19 +7,105 @@ namespace TUnit.Core.Tracking; /// /// Pure reference counting object tracker for disposable objects. /// Objects are disposed when their reference count reaches zero, regardless of sharing type. +/// Uses ReferenceEqualityComparer to track objects by identity, not value equality. /// +/// +/// The static s_trackedObjects dictionary is shared across all tests. +/// Call at the end of a test session to release memory. +/// internal class ObjectTracker(TrackableObjectGraphProvider trackableObjectGraphProvider, Disposer disposer) { - private static readonly ConcurrentDictionary _trackedObjects = new(); + // Use ReferenceEqualityComparer to prevent objects with custom Equals from sharing state + private static readonly ConcurrentDictionary s_trackedObjects = + new(Helpers.ReferenceEqualityComparer.Instance); + + // Lock for atomic decrement-check-dispose operations to prevent race conditions + private static readonly object s_disposalLock = new(); + + // Collects errors from async disposal callbacks for post-session review + private static readonly ConcurrentBag s_asyncCallbackErrors = new(); + + /// + /// Gets any errors that occurred during async disposal callbacks. + /// Check this at the end of a test session to surface hidden failures. + /// + public static IReadOnlyCollection GetAsyncCallbackErrors() => s_asyncCallbackErrors.ToArray(); + + /// + /// Clears all static tracking state. Call at the end of a test session to release memory. + /// + public static void ClearStaticTracking() + { + s_trackedObjects.Clear(); + s_asyncCallbackErrors.Clear(); + } + + /// + /// Gets an existing counter for the object or creates a new one. + /// Centralizes the GetOrAdd pattern to ensure consistent counter creation. + /// + private static Counter GetOrCreateCounter(object obj) => + s_trackedObjects.GetOrAdd(obj, static _ => new Counter()); + + /// + /// Flattens a ConcurrentDictionary of depth-keyed HashSets into a single HashSet. + /// Thread-safe: locks each HashSet while copying. + /// Pre-calculates capacity to avoid HashSet resizing during population. + /// + private static HashSet FlattenTrackedObjects(ConcurrentDictionary> trackedObjects) + { +#if NETSTANDARD2_0 + // .NET Standard 2.0 doesn't support HashSet capacity constructor + var result = new HashSet(Helpers.ReferenceEqualityComparer.Instance); +#else + // First pass: calculate total capacity to avoid resizing + var totalCapacity = 0; + foreach (var kvp in trackedObjects) + { + lock (kvp.Value) + { + totalCapacity += kvp.Value.Count; + } + } + + // Second pass: populate with pre-sized HashSet + var result = new HashSet(totalCapacity, Helpers.ReferenceEqualityComparer.Instance); +#endif + foreach (var kvp in trackedObjects) + { + lock (kvp.Value) + { + foreach (var obj in kvp.Value) + { + result.Add(obj); + } + } + } + + return result; + } public void TrackObjects(TestContext testContext) { - var alreadyTracked = testContext.TrackedObjects.SelectMany(x => x.Value).ToHashSet(); + // Get already tracked objects (DRY: use helper method) + var alreadyTracked = FlattenTrackedObjects(testContext.TrackedObjects); - var newTrackableObjects = trackableObjectGraphProvider.GetTrackableObjects(testContext) - .SelectMany(x => x.Value) - .Except(alreadyTracked) - .ToHashSet(); + // Get new trackable objects + var newTrackableObjects = new HashSet(Helpers.ReferenceEqualityComparer.Instance); + var trackableDict = trackableObjectGraphProvider.GetTrackableObjects(testContext); + foreach (var kvp in trackableDict) + { + lock (kvp.Value) + { + foreach (var obj in kvp.Value) + { + if (!alreadyTracked.Contains(obj)) + { + newTrackableObjects.Add(obj); + } + } + } + } foreach (var obj in newTrackableObjects) { @@ -29,9 +115,10 @@ public void TrackObjects(TestContext testContext) public async ValueTask UntrackObjects(TestContext testContext, List cleanupExceptions) { - foreach (var obj in testContext.TrackedObjects - .SelectMany(x => x.Value) - .ToHashSet()) + // Get all objects to untrack (DRY: use helper method) + var objectsToUntrack = FlattenTrackedObjects(testContext.TrackedObjects); + + foreach (var obj in objectsToUntrack) { try { @@ -70,7 +157,7 @@ private void TrackObject(object? obj) return; } - var counter = _trackedObjects.GetOrAdd(obj, static _ => new Counter()); + var counter = GetOrCreateCounter(obj); counter.Increment(); } @@ -81,20 +168,36 @@ private async ValueTask UntrackObject(object? obj) return; } - if (_trackedObjects.TryGetValue(obj, out var counter)) - { - var count = counter.Decrement(); + var shouldDispose = false; - if (count < 0) + // Use lock to make decrement-check-remove atomic and prevent race conditions + // where multiple tests could try to dispose the same object simultaneously + lock (s_disposalLock) + { + if (s_trackedObjects.TryGetValue(obj, out var counter)) { - throw new InvalidOperationException("Reference count for object went below zero. This indicates a bug in the reference counting logic."); - } + var count = counter.Decrement(); - if (count == 0) - { - await disposer.DisposeAsync(obj).ConfigureAwait(false); + if (count < 0) + { + throw new InvalidOperationException("Reference count for object went below zero. This indicates a bug in the reference counting logic."); + } + + if (count == 0) + { + // Remove from tracking dictionary to prevent memory leak + // Use TryRemove to ensure atomicity - only remove if still in dictionary + s_trackedObjects.TryRemove(obj, out _); + shouldDispose = true; + } } } + + // Dispose outside the lock to avoid blocking other untrack operations + if (shouldDispose) + { + await disposer.DisposeAsync(obj).ConfigureAwait(false); + } } /// @@ -105,37 +208,128 @@ private static bool ShouldSkipTracking(object? obj) return obj is not IDisposable and not IAsyncDisposable; } + /// + /// Registers a callback to be invoked when the object is disposed (ref count reaches 0). + /// If the object is already disposed (or was never tracked), the callback is invoked immediately. + /// The callback is guaranteed to be invoked exactly once (idempotent). + /// + /// The object to monitor for disposal. If null or not disposable, the method returns without action. + /// The callback to invoke on disposal. Must not be null. + /// Thrown when is null. public static void OnDisposed(object? o, Action action) { - if(o is not IDisposable and not IAsyncDisposable) +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(action); +#else + if (action == null) { - return; + throw new ArgumentNullException(nameof(action)); } +#endif - _trackedObjects.GetOrAdd(o, static _ => new Counter()) - .OnCountChanged += (_, count) => - { - if (count == 0) - { - action(); - } - }; + RegisterDisposalCallback(o, action, static a => a()); } + /// + /// Registers an async callback to be invoked when the object is disposed (ref count reaches 0). + /// If the object is already disposed (or was never tracked), the callback is invoked immediately. + /// The callback is guaranteed to be invoked exactly once (idempotent). + /// + /// The object to monitor for disposal. If null or not disposable, the method returns without action. + /// The async callback to invoke on disposal. Must not be null. + /// Thrown when is null. public static void OnDisposedAsync(object? o, Func asyncAction) { - if(o is not IDisposable and not IAsyncDisposable) +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(asyncAction); +#else + if (asyncAction == null) + { + throw new ArgumentNullException(nameof(asyncAction)); + } +#endif + + // Wrap async action in fire-and-forget with exception collection + RegisterDisposalCallback(o, asyncAction, static a => _ = SafeExecuteAsync(a)); + } + + /// + /// Core implementation for registering disposal callbacks. + /// Extracts common logic from OnDisposed and OnDisposedAsync (DRY principle). + /// + /// The type of action (Action or Func<Task>). + /// The object to monitor for disposal. + /// The callback action. + /// How to invoke the action (sync vs async wrapper). + private static void RegisterDisposalCallback( + object? o, + TAction action, + Action invoker) + where TAction : Delegate + { + if (o is not IDisposable and not IAsyncDisposable) { return; } - _trackedObjects.GetOrAdd(o, static _ => new Counter()) - .OnCountChanged += async (_, count) => + // Only register callback if the object is actually being tracked. + // If not tracked, invoke callback immediately (object is effectively "disposed"). + // This prevents creating spurious counters for untracked objects. + if (!s_trackedObjects.TryGetValue(o, out var counter)) { - if (count == 0) + // Object not tracked - invoke callback immediately + invoker(action); + return; + } + + // Use flag to ensure callback only fires once (idempotent) + var invoked = 0; + EventHandler? handler = null; + + handler = (sender, count) => + { + if (count == 0 && Interlocked.Exchange(ref invoked, 1) == 0) { - await asyncAction().ConfigureAwait(false); + // Remove handler to prevent memory leaks + if (sender is Counter c && handler != null) + { + c.OnCountChanged -= handler; + } + + invoker(action); } }; + + counter.OnCountChanged += handler; + + // Check if already disposed (count is 0) - invoke immediately if so + // This prevents lost callbacks when registering after disposal + // Idempotent check ensures this doesn't double-fire if event already triggered + if (counter.CurrentCount == 0 && Interlocked.Exchange(ref invoked, 1) == 0) + { + counter.OnCountChanged -= handler; + invoker(action); + } + } + + /// + /// Executes an async action safely, catching and collecting exceptions + /// for post-session review instead of silently swallowing them. + /// + private static async Task SafeExecuteAsync(Func asyncAction) + { + try + { + await asyncAction().ConfigureAwait(false); + } + catch (Exception ex) + { + // Collect error for post-session review instead of silently swallowing + s_asyncCallbackErrors.Add(ex); + +#if DEBUG + System.Diagnostics.Debug.WriteLine($"[ObjectTracker] Exception in OnDisposedAsync callback: {ex.Message}"); +#endif + } } } diff --git a/TUnit.Core/Tracking/TrackableObjectGraphProvider.cs b/TUnit.Core/Tracking/TrackableObjectGraphProvider.cs index 97301e53f8..2460406c6f 100644 --- a/TUnit.Core/Tracking/TrackableObjectGraphProvider.cs +++ b/TUnit.Core/Tracking/TrackableObjectGraphProvider.cs @@ -1,57 +1,47 @@ -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; -using TUnit.Core.PropertyInjection; +using System.Collections.Concurrent; +using TUnit.Core.Discovery; +using TUnit.Core.Interfaces; using TUnit.Core.StaticProperties; namespace TUnit.Core.Tracking; +/// +/// Provides trackable objects from test contexts for lifecycle management. +/// Delegates to for the actual discovery logic. +/// internal class TrackableObjectGraphProvider { - public ConcurrentDictionary> GetTrackableObjects(TestContext testContext) - { - var visitedObjects = testContext.TrackedObjects; - - var testDetails = testContext.Metadata.TestDetails; - - foreach (var classArgument in testDetails.TestClassArguments) - { - if (classArgument != null && visitedObjects.GetOrAdd(0, []).Add(classArgument)) - { - AddNestedTrackableObjects(classArgument, visitedObjects, 1); - } - } + private readonly IObjectGraphDiscoverer _discoverer; - foreach (var methodArgument in testDetails.TestMethodArguments) - { - if (methodArgument != null && visitedObjects.GetOrAdd(0, []).Add(methodArgument)) - { - AddNestedTrackableObjects(methodArgument, visitedObjects, 1); - } - } - - foreach (var property in testDetails.TestClassInjectedPropertyArguments.Values) - { - if (property != null && visitedObjects.GetOrAdd(0, []).Add(property)) - { - AddNestedTrackableObjects(property, visitedObjects, 1); - } - } + /// + /// Creates a new instance with the default discoverer. + /// + public TrackableObjectGraphProvider() : this(new ObjectGraphDiscoverer()) + { + } - return visitedObjects; + /// + /// Creates a new instance with a custom discoverer (for testing). + /// + public TrackableObjectGraphProvider(IObjectGraphDiscoverer discoverer) + { + _discoverer = discoverer; } - private static void AddToLevel(Dictionary> objectsByLevel, int level, object obj) + /// + /// Gets trackable objects from a test context, organized by depth level. + /// Delegates to the shared IObjectGraphDiscoverer to eliminate code duplication. + /// + /// The test context to get trackable objects from. + /// Optional cancellation token for long-running discovery. + public ConcurrentDictionary> GetTrackableObjects(TestContext testContext, CancellationToken cancellationToken = default) { - if (!objectsByLevel.TryGetValue(level, out var list)) - { - list = []; - objectsByLevel[level] = list; - } - list.Add(obj); + // OCP-compliant: Use the interface method directly instead of type-checking + return _discoverer.DiscoverAndTrackObjects(testContext, cancellationToken); } /// - /// Get trackable objects for static properties (session-level) + /// Gets trackable objects for static properties (session-level). /// public IEnumerable GetStaticPropertyTrackableObjects() { @@ -63,67 +53,4 @@ public IEnumerable GetStaticPropertyTrackableObjects() } } } - - private void AddNestedTrackableObjects(object obj, ConcurrentDictionary> visitedObjects, int currentDepth) - { - var plan = PropertyInjectionCache.GetOrCreatePlan(obj.GetType()); - - if(!SourceRegistrar.IsEnabled) - { - foreach (var prop in plan.ReflectionProperties) - { - var value = prop.Property.GetValue(obj); - - if (value == null) - { - continue; - } - - // Check if already visited before yielding to prevent duplicates - if (!visitedObjects.GetOrAdd(currentDepth, []).Add(value)) - { - continue; - } - - if (!PropertyInjectionCache.HasInjectableProperties(value.GetType())) - { - continue; - } - - AddNestedTrackableObjects(value, visitedObjects, currentDepth + 1); - } - } - else - { - foreach (var metadata in plan.SourceGeneratedProperties) - { - var property = metadata.ContainingType.GetProperty(metadata.PropertyName); - - if (property == null || !property.CanRead) - { - continue; - } - - var value = property.GetValue(obj); - - if (value == null) - { - continue; - } - - // Check if already visited before yielding to prevent duplicates - if (!visitedObjects.GetOrAdd(currentDepth, []).Add(value)) - { - continue; - } - - if (!PropertyInjectionCache.HasInjectableProperties(value.GetType())) - { - continue; - } - - AddNestedTrackableObjects(value, visitedObjects, currentDepth + 1); - } - } - } } diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index 30dc1bcb7e..a8ebc2afbc 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -45,9 +45,11 @@ public TestBuilder( } /// - /// Initializes any IAsyncInitializer objects in class data that were deferred during registration. + /// Initializes class data objects during test building. + /// Only IAsyncDiscoveryInitializer objects are initialized during discovery. + /// Regular IAsyncInitializer objects are deferred to execution phase. /// - private async Task InitializeDeferredClassDataAsync(object?[] classData) + private static async Task InitializeClassDataAsync(object?[] classData) { if (classData == null || classData.Length == 0) { @@ -56,44 +58,16 @@ private async Task InitializeDeferredClassDataAsync(object?[] classData) foreach (var data in classData) { - if (data is IAsyncInitializer asyncInitializer && data is not IDataSourceAttribute) - { - if (!ObjectInitializer.IsInitialized(data)) - { - await ObjectInitializer.InitializeAsync(data); - } - } - } - } - - /// - /// Initializes any IAsyncDiscoveryInitializer objects in class data during test discovery. - /// This is called BEFORE method data sources are evaluated, enabling data sources - /// to access initialized shared objects (like Docker containers). - /// - private static async Task InitializeDiscoveryObjectsAsync(object?[] classData) - { - if (classData == null || classData.Length == 0) - { - return; - } - - foreach (var data in classData) - { - if (data is IAsyncDiscoveryInitializer) - { - // Uses ObjectInitializer which handles deduplication. - // This also prevents double-init during execution since ObjectInitializer - // tracks initialized objects. - await ObjectInitializer.InitializeAsync(data); - } + // Discovery: only IAsyncDiscoveryInitializer objects are initialized. + // Regular IAsyncInitializer objects are deferred to execution phase. + await ObjectInitializer.InitializeForDiscoveryAsync(data); } } private async Task CreateInstance(TestMetadata metadata, Type[] resolvedClassGenericArgs, object?[] classData, TestBuilderContext builderContext) { // Initialize any deferred IAsyncInitializer objects in class data - await InitializeDeferredClassDataAsync(classData); + await InitializeClassDataAsync(classData); // First try to create instance with ClassConstructor attribute // Use attributes from context if available @@ -230,9 +204,9 @@ public async Task> BuildTestsFromMetadataAsy var classDataResult = await classDataFactory() ?? []; var classData = DataUnwrapper.Unwrap(classDataResult); - // Initialize IAsyncDiscoveryInitializer objects before method data sources are evaluated. - // This enables InstanceMethodDataSource to access initialized shared objects. - await InitializeDiscoveryObjectsAsync(classData); + // Initialize objects before method data sources are evaluated. + // ObjectInitializer is phase-aware and will only initialize IAsyncDiscoveryInitializer during Discovery. + await InitializeClassDataAsync(classData); var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData); @@ -294,11 +268,8 @@ await _objectLifecycleService.RegisterObjectAsync( metadata.MethodMetadata, tempEvents); - // Initialize the test class instance if it implements IAsyncDiscoveryInitializer - if (instanceForMethodDataSources is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(instanceForMethodDataSources); - } + // Discovery: only IAsyncDiscoveryInitializer is initialized + await ObjectInitializer.InitializeForDiscoveryAsync(instanceForMethodDataSources); } } catch (Exception ex) @@ -347,8 +318,8 @@ await _objectLifecycleService.RegisterObjectAsync( classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); var methodData = DataUnwrapper.UnwrapWithTypes(await methodDataFactory() ?? [], metadata.MethodMetadata.Parameters); - // Initialize any IAsyncDiscoveryInitializer objects in method data - await InitializeDiscoveryObjectsAsync(methodData); + // Initialize method data objects (ObjectInitializer is phase-aware) + await InitializeClassDataAsync(methodData); // For concrete generic instantiations, check if the data is compatible with the expected types if (metadata.GenericMethodTypeArguments is { Length: > 0 }) @@ -1423,9 +1394,8 @@ public async IAsyncEnumerable BuildTestsStreamingAsync( var classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); - // Initialize IAsyncDiscoveryInitializer objects before method data sources are evaluated. - // This enables InstanceMethodDataSource to access initialized shared objects. - await InitializeDiscoveryObjectsAsync(classData); + // Initialize objects before method data sources are evaluated (ObjectInitializer is phase-aware) + await InitializeClassDataAsync(classData); // Handle instance creation for method data sources var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData); @@ -1452,11 +1422,8 @@ await _objectLifecycleService.RegisterObjectAsync( metadata.MethodMetadata, tempEvents); - // Initialize the test class instance if it implements IAsyncDiscoveryInitializer - if (instanceForMethodDataSources is IAsyncDiscoveryInitializer) - { - await ObjectInitializer.InitializeAsync(instanceForMethodDataSources); - } + // Discovery: only IAsyncDiscoveryInitializer is initialized + await ObjectInitializer.InitializeForDiscoveryAsync(instanceForMethodDataSources); } // Stream through method data sources @@ -1567,8 +1534,8 @@ await _objectLifecycleService.RegisterObjectAsync( var methodData = DataUnwrapper.UnwrapWithTypes(await methodDataFactory() ?? [], metadata.MethodMetadata.Parameters); - // Initialize any IAsyncDiscoveryInitializer objects in method data - await InitializeDiscoveryObjectsAsync(methodData); + // Initialize method data objects (ObjectInitializer is phase-aware) + await InitializeClassDataAsync(methodData); // Check data compatibility for generic methods if (metadata.GenericMethodTypeArguments is { Length: > 0 }) diff --git a/TUnit.Engine/Framework/TUnitServiceProvider.cs b/TUnit.Engine/Framework/TUnitServiceProvider.cs index f64d64d004..9a31e5eb99 100644 --- a/TUnit.Engine/Framework/TUnitServiceProvider.cs +++ b/TUnit.Engine/Framework/TUnitServiceProvider.cs @@ -114,9 +114,11 @@ public TUnitServiceProvider(IExtension extension, var objectTracker = new ObjectTracker(trackableObjectGraphProvider, disposer); // Use Lazy to break circular dependency between PropertyInjector and ObjectLifecycleService + // PropertyInjector now depends on IInitializationCallback interface (implemented by ObjectLifecycleService) + // This follows Dependency Inversion Principle and improves testability ObjectLifecycleService? objectLifecycleServiceInstance = null; - var lazyObjectLifecycleService = new Lazy(() => objectLifecycleServiceInstance!); - var lazyPropertyInjector = new Lazy(() => new PropertyInjector(lazyObjectLifecycleService, TestSessionId)); + var lazyInitializationCallback = new Lazy(() => objectLifecycleServiceInstance!); + var lazyPropertyInjector = new Lazy(() => new PropertyInjector(lazyInitializationCallback, TestSessionId)); objectLifecycleServiceInstance = new ObjectLifecycleService(lazyPropertyInjector, objectGraphDiscoveryService, objectTracker); ObjectLifecycleService = Register(objectLifecycleServiceInstance); diff --git a/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs b/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs index 8d5e46f7f9..1a0636f605 100644 --- a/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs +++ b/TUnit.Engine/Services/ObjectGraphDiscoveryService.cs @@ -1,198 +1,45 @@ -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; using TUnit.Core; -using TUnit.Core.PropertyInjection; +using TUnit.Core.Discovery; +using TUnit.Core.Interfaces; namespace TUnit.Engine.Services; /// -/// Centralized service for discovering and organizing object graphs. -/// Eliminates duplicate graph traversal logic that was scattered across -/// PropertyInjectionService, DataSourceInitializer, and TrackableObjectGraphProvider. -/// Follows Single Responsibility Principle - only discovers objects, doesn't modify them. +/// Service for discovering and organizing object graphs in TUnit.Engine. +/// Delegates to in TUnit.Core for the actual discovery logic. /// internal sealed class ObjectGraphDiscoveryService { - /// - /// Discovers all objects from test context arguments and properties, organized by depth level. - /// Depth 0 = root objects (class args, method args, property values) - /// Depth 1+ = nested objects found in properties of objects at previous depth - /// - public ObjectGraph DiscoverObjectGraph(TestContext testContext) - { - var objectsByDepth = new ConcurrentDictionary>(); - var allObjects = new HashSet(); - var visitedObjects = new HashSet(); - - var testDetails = testContext.Metadata.TestDetails; - - // Collect root-level objects (depth 0) - foreach (var classArgument in testDetails.TestClassArguments) - { - if (classArgument != null && visitedObjects.Add(classArgument)) - { - AddToDepth(objectsByDepth, 0, classArgument); - allObjects.Add(classArgument); - DiscoverNestedObjects(classArgument, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); - } - } - - foreach (var methodArgument in testDetails.TestMethodArguments) - { - if (methodArgument != null && visitedObjects.Add(methodArgument)) - { - AddToDepth(objectsByDepth, 0, methodArgument); - allObjects.Add(methodArgument); - DiscoverNestedObjects(methodArgument, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); - } - } - - foreach (var property in testDetails.TestClassInjectedPropertyArguments.Values) - { - if (property != null && visitedObjects.Add(property)) - { - AddToDepth(objectsByDepth, 0, property); - allObjects.Add(property); - DiscoverNestedObjects(property, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); - } - } - - return new ObjectGraph(objectsByDepth, allObjects); - } + private readonly IObjectGraphDiscoverer _discoverer; /// - /// Discovers nested objects from a single root object, organized by depth. - /// Used for discovering objects within a data source or property value. + /// Creates a new instance with the default discoverer. /// - public ObjectGraph DiscoverNestedObjectGraph(object rootObject) + public ObjectGraphDiscoveryService() : this(new ObjectGraphDiscoverer()) { - var objectsByDepth = new ConcurrentDictionary>(); - var allObjects = new HashSet(); - var visitedObjects = new HashSet(); - - if (visitedObjects.Add(rootObject)) - { - AddToDepth(objectsByDepth, 0, rootObject); - allObjects.Add(rootObject); - DiscoverNestedObjects(rootObject, objectsByDepth, visitedObjects, allObjects, currentDepth: 1); - } - - return new ObjectGraph(objectsByDepth, allObjects); } /// - /// Recursively discovers nested objects that have injectable properties. + /// Creates a new instance with a custom discoverer (for testing). /// - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Property discovery handles both AOT and reflection modes")] - private void DiscoverNestedObjects( - object obj, - ConcurrentDictionary> objectsByDepth, - HashSet visitedObjects, - HashSet allObjects, - int currentDepth) + public ObjectGraphDiscoveryService(IObjectGraphDiscoverer discoverer) { - var plan = PropertyInjectionCache.GetOrCreatePlan(obj.GetType()); - - if (!plan.HasProperties) - { - return; - } - - // Use source-generated properties if available, otherwise fall back to reflection - if (plan.SourceGeneratedProperties.Length > 0) - { - foreach (var metadata in plan.SourceGeneratedProperties) - { - var property = metadata.ContainingType.GetProperty(metadata.PropertyName); - if (property == null || !property.CanRead) - { - continue; - } - - var value = property.GetValue(obj); - if (value == null || !visitedObjects.Add(value)) - { - continue; - } - - AddToDepth(objectsByDepth, currentDepth, value); - allObjects.Add(value); - - // Recursively discover if this value has injectable properties - if (PropertyInjectionCache.HasInjectableProperties(value.GetType())) - { - DiscoverNestedObjects(value, objectsByDepth, visitedObjects, allObjects, currentDepth + 1); - } - } - } - else if (plan.ReflectionProperties.Length > 0) - { - foreach (var (property, _) in plan.ReflectionProperties) - { - var value = property.GetValue(obj); - if (value == null || !visitedObjects.Add(value)) - { - continue; - } - - AddToDepth(objectsByDepth, currentDepth, value); - allObjects.Add(value); - - // Recursively discover if this value has injectable properties - if (PropertyInjectionCache.HasInjectableProperties(value.GetType())) - { - DiscoverNestedObjects(value, objectsByDepth, visitedObjects, allObjects, currentDepth + 1); - } - } - } + _discoverer = discoverer; } - private static void AddToDepth(ConcurrentDictionary> objectsByDepth, int depth, object obj) - { - objectsByDepth.GetOrAdd(depth, _ => []).Add(obj); - } -} - -/// -/// Represents a discovered object graph organized by depth level. -/// -internal sealed class ObjectGraph -{ - public ObjectGraph(ConcurrentDictionary> objectsByDepth, HashSet allObjects) - { - ObjectsByDepth = objectsByDepth; - AllObjects = allObjects; - MaxDepth = objectsByDepth.Count > 0 ? objectsByDepth.Keys.Max() : -1; - } - - /// - /// Objects organized by depth (0 = root arguments, 1+ = nested). - /// - public ConcurrentDictionary> ObjectsByDepth { get; } - - /// - /// All unique objects in the graph. - /// - public HashSet AllObjects { get; } - /// - /// Maximum nesting depth (-1 if empty). - /// - public int MaxDepth { get; } - - /// - /// Gets objects at a specific depth level. + /// Discovers all objects from test context arguments and properties, organized by depth level. /// - public IEnumerable GetObjectsAtDepth(int depth) + public IObjectGraph DiscoverObjectGraph(TestContext testContext, CancellationToken cancellationToken = default) { - return ObjectsByDepth.TryGetValue(depth, out var objects) ? objects : []; + return _discoverer.DiscoverObjectGraph(testContext, cancellationToken); } /// - /// Gets depth levels in descending order (deepest first). + /// Discovers nested objects from a single root object, organized by depth. /// - public IEnumerable GetDepthsDescending() + public IObjectGraph DiscoverNestedObjectGraph(object rootObject, CancellationToken cancellationToken = default) { - return ObjectsByDepth.Keys.OrderByDescending(d => d); + return _discoverer.DiscoverNestedObjectGraph(rootObject, cancellationToken); } } diff --git a/TUnit.Engine/Services/ObjectLifecycleService.cs b/TUnit.Engine/Services/ObjectLifecycleService.cs index 33d50d9b08..8ab1773f6a 100644 --- a/TUnit.Engine/Services/ObjectLifecycleService.cs +++ b/TUnit.Engine/Services/ObjectLifecycleService.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using TUnit.Core; +using TUnit.Core.Helpers; using TUnit.Core.Interfaces; using TUnit.Core.PropertyInjection; using TUnit.Core.PropertyInjection.Initialization; @@ -17,14 +18,20 @@ namespace TUnit.Engine.Services; /// Uses Lazy<T> for dependencies to break circular references without manual Initialize() calls. /// Follows clear phase separation: Register → Inject → Initialize → Cleanup. /// -internal sealed class ObjectLifecycleService : IObjectRegistry +/// +/// Implements to allow PropertyInjector to call back for initialization +/// without creating a direct dependency (breaking the circular reference pattern). +/// +internal sealed class ObjectLifecycleService : IObjectRegistry, IInitializationCallback { private readonly Lazy _propertyInjector; private readonly ObjectGraphDiscoveryService _objectGraphDiscoveryService; private readonly ObjectTracker _objectTracker; // Track initialization state per object - private readonly ConcurrentDictionary> _initializationTasks = new(); + // Use ReferenceEqualityComparer to prevent objects with custom Equals from sharing initialization state + private readonly ConcurrentDictionary> _initializationTasks = + new(Core.Helpers.ReferenceEqualityComparer.Instance); public ObjectLifecycleService( Lazy propertyInjector, @@ -94,7 +101,8 @@ public async Task RegisterArgumentsAsync( return; } - var tasks = new List(); + // Pre-allocate with expected capacity to avoid resizing + var tasks = new List(arguments.Length); foreach (var argument in arguments) { if (argument != null) @@ -103,7 +111,10 @@ public async Task RegisterArgumentsAsync( } } - await Task.WhenAll(tasks); + if (tasks.Count > 0) + { + await Task.WhenAll(tasks); + } } #endregion @@ -112,10 +123,11 @@ public async Task RegisterArgumentsAsync( /// /// Prepares a test for execution. - /// Sets already-resolved cached property values on the current instance and initializes tracked objects. + /// Sets already-resolved cached property values on the current instance. /// This is needed because retries create new instances that don't have properties set yet. + /// Does NOT call IAsyncInitializer - that is deferred until after BeforeClass hooks via InitializeTestObjectsAsync. /// - public async Task PrepareTestAsync(TestContext testContext, CancellationToken cancellationToken) + public void PrepareTest(TestContext testContext) { var testClassInstance = testContext.Metadata.TestDetails.ClassInstance; @@ -123,7 +135,14 @@ public async Task PrepareTestAsync(TestContext testContext, CancellationToken ca // Properties were resolved and cached during RegisterTestAsync, so shared objects are already created // We just need to set them on the actual test instance (retries create new instances) SetCachedPropertiesOnInstance(testClassInstance, testContext); + } + /// + /// Initializes test objects (IAsyncInitializer) after BeforeClass hooks have run. + /// This ensures resources like Docker containers are not started until needed. + /// + public async Task InitializeTestObjectsAsync(TestContext testContext, CancellationToken cancellationToken) + { // Initialize all tracked objects (IAsyncInitializer) depth-first await InitializeTrackedObjectsAsync(testContext, cancellationToken); } @@ -148,7 +167,7 @@ private void SetCachedPropertiesOnInstance(object instance, TestContext testCont { foreach (var metadata in plan.SourceGeneratedProperties) { - var cacheKey = $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + var cacheKey = PropertyCacheKeyGenerator.GetCacheKey(metadata); if (cachedProperties.TryGetValue(cacheKey, out var cachedValue) && cachedValue != null) { @@ -161,7 +180,7 @@ private void SetCachedPropertiesOnInstance(object instance, TestContext testCont { foreach (var (property, _) in plan.ReflectionProperties) { - var cacheKey = $"{property.DeclaringType!.FullName}.{property.Name}"; + var cacheKey = PropertyCacheKeyGenerator.GetCacheKey(property); if (cachedProperties.TryGetValue(cacheKey, out var cachedValue) && cachedValue != null) { @@ -175,31 +194,76 @@ private void SetCachedPropertiesOnInstance(object instance, TestContext testCont /// /// Initializes all tracked objects depth-first (deepest objects first). + /// This is called during test execution (after BeforeClass hooks) to initialize IAsyncInitializer objects. + /// Objects at the same level are initialized in parallel. /// private async Task InitializeTrackedObjectsAsync(TestContext testContext, CancellationToken cancellationToken) { - var levels = testContext.TrackedObjects.Keys.OrderByDescending(level => level); + // Get levels without LINQ - use Array.Sort with reverse comparison for descending order + var trackedObjects = testContext.TrackedObjects; + var levelCount = trackedObjects.Count; - foreach (var level in levels) + if (levelCount > 0) { - var objectsAtLevel = testContext.TrackedObjects[level]; - - // Initialize all objects at this depth in parallel - await Task.WhenAll(objectsAtLevel.Select(obj => - EnsureInitializedAsync( - obj, - testContext.StateBag.Items, - testContext.Metadata.TestDetails.MethodMetadata, - testContext.InternalEvents, - cancellationToken).AsTask())); + var levels = new int[levelCount]; + trackedObjects.Keys.CopyTo(levels, 0); + Array.Sort(levels, (a, b) => b.CompareTo(a)); // Descending order + + foreach (var level in levels) + { + if (!trackedObjects.TryGetValue(level, out var objectsAtLevel)) + { + continue; + } + + // Copy to array under lock to prevent concurrent modification + object[] objectsCopy; + lock (objectsAtLevel) + { + objectsCopy = new object[objectsAtLevel.Count]; + objectsAtLevel.CopyTo(objectsCopy); + } + + // Initialize all objects at this level in parallel + var tasks = new List(objectsCopy.Length); + foreach (var obj in objectsCopy) + { + tasks.Add(InitializeObjectWithNestedAsync(obj, cancellationToken)); + } + + if (tasks.Count > 0) + { + await Task.WhenAll(tasks); + } + } } - // Finally initialize the test class itself - await EnsureInitializedAsync( - testContext.Metadata.TestDetails.ClassInstance, - testContext.StateBag.Items, - testContext.Metadata.TestDetails.MethodMetadata, - testContext.InternalEvents, + // Finally initialize the test class and its nested objects + var classInstance = testContext.Metadata.TestDetails.ClassInstance; + await InitializeNestedObjectsForExecutionAsync(classInstance, cancellationToken); + await ObjectInitializer.InitializeAsync(classInstance, cancellationToken); + } + + /// + /// Initializes an object and its nested objects. + /// + private async Task InitializeObjectWithNestedAsync(object obj, CancellationToken cancellationToken) + { + // First initialize nested objects depth-first + await InitializeNestedObjectsForExecutionAsync(obj, cancellationToken); + + // Then initialize the object itself + await ObjectInitializer.InitializeAsync(obj, cancellationToken); + } + + /// + /// Initializes nested objects during execution phase - all IAsyncInitializer objects. + /// + private Task InitializeNestedObjectsForExecutionAsync(object rootObject, CancellationToken cancellationToken) + { + return InitializeNestedObjectsAsync( + rootObject, + ObjectInitializer.InitializeAsync, cancellationToken); } @@ -234,6 +298,7 @@ public async ValueTask InjectPropertiesAsync( /// /// Ensures an object is fully initialized (property injection + IAsyncInitializer). /// Thread-safe with fast-path for already-initialized objects. + /// Called during test execution to initialize all IAsyncInitializer objects. /// public async ValueTask EnsureInitializedAsync( T obj, @@ -247,13 +312,17 @@ public async ValueTask EnsureInitializedAsync( throw new ArgumentNullException(nameof(obj)); } - // Fast path: already initialized + // Fast path: already processed by this service if (_initializationTasks.TryGetValue(obj, out var existingTcs) && existingTcs.Task.IsCompleted) { if (existingTcs.Task.IsFaulted) { await existingTcs.Task.ConfigureAwait(false); } + + // EnsureInitializedAsync is only called during discovery (from PropertyInjector). + // If the object is shared and has already been processed, just return it. + // Regular IAsyncInitializer objects will be initialized during execution via InitializeTrackedObjectsAsync. return obj; } @@ -268,8 +337,18 @@ public async ValueTask EnsureInitializedAsync( await InitializeObjectCoreAsync(obj, objectBag, methodMetadata, events, cancellationToken); tcs.SetResult(true); } + catch (OperationCanceledException) + { + // Propagate cancellation without caching failure - allows retry after cancel + _initializationTasks.TryRemove(obj, out _); + tcs.SetCanceled(); + throw; + } catch (Exception ex) { + // Remove failed initialization from cache to allow retry + // This is important for transient failures that may succeed on retry + _initializationTasks.TryRemove(obj, out _); tcs.SetException(ex); throw; } @@ -284,7 +363,8 @@ public async ValueTask EnsureInitializedAsync( } /// - /// Core initialization: property injection + nested objects + IAsyncInitializer. + /// Core initialization: property injection + IAsyncDiscoveryInitializer only. + /// Regular IAsyncInitializer objects are NOT initialized here - they are deferred to execution phase. /// private async Task InitializeObjectCoreAsync( object obj, @@ -296,44 +376,66 @@ private async Task InitializeObjectCoreAsync( objectBag ??= new ConcurrentDictionary(); events ??= new TestContextEvents(); - try - { - // Step 1: Inject properties - await PropertyInjector.InjectPropertiesAsync(obj, objectBag, methodMetadata, events); + // Let exceptions propagate naturally - don't wrap in InvalidOperationException + // This aligns with ObjectInitializer behavior and provides cleaner stack traces - // Step 2: Initialize nested objects depth-first - await InitializeNestedObjectsAsync(obj, cancellationToken); + // Step 1: Inject properties + await PropertyInjector.InjectPropertiesAsync(obj, objectBag, methodMetadata, events); - // Step 3: Call IAsyncInitializer on the object itself - if (obj is IAsyncInitializer asyncInitializer) - { - await ObjectInitializer.InitializeAsync(asyncInitializer, cancellationToken); - } - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Failed to initialize object of type '{obj.GetType().Name}': {ex.Message}", ex); - } + // Step 2: Initialize nested objects depth-first (discovery-only) + await InitializeNestedObjectsForDiscoveryAsync(obj, cancellationToken); + + // Step 3: Call IAsyncDiscoveryInitializer only (not regular IAsyncInitializer) + // Regular IAsyncInitializer objects are deferred to execution phase via InitializeTestObjectsAsync + await ObjectInitializer.InitializeForDiscoveryAsync(obj, cancellationToken); } /// - /// Initializes nested objects depth-first using the centralized ObjectGraphDiscoveryService. + /// Initializes nested objects during discovery phase - only IAsyncDiscoveryInitializer objects. /// - private async Task InitializeNestedObjectsAsync(object rootObject, CancellationToken cancellationToken) + private Task InitializeNestedObjectsForDiscoveryAsync(object rootObject, CancellationToken cancellationToken) { - var graph = _objectGraphDiscoveryService.DiscoverNestedObjectGraph(rootObject); + return InitializeNestedObjectsAsync( + rootObject, + ObjectInitializer.InitializeForDiscoveryAsync, + cancellationToken); + } + + /// + /// Shared implementation for nested object initialization (DRY). + /// Discovers nested objects and initializes them depth-first using the provided initializer. + /// + /// The root object to discover nested objects from. + /// The initializer function to call for each object. + /// Cancellation token. + private async Task InitializeNestedObjectsAsync( + object rootObject, + Func initializer, + CancellationToken cancellationToken) + { + var graph = _objectGraphDiscoveryService.DiscoverNestedObjectGraph(rootObject, cancellationToken); // Initialize from deepest to shallowest (skip depth 0 which is the root itself) foreach (var depth in graph.GetDepthsDescending()) { - if (depth == 0) continue; // Root handled separately + if (depth == 0) + { + continue; // Root handled separately + } var objectsAtDepth = graph.GetObjectsAtDepth(depth); - await Task.WhenAll(objectsAtDepth - .Where(obj => obj is IAsyncInitializer) - .Select(obj => ObjectInitializer.InitializeAsync(obj, cancellationToken).AsTask())); + // Pre-allocate task list without LINQ Select + var tasks = new List(); + foreach (var obj in objectsAtDepth) + { + tasks.Add(initializer(obj, cancellationToken).AsTask()); + } + + if (tasks.Count > 0) + { + await Task.WhenAll(tasks); + } } } diff --git a/TUnit.Engine/Services/PropertyInjector.cs b/TUnit.Engine/Services/PropertyInjector.cs index 249f19207b..e0008d17ac 100644 --- a/TUnit.Engine/Services/PropertyInjector.cs +++ b/TUnit.Engine/Services/PropertyInjector.cs @@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Reflection; using TUnit.Core; +using TUnit.Core.Helpers; using TUnit.Core.Interfaces; using TUnit.Core.Interfaces.SourceGenerator; using TUnit.Core.PropertyInjection; @@ -14,17 +15,21 @@ namespace TUnit.Engine.Services; /// Follows Single Responsibility Principle - only injects property values, doesn't initialize objects. /// Uses Lazy initialization to break circular dependencies without manual Initialize() calls. /// +/// +/// Depends on rather than a concrete service, +/// enabling testability and following Dependency Inversion Principle. +/// internal sealed class PropertyInjector { - private readonly Lazy _objectLifecycleService; + private readonly Lazy _initializationCallback; private readonly string _testSessionId; // Object pool for visited dictionaries to reduce allocations private static readonly ConcurrentBag> _visitedObjectsPool = new(); - public PropertyInjector(Lazy objectLifecycleService, string testSessionId) + public PropertyInjector(Lazy initializationCallback, string testSessionId) { - _objectLifecycleService = objectLifecycleService; + _initializationCallback = initializationCallback; _testSessionId = testSessionId; } @@ -95,7 +100,7 @@ public async Task InjectPropertiesAsync( #if NETSTANDARD2_0 visitedObjects = new ConcurrentDictionary(); #else - visitedObjects = new ConcurrentDictionary(ReferenceEqualityComparer.Instance); + visitedObjects = new ConcurrentDictionary(Core.Helpers.ReferenceEqualityComparer.Instance); #endif } @@ -124,17 +129,29 @@ public async Task InjectPropertiesIntoArgumentsAsync( return; } - var injectableArgs = arguments - .Where(arg => arg != null && PropertyInjectionCache.HasInjectableProperties(arg.GetType())) - .ToArray(); + // Build list of injectable args without LINQ + var injectableArgs = new List(arguments.Length); + foreach (var arg in arguments) + { + if (arg != null && PropertyInjectionCache.HasInjectableProperties(arg.GetType())) + { + injectableArgs.Add(arg); + } + } - if (injectableArgs.Length == 0) + if (injectableArgs.Count == 0) { return; } - await Task.WhenAll(injectableArgs.Select(arg => - InjectPropertiesAsync(arg!, objectBag, methodMetadata, events))); + // Build task list without LINQ Select + var tasks = new List(injectableArgs.Count); + foreach (var arg in injectableArgs) + { + tasks.Add(InjectPropertiesAsync(arg, objectBag, methodMetadata, events)); + } + + await Task.WhenAll(tasks); } private async Task InjectPropertiesRecursiveAsync( @@ -184,7 +201,7 @@ await InjectReflectionPropertiesAsync( } } - private async Task InjectSourceGeneratedPropertiesAsync( + private Task InjectSourceGeneratedPropertiesAsync( object instance, PropertyInjectionMetadata[] properties, ConcurrentDictionary objectBag, @@ -192,14 +209,8 @@ private async Task InjectSourceGeneratedPropertiesAsync( TestContextEvents events, ConcurrentDictionary visitedObjects) { - if (properties.Length == 0) - { - return; - } - - // Initialize properties in parallel - await Task.WhenAll(properties.Select(metadata => - InjectSourceGeneratedPropertyAsync(instance, metadata, objectBag, methodMetadata, events, visitedObjects))); + return ParallelTaskHelper.ForEachAsync(properties, + prop => InjectSourceGeneratedPropertyAsync(instance, prop, objectBag, methodMetadata, events, visitedObjects)); } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Source-gen properties are AOT-safe")] @@ -228,7 +239,7 @@ private async Task InjectSourceGeneratedPropertyAsync( object? resolvedValue = null; // Use a composite key to avoid conflicts when nested classes have properties with the same name - var cacheKey = $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + var cacheKey = PropertyCacheKeyGenerator.GetCacheKey(metadata); // Check if property was pre-resolved during registration if (testContext?.Metadata.TestDetails.TestClassInjectedPropertyArguments.TryGetValue(cacheKey, out resolvedValue) == true) @@ -272,7 +283,7 @@ private async Task InjectSourceGeneratedPropertyAsync( } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] - private async Task InjectReflectionPropertiesAsync( + private Task InjectReflectionPropertiesAsync( object instance, (PropertyInfo Property, IDataSourceAttribute DataSource)[] properties, ConcurrentDictionary objectBag, @@ -280,13 +291,8 @@ private async Task InjectReflectionPropertiesAsync( TestContextEvents events, ConcurrentDictionary visitedObjects) { - if (properties.Length == 0) - { - return; - } - - await Task.WhenAll(properties.Select(pair => - InjectReflectionPropertyAsync(instance, pair.Property, pair.DataSource, objectBag, methodMetadata, events, visitedObjects))); + return ParallelTaskHelper.ForEachAsync(properties, + pair => InjectReflectionPropertyAsync(instance, pair.Property, pair.DataSource, objectBag, methodMetadata, events, visitedObjects)); } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] @@ -380,21 +386,15 @@ private async Task RecurseIntoNestedPropertiesAsync( } } - private async Task ResolveAndCacheSourceGeneratedPropertiesAsync( + private Task ResolveAndCacheSourceGeneratedPropertiesAsync( PropertyInjectionMetadata[] properties, ConcurrentDictionary objectBag, MethodMetadata? methodMetadata, TestContextEvents events, TestContext testContext) { - if (properties.Length == 0) - { - return; - } - - // Resolve properties in parallel - await Task.WhenAll(properties.Select(metadata => - ResolveAndCacheSourceGeneratedPropertyAsync(metadata, objectBag, methodMetadata, events, testContext))); + return ParallelTaskHelper.ForEachAsync(properties, + prop => ResolveAndCacheSourceGeneratedPropertyAsync(prop, objectBag, methodMetadata, events, testContext)); } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Source-gen properties are AOT-safe")] @@ -405,7 +405,7 @@ private async Task ResolveAndCacheSourceGeneratedPropertyAsync( TestContextEvents events, TestContext testContext) { - var cacheKey = $"{metadata.ContainingType.FullName}.{metadata.PropertyName}"; + var cacheKey = PropertyCacheKeyGenerator.GetCacheKey(metadata); // Check if already cached if (testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments.ContainsKey(cacheKey)) @@ -439,20 +439,15 @@ private async Task ResolveAndCacheSourceGeneratedPropertyAsync( } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] - private async Task ResolveAndCacheReflectionPropertiesAsync( + private Task ResolveAndCacheReflectionPropertiesAsync( (PropertyInfo Property, IDataSourceAttribute DataSource)[] properties, ConcurrentDictionary objectBag, MethodMetadata? methodMetadata, TestContextEvents events, TestContext testContext) { - if (properties.Length == 0) - { - return; - } - - await Task.WhenAll(properties.Select(pair => - ResolveAndCacheReflectionPropertyAsync(pair.Property, pair.DataSource, objectBag, methodMetadata, events, testContext))); + return ParallelTaskHelper.ForEachAsync(properties, + pair => ResolveAndCacheReflectionPropertyAsync(pair.Property, pair.DataSource, objectBag, methodMetadata, events, testContext)); } [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Reflection mode is not used in AOT")] @@ -464,7 +459,7 @@ private async Task ResolveAndCacheReflectionPropertyAsync( TestContextEvents events, TestContext testContext) { - var cacheKey = $"{property.DeclaringType!.FullName}.{property.Name}"; + var cacheKey = PropertyCacheKeyGenerator.GetCacheKey(property); // Check if already cached if (testContext.Metadata.TestDetails.TestClassInjectedPropertyArguments.ContainsKey(cacheKey)) @@ -525,15 +520,14 @@ private async Task ResolveAndCacheReflectionPropertyAsync( if (value != null) { - // Ensure nested objects are initialized - if (PropertyInjectionCache.HasInjectableProperties(value.GetType()) || value is IAsyncInitializer) - { - await _objectLifecycleService.Value.EnsureInitializedAsync( - value, - context.ObjectBag, - context.MethodMetadata, - context.Events); - } + // EnsureInitializedAsync handles property injection and initialization. + // ObjectInitializer is phase-aware: during Discovery phase, only IAsyncDiscoveryInitializer + // objects are initialized; regular IAsyncInitializer objects are deferred to Execution phase. + await _initializationCallback.Value.EnsureInitializedAsync( + value, + context.ObjectBag, + context.MethodMetadata, + context.Events); return value; } @@ -561,7 +555,7 @@ await _objectLifecycleService.Value.EnsureInitializedAsync( } // Ensure the data source is initialized - return await _objectLifecycleService.Value.EnsureInitializedAsync( + return await _initializationCallback.Value.EnsureInitializedAsync( dataSource, context.ObjectBag, context.MethodMetadata, diff --git a/TUnit.Engine/Services/TestExecution/TestCoordinator.cs b/TUnit.Engine/Services/TestExecution/TestCoordinator.cs index b448e459e6..683a9e8f4c 100644 --- a/TUnit.Engine/Services/TestExecution/TestCoordinator.cs +++ b/TUnit.Engine/Services/TestExecution/TestCoordinator.cs @@ -126,9 +126,9 @@ await TimeoutHelper.ExecuteWithTimeoutAsync( try { - await _testInitializer.InitializeTest(test, ct).ConfigureAwait(false); + _testInitializer.PrepareTest(test, ct); test.Context.RestoreExecutionContext(); - await _testExecutor.ExecuteAsync(test, ct).ConfigureAwait(false); + await _testExecutor.ExecuteAsync(test, _testInitializer, ct).ConfigureAwait(false); } finally { diff --git a/TUnit.Engine/TestExecutor.cs b/TUnit.Engine/TestExecutor.cs index e7d65b92f0..dbb80cc3f6 100644 --- a/TUnit.Engine/TestExecutor.cs +++ b/TUnit.Engine/TestExecutor.cs @@ -62,7 +62,7 @@ await _beforeHookTaskCache.GetOrCreateBeforeTestSessionTask( /// Creates a test executor delegate that wraps the provided executor with hook orchestration. /// Uses focused services that follow SRP to manage lifecycle and execution. /// - public async ValueTask ExecuteAsync(AbstractExecutableTest executableTest, CancellationToken cancellationToken) + public async ValueTask ExecuteAsync(AbstractExecutableTest executableTest, TestInitializer testInitializer, CancellationToken cancellationToken) { var testClass = executableTest.Metadata.TestClassType; @@ -112,6 +112,12 @@ await _eventReceiverOrchestrator.InvokeFirstTestInClassEventReceiversAsync( executableTest.Context.ClassContext.RestoreExecutionContext(); + // Initialize test objects (IAsyncInitializer) AFTER BeforeClass hooks + // This ensures resources like Docker containers are not started until needed + await testInitializer.InitializeTestObjectsAsync(executableTest, cancellationToken).ConfigureAwait(false); + + executableTest.Context.RestoreExecutionContext(); + // Early stage test start receivers run before instance-level hooks await _eventReceiverOrchestrator.InvokeTestStartEventReceiversAsync(executableTest.Context, cancellationToken, EventReceiverStage.Early).ConfigureAwait(false); diff --git a/TUnit.Engine/TestInitializer.cs b/TUnit.Engine/TestInitializer.cs index de117c6746..73fbb7fbc2 100644 --- a/TUnit.Engine/TestInitializer.cs +++ b/TUnit.Engine/TestInitializer.cs @@ -20,12 +20,19 @@ public TestInitializer( _objectLifecycleService = objectLifecycleService; } - public async ValueTask InitializeTest(AbstractExecutableTest test, CancellationToken cancellationToken) + public void PrepareTest(AbstractExecutableTest test, CancellationToken cancellationToken) { // Register event receivers _eventReceiverOrchestrator.RegisterReceivers(test.Context, cancellationToken); - // Prepare test: inject properties, track objects, initialize (IAsyncInitializer) - await _objectLifecycleService.PrepareTestAsync(test.Context, cancellationToken); + // Prepare test: set cached property values on the instance + // Does NOT call IAsyncInitializer - that is deferred until after BeforeClass hooks + _objectLifecycleService.PrepareTest(test.Context); + } + + public async ValueTask InitializeTestObjectsAsync(AbstractExecutableTest test, CancellationToken cancellationToken) + { + // Initialize test objects (IAsyncInitializer) - called after BeforeClass hooks + await _objectLifecycleService.InitializeTestObjectsAsync(test.Context, cancellationToken); } } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 33684f6146..212cbcb9fc 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1000,10 +1000,6 @@ namespace public . NotInParallelConstraintKeys { get; init; } public int Order { get; set; } } - public static class ObjectInitializer - { - public static . InitializeAsync(object? obj, .CancellationToken cancellationToken = default) { } - } public class ParallelGroupAttribute : .TUnitAttribute, ., . { public ParallelGroupAttribute(string group) { } @@ -2021,14 +2017,23 @@ namespace .Helpers [.("MakeGenericType requires runtime code generation")] public static MakeGenericTypeSafe( genericTypeDefinition, params [] typeArguments) { } } + public static class ParallelTaskHelper + { + public static . ForEachAsync(. items, action) { } + public static . ForEachAsync(T[] items, action) { } + public static . ForEachAsync(. items, action, .CancellationToken cancellationToken) { } + public static . ForEachAsync(T[] items, action, .CancellationToken cancellationToken) { } + public static . ForEachWithIndexAsync(T[] items, action) { } + public static . ForEachWithIndexAsync(T[] items, action, .CancellationToken cancellationToken) { } + } public class ProcessorCountParallelLimit : . { public ProcessorCountParallelLimit() { } public int Limit { get; } } - public class ReferenceEqualityComparer : . + public sealed class ReferenceEqualityComparer : . { - public ReferenceEqualityComparer() { } + public static readonly . Instance; public bool Equals(object? x, object? y) { } public int GetHashCode(object obj) { } } @@ -2229,6 +2234,10 @@ namespace .Interfaces { .<> GenerateDataFactories(.DataSourceContext context); } + public interface IDisposer + { + . DisposeAsync(object? obj); + } public interface IEventReceiver { int Order { get; } @@ -2588,6 +2597,14 @@ namespace .Models public ? MethodInvoker { get; set; } } } +namespace .PropertyInjection +{ + public static class PropertyCacheKeyGenerator + { + public static string GetCacheKey(.PropertyInfo property) { } + public static string GetCacheKey(..PropertyInjectionMetadata metadata) { } + } +} namespace .Services { [.("Generic type resolution requires runtime type generation")] diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index d97c4f38b5..00c508f06b 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1000,10 +1000,6 @@ namespace public . NotInParallelConstraintKeys { get; init; } public int Order { get; set; } } - public static class ObjectInitializer - { - public static . InitializeAsync(object? obj, .CancellationToken cancellationToken = default) { } - } public class ParallelGroupAttribute : .TUnitAttribute, ., . { public ParallelGroupAttribute(string group) { } @@ -2021,14 +2017,23 @@ namespace .Helpers [.("MakeGenericType requires runtime code generation")] public static MakeGenericTypeSafe( genericTypeDefinition, params [] typeArguments) { } } + public static class ParallelTaskHelper + { + public static . ForEachAsync(. items, action) { } + public static . ForEachAsync(T[] items, action) { } + public static . ForEachAsync(. items, action, .CancellationToken cancellationToken) { } + public static . ForEachAsync(T[] items, action, .CancellationToken cancellationToken) { } + public static . ForEachWithIndexAsync(T[] items, action) { } + public static . ForEachWithIndexAsync(T[] items, action, .CancellationToken cancellationToken) { } + } public class ProcessorCountParallelLimit : . { public ProcessorCountParallelLimit() { } public int Limit { get; } } - public class ReferenceEqualityComparer : . + public sealed class ReferenceEqualityComparer : . { - public ReferenceEqualityComparer() { } + public static readonly . Instance; public bool Equals(object? x, object? y) { } public int GetHashCode(object obj) { } } @@ -2229,6 +2234,10 @@ namespace .Interfaces { .<> GenerateDataFactories(.DataSourceContext context); } + public interface IDisposer + { + . DisposeAsync(object? obj); + } public interface IEventReceiver { int Order { get; } @@ -2588,6 +2597,14 @@ namespace .Models public ? MethodInvoker { get; set; } } } +namespace .PropertyInjection +{ + public static class PropertyCacheKeyGenerator + { + public static string GetCacheKey(.PropertyInfo property) { } + public static string GetCacheKey(..PropertyInjectionMetadata metadata) { } + } +} namespace .Services { [.("Generic type resolution requires runtime type generation")] diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 5280c9595c..af52063e82 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1000,10 +1000,6 @@ namespace public . NotInParallelConstraintKeys { get; init; } public int Order { get; set; } } - public static class ObjectInitializer - { - public static . InitializeAsync(object? obj, .CancellationToken cancellationToken = default) { } - } public class ParallelGroupAttribute : .TUnitAttribute, ., . { public ParallelGroupAttribute(string group) { } @@ -2021,14 +2017,23 @@ namespace .Helpers [.("MakeGenericType requires runtime code generation")] public static MakeGenericTypeSafe( genericTypeDefinition, params [] typeArguments) { } } + public static class ParallelTaskHelper + { + public static . ForEachAsync(. items, action) { } + public static . ForEachAsync(T[] items, action) { } + public static . ForEachAsync(. items, action, .CancellationToken cancellationToken) { } + public static . ForEachAsync(T[] items, action, .CancellationToken cancellationToken) { } + public static . ForEachWithIndexAsync(T[] items, action) { } + public static . ForEachWithIndexAsync(T[] items, action, .CancellationToken cancellationToken) { } + } public class ProcessorCountParallelLimit : . { public ProcessorCountParallelLimit() { } public int Limit { get; } } - public class ReferenceEqualityComparer : . + public sealed class ReferenceEqualityComparer : . { - public ReferenceEqualityComparer() { } + public static readonly . Instance; public bool Equals(object? x, object? y) { } public int GetHashCode(object obj) { } } @@ -2229,6 +2234,10 @@ namespace .Interfaces { .<> GenerateDataFactories(.DataSourceContext context); } + public interface IDisposer + { + . DisposeAsync(object? obj); + } public interface IEventReceiver { int Order { get; } @@ -2588,6 +2597,14 @@ namespace .Models public ? MethodInvoker { get; set; } } } +namespace .PropertyInjection +{ + public static class PropertyCacheKeyGenerator + { + public static string GetCacheKey(.PropertyInfo property) { } + public static string GetCacheKey(..PropertyInjectionMetadata metadata) { } + } +} namespace .Services { [.("Generic type resolution requires runtime type generation")] diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 538bd3ca00..a3d525329b 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -963,10 +963,6 @@ namespace public . NotInParallelConstraintKeys { get; init; } public int Order { get; set; } } - public static class ObjectInitializer - { - public static . InitializeAsync(object? obj, .CancellationToken cancellationToken = default) { } - } public class ParallelGroupAttribute : .TUnitAttribute, ., . { public ParallelGroupAttribute(string group) { } @@ -1960,14 +1956,23 @@ namespace .Helpers public static bool IsConstructedGenericType( type) { } public static MakeGenericTypeSafe( genericTypeDefinition, params [] typeArguments) { } } + public static class ParallelTaskHelper + { + public static . ForEachAsync(. items, action) { } + public static . ForEachAsync(T[] items, action) { } + public static . ForEachAsync(. items, action, .CancellationToken cancellationToken) { } + public static . ForEachAsync(T[] items, action, .CancellationToken cancellationToken) { } + public static . ForEachWithIndexAsync(T[] items, action) { } + public static . ForEachWithIndexAsync(T[] items, action, .CancellationToken cancellationToken) { } + } public class ProcessorCountParallelLimit : . { public ProcessorCountParallelLimit() { } public int Limit { get; } } - public class ReferenceEqualityComparer : . + public sealed class ReferenceEqualityComparer : . { - public ReferenceEqualityComparer() { } + public static readonly . Instance; public bool Equals(object? x, object? y) { } public int GetHashCode(object obj) { } } @@ -2161,6 +2166,10 @@ namespace .Interfaces { .<> GenerateDataFactories(.DataSourceContext context); } + public interface IDisposer + { + . DisposeAsync(object? obj); + } public interface IEventReceiver { int Order { get; } @@ -2510,6 +2519,14 @@ namespace .Models public ? MethodInvoker { get; set; } } } +namespace .PropertyInjection +{ + public static class PropertyCacheKeyGenerator + { + public static string GetCacheKey(.PropertyInfo property) { } + public static string GetCacheKey(..PropertyInjectionMetadata metadata) { } + } +} namespace .Services { public class GenericTypeResolver : . diff --git a/TUnit.TestProject/Bugs/3992/RuntimeInitializeTests.cs b/TUnit.TestProject/Bugs/3992/RuntimeInitializeTests.cs new file mode 100644 index 0000000000..1d86987a8a --- /dev/null +++ b/TUnit.TestProject/Bugs/3992/RuntimeInitializeTests.cs @@ -0,0 +1,56 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3992; + +/// +/// Once this is discovered during test discovery, containers spin up +/// +[EngineTest(ExpectedResult.Pass)] +public sealed class RuntimeInitializeTests +{ + //Docker container + [ClassDataSource(Shared = SharedType.PerClass)] + public required DummyContainer Container { get; init; } + + [Before(Class)] + public static Task BeforeClass(ClassHookContext context) => NotInitialised(context.Tests); + + [After(TestDiscovery)] + public static Task AfterDiscovery(TestDiscoveryContext context) => NotInitialised(context.AllTests); + + public static async Task NotInitialised(IEnumerable tests) + { + var bugRecreations = tests.Select(x => x.Metadata.TestDetails.ClassInstance).OfType(); + + foreach (var bugRecreation in bugRecreations) + { + await Assert.That(bugRecreation.Container).IsNotNull(); + await Assert.That(DummyContainer.NumberOfInits).IsEqualTo(0); + } + } + + [Test, Arguments(1)] + public async Task Test(int value, CancellationToken token) + { + await Assert.That(value).IsNotDefault(); + await Assert.That(DummyContainer.NumberOfInits).IsEqualTo(1); + } + + public class DummyContainer : IAsyncInitializer, IAsyncDisposable + { + public Task InitializeAsync() + { + NumberOfInits++; + return Task.CompletedTask; + } + + public static int NumberOfInits { get; private set; } + + public ValueTask DisposeAsync() + { + return default; + } + } + +} diff --git a/TUnit.TestProject/Bugs/3992/RuntimeInitializeTests2.cs b/TUnit.TestProject/Bugs/3992/RuntimeInitializeTests2.cs new file mode 100644 index 0000000000..4edc097c47 --- /dev/null +++ b/TUnit.TestProject/Bugs/3992/RuntimeInitializeTests2.cs @@ -0,0 +1,56 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3992; + +/// +/// Once this is discovered during test discovery, containers spin up +/// +[EngineTest(ExpectedResult.Pass)] +public sealed class DiscoveryInitializeTests +{ + //Docker container + [ClassDataSource(Shared = SharedType.PerClass)] + public required DummyContainer Container { get; init; } + + [Before(Class)] + public static Task BeforeClass(ClassHookContext context) => Initialised(context.Tests); + + [After(TestDiscovery)] + public static Task AfterDiscovery(TestDiscoveryContext context) => Initialised(context.AllTests); + + public static async Task Initialised(IEnumerable tests) + { + var bugRecreations = tests.Select(x => x.Metadata.TestDetails.ClassInstance).OfType(); + + foreach (var bugRecreation in bugRecreations) + { + await Assert.That(bugRecreation.Container).IsNotNull(); + await Assert.That(DummyContainer.NumberOfInits).IsEqualTo(1); + } + } + + [Test, Arguments(1)] + public async Task Test(int value, CancellationToken token) + { + await Assert.That(value).IsNotDefault(); + await Assert.That(DummyContainer.NumberOfInits).IsEqualTo(1); + } + + public class DummyContainer : IAsyncDiscoveryInitializer, IAsyncDisposable + { + public Task InitializeAsync() + { + NumberOfInits++; + return Task.CompletedTask; + } + + public static int NumberOfInits { get; private set; } + + public ValueTask DisposeAsync() + { + return default; + } + } + +} diff --git a/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs b/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs index cb11a76453..246e622391 100644 --- a/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs +++ b/TUnit.TestProject/TestBuildContextOutputCaptureTests.cs @@ -30,9 +30,12 @@ public DataSourceWithConstructorOutput() } /// - /// Data source that writes to console in async initializer + /// Data source that writes to console in async initializer. + /// Uses IAsyncDiscoveryInitializer so it initializes during test discovery/building, + /// allowing the output to be captured in the test's build context. + /// Note: Regular IAsyncInitializer only runs during test execution (per issue #3992 fix). /// - public class DataSourceWithAsyncInitOutput : IAsyncInitializer + public class DataSourceWithAsyncInitOutput : IAsyncDiscoveryInitializer { public string Value { get; private set; } = "Uninitialized"; @@ -88,8 +91,9 @@ public async Task Test_CapturesConstructorOutput_InTestResults(DataSourceWithCon [ClassDataSource] public async Task Test_CapturesAsyncInitializerOutput_InTestResults(DataSourceWithAsyncInitOutput data) { - // The InitializeAsync output should be captured during test building - // and included in the test's output + // The InitializeAsync output should be captured during test building. + // Note: This uses IAsyncDiscoveryInitializer which runs during discovery. + // Regular IAsyncInitializer runs during execution only (per issue #3992 fix). // Get the test output var output = TestContext.Current!.GetStandardOutput(); From 7b9093fce944c8149451a70d89999268a24e7762 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Sun, 7 Dec 2025 23:36:41 +0000 Subject: [PATCH 164/192] feat: support class-level CombinedDataSources with static and method data sources (#4007) * feat: support class-level CombinedDataSources with static and method data sources * fix: improve error message for instance data sources at class level in CombinedDataSourcesAttribute --- .../TestData/CombinedDataSourcesAttribute.cs | 9 +- ...Has_No_API_Changes.DotNet10_0.verified.txt | 2 +- ..._Has_No_API_Changes.DotNet8_0.verified.txt | 2 +- ..._Has_No_API_Changes.DotNet9_0.verified.txt | 2 +- ...ary_Has_No_API_Changes.Net4_7.verified.txt | 2 +- .../ClassLevelCombinedDataSourcesTests.cs | 153 ++++++++++++++++++ 6 files changed, 163 insertions(+), 7 deletions(-) create mode 100644 TUnit.TestProject/Bugs/3990/ClassLevelCombinedDataSourcesTests.cs diff --git a/TUnit.Core/Attributes/TestData/CombinedDataSourcesAttribute.cs b/TUnit.Core/Attributes/TestData/CombinedDataSourcesAttribute.cs index e39d59f1bb..4d8ab15ef5 100644 --- a/TUnit.Core/Attributes/TestData/CombinedDataSourcesAttribute.cs +++ b/TUnit.Core/Attributes/TestData/CombinedDataSourcesAttribute.cs @@ -81,7 +81,7 @@ namespace TUnit.Core; /// /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] -public sealed class CombinedDataSourcesAttribute : AsyncUntypedDataSourceGeneratorAttribute, IAccessesInstanceData +public sealed class CombinedDataSourcesAttribute : AsyncUntypedDataSourceGeneratorAttribute { protected override async IAsyncEnumerable>> GenerateDataSourcesAsync(DataGeneratorMetadata dataGeneratorMetadata) { @@ -156,9 +156,12 @@ public sealed class CombinedDataSourcesAttribute : AsyncUntypedDataSourceGenerat if (dataSourceAttr is IAccessesInstanceData && dataGeneratorMetadata.TestClassInstance == null) { var className = dataGeneratorMetadata.TestInformation?.Class.Type.Name ?? "Unknown"; + var attrName = dataSourceAttr.GetType().Name; throw new InvalidOperationException( - $"Cannot use instance-based data source attribute on parameter '{parameterMetadata.Name}' when no instance is available. " + - $"Consider using static data sources or ensure the test class is properly instantiated."); + $"Cannot use instance-based data source '{attrName}' on parameter '{parameterMetadata.Name}' in class '{className}'. " + + $"When [CombinedDataSources] is applied at the class level (constructor parameters), all data sources must be static " + + $"because no instance exists yet. Use static [MethodDataSource] or [Arguments] instead, " + + $"or move [CombinedDataSources] to the method level if you need instance-based data sources."); } // Create metadata for this single parameter diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 212cbcb9fc..a01bfb6b84 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -371,7 +371,7 @@ namespace public static .ClassMetadata GetOrAdd(string name, <.ClassMetadata> factory) { } } [(.Class | .Method)] - public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute, .IAccessesInstanceData + public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute { public CombinedDataSourcesAttribute() { } [.(typeof(.CombinedDataSourcesAttribute.d__0))] diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 00c508f06b..6473654dd9 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -371,7 +371,7 @@ namespace public static .ClassMetadata GetOrAdd(string name, <.ClassMetadata> factory) { } } [(.Class | .Method)] - public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute, .IAccessesInstanceData + public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute { public CombinedDataSourcesAttribute() { } [.(typeof(.CombinedDataSourcesAttribute.d__0))] diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index af52063e82..f5e15d8132 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -371,7 +371,7 @@ namespace public static .ClassMetadata GetOrAdd(string name, <.ClassMetadata> factory) { } } [(.Class | .Method)] - public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute, .IAccessesInstanceData + public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute { public CombinedDataSourcesAttribute() { } [.(typeof(.CombinedDataSourcesAttribute.d__0))] diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index a3d525329b..143ce52b60 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -351,7 +351,7 @@ namespace public static .ClassMetadata GetOrAdd(string name, <.ClassMetadata> factory) { } } [(.Class | .Method)] - public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute, .IAccessesInstanceData + public sealed class CombinedDataSourcesAttribute : .AsyncUntypedDataSourceGeneratorAttribute { public CombinedDataSourcesAttribute() { } [.(typeof(.CombinedDataSourcesAttribute.d__0))] diff --git a/TUnit.TestProject/Bugs/3990/ClassLevelCombinedDataSourcesTests.cs b/TUnit.TestProject/Bugs/3990/ClassLevelCombinedDataSourcesTests.cs new file mode 100644 index 0000000000..81bb4a7f5d --- /dev/null +++ b/TUnit.TestProject/Bugs/3990/ClassLevelCombinedDataSourcesTests.cs @@ -0,0 +1,153 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._3990; + +/// +/// Tests for GitHub Issue #3990: Support CombinedDataSources on Class level +/// + +#region Test 1: Class-level CombinedDataSources with static Arguments + +[EngineTest(ExpectedResult.Pass)] +[CombinedDataSources] +public class ClassLevelCombinedDataSources_WithStaticArguments( + [Arguments(1, 2, 3)] int x, + [Arguments("a", "b")] string y) +{ + [Test] + public async Task Test_ShouldReceiveConstructorParameters() + { + // Should create 3 x 2 = 6 test cases + await Assert.That(x).IsIn([1, 2, 3]); + await Assert.That(y).IsIn(["a", "b"]); + } +} + +#endregion + +#region Test 2: Class-level CombinedDataSources with static MethodDataSource + +public class ClassLevelDataProviders +{ + public static IEnumerable GetNumbers() + { + yield return 10; + yield return 20; + } + + public static IEnumerable GetStrings() + { + yield return "Hello"; + yield return "World"; + } + + public static IEnumerable GetColors() + { + yield return "Red"; + yield return "Blue"; + yield return "Green"; + } +} + +[EngineTest(ExpectedResult.Pass)] +[CombinedDataSources] +public class ClassLevelCombinedDataSources_WithStaticMethodDataSource( + [MethodDataSource(nameof(ClassLevelDataProviders.GetNumbers))] int number, + [MethodDataSource(nameof(ClassLevelDataProviders.GetStrings))] string text) +{ + [Test] + public async Task Test_ShouldReceiveDataFromStaticMethods() + { + // Should create 2 x 2 = 4 test cases + await Assert.That(number).IsIn([10, 20]); + await Assert.That(text).IsIn(["Hello", "World"]); + } +} + +#endregion + +#region Test 3: Class-level CombinedDataSources mixed with method-level data sources + +[EngineTest(ExpectedResult.Pass)] +[CombinedDataSources] +public class ClassLevelCombinedDataSources_MixedWithMethodLevel( + [Arguments(1, 2)] int classArg, + [Arguments("A", "B")] string classText) +{ + [Test] + [CombinedDataSources] + public async Task Test_ShouldCombineClassAndMethodData( + [Arguments(100, 200)] int methodArg, + [Arguments("X", "Y")] string methodText) + { + // Class: 2 x 2 = 4 combinations + // Method: 2 x 2 = 4 combinations + // Total: 4 x 4 = 16 test cases + await Assert.That(classArg).IsIn([1, 2]); + await Assert.That(classText).IsIn(["A", "B"]); + await Assert.That(methodArg).IsIn([100, 200]); + await Assert.That(methodText).IsIn(["X", "Y"]); + } +} + +#endregion + +#region Test 4: Class-level CombinedDataSources with mixed data source types + +[EngineTest(ExpectedResult.Pass)] +[CombinedDataSources] +public class ClassLevelCombinedDataSources_MixedDataSourceTypes( + [Arguments(1, 2)] int number, + [MethodDataSource(nameof(ClassLevelDataProviders.GetColors))] string color) +{ + [Test] + public async Task Test_ShouldMixArgumentsAndMethodDataSource() + { + // Should create 2 x 3 = 6 test cases + await Assert.That(number).IsIn([1, 2]); + await Assert.That(color).IsIn(["Red", "Blue", "Green"]); + } +} + +#endregion + +#region Test 5: Class-level CombinedDataSources with three constructor parameters + +[EngineTest(ExpectedResult.Pass)] +[CombinedDataSources] +public class ClassLevelCombinedDataSources_ThreeParameters( + [Arguments(1, 2)] int x, + [Arguments("a", "b")] string y, + [Arguments(true, false)] bool z) +{ + [Test] + public async Task Test_ShouldHandleThreeParameters() + { + // Should create 2 x 2 x 2 = 8 test cases + await Assert.That(x).IsIn([1, 2]); + await Assert.That(y).IsIn(["a", "b"]); + await Assert.That(z).IsIn([true, false]); + } +} + +#endregion + +#region Edge Case: Instance data source at class level + +/// +/// Edge case documentation: When using CombinedDataSources at the class level with +/// an instance-requiring data source (like MethodDataSource pointing to an instance method), +/// the runtime check in CombinedDataSourcesAttribute.GetParameterValues() (lines 156-165) +/// will throw an InvalidOperationException with a clear, diagnostic error message: +/// +/// "Cannot use instance-based data source '{AttributeName}' on parameter '{name}' in class '{ClassName}'. +/// When [CombinedDataSources] is applied at the class level (constructor parameters), all data sources +/// must be static because no instance exists yet. Use static [MethodDataSource] or [Arguments] instead, +/// or move [CombinedDataSources] to the method level if you need instance-based data sources." +/// +/// This provides proper error handling with actionable guidance, replacing the confusing +/// "circular dependency" message that was previously shown due to the blanket IAccessesInstanceData check. +/// +public class EdgeCaseDocumentation; + +#endregion From cd25f3ef3e956b5c11613c10fc0f8d7625a78058 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 8 Dec 2025 00:04:07 +0000 Subject: [PATCH 165/192] fix: improve exception messages for hook failures in HookExecutor (#4008) --- TUnit.Engine/Services/HookExecutor.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/TUnit.Engine/Services/HookExecutor.cs b/TUnit.Engine/Services/HookExecutor.cs index 46a58414a6..5421310afd 100644 --- a/TUnit.Engine/Services/HookExecutor.cs +++ b/TUnit.Engine/Services/HookExecutor.cs @@ -57,7 +57,7 @@ public async ValueTask ExecuteBeforeTestSessionHooksAsync(CancellationToken canc ExceptionDispatchInfo.Capture(skipEx).Throw(); } - throw new BeforeTestSessionException("BeforeTestSession hook failed", ex); + throw new BeforeTestSessionException($"BeforeTestSession hook failed: {ex.Message}", ex); } } } @@ -83,7 +83,7 @@ public async ValueTask> ExecuteAfterTestSessionHooksAsync(Cancel { // Collect hook exceptions instead of throwing immediately // This allows all hooks to run even if some fail - exceptions.Add(new AfterTestSessionException("AfterTestSession hook failed", ex)); + exceptions.Add(new AfterTestSessionException($"AfterTestSession hook failed: {ex.Message}", ex)); } } @@ -119,7 +119,7 @@ public async ValueTask ExecuteBeforeAssemblyHooksAsync(Assembly assembly, Cancel ExceptionDispatchInfo.Capture(skipEx).Throw(); } - throw new BeforeAssemblyException("BeforeAssembly hook failed", ex); + throw new BeforeAssemblyException($"BeforeAssembly hook failed: {ex.Message}", ex); } } } @@ -146,7 +146,7 @@ public async ValueTask> ExecuteAfterAssemblyHooksAsync(Assembly { // Collect hook exceptions instead of throwing immediately // This allows all hooks to run even if some fail - exceptions.Add(new AfterAssemblyException("AfterAssembly hook failed", ex)); + exceptions.Add(new AfterAssemblyException($"AfterAssembly hook failed: {ex.Message}", ex)); } } @@ -184,7 +184,7 @@ public async ValueTask ExecuteBeforeClassHooksAsync( ExceptionDispatchInfo.Capture(skipEx).Throw(); } - throw new BeforeClassException("BeforeClass hook failed", ex); + throw new BeforeClassException($"BeforeClass hook failed: {ex.Message}", ex); } } } @@ -213,7 +213,7 @@ public async ValueTask> ExecuteAfterClassHooksAsync( { // Collect hook exceptions instead of throwing immediately // This allows all hooks to run even if some fail - exceptions.Add(new AfterClassException("AfterClass hook failed", ex)); + exceptions.Add(new AfterClassException($"AfterClass hook failed: {ex.Message}", ex)); } } @@ -248,7 +248,7 @@ public async ValueTask ExecuteBeforeTestHooksAsync(AbstractExecutableTest test, ExceptionDispatchInfo.Capture(skipEx).Throw(); } - throw new BeforeTestException("BeforeEveryTest hook failed", ex); + throw new BeforeTestException($"BeforeEveryTest hook failed: {ex.Message}", ex); } } } @@ -277,7 +277,7 @@ public async ValueTask ExecuteBeforeTestHooksAsync(AbstractExecutableTest test, ExceptionDispatchInfo.Capture(skipEx).Throw(); } - throw new BeforeTestException("BeforeTest hook failed", ex); + throw new BeforeTestException($"BeforeTest hook failed: {ex.Message}", ex); } } } @@ -347,7 +347,7 @@ public async ValueTask ExecuteBeforeTestDiscoveryHooksAsync(CancellationToken ca } catch (Exception ex) { - throw new BeforeTestDiscoveryException("BeforeTestDiscovery hook failed", ex); + throw new BeforeTestDiscoveryException($"BeforeTestDiscovery hook failed: {ex.Message}", ex); } } } @@ -370,7 +370,7 @@ public async ValueTask ExecuteAfterTestDiscoveryHooksAsync(CancellationToken can } catch (Exception ex) { - throw new AfterTestDiscoveryException("AfterTestDiscovery hook failed", ex); + throw new AfterTestDiscoveryException($"AfterTestDiscovery hook failed: {ex.Message}", ex); } } } From 600a8a74b45cb4f2ca44d2a6e9e57511ada01c36 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 8 Dec 2025 00:31:16 +0000 Subject: [PATCH 166/192] chore: update benchmark results (#4009) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 16 +- docs/docs/benchmarks/index.md | 4 +- docs/static/benchmarks/AsyncTests.json | 42 +-- docs/static/benchmarks/BuildTime.json | 30 +- docs/static/benchmarks/DataDrivenTests.json | 42 +-- .../benchmarks/MassiveParallelTests.json | 42 +-- docs/static/benchmarks/MatrixTests.json | 42 +-- docs/static/benchmarks/ScaleTests.json | 42 +-- .../static/benchmarks/SetupTeardownTests.json | 34 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 264 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 336 insertions(+), 332 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index e244cce428..6302e229ce 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 568.5 ms | 568.2 ms | 2.94 ms | -| NUnit | 4.4.0 | 787.8 ms | 785.5 ms | 7.98 ms | -| MSTest | 4.0.2 | 674.0 ms | 673.4 ms | 4.57 ms | -| xUnit3 | 3.2.1 | 751.1 ms | 750.7 ms | 6.33 ms | -| **TUnit (AOT)** | 1.3.25 | 124.7 ms | 124.8 ms | 0.19 ms | +| **TUnit** | 1.3.25 | 572.6 ms | 572.4 ms | 4.96 ms | +| NUnit | 4.4.0 | 754.3 ms | 750.6 ms | 8.29 ms | +| MSTest | 4.0.2 | 627.7 ms | 627.7 ms | 7.49 ms | +| xUnit3 | 3.2.1 | 709.3 ms | 709.4 ms | 4.49 ms | +| **TUnit (AOT)** | 1.3.25 | 124.0 ms | 124.1 ms | 0.50 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 946 - bar [568.5, 787.8, 674, 751.1, 124.7] + y-axis "Time (ms)" 0 --> 906 + bar [572.6, 754.3, 627.7, 709.3, 124] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.679Z* +*Last generated: 2025-12-08T00:31:02.925Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 952ba578ec..15f0123047 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 2.046 s | 2.052 s | 0.0208 s | -| Build_NUnit | 4.4.0 | 1.643 s | 1.643 s | 0.0154 s | -| Build_MSTest | 4.0.2 | 1.708 s | 1.705 s | 0.0136 s | -| Build_xUnit3 | 3.2.1 | 1.621 s | 1.618 s | 0.0193 s | +| **TUnit** | 1.3.25 | 2.075 s | 2.069 s | 0.0233 s | +| Build_NUnit | 4.4.0 | 1.652 s | 1.655 s | 0.0154 s | +| Build_MSTest | 4.0.2 | 1.737 s | 1.735 s | 0.0125 s | +| Build_xUnit3 | 3.2.1 | 1.639 s | 1.637 s | 0.0125 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.046, 1.643, 1.708, 1.621] + bar [2.075, 1.652, 1.737, 1.639] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.681Z* +*Last generated: 2025-12-08T00:31:02.927Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 1d5d13ffe1..e611409fca 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 501.49 ms | 500.65 ms | 4.437 ms | -| NUnit | 4.4.0 | 649.96 ms | 648.29 ms | 6.379 ms | -| MSTest | 4.0.2 | 621.30 ms | 619.30 ms | 7.369 ms | -| xUnit3 | 3.2.1 | 614.67 ms | 612.39 ms | 6.589 ms | -| **TUnit (AOT)** | 1.3.25 | 25.06 ms | 25.16 ms | 0.372 ms | +| **TUnit** | 1.3.25 | 509.64 ms | 508.05 ms | 5.473 ms | +| NUnit | 4.4.0 | 626.37 ms | 625.58 ms | 7.981 ms | +| MSTest | 4.0.2 | 497.72 ms | 496.51 ms | 10.539 ms | +| xUnit3 | 3.2.1 | 578.03 ms | 576.79 ms | 6.476 ms | +| **TUnit (AOT)** | 1.3.25 | 24.83 ms | 24.75 ms | 0.186 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 780 - bar [501.49, 649.96, 621.3, 614.67, 25.06] + y-axis "Time (ms)" 0 --> 752 + bar [509.64, 626.37, 497.72, 578.03, 24.83] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.679Z* +*Last generated: 2025-12-08T00:31:02.925Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 5f44cc88d5..a38eb2768d 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 581.1 ms | 580.1 ms | 4.80 ms | -| NUnit | 4.4.0 | 1,280.5 ms | 1,281.2 ms | 6.21 ms | -| MSTest | 4.0.2 | 3,004.7 ms | 3,003.7 ms | 6.26 ms | -| xUnit3 | 3.2.1 | 3,078.4 ms | 3,073.8 ms | 15.95 ms | -| **TUnit (AOT)** | 1.3.25 | 130.0 ms | 129.9 ms | 0.54 ms | +| **TUnit** | 1.3.25 | 601.6 ms | 600.8 ms | 2.29 ms | +| NUnit | 4.4.0 | 1,262.9 ms | 1,263.1 ms | 7.14 ms | +| MSTest | 4.0.2 | 2,958.2 ms | 2,958.3 ms | 12.65 ms | +| xUnit3 | 3.2.1 | 3,049.5 ms | 3,045.3 ms | 8.63 ms | +| **TUnit (AOT)** | 1.3.25 | 131.0 ms | 130.8 ms | 0.75 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3695 - bar [581.1, 1280.5, 3004.7, 3078.4, 130] + y-axis "Time (ms)" 0 --> 3660 + bar [601.6, 1262.9, 2958.2, 3049.5, 131] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.679Z* +*Last generated: 2025-12-08T00:31:02.925Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index 664923eef0..cbae2a268e 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 572.59 ms | 571.95 ms | 4.628 ms | -| NUnit | 4.4.0 | 1,671.90 ms | 1,667.50 ms | 13.020 ms | -| MSTest | 4.0.2 | 1,530.26 ms | 1,527.81 ms | 9.974 ms | -| xUnit3 | 3.2.1 | 1,617.37 ms | 1,619.54 ms | 6.699 ms | -| **TUnit (AOT)** | 1.3.25 | 80.09 ms | 80.13 ms | 0.250 ms | +| **TUnit** | 1.3.25 | 557.44 ms | 558.56 ms | 4.266 ms | +| NUnit | 4.4.0 | 1,617.68 ms | 1,615.87 ms | 7.997 ms | +| MSTest | 4.0.2 | 1,482.07 ms | 1,481.63 ms | 4.802 ms | +| xUnit3 | 3.2.1 | 1,582.16 ms | 1,583.58 ms | 11.600 ms | +| **TUnit (AOT)** | 1.3.25 | 78.68 ms | 78.69 ms | 0.335 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 2007 - bar [572.59, 1671.9, 1530.26, 1617.37, 80.09] + y-axis "Time (ms)" 0 --> 1942 + bar [557.44, 1617.68, 1482.07, 1582.16, 78.68] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.680Z* +*Last generated: 2025-12-08T00:31:02.925Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 2b5c1331cc..57b7a85ab0 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 524.64 ms | 525.21 ms | 3.822 ms | -| NUnit | 4.4.0 | 668.92 ms | 668.72 ms | 9.454 ms | -| MSTest | 4.0.2 | 505.87 ms | 506.54 ms | 14.411 ms | -| xUnit3 | 3.2.1 | 588.42 ms | 585.27 ms | 13.938 ms | -| **TUnit (AOT)** | 1.3.25 | 45.69 ms | 45.54 ms | 3.688 ms | +| **TUnit** | 1.3.25 | 530.41 ms | 530.67 ms | 6.185 ms | +| NUnit | 4.4.0 | 668.03 ms | 666.16 ms | 8.387 ms | +| MSTest | 4.0.2 | 492.81 ms | 491.68 ms | 10.936 ms | +| xUnit3 | 3.2.1 | 578.72 ms | 577.33 ms | 9.827 ms | +| **TUnit (AOT)** | 1.3.25 | 43.70 ms | 42.95 ms | 3.787 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 803 - bar [524.64, 668.92, 505.87, 588.42, 45.69] + y-axis "Time (ms)" 0 --> 802 + bar [530.41, 668.03, 492.81, 578.72, 43.7] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.680Z* +*Last generated: 2025-12-08T00:31:02.926Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index a34853e837..4a39b85bf1 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-07** from the latest CI run. +This benchmark was automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,10 +16,10 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 574.5 ms | 572.8 ms | 6.91 ms | -| NUnit | 4.4.0 | 1,290.0 ms | 1,292.3 ms | 13.26 ms | -| MSTest | 4.0.2 | 1,123.5 ms | 1,125.0 ms | 8.70 ms | -| xUnit3 | 3.2.1 | 1,208.5 ms | 1,208.1 ms | 14.62 ms | +| **TUnit** | 1.3.25 | 568.0 ms | 568.2 ms | 3.79 ms | +| NUnit | 4.4.0 | 1,275.7 ms | 1,275.6 ms | 6.97 ms | +| MSTest | 4.0.2 | 1,111.2 ms | 1,109.8 ms | 11.36 ms | +| xUnit3 | 3.2.1 | 1,198.2 ms | 1,197.5 ms | 7.29 ms | | **TUnit (AOT)** | 1.3.25 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-07** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1548 - bar [574.5, 1290, 1123.5, 1208.5, 0] + y-axis "Time (ms)" 0 --> 1531 + bar [568, 1275.7, 1111.2, 1198.2, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-07T00:31:50.680Z* +*Last generated: 2025-12-08T00:31:02.926Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 7a7950cd8a..ed0611bbee 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-07** from the latest CI run. +These benchmarks were automatically generated on **2025-12-08** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-07T00:31:50.681Z* +*Last generated: 2025-12-08T00:31:02.927Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 1e72945257..ee8d2556df 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.679Z", + "timestamp": "2025-12-08T00:31:02.925Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "568.5 ms", - "Error": "3.15 ms", - "StdDev": "2.94 ms", - "Median": "568.2 ms" + "Mean": "572.6 ms", + "Error": "5.59 ms", + "StdDev": "4.96 ms", + "Median": "572.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "787.8 ms", - "Error": "9.56 ms", - "StdDev": "7.98 ms", - "Median": "785.5 ms" + "Mean": "754.3 ms", + "Error": "8.86 ms", + "StdDev": "8.29 ms", + "Median": "750.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "674.0 ms", - "Error": "5.85 ms", - "StdDev": "4.57 ms", - "Median": "673.4 ms" + "Mean": "627.7 ms", + "Error": "8.45 ms", + "StdDev": "7.49 ms", + "Median": "627.7 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "751.1 ms", - "Error": "7.14 ms", - "StdDev": "6.33 ms", - "Median": "750.7 ms" + "Mean": "709.3 ms", + "Error": "5.37 ms", + "StdDev": "4.49 ms", + "Median": "709.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "124.7 ms", - "Error": "0.22 ms", - "StdDev": "0.19 ms", - "Median": "124.8 ms" + "Mean": "124.0 ms", + "Error": "0.53 ms", + "StdDev": "0.50 ms", + "Median": "124.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 6a9484442d..7daa600b7b 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.681Z", + "timestamp": "2025-12-08T00:31:02.927Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "2.046 s", - "Error": "0.0222 s", - "StdDev": "0.0208 s", - "Median": "2.052 s" + "Mean": "2.075 s", + "Error": "0.0262 s", + "StdDev": "0.0233 s", + "Median": "2.069 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.643 s", + "Mean": "1.652 s", "Error": "0.0165 s", "StdDev": "0.0154 s", - "Median": "1.643 s" + "Median": "1.655 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.708 s", - "Error": "0.0145 s", - "StdDev": "0.0136 s", - "Median": "1.705 s" + "Mean": "1.737 s", + "Error": "0.0133 s", + "StdDev": "0.0125 s", + "Median": "1.735 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.621 s", - "Error": "0.0206 s", - "StdDev": "0.0193 s", - "Median": "1.618 s" + "Mean": "1.639 s", + "Error": "0.0134 s", + "StdDev": "0.0125 s", + "Median": "1.637 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 54667a4388..3e3843da19 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.679Z", + "timestamp": "2025-12-08T00:31:02.925Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "501.49 ms", - "Error": "4.743 ms", - "StdDev": "4.437 ms", - "Median": "500.65 ms" + "Mean": "509.64 ms", + "Error": "5.851 ms", + "StdDev": "5.473 ms", + "Median": "508.05 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "649.96 ms", - "Error": "6.819 ms", - "StdDev": "6.379 ms", - "Median": "648.29 ms" + "Mean": "626.37 ms", + "Error": "9.003 ms", + "StdDev": "7.981 ms", + "Median": "625.58 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "621.30 ms", - "Error": "8.824 ms", - "StdDev": "7.369 ms", - "Median": "619.30 ms" + "Mean": "497.72 ms", + "Error": "9.850 ms", + "StdDev": "10.539 ms", + "Median": "496.51 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "614.67 ms", - "Error": "7.433 ms", - "StdDev": "6.589 ms", - "Median": "612.39 ms" + "Mean": "578.03 ms", + "Error": "7.305 ms", + "StdDev": "6.476 ms", + "Median": "576.79 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "25.06 ms", - "Error": "0.397 ms", - "StdDev": "0.372 ms", - "Median": "25.16 ms" + "Mean": "24.83 ms", + "Error": "0.210 ms", + "StdDev": "0.186 ms", + "Median": "24.75 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 94638c698c..48d1a1ef3f 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.679Z", + "timestamp": "2025-12-08T00:31:02.925Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "581.1 ms", - "Error": "5.13 ms", - "StdDev": "4.80 ms", - "Median": "580.1 ms" + "Mean": "601.6 ms", + "Error": "2.93 ms", + "StdDev": "2.29 ms", + "Median": "600.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,280.5 ms", - "Error": "6.64 ms", - "StdDev": "6.21 ms", - "Median": "1,281.2 ms" + "Mean": "1,262.9 ms", + "Error": "8.05 ms", + "StdDev": "7.14 ms", + "Median": "1,263.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,004.7 ms", - "Error": "6.69 ms", - "StdDev": "6.26 ms", - "Median": "3,003.7 ms" + "Mean": "2,958.2 ms", + "Error": "14.27 ms", + "StdDev": "12.65 ms", + "Median": "2,958.3 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,078.4 ms", - "Error": "17.05 ms", - "StdDev": "15.95 ms", - "Median": "3,073.8 ms" + "Mean": "3,049.5 ms", + "Error": "10.33 ms", + "StdDev": "8.63 ms", + "Median": "3,045.3 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "130.0 ms", - "Error": "0.58 ms", - "StdDev": "0.54 ms", - "Median": "129.9 ms" + "Mean": "131.0 ms", + "Error": "0.85 ms", + "StdDev": "0.75 ms", + "Median": "130.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 703af38565..130f3c7a62 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.680Z", + "timestamp": "2025-12-08T00:31:02.926Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "572.59 ms", - "Error": "4.948 ms", - "StdDev": "4.628 ms", - "Median": "571.95 ms" + "Mean": "557.44 ms", + "Error": "4.812 ms", + "StdDev": "4.266 ms", + "Median": "558.56 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,671.90 ms", - "Error": "14.687 ms", - "StdDev": "13.020 ms", - "Median": "1,667.50 ms" + "Mean": "1,617.68 ms", + "Error": "8.550 ms", + "StdDev": "7.997 ms", + "Median": "1,615.87 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,530.26 ms", - "Error": "10.662 ms", - "StdDev": "9.974 ms", - "Median": "1,527.81 ms" + "Mean": "1,482.07 ms", + "Error": "5.416 ms", + "StdDev": "4.802 ms", + "Median": "1,481.63 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,617.37 ms", - "Error": "8.022 ms", - "StdDev": "6.699 ms", - "Median": "1,619.54 ms" + "Mean": "1,582.16 ms", + "Error": "12.401 ms", + "StdDev": "11.600 ms", + "Median": "1,583.58 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "80.09 ms", - "Error": "0.282 ms", - "StdDev": "0.250 ms", - "Median": "80.13 ms" + "Mean": "78.68 ms", + "Error": "0.377 ms", + "StdDev": "0.335 ms", + "Median": "78.69 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index b11706a144..d511352639 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.680Z", + "timestamp": "2025-12-08T00:31:02.926Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,42 +10,42 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "524.64 ms", - "Error": "4.312 ms", - "StdDev": "3.822 ms", - "Median": "525.21 ms" + "Mean": "530.41 ms", + "Error": "6.612 ms", + "StdDev": "6.185 ms", + "Median": "530.67 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "668.92 ms", - "Error": "10.107 ms", - "StdDev": "9.454 ms", - "Median": "668.72 ms" + "Mean": "668.03 ms", + "Error": "9.461 ms", + "StdDev": "8.387 ms", + "Median": "666.16 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "505.87 ms", - "Error": "10.049 ms", - "StdDev": "14.411 ms", - "Median": "506.54 ms" + "Mean": "492.81 ms", + "Error": "9.839 ms", + "StdDev": "10.936 ms", + "Median": "491.68 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "588.42 ms", - "Error": "11.349 ms", - "StdDev": "13.938 ms", - "Median": "585.27 ms" + "Mean": "578.72 ms", + "Error": "11.086 ms", + "StdDev": "9.827 ms", + "Median": "577.33 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "45.69 ms", - "Error": "1.251 ms", - "StdDev": "3.688 ms", - "Median": "45.54 ms" + "Mean": "43.70 ms", + "Error": "1.284 ms", + "StdDev": "3.787 ms", + "Median": "42.95 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 2a53f21d33..831c4c8747 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.680Z", + "timestamp": "2025-12-08T00:31:02.926Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -10,34 +10,34 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "574.5 ms", - "Error": "7.39 ms", - "StdDev": "6.91 ms", - "Median": "572.8 ms" + "Mean": "568.0 ms", + "Error": "4.28 ms", + "StdDev": "3.79 ms", + "Median": "568.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,290.0 ms", - "Error": "14.17 ms", - "StdDev": "13.26 ms", - "Median": "1,292.3 ms" + "Mean": "1,275.7 ms", + "Error": "7.86 ms", + "StdDev": "6.97 ms", + "Median": "1,275.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,123.5 ms", - "Error": "9.30 ms", - "StdDev": "8.70 ms", - "Median": "1,125.0 ms" + "Mean": "1,111.2 ms", + "Error": "12.15 ms", + "StdDev": "11.36 ms", + "Median": "1,109.8 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,208.5 ms", - "Error": "16.50 ms", - "StdDev": "14.62 ms", - "Median": "1,208.1 ms" + "Mean": "1,198.2 ms", + "Error": "8.23 ms", + "StdDev": "7.29 ms", + "Median": "1,197.5 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 598ddeb015..8d3f9f9fe5 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -110,5 +110,9 @@ { "date": "2025-12-07", "environment": "Ubuntu" + }, + { + "date": "2025-12-08", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 75481d1843..87cc8477bd 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T00:31:50.681Z", + "timestamp": "2025-12-08T00:31:02.927Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -10,244 +10,244 @@ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "568.5 ms", - "Error": "3.15 ms", - "StdDev": "2.94 ms", - "Median": "568.2 ms" + "Mean": "572.6 ms", + "Error": "5.59 ms", + "StdDev": "4.96 ms", + "Median": "572.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "787.8 ms", - "Error": "9.56 ms", - "StdDev": "7.98 ms", - "Median": "785.5 ms" + "Mean": "754.3 ms", + "Error": "8.86 ms", + "StdDev": "8.29 ms", + "Median": "750.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "674.0 ms", - "Error": "5.85 ms", - "StdDev": "4.57 ms", - "Median": "673.4 ms" + "Mean": "627.7 ms", + "Error": "8.45 ms", + "StdDev": "7.49 ms", + "Median": "627.7 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "751.1 ms", - "Error": "7.14 ms", - "StdDev": "6.33 ms", - "Median": "750.7 ms" + "Mean": "709.3 ms", + "Error": "5.37 ms", + "StdDev": "4.49 ms", + "Median": "709.4 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "124.7 ms", - "Error": "0.22 ms", - "StdDev": "0.19 ms", - "Median": "124.8 ms" + "Mean": "124.0 ms", + "Error": "0.53 ms", + "StdDev": "0.50 ms", + "Median": "124.1 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "501.49 ms", - "Error": "4.743 ms", - "StdDev": "4.437 ms", - "Median": "500.65 ms" + "Mean": "509.64 ms", + "Error": "5.851 ms", + "StdDev": "5.473 ms", + "Median": "508.05 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "649.96 ms", - "Error": "6.819 ms", - "StdDev": "6.379 ms", - "Median": "648.29 ms" + "Mean": "626.37 ms", + "Error": "9.003 ms", + "StdDev": "7.981 ms", + "Median": "625.58 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "621.30 ms", - "Error": "8.824 ms", - "StdDev": "7.369 ms", - "Median": "619.30 ms" + "Mean": "497.72 ms", + "Error": "9.850 ms", + "StdDev": "10.539 ms", + "Median": "496.51 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "614.67 ms", - "Error": "7.433 ms", - "StdDev": "6.589 ms", - "Median": "612.39 ms" + "Mean": "578.03 ms", + "Error": "7.305 ms", + "StdDev": "6.476 ms", + "Median": "576.79 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "25.06 ms", - "Error": "0.397 ms", - "StdDev": "0.372 ms", - "Median": "25.16 ms" + "Mean": "24.83 ms", + "Error": "0.210 ms", + "StdDev": "0.186 ms", + "Median": "24.75 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "581.1 ms", - "Error": "5.13 ms", - "StdDev": "4.80 ms", - "Median": "580.1 ms" + "Mean": "601.6 ms", + "Error": "2.93 ms", + "StdDev": "2.29 ms", + "Median": "600.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,280.5 ms", - "Error": "6.64 ms", - "StdDev": "6.21 ms", - "Median": "1,281.2 ms" + "Mean": "1,262.9 ms", + "Error": "8.05 ms", + "StdDev": "7.14 ms", + "Median": "1,263.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,004.7 ms", - "Error": "6.69 ms", - "StdDev": "6.26 ms", - "Median": "3,003.7 ms" + "Mean": "2,958.2 ms", + "Error": "14.27 ms", + "StdDev": "12.65 ms", + "Median": "2,958.3 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,078.4 ms", - "Error": "17.05 ms", - "StdDev": "15.95 ms", - "Median": "3,073.8 ms" + "Mean": "3,049.5 ms", + "Error": "10.33 ms", + "StdDev": "8.63 ms", + "Median": "3,045.3 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "130.0 ms", - "Error": "0.58 ms", - "StdDev": "0.54 ms", - "Median": "129.9 ms" + "Mean": "131.0 ms", + "Error": "0.85 ms", + "StdDev": "0.75 ms", + "Median": "130.8 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "572.59 ms", - "Error": "4.948 ms", - "StdDev": "4.628 ms", - "Median": "571.95 ms" + "Mean": "557.44 ms", + "Error": "4.812 ms", + "StdDev": "4.266 ms", + "Median": "558.56 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,671.90 ms", - "Error": "14.687 ms", - "StdDev": "13.020 ms", - "Median": "1,667.50 ms" + "Mean": "1,617.68 ms", + "Error": "8.550 ms", + "StdDev": "7.997 ms", + "Median": "1,615.87 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,530.26 ms", - "Error": "10.662 ms", - "StdDev": "9.974 ms", - "Median": "1,527.81 ms" + "Mean": "1,482.07 ms", + "Error": "5.416 ms", + "StdDev": "4.802 ms", + "Median": "1,481.63 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,617.37 ms", - "Error": "8.022 ms", - "StdDev": "6.699 ms", - "Median": "1,619.54 ms" + "Mean": "1,582.16 ms", + "Error": "12.401 ms", + "StdDev": "11.600 ms", + "Median": "1,583.58 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "80.09 ms", - "Error": "0.282 ms", - "StdDev": "0.250 ms", - "Median": "80.13 ms" + "Mean": "78.68 ms", + "Error": "0.377 ms", + "StdDev": "0.335 ms", + "Median": "78.69 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "524.64 ms", - "Error": "4.312 ms", - "StdDev": "3.822 ms", - "Median": "525.21 ms" + "Mean": "530.41 ms", + "Error": "6.612 ms", + "StdDev": "6.185 ms", + "Median": "530.67 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "668.92 ms", - "Error": "10.107 ms", - "StdDev": "9.454 ms", - "Median": "668.72 ms" + "Mean": "668.03 ms", + "Error": "9.461 ms", + "StdDev": "8.387 ms", + "Median": "666.16 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "505.87 ms", - "Error": "10.049 ms", - "StdDev": "14.411 ms", - "Median": "506.54 ms" + "Mean": "492.81 ms", + "Error": "9.839 ms", + "StdDev": "10.936 ms", + "Median": "491.68 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "588.42 ms", - "Error": "11.349 ms", - "StdDev": "13.938 ms", - "Median": "585.27 ms" + "Mean": "578.72 ms", + "Error": "11.086 ms", + "StdDev": "9.827 ms", + "Median": "577.33 ms" }, { "Method": "TUnit_AOT", "Version": "1.3.25", - "Mean": "45.69 ms", - "Error": "1.251 ms", - "StdDev": "3.688 ms", - "Median": "45.54 ms" + "Mean": "43.70 ms", + "Error": "1.284 ms", + "StdDev": "3.787 ms", + "Median": "42.95 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.3.25", - "Mean": "574.5 ms", - "Error": "7.39 ms", - "StdDev": "6.91 ms", - "Median": "572.8 ms" + "Mean": "568.0 ms", + "Error": "4.28 ms", + "StdDev": "3.79 ms", + "Median": "568.2 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,290.0 ms", - "Error": "14.17 ms", - "StdDev": "13.26 ms", - "Median": "1,292.3 ms" + "Mean": "1,275.7 ms", + "Error": "7.86 ms", + "StdDev": "6.97 ms", + "Median": "1,275.6 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,123.5 ms", - "Error": "9.30 ms", - "StdDev": "8.70 ms", - "Median": "1,125.0 ms" + "Mean": "1,111.2 ms", + "Error": "12.15 ms", + "StdDev": "11.36 ms", + "Median": "1,109.8 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,208.5 ms", - "Error": "16.50 ms", - "StdDev": "14.62 ms", - "Median": "1,208.1 ms" + "Mean": "1,198.2 ms", + "Error": "8.23 ms", + "StdDev": "7.29 ms", + "Median": "1,197.5 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.3.25", - "Mean": "2.046 s", - "Error": "0.0222 s", - "StdDev": "0.0208 s", - "Median": "2.052 s" + "Mean": "2.075 s", + "Error": "0.0262 s", + "StdDev": "0.0233 s", + "Median": "2.069 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.643 s", + "Mean": "1.652 s", "Error": "0.0165 s", "StdDev": "0.0154 s", - "Median": "1.643 s" + "Median": "1.655 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.708 s", - "Error": "0.0145 s", - "StdDev": "0.0136 s", - "Median": "1.705 s" + "Mean": "1.737 s", + "Error": "0.0133 s", + "StdDev": "0.0125 s", + "Median": "1.735 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.621 s", - "Error": "0.0206 s", - "StdDev": "0.0193 s", - "Median": "1.618 s" + "Mean": "1.639 s", + "Error": "0.0134 s", + "StdDev": "0.0125 s", + "Median": "1.637 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-07T00:31:50.678Z" + "lastUpdated": "2025-12-08T00:31:02.924Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index ea3d1c35d1..f547bddc9a 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-07", + "timestamp": "2025-12-08", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 2363d2537081ffc03fbc7b959b89afdab3423728 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 8 Dec 2025 01:12:35 +0000 Subject: [PATCH 167/192] chore(deps): update actions/checkout action to v6 (#3980) Co-authored-by: Renovate Bot --- .github/workflows/claude-code-review.yml | 2 +- .github/workflows/claude.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 7b5ae6cac4..d417609300 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -48,7 +48,7 @@ jobs: return pr; - name: Checkout PR branch - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'workflow_dispatch' && steps.pr-info.outputs.ref || github.event.pull_request.head.ref }} repository: ${{ github.event_name == 'workflow_dispatch' && steps.pr-info.outputs.repo || github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index d300267f18..94dcce5581 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -26,7 +26,7 @@ jobs: actions: read # Required for Claude to read CI results on PRs steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 1 From 5d8a5215500c22bd52999dedfcbaeee18c334994 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 01:13:07 +0000 Subject: [PATCH 168/192] chore(deps): bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /docs (#3963) Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases) - [Commits](https://github.com/syntax-tree/mdast-util-to-hast/compare/13.2.0...13.2.1) --- updated-dependencies: - dependency-name: mdast-util-to-hast dependency-version: 13.2.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 63e350d3d4..3ab069b6b7 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -6512,9 +6512,9 @@ mdast-util-phrasing@^4.0.0: unist-util-is "^6.0.0" mdast-util-to-hast@^13.0.0: - version "13.2.0" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz" - integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" From 4fa02a710fe4151e114cd74fb45929395c24f707 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 8 Dec 2025 01:13:45 +0000 Subject: [PATCH 169/192] chore(deps): update tunit to 1.5.6 (#3988) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 4 ++-- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- .../ExampleNamespace.TestProject.csproj | 2 +- .../content/TUnit.Aspire.Test/ExampleNamespace.csproj | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 4 ++-- TUnit.Templates/content/TUnit.Playwright/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.VB/TestProject.vbproj | 2 +- TUnit.Templates/content/TUnit/TestProject.csproj | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 286884119a..54ba16aeae 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 24b3cf6158..32a72baa09 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 4f4100eb40..cbf783f80f 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 872ec211ef..deaf6f4190 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 1a3e9daad4..645e71de21 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index fa01bb3d55..04838804df 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 250cdeeadd..66151ae388 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 65dd45b257..3e3057e7b4 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index d18b2c8a1e..5affa06433 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file From 0ded6a3763c845e1690b1507ea72d59d06d13115 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 00:29:26 +0000 Subject: [PATCH 170/192] chore: update benchmark results (#4014) --- docs/docs/benchmarks/AsyncTests.md | 18 +- docs/docs/benchmarks/BuildTime.md | 14 +- docs/docs/benchmarks/DataDrivenTests.md | 18 +- docs/docs/benchmarks/MassiveParallelTests.md | 18 +- docs/docs/benchmarks/MatrixTests.md | 18 +- docs/docs/benchmarks/ScaleTests.md | 18 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 6 +- docs/static/benchmarks/AsyncTests.json | 46 +-- docs/static/benchmarks/BuildTime.json | 36 +-- docs/static/benchmarks/DataDrivenTests.json | 46 +-- .../benchmarks/MassiveParallelTests.json | 46 +-- docs/static/benchmarks/MatrixTests.json | 46 +-- docs/static/benchmarks/ScaleTests.json | 44 +-- .../static/benchmarks/SetupTeardownTests.json | 38 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 292 +++++++++--------- docs/static/benchmarks/summary.json | 2 +- 18 files changed, 366 insertions(+), 362 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 6302e229ce..707909493d 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 572.6 ms | 572.4 ms | 4.96 ms | -| NUnit | 4.4.0 | 754.3 ms | 750.6 ms | 8.29 ms | -| MSTest | 4.0.2 | 627.7 ms | 627.7 ms | 7.49 ms | -| xUnit3 | 3.2.1 | 709.3 ms | 709.4 ms | 4.49 ms | -| **TUnit (AOT)** | 1.3.25 | 124.0 ms | 124.1 ms | 0.50 ms | +| **TUnit** | 1.5.6 | 583.0 ms | 583.5 ms | 2.75 ms | +| NUnit | 4.4.0 | 811.7 ms | 812.7 ms | 5.89 ms | +| MSTest | 4.0.2 | 688.5 ms | 689.0 ms | 8.46 ms | +| xUnit3 | 3.2.1 | 773.6 ms | 773.2 ms | 5.60 ms | +| **TUnit (AOT)** | 1.5.6 | 124.6 ms | 124.6 ms | 0.41 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 906 - bar [572.6, 754.3, 627.7, 709.3, 124] + y-axis "Time (ms)" 0 --> 975 + bar [583, 811.7, 688.5, 773.6, 124.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.925Z* +*Last generated: 2025-12-09T00:29:13.178Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 15f0123047..4fa3e24770 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 2.075 s | 2.069 s | 0.0233 s | -| Build_NUnit | 4.4.0 | 1.652 s | 1.655 s | 0.0154 s | -| Build_MSTest | 4.0.2 | 1.737 s | 1.735 s | 0.0125 s | -| Build_xUnit3 | 3.2.1 | 1.639 s | 1.637 s | 0.0125 s | +| **TUnit** | 1.5.6 | 2.067 s | 2.075 s | 0.0363 s | +| Build_NUnit | 4.4.0 | 1.654 s | 1.649 s | 0.0139 s | +| Build_MSTest | 4.0.2 | 1.679 s | 1.678 s | 0.0132 s | +| Build_xUnit3 | 3.2.1 | 1.611 s | 1.616 s | 0.0301 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.075, 1.652, 1.737, 1.639] + bar [2.067, 1.654, 1.679, 1.611] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.927Z* +*Last generated: 2025-12-09T00:29:13.180Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index e611409fca..d665c3f7e1 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 509.64 ms | 508.05 ms | 5.473 ms | -| NUnit | 4.4.0 | 626.37 ms | 625.58 ms | 7.981 ms | -| MSTest | 4.0.2 | 497.72 ms | 496.51 ms | 10.539 ms | -| xUnit3 | 3.2.1 | 578.03 ms | 576.79 ms | 6.476 ms | -| **TUnit (AOT)** | 1.3.25 | 24.83 ms | 24.75 ms | 0.186 ms | +| **TUnit** | 1.5.6 | 496.09 ms | 495.80 ms | 6.452 ms | +| NUnit | 4.4.0 | 604.12 ms | 603.02 ms | 7.033 ms | +| MSTest | 4.0.2 | 471.16 ms | 470.20 ms | 6.149 ms | +| xUnit3 | 3.2.1 | 568.44 ms | 567.48 ms | 4.891 ms | +| **TUnit (AOT)** | 1.5.6 | 24.13 ms | 24.14 ms | 0.074 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 752 - bar [509.64, 626.37, 497.72, 578.03, 24.83] + y-axis "Time (ms)" 0 --> 725 + bar [496.09, 604.12, 471.16, 568.44, 24.13] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.925Z* +*Last generated: 2025-12-09T00:29:13.178Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index a38eb2768d..59c8e23054 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 601.6 ms | 600.8 ms | 2.29 ms | -| NUnit | 4.4.0 | 1,262.9 ms | 1,263.1 ms | 7.14 ms | -| MSTest | 4.0.2 | 2,958.2 ms | 2,958.3 ms | 12.65 ms | -| xUnit3 | 3.2.1 | 3,049.5 ms | 3,045.3 ms | 8.63 ms | -| **TUnit (AOT)** | 1.3.25 | 131.0 ms | 130.8 ms | 0.75 ms | +| **TUnit** | 1.5.6 | 582.8 ms | 583.4 ms | 6.12 ms | +| NUnit | 4.4.0 | 1,263.7 ms | 1,262.1 ms | 8.97 ms | +| MSTest | 4.0.2 | 2,970.4 ms | 2,969.5 ms | 10.25 ms | +| xUnit3 | 3.2.1 | 3,045.0 ms | 3,045.9 ms | 6.20 ms | +| **TUnit (AOT)** | 1.5.6 | 130.3 ms | 130.3 ms | 0.46 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3660 - bar [601.6, 1262.9, 2958.2, 3049.5, 131] + y-axis "Time (ms)" 0 --> 3654 + bar [582.8, 1263.7, 2970.4, 3045, 130.3] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.925Z* +*Last generated: 2025-12-09T00:29:13.178Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index cbae2a268e..fcc8874530 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 557.44 ms | 558.56 ms | 4.266 ms | -| NUnit | 4.4.0 | 1,617.68 ms | 1,615.87 ms | 7.997 ms | -| MSTest | 4.0.2 | 1,482.07 ms | 1,481.63 ms | 4.802 ms | -| xUnit3 | 3.2.1 | 1,582.16 ms | 1,583.58 ms | 11.600 ms | -| **TUnit (AOT)** | 1.3.25 | 78.68 ms | 78.69 ms | 0.335 ms | +| **TUnit** | 1.5.6 | 558.40 ms | 558.35 ms | 6.603 ms | +| NUnit | 4.4.0 | 1,614.95 ms | 1,615.43 ms | 8.118 ms | +| MSTest | 4.0.2 | 1,484.96 ms | 1,484.91 ms | 4.242 ms | +| xUnit3 | 3.2.1 | 1,576.63 ms | 1,575.42 ms | 6.563 ms | +| **TUnit (AOT)** | 1.5.6 | 78.58 ms | 78.49 ms | 0.440 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1942 - bar [557.44, 1617.68, 1482.07, 1582.16, 78.68] + y-axis "Time (ms)" 0 --> 1938 + bar [558.4, 1614.95, 1484.96, 1576.63, 78.58] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.925Z* +*Last generated: 2025-12-09T00:29:13.179Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 57b7a85ab0..b276a68082 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 530.41 ms | 530.67 ms | 6.185 ms | -| NUnit | 4.4.0 | 668.03 ms | 666.16 ms | 8.387 ms | -| MSTest | 4.0.2 | 492.81 ms | 491.68 ms | 10.936 ms | -| xUnit3 | 3.2.1 | 578.72 ms | 577.33 ms | 9.827 ms | -| **TUnit (AOT)** | 1.3.25 | 43.70 ms | 42.95 ms | 3.787 ms | +| **TUnit** | 1.5.6 | 512.24 ms | 511.92 ms | 3.757 ms | +| NUnit | 4.4.0 | 671.21 ms | 672.67 ms | 11.866 ms | +| MSTest | 4.0.2 | 494.89 ms | 491.23 ms | 9.087 ms | +| xUnit3 | 3.2.1 | 578.72 ms | 577.43 ms | 5.419 ms | +| **TUnit (AOT)** | 1.5.6 | 39.20 ms | 39.33 ms | 3.165 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 802 - bar [530.41, 668.03, 492.81, 578.72, 43.7] + y-axis "Time (ms)" 0 --> 806 + bar [512.24, 671.21, 494.89, 578.72, 39.2] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.926Z* +*Last generated: 2025-12-09T00:29:13.179Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 4a39b85bf1..8226e0e2f9 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-08** from the latest CI run. +This benchmark was automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.3.25 | 568.0 ms | 568.2 ms | 3.79 ms | -| NUnit | 4.4.0 | 1,275.7 ms | 1,275.6 ms | 6.97 ms | -| MSTest | 4.0.2 | 1,111.2 ms | 1,109.8 ms | 11.36 ms | -| xUnit3 | 3.2.1 | 1,198.2 ms | 1,197.5 ms | 7.29 ms | -| **TUnit (AOT)** | 1.3.25 | NA | NA | NA | +| **TUnit** | 1.5.6 | 564.3 ms | 564.5 ms | 4.53 ms | +| NUnit | 4.4.0 | 1,270.7 ms | 1,269.2 ms | 7.74 ms | +| MSTest | 4.0.2 | 1,105.3 ms | 1,101.4 ms | 8.42 ms | +| xUnit3 | 3.2.1 | 1,204.2 ms | 1,201.9 ms | 13.76 ms | +| **TUnit (AOT)** | 1.5.6 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-08** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1531 - bar [568, 1275.7, 1111.2, 1198.2, 0] + y-axis "Time (ms)" 0 --> 1525 + bar [564.3, 1270.7, 1105.3, 1204.2, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-08T00:31:02.926Z* +*Last generated: 2025-12-09T00:29:13.179Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index ed0611bbee..0e1beab983 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-08** from the latest CI run. +These benchmarks were automatically generated on **2025-12-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.3.25 | +| **TUnit** | 1.5.6 | | **xUnit v3** | 3.2.1 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-08T00:31:02.927Z* +*Last generated: 2025-12-09T00:29:13.180Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index ee8d2556df..6411918aa7 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.925Z", + "timestamp": "2025-12-09T00:29:13.178Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "572.6 ms", - "Error": "5.59 ms", - "StdDev": "4.96 ms", - "Median": "572.4 ms" + "Version": "1.5.6", + "Mean": "583.0 ms", + "Error": "3.10 ms", + "StdDev": "2.75 ms", + "Median": "583.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "754.3 ms", - "Error": "8.86 ms", - "StdDev": "8.29 ms", - "Median": "750.6 ms" + "Mean": "811.7 ms", + "Error": "7.54 ms", + "StdDev": "5.89 ms", + "Median": "812.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "627.7 ms", - "Error": "8.45 ms", - "StdDev": "7.49 ms", - "Median": "627.7 ms" + "Mean": "688.5 ms", + "Error": "10.13 ms", + "StdDev": "8.46 ms", + "Median": "689.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "709.3 ms", - "Error": "5.37 ms", - "StdDev": "4.49 ms", - "Median": "709.4 ms" + "Mean": "773.6 ms", + "Error": "6.70 ms", + "StdDev": "5.60 ms", + "Median": "773.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "124.0 ms", - "Error": "0.53 ms", - "StdDev": "0.50 ms", - "Median": "124.1 ms" + "Version": "1.5.6", + "Mean": "124.6 ms", + "Error": "0.43 ms", + "StdDev": "0.41 ms", + "Median": "124.6 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 7daa600b7b..158c28baee 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.927Z", + "timestamp": "2025-12-09T00:29:13.180Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,35 +9,35 @@ "results": [ { "Method": "Build_TUnit", - "Version": "1.3.25", - "Mean": "2.075 s", - "Error": "0.0262 s", - "StdDev": "0.0233 s", - "Median": "2.069 s" + "Version": "1.5.6", + "Mean": "2.067 s", + "Error": "0.0389 s", + "StdDev": "0.0363 s", + "Median": "2.075 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.652 s", - "Error": "0.0165 s", - "StdDev": "0.0154 s", - "Median": "1.655 s" + "Mean": "1.654 s", + "Error": "0.0167 s", + "StdDev": "0.0139 s", + "Median": "1.649 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.737 s", - "Error": "0.0133 s", - "StdDev": "0.0125 s", - "Median": "1.735 s" + "Mean": "1.679 s", + "Error": "0.0149 s", + "StdDev": "0.0132 s", + "Median": "1.678 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.639 s", - "Error": "0.0134 s", - "StdDev": "0.0125 s", - "Median": "1.637 s" + "Mean": "1.611 s", + "Error": "0.0322 s", + "StdDev": "0.0301 s", + "Median": "1.616 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 3e3843da19..24622d00a3 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.925Z", + "timestamp": "2025-12-09T00:29:13.178Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "509.64 ms", - "Error": "5.851 ms", - "StdDev": "5.473 ms", - "Median": "508.05 ms" + "Version": "1.5.6", + "Mean": "496.09 ms", + "Error": "6.897 ms", + "StdDev": "6.452 ms", + "Median": "495.80 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "626.37 ms", - "Error": "9.003 ms", - "StdDev": "7.981 ms", - "Median": "625.58 ms" + "Mean": "604.12 ms", + "Error": "7.933 ms", + "StdDev": "7.033 ms", + "Median": "603.02 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "497.72 ms", - "Error": "9.850 ms", - "StdDev": "10.539 ms", - "Median": "496.51 ms" + "Mean": "471.16 ms", + "Error": "6.936 ms", + "StdDev": "6.149 ms", + "Median": "470.20 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "578.03 ms", - "Error": "7.305 ms", - "StdDev": "6.476 ms", - "Median": "576.79 ms" + "Mean": "568.44 ms", + "Error": "5.517 ms", + "StdDev": "4.891 ms", + "Median": "567.48 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "24.83 ms", - "Error": "0.210 ms", - "StdDev": "0.186 ms", - "Median": "24.75 ms" + "Version": "1.5.6", + "Mean": "24.13 ms", + "Error": "0.088 ms", + "StdDev": "0.074 ms", + "Median": "24.14 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index 48d1a1ef3f..b09c1c7f40 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.925Z", + "timestamp": "2025-12-09T00:29:13.179Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "601.6 ms", - "Error": "2.93 ms", - "StdDev": "2.29 ms", - "Median": "600.8 ms" + "Version": "1.5.6", + "Mean": "582.8 ms", + "Error": "6.55 ms", + "StdDev": "6.12 ms", + "Median": "583.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,262.9 ms", - "Error": "8.05 ms", - "StdDev": "7.14 ms", - "Median": "1,263.1 ms" + "Mean": "1,263.7 ms", + "Error": "9.59 ms", + "StdDev": "8.97 ms", + "Median": "1,262.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,958.2 ms", - "Error": "14.27 ms", - "StdDev": "12.65 ms", - "Median": "2,958.3 ms" + "Mean": "2,970.4 ms", + "Error": "12.27 ms", + "StdDev": "10.25 ms", + "Median": "2,969.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,049.5 ms", - "Error": "10.33 ms", - "StdDev": "8.63 ms", - "Median": "3,045.3 ms" + "Mean": "3,045.0 ms", + "Error": "7.42 ms", + "StdDev": "6.20 ms", + "Median": "3,045.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "131.0 ms", - "Error": "0.85 ms", - "StdDev": "0.75 ms", - "Median": "130.8 ms" + "Version": "1.5.6", + "Mean": "130.3 ms", + "Error": "0.50 ms", + "StdDev": "0.46 ms", + "Median": "130.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 130f3c7a62..1533554c7c 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.926Z", + "timestamp": "2025-12-09T00:29:13.179Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "557.44 ms", - "Error": "4.812 ms", - "StdDev": "4.266 ms", - "Median": "558.56 ms" + "Version": "1.5.6", + "Mean": "558.40 ms", + "Error": "7.059 ms", + "StdDev": "6.603 ms", + "Median": "558.35 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,617.68 ms", - "Error": "8.550 ms", - "StdDev": "7.997 ms", - "Median": "1,615.87 ms" + "Mean": "1,614.95 ms", + "Error": "9.157 ms", + "StdDev": "8.118 ms", + "Median": "1,615.43 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,482.07 ms", - "Error": "5.416 ms", - "StdDev": "4.802 ms", - "Median": "1,481.63 ms" + "Mean": "1,484.96 ms", + "Error": "5.434 ms", + "StdDev": "4.242 ms", + "Median": "1,484.91 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,582.16 ms", - "Error": "12.401 ms", - "StdDev": "11.600 ms", - "Median": "1,583.58 ms" + "Mean": "1,576.63 ms", + "Error": "7.017 ms", + "StdDev": "6.563 ms", + "Median": "1,575.42 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "78.68 ms", - "Error": "0.377 ms", - "StdDev": "0.335 ms", - "Median": "78.69 ms" + "Version": "1.5.6", + "Mean": "78.58 ms", + "Error": "0.470 ms", + "StdDev": "0.440 ms", + "Median": "78.49 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index d511352639..09400155ab 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.926Z", + "timestamp": "2025-12-09T00:29:13.179Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "530.41 ms", - "Error": "6.612 ms", - "StdDev": "6.185 ms", - "Median": "530.67 ms" + "Version": "1.5.6", + "Mean": "512.24 ms", + "Error": "4.238 ms", + "StdDev": "3.757 ms", + "Median": "511.92 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "668.03 ms", - "Error": "9.461 ms", - "StdDev": "8.387 ms", - "Median": "666.16 ms" + "Mean": "671.21 ms", + "Error": "12.685 ms", + "StdDev": "11.866 ms", + "Median": "672.67 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "492.81 ms", - "Error": "9.839 ms", - "StdDev": "10.936 ms", - "Median": "491.68 ms" + "Mean": "494.89 ms", + "Error": "9.714 ms", + "StdDev": "9.087 ms", + "Median": "491.23 ms" }, { "Method": "xUnit3", "Version": "3.2.1", "Mean": "578.72 ms", - "Error": "11.086 ms", - "StdDev": "9.827 ms", - "Median": "577.33 ms" + "Error": "5.793 ms", + "StdDev": "5.419 ms", + "Median": "577.43 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "43.70 ms", - "Error": "1.284 ms", - "StdDev": "3.787 ms", - "Median": "42.95 ms" + "Version": "1.5.6", + "Mean": "39.20 ms", + "Error": "1.079 ms", + "StdDev": "3.165 ms", + "Median": "39.33 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 831c4c8747..4cf336c27e 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.926Z", + "timestamp": "2025-12-09T00:29:13.179Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", @@ -9,39 +9,39 @@ "results": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "568.0 ms", - "Error": "4.28 ms", - "StdDev": "3.79 ms", - "Median": "568.2 ms" + "Version": "1.5.6", + "Mean": "564.3 ms", + "Error": "5.11 ms", + "StdDev": "4.53 ms", + "Median": "564.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,275.7 ms", - "Error": "7.86 ms", - "StdDev": "6.97 ms", - "Median": "1,275.6 ms" + "Mean": "1,270.7 ms", + "Error": "9.27 ms", + "StdDev": "7.74 ms", + "Median": "1,269.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,111.2 ms", - "Error": "12.15 ms", - "StdDev": "11.36 ms", - "Median": "1,109.8 ms" + "Mean": "1,105.3 ms", + "Error": "9.00 ms", + "StdDev": "8.42 ms", + "Median": "1,101.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,198.2 ms", - "Error": "8.23 ms", - "StdDev": "7.29 ms", - "Median": "1,197.5 ms" + "Mean": "1,204.2 ms", + "Error": "14.71 ms", + "StdDev": "13.76 ms", + "Median": "1,201.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", + "Version": "1.5.6", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 8d3f9f9fe5..1c741e7941 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -114,5 +114,9 @@ { "date": "2025-12-08", "environment": "Ubuntu" + }, + { + "date": "2025-12-09", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 87cc8477bd..077c374a55 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-08T00:31:02.927Z", + "timestamp": "2025-12-09T00:29:13.180Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "572.6 ms", - "Error": "5.59 ms", - "StdDev": "4.96 ms", - "Median": "572.4 ms" + "Version": "1.5.6", + "Mean": "583.0 ms", + "Error": "3.10 ms", + "StdDev": "2.75 ms", + "Median": "583.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "754.3 ms", - "Error": "8.86 ms", - "StdDev": "8.29 ms", - "Median": "750.6 ms" + "Mean": "811.7 ms", + "Error": "7.54 ms", + "StdDev": "5.89 ms", + "Median": "812.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "627.7 ms", - "Error": "8.45 ms", - "StdDev": "7.49 ms", - "Median": "627.7 ms" + "Mean": "688.5 ms", + "Error": "10.13 ms", + "StdDev": "8.46 ms", + "Median": "689.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "709.3 ms", - "Error": "5.37 ms", - "StdDev": "4.49 ms", - "Median": "709.4 ms" + "Mean": "773.6 ms", + "Error": "6.70 ms", + "StdDev": "5.60 ms", + "Median": "773.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "124.0 ms", - "Error": "0.53 ms", - "StdDev": "0.50 ms", - "Median": "124.1 ms" + "Version": "1.5.6", + "Mean": "124.6 ms", + "Error": "0.43 ms", + "StdDev": "0.41 ms", + "Median": "124.6 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "509.64 ms", - "Error": "5.851 ms", - "StdDev": "5.473 ms", - "Median": "508.05 ms" + "Version": "1.5.6", + "Mean": "496.09 ms", + "Error": "6.897 ms", + "StdDev": "6.452 ms", + "Median": "495.80 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "626.37 ms", - "Error": "9.003 ms", - "StdDev": "7.981 ms", - "Median": "625.58 ms" + "Mean": "604.12 ms", + "Error": "7.933 ms", + "StdDev": "7.033 ms", + "Median": "603.02 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "497.72 ms", - "Error": "9.850 ms", - "StdDev": "10.539 ms", - "Median": "496.51 ms" + "Mean": "471.16 ms", + "Error": "6.936 ms", + "StdDev": "6.149 ms", + "Median": "470.20 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "578.03 ms", - "Error": "7.305 ms", - "StdDev": "6.476 ms", - "Median": "576.79 ms" + "Mean": "568.44 ms", + "Error": "5.517 ms", + "StdDev": "4.891 ms", + "Median": "567.48 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "24.83 ms", - "Error": "0.210 ms", - "StdDev": "0.186 ms", - "Median": "24.75 ms" + "Version": "1.5.6", + "Mean": "24.13 ms", + "Error": "0.088 ms", + "StdDev": "0.074 ms", + "Median": "24.14 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "601.6 ms", - "Error": "2.93 ms", - "StdDev": "2.29 ms", - "Median": "600.8 ms" + "Version": "1.5.6", + "Mean": "582.8 ms", + "Error": "6.55 ms", + "StdDev": "6.12 ms", + "Median": "583.4 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,262.9 ms", - "Error": "8.05 ms", - "StdDev": "7.14 ms", - "Median": "1,263.1 ms" + "Mean": "1,263.7 ms", + "Error": "9.59 ms", + "StdDev": "8.97 ms", + "Median": "1,262.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,958.2 ms", - "Error": "14.27 ms", - "StdDev": "12.65 ms", - "Median": "2,958.3 ms" + "Mean": "2,970.4 ms", + "Error": "12.27 ms", + "StdDev": "10.25 ms", + "Median": "2,969.5 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,049.5 ms", - "Error": "10.33 ms", - "StdDev": "8.63 ms", - "Median": "3,045.3 ms" + "Mean": "3,045.0 ms", + "Error": "7.42 ms", + "StdDev": "6.20 ms", + "Median": "3,045.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "131.0 ms", - "Error": "0.85 ms", - "StdDev": "0.75 ms", - "Median": "130.8 ms" + "Version": "1.5.6", + "Mean": "130.3 ms", + "Error": "0.50 ms", + "StdDev": "0.46 ms", + "Median": "130.3 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "557.44 ms", - "Error": "4.812 ms", - "StdDev": "4.266 ms", - "Median": "558.56 ms" + "Version": "1.5.6", + "Mean": "558.40 ms", + "Error": "7.059 ms", + "StdDev": "6.603 ms", + "Median": "558.35 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,617.68 ms", - "Error": "8.550 ms", - "StdDev": "7.997 ms", - "Median": "1,615.87 ms" + "Mean": "1,614.95 ms", + "Error": "9.157 ms", + "StdDev": "8.118 ms", + "Median": "1,615.43 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,482.07 ms", - "Error": "5.416 ms", - "StdDev": "4.802 ms", - "Median": "1,481.63 ms" + "Mean": "1,484.96 ms", + "Error": "5.434 ms", + "StdDev": "4.242 ms", + "Median": "1,484.91 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,582.16 ms", - "Error": "12.401 ms", - "StdDev": "11.600 ms", - "Median": "1,583.58 ms" + "Mean": "1,576.63 ms", + "Error": "7.017 ms", + "StdDev": "6.563 ms", + "Median": "1,575.42 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "78.68 ms", - "Error": "0.377 ms", - "StdDev": "0.335 ms", - "Median": "78.69 ms" + "Version": "1.5.6", + "Mean": "78.58 ms", + "Error": "0.470 ms", + "StdDev": "0.440 ms", + "Median": "78.49 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "530.41 ms", - "Error": "6.612 ms", - "StdDev": "6.185 ms", - "Median": "530.67 ms" + "Version": "1.5.6", + "Mean": "512.24 ms", + "Error": "4.238 ms", + "StdDev": "3.757 ms", + "Median": "511.92 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "668.03 ms", - "Error": "9.461 ms", - "StdDev": "8.387 ms", - "Median": "666.16 ms" + "Mean": "671.21 ms", + "Error": "12.685 ms", + "StdDev": "11.866 ms", + "Median": "672.67 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "492.81 ms", - "Error": "9.839 ms", - "StdDev": "10.936 ms", - "Median": "491.68 ms" + "Mean": "494.89 ms", + "Error": "9.714 ms", + "StdDev": "9.087 ms", + "Median": "491.23 ms" }, { "Method": "xUnit3", "Version": "3.2.1", "Mean": "578.72 ms", - "Error": "11.086 ms", - "StdDev": "9.827 ms", - "Median": "577.33 ms" + "Error": "5.793 ms", + "StdDev": "5.419 ms", + "Median": "577.43 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", - "Mean": "43.70 ms", - "Error": "1.284 ms", - "StdDev": "3.787 ms", - "Median": "42.95 ms" + "Version": "1.5.6", + "Mean": "39.20 ms", + "Error": "1.079 ms", + "StdDev": "3.165 ms", + "Median": "39.33 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.3.25", - "Mean": "568.0 ms", - "Error": "4.28 ms", - "StdDev": "3.79 ms", - "Median": "568.2 ms" + "Version": "1.5.6", + "Mean": "564.3 ms", + "Error": "5.11 ms", + "StdDev": "4.53 ms", + "Median": "564.5 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,275.7 ms", - "Error": "7.86 ms", - "StdDev": "6.97 ms", - "Median": "1,275.6 ms" + "Mean": "1,270.7 ms", + "Error": "9.27 ms", + "StdDev": "7.74 ms", + "Median": "1,269.2 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,111.2 ms", - "Error": "12.15 ms", - "StdDev": "11.36 ms", - "Median": "1,109.8 ms" + "Mean": "1,105.3 ms", + "Error": "9.00 ms", + "StdDev": "8.42 ms", + "Median": "1,101.4 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,198.2 ms", - "Error": "8.23 ms", - "StdDev": "7.29 ms", - "Median": "1,197.5 ms" + "Mean": "1,204.2 ms", + "Error": "14.71 ms", + "StdDev": "13.76 ms", + "Median": "1,201.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.3.25", + "Version": "1.5.6", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.3.25", - "Mean": "2.075 s", - "Error": "0.0262 s", - "StdDev": "0.0233 s", - "Median": "2.069 s" + "Version": "1.5.6", + "Mean": "2.067 s", + "Error": "0.0389 s", + "StdDev": "0.0363 s", + "Median": "2.075 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.652 s", - "Error": "0.0165 s", - "StdDev": "0.0154 s", - "Median": "1.655 s" + "Mean": "1.654 s", + "Error": "0.0167 s", + "StdDev": "0.0139 s", + "Median": "1.649 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.737 s", - "Error": "0.0133 s", - "StdDev": "0.0125 s", - "Median": "1.735 s" + "Mean": "1.679 s", + "Error": "0.0149 s", + "StdDev": "0.0132 s", + "Median": "1.678 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.639 s", - "Error": "0.0134 s", - "StdDev": "0.0125 s", - "Median": "1.637 s" + "Mean": "1.611 s", + "Error": "0.0322 s", + "StdDev": "0.0301 s", + "Median": "1.616 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-08T00:31:02.924Z" + "lastUpdated": "2025-12-09T00:29:13.177Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index f547bddc9a..1e364879c4 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-08", + "timestamp": "2025-12-09", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file From 9aa0a90f3aad39d06557d80d63ede37e6b34f5c5 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:09:27 +0000 Subject: [PATCH 171/192] Add Skip.Test() documentation for dynamic test skipping (#4018) * Initial plan * Add comprehensive documentation for Skip.Test() method and dynamic skipping Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- docs/docs/test-authoring/skip.md | 155 +++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/docs/docs/test-authoring/skip.md b/docs/docs/test-authoring/skip.md index 58d9ef2aa1..88f6ab48af 100644 --- a/docs/docs/test-authoring/skip.md +++ b/docs/docs/test-authoring/skip.md @@ -64,3 +64,158 @@ public class MyTestClass { } ``` + +## Dynamic Skipping at Runtime + +Sometimes you need to determine whether to skip a test at runtime based on conditions that aren't known until the test executes. For this, you can use the static `Skip.Test(reason)` method. + +### Skip.Test() + +The `Skip.Test(reason)` method allows you to dynamically skip a test from within the test method or hooks. When called, it throws a `SkipTestException` that the test framework catches and marks the test as skipped. + +```csharp +using TUnit.Core; + +namespace MyTestProject; + +public class MyTestClass +{ + [Test] + public async Task MyTest() + { + var apiAvailable = await CheckApiAvailability(); + + if (!apiAvailable) + { + Skip.Test("API is not available"); + } + + // Test continues only if API is available + await CallApi(); + } +} +``` + +### Skip.When() + +For cleaner conditional skipping, you can use `Skip.When(condition, reason)` which skips the test when the condition is `true`: + +```csharp +using TUnit.Core; + +namespace MyTestProject; + +public class MyTestClass +{ + [Test] + public void MyTest() + { + var isCI = Environment.GetEnvironmentVariable("CI") != null; + + Skip.When(isCI, "This test doesn't run in CI environments"); + + // Test continues only when not in CI + RunLocalOnlyTest(); + } +} +``` + +### Skip.Unless() + +Similarly, `Skip.Unless(condition, reason)` skips the test unless the condition is `true`: + +```csharp +using TUnit.Core; + +namespace MyTestProject; + +public class MyTestClass +{ + [Test] + public void MyTest() + { + var hasRequiredPermissions = CheckPermissions(); + + Skip.Unless(hasRequiredPermissions, "User doesn't have required permissions"); + + // Test continues only if user has permissions + PerformPrivilegedOperation(); + } +} +``` + +### Skipping from Hooks + +You can also use `Skip.Test()` in test hooks to skip tests based on setup conditions: + +```csharp +using TUnit.Core; + +namespace MyTestProject; + +public class MyTestClass +{ + [Before(Test)] + public void BeforeEachTest() + { + var databaseAvailable = CheckDatabaseConnection(); + + if (!databaseAvailable) + { + Skip.Test("Database is not available"); + } + } + + [Test] + public void Test1() + { + // This test will be skipped if database is unavailable + } + + [Test] + public void Test2() + { + // This test will also be skipped if database is unavailable + } +} +``` + +You can skip all tests in a class from a `Before(Class)` hook: + +```csharp +using TUnit.Core; + +namespace MyTestProject; + +public class MyTestClass +{ + [Before(Class)] + public static void BeforeAllTests() + { + var serviceAvailable = CheckExternalService(); + + if (!serviceAvailable) + { + Skip.Test("External service is not available"); + } + } + + [Test] + public void Test1() + { + // All tests in this class will be skipped if service is unavailable + } +} +``` + +### When to Use Dynamic Skipping + +Use `Skip.Test()` and its variants when: +- The skip condition depends on runtime state (external services, environment variables, etc.) +- You need to perform some logic or API calls to determine if a test should run +- The skip decision is based on test setup or initialization results + +Use `[Skip]` attribute when: +- The skip condition is known at compile time or discovery time +- You want to skip tests based on static configuration or platform checks +- You need custom skip logic in a reusable attribute From f52bd5f81446b7c52cabdb7770549eaa2ef530e2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:11:18 +0000 Subject: [PATCH 172/192] Remove Skip.When() and Skip.Unless() examples Remove examples for Skip.When() and Skip.Unless() methods. --- docs/docs/test-authoring/skip.md | 47 -------------------------------- 1 file changed, 47 deletions(-) diff --git a/docs/docs/test-authoring/skip.md b/docs/docs/test-authoring/skip.md index 88f6ab48af..02d8387d03 100644 --- a/docs/docs/test-authoring/skip.md +++ b/docs/docs/test-authoring/skip.md @@ -96,53 +96,6 @@ public class MyTestClass } ``` -### Skip.When() - -For cleaner conditional skipping, you can use `Skip.When(condition, reason)` which skips the test when the condition is `true`: - -```csharp -using TUnit.Core; - -namespace MyTestProject; - -public class MyTestClass -{ - [Test] - public void MyTest() - { - var isCI = Environment.GetEnvironmentVariable("CI") != null; - - Skip.When(isCI, "This test doesn't run in CI environments"); - - // Test continues only when not in CI - RunLocalOnlyTest(); - } -} -``` - -### Skip.Unless() - -Similarly, `Skip.Unless(condition, reason)` skips the test unless the condition is `true`: - -```csharp -using TUnit.Core; - -namespace MyTestProject; - -public class MyTestClass -{ - [Test] - public void MyTest() - { - var hasRequiredPermissions = CheckPermissions(); - - Skip.Unless(hasRequiredPermissions, "User doesn't have required permissions"); - - // Test continues only if user has permissions - PerformPrivilegedOperation(); - } -} -``` ### Skipping from Hooks From 82d177106a21fbcdffdbde784f56e0c2efeb2000 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:52:19 +0000 Subject: [PATCH 173/192] Fix documentation to use --treenode-filter instead of unsupported --filter syntax (#4020) * Initial plan * Update docs to use correct --treenode-filter syntax instead of --filter Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- docs/docs/advanced/performance-best-practices.md | 11 ++++++++--- docs/docs/examples/tunit-ci-pipeline.md | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/docs/advanced/performance-best-practices.md b/docs/docs/advanced/performance-best-practices.md index 3e7f0abb2f..15034990fd 100644 --- a/docs/docs/advanced/performance-best-practices.md +++ b/docs/docs/advanced/performance-best-practices.md @@ -482,15 +482,20 @@ public class InMemoryDatabaseTests ```bash # Run fast unit tests first -dotnet test --filter "Category=Unit" --no-build +dotnet test --no-build -- --treenode-filter "/*/*/*/*[Category=Unit]" # Run slower integration tests separately -dotnet test --filter "Category=Integration" --no-build +dotnet test --no-build -- --treenode-filter "/*/*/*/*[Category=Integration]" # Run expensive E2E tests last -dotnet test --filter "Category=E2E" --no-build +dotnet test --no-build -- --treenode-filter "/*/*/*/*[Category=E2E]" ``` +> **Note**: With .NET 10 SDK or newer, you can use the simpler syntax: +> ```bash +> dotnet test --no-build --treenode-filter "/**[Category=Unit]" +> ``` + ### Use Test Result Caching ```xml diff --git a/docs/docs/examples/tunit-ci-pipeline.md b/docs/docs/examples/tunit-ci-pipeline.md index 07ea89d282..3d2bff9aab 100644 --- a/docs/docs/examples/tunit-ci-pipeline.md +++ b/docs/docs/examples/tunit-ci-pipeline.md @@ -331,7 +331,7 @@ test:integration: - build script: - dotnet test --configuration $BUILD_CONFIGURATION --no-build - --filter "Category=Integration" + -- --treenode-filter "/*/*/*/*[Category=Integration]" --report-trx --results-directory ./TestResults artifacts: when: always @@ -590,13 +590,18 @@ Run different test categories in separate jobs: ```yaml # Unit tests (fast) - name: Unit Tests - run: dotnet test --filter "Category=Unit" + run: dotnet test -- --treenode-filter "/*/*/*/*[Category=Unit]" # Integration tests (slower) - name: Integration Tests - run: dotnet test --filter "Category=Integration" + run: dotnet test -- --treenode-filter "/*/*/*/*[Category=Integration]" ``` +> **Note**: With .NET 10 SDK or newer, you can use the simpler syntax without the `--` separator: +> ```yaml +> run: dotnet test --treenode-filter "/**[Category=Unit]" +> ``` + ### Fail Fast in PRs Use fail-fast mode for quick feedback in pull requests: From 5371cd2f2b9adf21f27db7d45f3117a4613eaa11 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:56:14 +0000 Subject: [PATCH 174/192] Add sponsorship link to documentation and homepage --- docs/docusaurus.config.ts | 5 +++++ docs/src/pages/index.tsx | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 4ef47a5e11..5c2a8f85c9 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -109,6 +109,11 @@ const config: Config = { label: 'GitHub', position: 'right', }, + { + href: 'https://github.com/sponsors/thomhurst', + label: 'ā¤ļø Sponsor', + position: 'right', + }, ], }, footer: { diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index 0242064ad4..38695fbafe 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -75,6 +75,12 @@ public async Task MyTest() View Tutorial + + ā¤ļø Sponsor +
From 212efa0fcfea74c6eb5a7d1e84befb8fa5812142 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:07:23 +0000 Subject: [PATCH 175/192] chore(deps): update dependency fsharp.core to 10.0.101 (#4021) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 54ba16aeae..010a66a6af 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -13,7 +13,7 @@ - + From 80ad3b9e4ffdd608dcc1ae8c29d46a712b2b7c7d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:32:17 +0000 Subject: [PATCH 176/192] chore(deps): update dependency microsoft.entityframeworkcore to 10.0.1 (#4022) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 010a66a6af..ff142d1200 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -32,7 +32,7 @@ - + From 246c3f9795c9258da6252c31598e65de571c6eba Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:12:48 +0000 Subject: [PATCH 177/192] chore(deps): update dependency microsoft.extensions.dependencyinjection to 10.0.1 (#4023) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index ff142d1200..849f2d2d8f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,7 +33,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index 04838804df..dc3cd9a2aa 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -9,7 +9,7 @@ - + From 6a0d2b1968c05c1b94790e43cab3697ee8c3d2a9 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:22:58 +0000 Subject: [PATCH 178/192] chore(deps): update dependency microsoft.templateengine.authoring.cli to v10.0.101 (#4024) Co-authored-by: Renovate Bot --- .config/dotnet-tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index d5bd384a8d..18b528665f 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "microsoft.templateengine.authoring.cli": { - "version": "10.0.100", + "version": "10.0.101", "commands": [ "dotnet-template-authoring" ], From 357b33c96161c6f63293ee5600976a6bae35be42 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:36:24 +0000 Subject: [PATCH 179/192] chore(deps): update dependency microsoft.templateengine.authoring.templateverifier to 10.0.101 (#4025) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 849f2d2d8f..0d7176a429 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -36,7 +36,7 @@ - + From 4bfc691e0cb7690aa74995b3434a5ed6d22117a4 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:41:47 +0000 Subject: [PATCH 180/192] chore(deps): update dependency system.commandline to 2.0.1 (#4026) Co-authored-by: Renovate Bot --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 0d7176a429..158dc6ca17 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -73,7 +73,7 @@ - + From 87a8160c8e5512fdabe380c2b200489006015973 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 20:30:29 +0000 Subject: [PATCH 181/192] chore(deps): update dependency dotnet-sdk to v10.0.101 (#4027) Co-authored-by: Renovate Bot --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 67b0c9d008..2139291fc8 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.100", + "version": "10.0.101", "rollForward": "latestMajor", "allowPrerelease": true }, From 2267b10a0c5434d5084315ce50dc1efafd060472 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:02:32 +0000 Subject: [PATCH 182/192] chore(deps): update microsoft.aspnetcore to 10.0.1 (#4028) Co-authored-by: Renovate Bot --- Directory.Packages.props | 6 +++--- .../TUnit.AspNet.FSharp/TestProject/TestProject.fsproj | 2 +- .../content/TUnit.AspNet/TestProject/TestProject.csproj | 2 +- TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 158dc6ca17..4176efb6f3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -16,9 +16,9 @@ - - - + + + diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 32a72baa09..5de92f03b5 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index cbf783f80f..d2869e55bb 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj b/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj index d1fadfb3ce..810579733e 100644 --- a/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/WebApp/WebApp.csproj @@ -7,7 +7,7 @@ - + From ff500b7a92c45d3c7e4fed6a87e64dad62990bd0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:35:26 +0000 Subject: [PATCH 183/192] chore(deps): update peter-evans/create-pull-request action to v8 (#4030) Co-authored-by: Renovate Bot --- .github/workflows/speed-comparison.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 91b0386172..cd8f8a4387 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -278,7 +278,7 @@ jobs: - name: Create Pull Request if: steps.check_changes.outputs.has_changes == 'true' id: create_pr - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: token: ${{ secrets.ADMIN_TOKEN }} commit-message: 'chore: update benchmark results' From f4b64fc4a0c0f183151e9ef595debbc83fd70aa4 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:36:03 +0000 Subject: [PATCH 184/192] chore(deps): update dependency polyfill to 9.3.2 (#4013) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index 2d3609dd1b..333e0ee910 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.3.1 + <_TUnitPolyfillVersion>9.3.2 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From 7ad17cf357a3d9b3d7be3a97430d6decce9afa3c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:36:45 +0000 Subject: [PATCH 185/192] chore(deps): update actions/github-script action to v8 (#3981) Co-authored-by: Renovate Bot --- .github/workflows/claude-code-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index d417609300..bbe61036fe 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -35,7 +35,7 @@ jobs: - name: Get PR info (manual trigger) if: github.event_name == 'workflow_dispatch' id: pr-info - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const { data: pr } = await github.rest.pulls.get({ From c79718a9ab2cc7185a738bfb73d9d3c365a6737d Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:37:15 +0000 Subject: [PATCH 186/192] chore(deps): update opentelemetry to 1.14.0 (#3830) Co-authored-by: Renovate Bot --- .../ExampleNamespace.ServiceDefaults.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj index 6e350de0e8..1aa2ba9e3f 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj @@ -14,9 +14,9 @@ - - - + + + From 6131ca3acaef9896b82f6542ff622d6b79a439dc Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:37:38 +0000 Subject: [PATCH 187/192] chore(deps): update microsoft.extensions to 10.1.0 (#4029) Co-authored-by: Renovate Bot --- .../ExampleNamespace.ServiceDefaults.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj index 1aa2ba9e3f..eeb71e38f4 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.ServiceDefaults/ExampleNamespace.ServiceDefaults.csproj @@ -10,8 +10,8 @@ - - + + From 884ad87baa9442b9a7ca251bb8d06bde369146c6 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 9 Dec 2025 22:50:43 +0000 Subject: [PATCH 188/192] chore(cleanup): remove obsolete cache files and documentation from the project --- .serena/.gitignore | 1 - .../document_symbols_cache_v20-05-25.pkl | Bin 927530 -> 0 bytes .../document_symbols_cache_v23-06-25.pkl | Bin 20264492 -> 0 bytes .serena/memories/code_style_conventions.md | 30 -------- .serena/memories/project_overview.md | 31 -------- .serena/memories/suggested_commands.md | 52 -------------- .serena/memories/task_completion_checklist.md | 41 ----------- .serena/project.yml | 66 ------------------ 8 files changed, 221 deletions(-) delete mode 100644 .serena/.gitignore delete mode 100644 .serena/cache/csharp/document_symbols_cache_v20-05-25.pkl delete mode 100644 .serena/cache/csharp/document_symbols_cache_v23-06-25.pkl delete mode 100644 .serena/memories/code_style_conventions.md delete mode 100644 .serena/memories/project_overview.md delete mode 100644 .serena/memories/suggested_commands.md delete mode 100644 .serena/memories/task_completion_checklist.md delete mode 100644 .serena/project.yml diff --git a/.serena/.gitignore b/.serena/.gitignore deleted file mode 100644 index 14d86ad623..0000000000 --- a/.serena/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/cache diff --git a/.serena/cache/csharp/document_symbols_cache_v20-05-25.pkl b/.serena/cache/csharp/document_symbols_cache_v20-05-25.pkl deleted file mode 100644 index 091ba63e6d4eaec1ea1ba029f2b66caf2f156d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 927530 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
    5a(~HBD#DF-6nzS%tC0TPJ0y`E%rQV&) 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 z z_a=edXbGMFH#q1FZXX#QKUA_?xeRUvTWOF}ypNP;x3Y5@IfdLlI}|0nF}HOpX+?y< zRBn@;S%mY<$cco%&3zkC>v@YiK|jDzbRxH+lAMUTc8D%x3p3hk)NR3u7;WX%b?=B^!$tsujiu3g%UxjGr}ri)?Ysx-N|{PonI^3aHYOQT znM_kOQ5mks19gcFc(F1VA9q75YZm+&5`J_oSnW#Ec&kA^p*ueW?+azTnXJBMBy~R5 zV_TAeH3ycO<8YJw%&_nG%wX;+EXK1FS9iS&}8!3 zvZ48e9W*HheV9bsiW{G_qqqMUH}*jHQ7Z}q<{Kbb1^=-rf_{^`QA%5U(!F~q_bXq$%)M(BsLiDNNipzFwj4kMq=YN zJ-R7e8%}dnQ;oU3Q%Q457N5$UBPTtjN(iPv1?H2hI504jo#>g9ON@9g+vO6YW9gAG zdhae*F-TiDQC*$sN1mC%{-X)No125LjHws%eg%+mhTFf>PgoxG3sh1bq^_N#uSFj8 znn1=0=((y)KivB;R;r<)7o^XH80*&?(x;^AVMtgac-Pa|yO3j8` z$Y5hK?TC2;Y@7=z4ZU1QDN`vcQ>~>U7c!(WnYLPr%5Xh$A&HH0A*~GD#c!aM=anrR z{p^D(Gdfm{US&6I2 zzST~0=R&-GpZ(SH8QyQHDQn)A@5xUUERUl9Rfd~^Uw9GCs5IhP`UBn=E0XoysaLhESCwu6;nQfKMw7`ii+V8|PT(}ym`v}uYP~Q_&Vqtg?RpzEaBSGM z3XrNBywpY6M5T=VTp4>NQ|cmO&-F-M4D6XqsZ05=-)jMT_aX?@%M03~^=WX0xrRbD zDWf`1Ms;Bki)OZl0IE!;T%&xbUTF_iT4q>B;%!EnbL{Ew=MYvxWTQ330sATl59SNU z?-;r&Ju;9U8VklrdeQsK5gRL#NF4q^P09}!bm!$WN*qF!;S55x)R@~dy$m8+dMbBz zu~Z^bz|3=s@NEw_0AU37_tFnA7oSXAk4nlZ)U|jyg|0Gb=8#+%&E++AZ z1>xN`L2&PYbb1InOuzIHv|s|$KwBxiRj`t0F|?gZKl;3zG-r&a^Tm6w=~1<($@`zL z2s&c3e9Qwuk5}0T1fWnsq9|Wq{cl8DO37gbBfJ$;e>e@N_S~#GG1ai;; zsn6bj8W-l4iQTWheE%709IvymJfk_h&O)_tKt^-(eU06RB{sayLTuP#VX!foo~u2I zdY;`V{k*hVDN`vcQ>CS1N@GZ6GNsj`GF*?eT4JNLS}TL`@))$TZ{&YPtsHAcu4Xu@ zD}*IL)hkK4S8C*5nWxD#(G+`y*%|`9!emOz%iJs9wbd)`-$Alo_`9zx_VpFZcS6oc zSxQJuaicuS0&N#TkCOL+vbikOY(bC0DO>&SP zo?&N9rc6(pKkTeLIG<@5XUG0fS!nkb&=qsYWc($kz`pwh=ch*<^Ubd!i{K0Vb*CMq zI_DJIr?Ch=scH5eN^WEBO;cI&mSv@K>*WP*@$z6atmwwEG7}~4Een59=W@W*Q}6x( z{e&$fU4}{ugzDN^`dS3SD+Ds;Fq8I{?ZI_9p(}5nHS4%p^v}J7T2Hu_vOuG~gl-SP z&}c8Ovb#@WOKP?y0X8Pn-m)~%U8-bVs)z0X$#fc}s7rA+tqX=j z21?nm+98sAG^|!F4{3b$NtIFfR%?8h1@L7uom45}Tb#{0zSqWwuX{CQ=_ndDa`b?y zmW{MlgNQWEFw*&&Omk-uL}o+wXs|IE2` i$;1=>>yG+xtOF{2n0^-+WOCu;*3{s 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

    S*n4N_A%Np^v7%R{9D>d#Y9U(XG_N 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≈lhkD4}LMCdB-)#tcwC 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

    (noR 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

    %6>CeEJ?UpO$9y@*4THJO?kY zBFRZJdK$ZYFh8CspKjgDOPKS$yiq8-&x|r@#*=c5Rq$73=DG!B2O(Lmw({N4yC znXsG}@K;zg&?R_?(LnTWAHNIHKyNZMo1%fL@ZL(cv5y^@Jew~s+7J`8gb?*R7i1Cz zhBXWW1P3TE_@Ci?Lqs>o>Zf#*(MG@#@K)$1F+l{i+5JzT4VXb&$Dl!gkTS=u+>Gvj zBWTj?fYwc#ANN4x-TXEHQ#HjWx{tmMr@un?5e5-WZCKk_aDi7-WvuN~HzsYLylgS5w=LC-bO{GDX8}-9(w;#qKe~2Y?xV@uQyz zNm81!$yBKdiu|ZKq)Js1N|l+RwJOD%M_mP*WW8!0_?7vp=WV{_*HbOL{3uPCfX`|s z;7`=at>;=Y0fQ10mh;6o{L-Xku$pYn@EbP^nR`d$%)K$Abk4~8zhKcPo_2m4e}x%& zKMN1h$V>0`@w;H;{T)NIZsg5izt6ynD|bfG&&VX0b$6nQrSlJ+KpQZFwvOijv#v6SG%vs$M$qK>u({iq z2O96oKLRjSoi2gB@z*%%6|gtx_GiJr66VRC!Hh7JLUOVV##%9$5Vb^<_K6~y0W-;5 z%gyKsFp`XPJFJn6G(Xb|B=e;tNXGdB%p!$Vrm?U}eTW4cu_KDC03{gHh_bbLH3l@Y z()u>-<_fHY*!F#Mtv>-uYV|6lH3>QOvnML$g)>xjIWt$6A~iDjesUWx^CNwW!EVRnErmMSC>Ltc5mS;tbmhYV2vd(*sG9 z*hhO(hN3fY6>=24ziL^kZA?=)Jf%Cewp1xuT$p9m2I59{swP_vHz1oM#^FCq@ET>4 z+Q(;=E?*tt=1}=+KR?&yD`{?ze06~5(B&&>ep8ryCC?$3qhgbiX3XUnv`L-nhJ5v! zgjwIprB%vTNH{$rV?AP~f>CY`m9eDTlNuFB^K36r!Cb;rFjZ7!tfqu3A&i%}fJN$X zuiL1ePMW+v)wA*yor9~Cv8Yc|a#q`zr!H%yJGN;-tHB+s$yvKsA!h;B55&k?NBPXs zWi3B6%*{f~Lv~BWNx`Tr^Ut+A%EQ8sJhhqO$(s7U_VNiPy9$OQWuWSvB)^nT+!RHB!#S6dWIot>tBzoh(ry-K`5 zTKiW^z|^NHBF3H_A>^jja)2gP$s1A0dzk|xS;2n?njvKB*EBI>@7^M4fhZ;FMv3|| zUu*d|UX{%8zrVBx{*8Brz6_ZTSMEAenOj+Yo2ZDYJX!>(f$6TG57l$8miSx{%cn@!fD}Ip-KH;7 zHUa{)|5OFiVP19!m_aizgFGvQ_$Z@FGiIza0wd2~X6|;I2aN1b08F(eCAB?1gEL=I z+k@`;-yxZcE)*)YrCiY}lxh|s6VqMpmbhuc@dl5hMdNvc8PC#;nHY?Cmgf&?c$Vge zdj`+HpBSE<--W3pP30jy!BiLvv^*?XFIaPS?T{rGTM38TPL(F@DjrdJl!fhCLFIsX z%Wg8Gaw|8Zf6$0Z>9$=%r8M8$GpPKluAuTgg34Fric2;|ky<)ZGCqC~Tasni%5%11 z-H0R2*(0;FVMLMfh$4`(z)hZOpU*87YlpP-1Rub)QLoROn zJ-H4nkR-2o4N&+mxXYF)E%X^XZx>+CZ4@nn=L%uFVu8`%34_G2=Lwtizh0&`_tHJ_ zrhCFZ&s$eYYZN8#T+fV2mv?+o&CIWE;BMDy{7Ra$9=}3)ZdFI&O=kWn&3OIG$Uo(| zeiTZxeiVMGYdiJp-PoxsCxoIsV@?>|7`6pufG^n>tw~7LciC0ry2t7Mxf|;@^%!uv zR{c08hvSiI)n1q>#yTAN#&Hv@yvlHymS?Q~R`PehV+8v=f$ZVuN!x{t7d{ zS@00WHF~#?-v#sAJ%(o8{D$3bh4)qzwBL@iZFKIC0hICA@c1BhD&zYgI`>6%+pKky z(QX3i@B!#1W;TLo-Baa~ec2&cZZgBNj$r{Sn*xh8uZKa6u*7#`SlG%o3~;H+VcQA# z5uBpS1WX39eq8fmP7X#$SbrJ{|6taXXhigz5h2Z+!w?bQEn!3)Z$BcOBQT~Iwl=t{ z8C>E`(CCVj(W^XQUS(&>ey%^Sj2Ilf!Mt6c2tDi6?7!s6O|B;A73 zDfY^?A4%EHe$kBBHSE&Tg5}FnqO#H{M9MCZ7ac#t?q4pa^cn&?n%j7-P+!e;c#ZDt z>>4dctDl`*IwrGi@O@?_Vf*-zd>)IySI0}$TCSA0@j_u!`odb)7w(6>PCoy))Y0~2 zEBb;FP+xVR*+}v_*_7%KK0Ij=kHlyZq1`*DP<#ih@5CDCJMkARy3wEiZSW8^1A4cQ z-vx!@y9~`Hh2mS`y_GN$S;2`nIsZ+@Ql=8HKwMI$@}YI!718ZFb2lvi_ipGmEvoN- zfq$!vp_2sm12|hx5*P{m_X{5ePqE>$6F#&j2zQYnaebt~L53|60E z(u73Mr<-D!kuwm_JQ%|>qekc)+x!G9^u&PkN&FRNhxs@>M7Bxq_VK&GHh;;`Y+{=q zhWAz?$mJJs?tbT^GMqBo8lDa4TA9rU*!h&H+gk1h&OoJ`G-L3>r=i<41$hy8gQsS& zm^+vQ2%14NH2pj**kzPqr5Ve78ljQr+s)lD`iY_8E%)mHS)!!>dpKbalRhzYw*;tH zHPRA{c@Z+;7UYLjYi!IqXO)(UMQhr35&nGA>-w9WURUQ&VFuy&f8VM%Fz!|td;G$f zRAv!^EElSRfw6PbV=gj=>fA$`|Bf~u^k@{J1`VjgXT!%5MC4RIcy_~2@0SvmnH~NF z(zsCqxrH=nKjVuhfjoDhDH-G;mO=V}ACt!Rc|^M+gFM@c3=$5lFNM&Q#EQ=}C56Py zL2}4Qj2sd@Myry@n$Upke~0Csc+mMO{tA;sz5)+X5}|k3@Vg+1e9h2ol0^P5ytgtO z_JM&M*Ko6fZ<$V&BH*5 zYhLa-j|lhywkcg^Xa>#DT+hRTn4&-<&2NWcjnK&R9p-L#c+l{^TnCUPygRnyls&#X zNLYD`XrI0T5RNzg!xdMm6x9nd%Q^q0EZGMGX2WJ1Q0l>LLL{>e42K}s68VM@%nfFO zk>gzWa+N&$E7`WT* zo-FOSNl3l}4u-=UaP_O-PqO z=sV8oe#zb>zGUxc1}^q@_)GRB@g@64GkZJ!CHs^3lKrC@NSfVYoE%8vOAd@?K;&%W zmw1~WH;UX7$l zAkl@Hn%~&Kr3R80OhM0_UMR548xemn!x2(h+v$1qZ%kk1v1%i=toJqfoX z>`FBg`UoYNYW6f;`hq)ufY+sbtz4-B#0~Y4jBf?IIy7xf?%~jn9)M(T&p@)TXCT?% zGmsn@C5k<09Rsntff{bE7BULA9QicxJ9@i-hLl@5d%%j%mv2y-kjA~H#(k#7{ienP zUZZlM$3MN2Hk!}}C#l2hIl8>NOu^Iq#8N3gl4_7`l#G#t-Jev0^dpB?q1C4vq*+x9 zC`d?QE_J0EdhcbhXmTj zI+0Tun}UFomiAK_d!|^(s~S)$V;cnTRK{-9Yc?HTPds?iq%wBur7?gS^)8=#we zmnsMUPJoD(aGD+=A_`oy#QGVy9i;3~il*=U<~rY*b#dMd<4Ua7!SERC*fn6b_G%o= z7?^xByP|OA*cRU!ha1*7+&AOuC`g!Ug~Npc>oYr=k?8d4rkGvy6vX!q#qhnzAzEdD z;X%pY18Y6;fb+fhD=aAaUGNZDAicYW-vt)=#XVj z{d$Ko@ikidi#^%l)I$PhmmSEBI=}fV!1GN&PmX3-&9@fp+I)HTsoa7Mt8$?*3(>Vc zbLB|HgI4GgWNP4(FQ3m$4h_eQBq1@hA)}ah)Nb5p-ielm3%(zwM>CC)8=q2t`b`3aapq=&z{ zA~%!>HW;EZ#(}>E>T%=MC9se7!tK1bLN;JDy=^tqn>4>XjNat=^%}iN^RBMb+ouzy zxBW^~g0Q*}beIsh!A;@`L77p^;W{(2q&bv1$n)(QvZNVr4h2Ptk+pXM;*Ex(lUAk@3&?e3IbRBJfktEutMnI4g%!P{* zjSD3Hm5ai8D-$WfScNLzRxek8K%TTqbG7+{)`+#odeOgT;g5&b!rFYLe38;%yR-#~ zIPAq5B;v^Ie5x#Rj)e|j>te2IEt1@1&+ZHuw4utPYj}+0?-2bS3BD2t-Vz<(Zl>d* z7&?}2Ivq=M_v!cxiPG_}LW1X5I`%MsMG7)VwkX9|r2H6!7!J(D*RIkH8z%e1UJY9l z%!*OZHlBhk89wVkegT?N*btyVA#|t!qC0l`Km&2_yrQPS zccKN;1K1dgjZ_b3eDVaoUhNqzAxxJlp#)tulEdSQzw4hXC_j3HLeT5#@&{FlcSfKrw8k(8H8=9-c z-q=(WTN77_y`iBx7h`h+;9%k==SKYXY)F{lb?^{lZ0OxJ{4T`UY&SF;V{A6Viz|)L z)E0!I-`OeyEAy`7dBF*+%)5=7Aw0-=nWn!lau{Vba_?6!vgp6z1%OsW_@+>IL5e8BZfu zy9KK;&yBkY$b@aM2gOBv(JHd#i>xiLhmbyJQ`b1#on4{34}ixo_D(R%VR7ko*p(1V zy@0k*xeij2m`Zi1S;J#z=oAlCw6J(6(p?HV8>WD#qpBUd6s@8t3DPlkPb>x~dOAv| zyPl6MU8wWrQM0Uc19#JfI%)QWI+m5X$59^Z4o7J`D7sA?CAG@hK9^}5Xg)( z)6}iPRnAGK&?jTA8Ln>3R&Ao;SFh&*J#h89fWH7|#%h-5;UP-G^ll%&3pP>5(5%}; zv0Dz_TN&aHex`)cd@)p)M_@KNvogLiy?~0AjNtVC7dXX;Za0{_VL`P;=;q!*d_DZT z%QRa<5Uy~VC1d0aUGXmEidNvRH?g1wXaVFFrkf}>Rex7JaSmfAk1gjLU{1E@t%Mai zPGITzxOo-AV!Wcxmj`|HwRX5%(r&1~1J_+STw1EoM!{YNSpB1fCZuiIT=mY#8R+1M ztKJzkLaWC_`1SPfhJ~KE;Cv7M3cH?u86G0Pr+3%zyKqc=uc28#Cg`&1x50}mw}yQm z*;l>;=kIsEQ-)M#T*ouQo=|4o?g8z5pQ&3vKZn{vN;hdnPr-Yk+cZ1P2t=^S&?)%X7GIst|@WZ|^pSKhkLoJ0F4>NO-Pc6~xa5;uEOCL}O`_8B5X(_1n$+P@Zqouq4elcN+mSu%%OY-LClzogwakKF!RdIW*lwfW{e^*@=ED8tl>zS$GVN9&n1YXsr%8RTPfF| zw6r~Ig{OC)9K{UBCA*TV*}k9yWhUUxjb{J=j~SKC3dtoGaAl&ws=gXnn`(Vwoi8*s zGna0#WD)R?kT>N*s(5vX$=B5pilWl%%~UGQuMDG7c@A}i6n-zwSj(oXC;Fc!NTn+y zZeYss($WIZ;7rjT@y}p$?rkYs>0Vzay!lmxq7ZhY8DY|VHVk3%9I6N@2$N<^kkVCz z{bP~{J7qu^pU7GTAvvbUt9Z@xRE0`TW?(N4Sx_N;8r1l6@CV{hZd$$*zamM+?S~Rv zwyED)+d!NH2{5KR2OO|qdeZ1U%f@OCb@@&umK|!Wn#`yliycu!hJ$N_V12IAsO(Rt zn)H_Im$C9_un);Zo=~bvNBmxTJX6KZnB!TEduisN2pypn&gDjf(D@T#)S?3^#6s~h zK9F<^g>P0d%egzan{J_yW}}7TIkd7v3Lb)Hy;_rB)PCYfV}ltPx0z*?o!lI%0^PySAX!RtgIXkkfA`q?Z_fa_{cF4dFwos)?%0nwPmboRA(w$ycG!-|pdu>@XCaQ8; zzteraq6gW~UX>3GleKkkyV+6J%#L0j!;W^F*^xANogHP9WJe!J*^wt(I?p_mB+onzk@2Yr$69I1GgF?KTL5i8av6@6 zOJKiT%Gb)3YNNLcqNQJ{Z{MR@`2Hx4&WwG3yBYiAX2$-i7{>mDnXyZA*BSfcNiz0- zNf~=83|nGIjOJ+3+^MI-- zyMFpSli=yI@)PI6{5F}LXYBJu2#*6di|eHDUJm#@Oz*`xGZu4|+(MNS#Y3zMIt{8p zrvY*ab`(O=SbBPhOp(Dzw1#5JpEDDPG#?4`*vj)Anv+nPv1m$HJ+?DR63F4Y_z=Jt z2aD8&9!umInv*F!TnRy22f-n(gFWO5!0XNEl4kVV8^c=Vx$f?l<{jNeS2;;^Wt4y% zKozcfJ)#uMtUmsD#*C;paC4~hJL&i9A+9-N%FEn=Q_ z&8}GG^KLbnc_<{43l}1*o)do9npvuWv(~mQqIZ?tE9S9Jq%SzcECu_WTBJx7(FDIL#{3%Lq>mJKJ(VJgVu0>x)bmdp7} zAL8&Q?0`S#q0~=?dP1+=hpYmW`%yYT(}NHC)qk*$IxV))wC4)bFox#RuVR#TX4Vuw zp2cDgXCWj4j$Bg>cN~~{GylyVFWL)ssdl7xs&dRepIa){GP|J=2tx~#hXjt%G+y8x zg_u>t#xlYgs8oa?1*#R{pHeEFR)EiKda3>hUsW)9)y#6Fc{J>7kmq_Zxiss+5#5Bm>2_?YII0#UUK3fvftE@`-mBUM141k-I7NDuoLWVh1cWH(M?hmtBpC zIlLTPsaGiV3PE+SICn_2@lZA5sD>Jrk5V#A$*g5E>uF17Bk^PDUI>PVr;hkY4|Fuk z?d`qL)6lIVcq!em>4t4n_(xA~iPXVbj3~wx&52hZIg@ggl&hp%CCU82a*Yp7$>?7s zw{RM^(LB#l@ZL9rR#Mtkkuc=7oe}1)Oj*`gVEy^JVn(&PW3$ns*-V?`h1Y zu1$M2cXWd$W;RtuTpMjl=1g6iscZ9!zqrVhZ@7~c=QZHxa#_dF-{>=-J6+(~(`5<8L432(@m8gj-G-F zMjnc(G#oiZ=PE{i6xMp8K}vBmrp7M?jzrm_Zxl zIiPl=GKa;@n2*2+nshs$b(3byN5G)*Cj3Q+?G9e3TDyH1)iedQ`AYdB zz%6)HoNE48XW8`Nunyb+MFpt>`V4AVll&c)0Rdw>4+3-+jj3)`60 zpsow~+5;VfSOo&JbNPAB6oKnlDB<_<>b(k6YgElxKWk%7rOYCRZ$O75#p0359MpCz z)vD$t8MYRO;K%!56^Te){vv0Ol$JA8XwuG}g<>06gyZ-dmU6`mfEXMENk<(BTc8q1 ztx#IBIZ_2%@F##${L@gq5C#vDKE8!NFA~g>w23(TwF(JbcA|LtPBTv*is9+f4RSXr zM}aio+jXA)ryb|%&L6`RQZM!^i*ke9O?@&Ax}AcAjJGjdt_E-9Y9LfXqL})$T$0?w zf5D?m#5fQgQFjihJC_}Y1gtqAL7#Z(C1Iz$S3Hj3!BNLmWzb7F=%wtb83#6y` z@JA=VAkl5rwpldUJ!mF7JBI9}8{`>L$WEH~cAf10K1s5h`s{j?2sn4a_!&rEa0-$a zJXxsLMuZOQd7r}YT~ahNYTx+eod;frYI&)Wx7}lW)_Wmv6fiaV+z-zw5Eej-@<#MG6)Ua#?(^n`<`+1Z(m`v~+Wn%x-Tg(zO)9)Y8#PND0Bbb`$5$2Cc>BQ)TO_S7O4gob7C*JJ0gGVKlxAWdyhr3h(kiM8&kSF#aFeBa4erOfG{c(6ARxVPhnYv)Dqs4F|Ab;}ZIO zC~y%~NU)_DnjRcUXw5>!zI?5?Tu+t=0{#RD zREX1GnL6^~E>;L{4s5`E|r4=D236ci`>pR3yTtO$|o&Gx7{mKGn;q(Nyu3eup_9u?hfr0YWD zSCSMWSFWXn1|D_p+_amol(a|`==tDbt`#lN7t8|vLX1E!-Le`ArTK8zanXOM)3(8Y z9y!%_O+cW>jVZP0gIBy<(Vk@cAbv8zx6JCms0E5689|sW`s~nUI`TMsWNxlv&p}eO z43WpMm4PavOAAXyywNjET#aE<`77$9{(HiGPUgT|Li`zd8h3LU(Xyvk@<^yCseOX}^q>f_YdY^BC#FuVnH z@zmH{TdI_-%n(`tqm9ktrGJT9J=L!_AGLK}ht%>$rtZ}8#+E(hG{OT*ep1Vu*zr=! zn`cw>Wo%zyM{c;FF_{J<;*mSP>92iw@!MGeHIOO%M+?b68+P^tVGt+IsXPde? z+t^fegZ8LzQQ74!Uv(E=(ZU7Z)zDC#yGi>1;9z3Wc@Tev-K5RHL%b48@2=r@;U?{{ zp;^C4o56l}!;35T#C|BG7QXDMNK>~{9(;VYc0a({ zolP@_Ghb1g2Cv+%Ec^Fub2E@YAeXOM`kJm#=?S3HSn~AjnGmiyDs=4Aj4+x&%6_=B z65u_nVqx*5JnLn+J_cdQ7;GFQW!^majt7?O4rz>jc`-Pe?Huo<`WZ7r%1s`kZ7%|O zCnB;dLgvF=A)(({+dxDzAYr~dYbtjU>d}+3aLdCM+`}(lJh@b?6&B&j4A_F;o|W(E z^Uhd~VkQcRqE0w)A)wh6hdl`yDt^aytqXDX=1%5(7ejk`s^kN=IptL0wc+g>fsK@x zNjZC$dzyF|#v*un)KKiU7@6ENY)$TsQKoL;gIZUnvfPY1x>3r!m7nX%lr*M`ep?uP@_ba2FQoZZntV~{+Tl>^#^JE?jjPjzGE7NBT~~?jG!w(U+#ISBNw=44 z#30SbdxjX^(hXvmx_uQYk%1rW|Rrnj4-vwDe}~L>DEv`!XHonm%EzX)0Cd?3Q7H88#JZ% zYeOu%C8`pcn0pVMDouO%xvn%xa~qYWeLRt_G)eQfgegt({83F#mgd)J za`F!#x9*BX?fu<2Csy9pl+uLM)P2S2fSDi;adW8RB;7_df{^C%o*{@2b%P+L?pnR# zR7VY0{rMI!S*^zTdDu*_M`H+9y6MW3H0#P!_c+)ucZFb6<*8GWMi01|ey}Sf_1C?t zJdqsN4F#%>$@@a5*sD6PMAgA?)gLseB9)LLwP!Vo6wu-R7-i}NpXs_X^%`ytRi+-} z=ejZ_&23bs#(5%LnUdy}Fl9=fpU`AyX?~q1JO2)H@2)6Q|8Fb^oX zVJ3>Fxj9s!l5Vfmh(elA_6$+{T{nng>fYuQsyd3e>d(3+m8!F5qJ1`oXr-I3R7tb0 zRCSM&{cBfTRWpWV&uCR&~t2OUhLp99R9JlPXvVDOd+qt6%{w z9*9x0Udv~^u4MT)zRY2M)7(v0vZT3p^BDtJEjqaG(X)lgmHT}2xDrfc}1&^Dz5r- zuSsRAU?$vh4B<*QUD=XmUD@g$M|+?vgqtc`SFy4+*cFocTJI}cB;R#Y;i_Z$T~xa2 zV7clKpj7edtm0*N$MJH1S8Pk)dqeYSUeoKMAvg0o=+9U3P^7GGgpzZl*F_t;F4{om z=9n#=-fJ-2c1Z6v)L+l5ODB>FEu9ovdUj`nbiOayL=JLm2q$i%wUWtql{c5_U`WsF zm-czx(uK^8kb5__@o;z5;eU z5d49z?s^2ES9X3KEa~n~cYh1J|1#&~+yRC`b3*2w@yXDd%E&y(8JYXQElwGk$Iug_ zM5E_g$;ccJwV#rirlv@V*EE%qxxu+8C-bqGoXm}l)oN1azLgF6`5fk>wJVn=`j%GK zLKgkYnCR;ipaGH~pT=KdNtsW=L+{-_eixE5KW%8%lQLts$Kkz|hREs(gkqC3Ap9I0tjnrlS5h=^vgB1|n1YB~FX8Y;c74nESx{%}SwBY1lPa2G)S{f? zMQ~D1-;YbE;O^O$7OmVXA`TZtr_58~{boS&5emHF22d_e5Vd_Ks|$0E7`Lsq)U zXb%FleGbAWq4_R2!=O8CC_g&cYDBt ziZ|ge1B3~0h0o%YJ-!v_P#6l9srS(~YN=R+vV|PrPbeOQhZFX43~u|)xRvIeVYrp& zJ2c!%^PSzt?VofWx6U8H9C9q(5yTKwWGa;A2s?-XLW?A%{psYX{8y4)iSMWvU_!Zl zovQ9C;sJw7B)L;Dm*}N8DBK-CV?UJalE1%UfvDSUxm$~hi$OKIoQCtZQv~>RL|8`%Fu080 z5o>Wse1UnVe*r$$uC=R!&kAoc>`- zlM#NOZ0ax#9i7h8hhxsuu->g6scS-g8$zqW^1jb8x|@$3w~3rFfGC8!io3`<8dfwelPvSx;=D(*}-%TEf z{zjsCXd^w=!bVaDraiQ$p*^H@Y<2sDhnTz;R&!#jGmXDsiH%N|*T6&EKJ;!MzYE*v zb%thr`;hVM8F+D}o)%t>bM`w^GK@0I8lDACWo4Gl+>EB+*PFVn<>w%fD&3^{Ht04B z-KN>57X{V^Gg$pRJ_w`A_=DVx$w-V~Nw+OpH)+1z1B;KS^8jKJ1pWq`r)LP9_{@Gk zVU5N*puo{Vt2SS#W=c!N;!vOm{-z7x8xkHF_UVwo`ET9379!7@7K#KMdwu3K#9c1f5GUmqE@s6Zie1Vh@O0LWjE1f%HM(-` zrd#F_PXJw+_0n687IW3AAwK1~eN7pB?$tsGe-bHLIYwLZo`pl}YpXOR3G>ZGsKm@c zifdeiO7s}5>agJ^pkIXLp19lj1pW&1s(cI{q7F;%uHknOxmrdRJx!a9eH)$RQDfZW(o9ML!>i~N#FFORy zpc$GiJS?cQ3N+IEb{N(OjXZ}q22(e5`!F=T4L<{rCA=9vhg0_WW*~j{Eh3}){`zy% z7XRV$+bVipUbGHd=lqwlPnApdu)K(|NX<65ni!GHIu3k^BABgaf|2IMFoKciI{8ZT zj_wo8Uv!>eoc|4Th%#Liv~$c0pd44e9^w2rdwgNBwmfV#_m_g<8{7*u{?P|^5<>WZ znL}J>M))1vj0P_whmdZMXdFVCpXffqzmO=xr=EZulfG%Ie8H|%3bSx8ClIo8VyToL zQFEDqX{9dT*s5+p1*~Ls$!MrzIK6<6Uhw{fe_hB`tU}FR*aK`wJM*epu=iwUO+}!y zs0N<}_dZ1IkI%A+4o7o;u;)08dZJtzFU{JQ=(02%ouirE!{!3gG$H|jOwMI^!?ayO zxe#zb>zGUxc2C8<4uT5LNWM2|rvTroAx2<2IAf;m0mMSGHLnM|(l7MBy zKlTRy*vEea5c(qHRt&y$X4Qq{MlmzX%*>>DG>nCe3(rqs!vXR}*DsD+lHD z3UV)BHmQ%VMI$gj7rQTE&X2T>LfK9;%A^_B-gy4V^E)+^N%MW(N7?$(j!URPf#V?q z%IX4c5l<+Hklp9?aPiLhIV7xP_1ND?l$NK8gAEvoiEmqPvOJgUWUex2*Q!}gz7&@u zv1;dvU;@sg%|Sm-y&*@4L!LXf3|6W_K36O*OBB}ZNqb?&u2eIjkLWT&_B2Ht9W8_F zrLvT-l`B<%xS>9$E9FJIQY+Zip=oP!&v36mvbSd-**8jSa?tYSW)aQG6(57Jbk-ys zn~(qxqQaQt`5nCXXsC8uxjPEUL+d_W5qoiX(l7K*6k} z!+MN(F+7(_Dn+MKG~F|7MjuF}Xh<%I3X(xE@Oet4EEn28T(B^Nxpv$z{?TLwif;me zqFF~%DreB;fTSg!RL(#~Ai_r~XQXlll7p36>rh{7)$W+e8C{Yy*!TG3aQG`B021f+ zJ|(}<&2;bvRA*0DYbqLGw-ya>JKA~_E6S-R0@g!e^kV>MB652^zM6>j=#k0uzt1fB)LhD<2QRf=*Z-@nVyto!>ZX8k^Rapm?$b5%R^ zBQHA{grMIUl0lU@2Y60!`6+YW;DPPziRcFLs!BH*4X-;MfNtXHCm?Us0Ysi9unn4F zThBm%-(Q(z12>PrBu3ce`OW5Tn9_n_W$x{$;Vi|c?pbp;N!KbDJ47}Xl`<~lZq_=w!QAr3?uSkL- zet8X01YZ~T_%40A6}ge|+Cd{X(XU9F(buEVbI8@*n_!8}bxpS>Zr~T)8zXe0M5$9z z67x-bZ0Hj6-Q0|KK8>fz%lJ8598rW>X+~eaE-}Xf7$TnB%rog?^PSurdfZ93O&WmG zjHyV1VskMm=5{d&=9c#h&Ffs=Q?fHx(+SMO-_ zy;~7z4JWhjUKCb5sU(Y5|g}22_SLm z^B{S}-n}~l>8ciHip!?>A7W|x&CyUk2NGMPMCV=_WmzzEn3P@8dC>~HWLfV@mW)@u zg%t_ywou}t+r3dj+I@T|=t7!rjWr8t_j5P60ipsb5(i8q&3E7m0M1YPj2|o3HW|`W-3!rRF?RMpU;_b2d5ha5UHTYO+M&dNyfk z$K(z`+Gio{L(#V62*}kSJ?6|3xSB2&YV+1i8U8ni7ZeM5D_5GeO6Af+?%(;qHH7#Y z)~SkRR}foOxy0dL$XNA}<`FRMCgMAR^V%l~G&6P7BK49~v1r%O%@EiVaLE^M!dmCc z73=8TZQTW_P*!v0_*5v9>t3|s)#FpqcR(m(4fa-$nOxmRjf1<98NTXPY$^n93x~j= z&xSG}e-Py~#bf(K6CrRW@cigEnuEfCj;<#9Ep$){e0#_o_!icw)tI;NJguLC6`Z)% z`4#*X7W4K?@DL3s^ll%&3o&oMYG~GD-mu%p;JuX)8u&$=7t+nhP|8gGJQJ9Nl$m^B zoli$}1HYZpO-8#5Nar`98y63V1#N>Fw2cfJcc)1dhRa`NU5D7c z<*7PZP=f$<{-R#(B=G;U_by;^U00c?VyU|&`6bzwV_UX!)VAenyWK6>aUQlFk@c|U zwjPn%q!UF+N>!)3t6W{xsfXl_A~HN~2%$*=Q3yvf33atK4+iW=TvodpHr>4^nG@B?{oI!thM&qYpuN=ilhA~ z5xwkOTST~la=gH2G*4MhL^Sw>O*IF5IN9w{edHdX1L-UB^Q-tdwLyE;m;cGx+*0iE zH7hy$?P>YIA9Wx2)|>j2XGd|aP<-2wQe&}_Upk3ovc_`QljQUo{h1;;{T=NXOLBU{ zD&afnT5BLi@q~QRobDBr@iQ=ppXdzY*by}7K_1JSD9-Zg@}|SJI{kQ|R4rbe+PFMa z*VTfThmeN4-lW38%bO~ts(*EAQ*2Pd=7W%MURB;gKjH+eVLT+lv#i@ z5H|CaJE52gz4qGhm;+7=bZ6`riIc%3)bw9$dN9+`�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ï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

    ^upZ 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

    PkI2gR{br>=IUba!F^nh^cWQ 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�`)dREUlXR?|BV6sWqNOB^Z&7T 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 z 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 z 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⊁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

    E%mnqfG;m_JR(jIvfP zb-3+^7Z^Io zZsla_f*#eGQx$IW&|xF8p+Fq!Nm)ALyX^Zft&s!f|hM(CXH^#F)4A!{$_!9nk+ zKii($=ZVhA>sdn1Yt`Xp3gl_#g*(u7_J*#PWzfVm`4~9?3TK`@dD_dpE}bsOXAnKV z*z|>MUZTWVzj3*Or7t=z5VCo#d7ob<21Sj?`B8QpJ}q?BcrQ6yEkazi>H{y9FXR!I zDh))4;C*}J-N3oKR;v0 zv4UrEL5!i~G1S98P0Y{$VE<$5^>Ru$Fhi_3Z2oiK5$w*i{G)!k(5`C!#iINHcP)k3 zq_LMvZuU~^z+Sl7Ya{H1i#K3J@=_M;W%)|TTZGM6i-@GT6-cbHilItqsM@lQoVU6N zNmJ)Kphdla`F>00+=X-H3&cE{@E|I+i#|?*6_UqQA>h2lEk=gjaOPr)j&&|@xE|+| zS_>R5-T-B~k_ntou(6S5Ht9HDtp8DUO|WtV(GgI|lk3GrH=9jtQ{$5#}sFHKD`y#xQi~F;u&9BJ4$0-Aa-0eGsu8z4r6Gj!e~^M3IXg*{&JcQ<^mP3v;6;g_pWet|+BLdTjS znXxzLBWbO$(W_SqCv?9?OS_{>$VXf$!hxk&zw9@bpy|#u&!~QAR}syRiDyfs>#9yj zb#?cVr0nimY!v1e3f`4MLj+uwDoq-KH*<1yXncs45J#Yf(}yhhNF!YGu2fp{h^Tr? z8#;ZHM|uQ;>u{^psLZxoz8Vbaw#nU(42?{5>i)$VX3s||5GW?e?~rMqOzM3j#;E5j zr)bus(>PV?HG^y9_*z(hX<}&PsUN8yr8!iOYCYda9&1&s^*efP{9_K+TW1SpfAwEs z#m+kv{=3a7-WY!291=|A3jrxKIF2k%%GRb7NNXvfpblf7LcqCV8SwO@@5eV*M9_u^Z5@MfM zru_P*I1z!cm=LnHNX8Te1)X&uAW8Fv2{mL92FF}PLS7BQVsWxvi&_t0yu$pGmnM$^ zORq}e*U1KrhfF4Biv(tKSCgN(ncVIt+}!ThI&iz6lJ!w;$Hg09H2F{_-0thZ?Ot*y z9Jzib3uz72xGvC$v=c=SEf9{ObLIQ@ToBl(x{WFt$$c*rmb^l-2!&s~R-P}qh?l{% ziUfwUu&FjG3ky(~)LS~RY8x{((|LJwY^~NRy8f(Z)d_4`O%Tb4B;MOX_HmPYzS3B) zdwngqJ2TsNF|(B%-^^zvE4td$I>aXREZ5&pyV>t-2lmU&qU&!i-hlP@PiDe?zyFq$ z^|yqjLh#N&)sIqB33#<*ser4WavNDx{TkNkAz{(J5!9L%X&(7=b@~}qU&MYKBOER3 z7aR4;Xu z**izd5J6snd&_VO^eRneJ$m#srb_cTI}WlrLD(81Wzl(&dkxwWies7R_wz#tL7(S2k3RLLSc4B~4#D zy5yd1S4#O){uR3C=-kG$5aP8tq-C*tkIj}{o#OBpc~JWHnf#s%E%k+2xZ_&(LTuH- zp|GjGMJ|_UCSjAg1gnV9&0}OBmlnJ!1g}y&X?P~ua~e~uBV#3ix;;xVQ5an0E5e;A z58Jv7ZkYm7e}r5B*nSbn)-7F94%bR7D1>n~r;$E_I|F(O)IbQ-=7PYMO1IB68Ou$( z@11sOryb2vw{+lQO3&`x>EimRbl_t0Hp_VDIHL*D_i6KQ)LfqKu<(Dm@#VKW;0rg4;tLl) znLT-bA`^W1Xarx9XH`I5o3crqiQN#!9OBi!SC^3{V(U~dAj4xhymGZLr?3Y-uqz6= zD+$w-muthFDP}9wI#=lSLUt^v8<|*S3xgeJVF#2-!A$7&u*)pVX$8S+D(#`e-rbZN zeV*!oKHLlm_$+qA#SdqXKL3yj`dnb?AX0jDF}D#UGTe`$mTDNpL2G+Pyjr`1%YV~$ z+4s63#>JE;+$qnwKDx`!#rI|pu~&a*7BLgU_AWanQg}efkTpkuQ_3Fu-HykZKmU@W zDmUYBZH{|3W8u%T1Zr&brV#;oqvATFy7U*^U8S<}{oB1vjP|UweT+q*V zhZE}gG~7@Rb%i7P>27dEJgudqV>wHV4ogovoI)}@(x)6zfoKs&f1`y&Z9FCaiPdPN zw~2t4$)|whCq<-GxGff0@R5sgXc>Vh=fDDTb|?ymQm-UEO4Ur+3qK5umUx=1@LtQA zQPq$cg66=K={Dov@&>;_;Xur0^v^T_katrk7gM0KQvh&%Q~+@CgV|H)BUw=B@=jX- z@PrB>Fq|LC56LV$BIq=Q!As`LCrsxZq|QospWB=CH4-EUS+}^~@5o{bS$Bejn<3AR z)r^bjKuat2#M5w(?(&Rm#}`l@4tY5ClUV@b{Pou=R%soM)=R|=)#47ZtY;X4(^oD+R1>!NK8TH@fTVQHX2rw(8l6i(YQjZ zjn?+C+$N#J-2?jVcR!V(1{>4ihoE!Wk~Zx$OBVIC0en9B*(Ky4bBF4txs z>)~c^5v9ogv07_p2#!H-f3uC`8jYocVvvJ?5Z1mjz=;>J0Gaq0(tO~qK-(lx`qbn5 z2dy3$eA%p`(}vB4_@-BYidj`|tcX9uxSMjn2dW=VR`V7M4fu)r)yi81+6n7_$zSwq zC3tTx$sn)JpBVRMBc|Wf8y3ACMs4l7Ch&zADE;+z808#9c8MTJXtOW0HxoLAYEo~9 zQFx{Ib{K&Zv~w|_1Px$s-w;^*@RVZ!yk!Z()Qx|-;AY`dx+o{G#E-E zp$k4=DK_fOdbuUi5<^$YzkoDea2Z_MWlsY0XQOTu^?5Kzl(tq;Q8ZB1^p>ozK=Foiu9GP9=M1 zaR6{BLUl>fPX%unL8!@b8x&g9iwRLGLCk(_d7VnXPVunT|Do7)h~m>OJ?cGVm59cS z@sj+rgEM^A#e~?aJzg7Y5|4W0#gXjg;Wvg9&hL5ECY*MGKjCYEOz?j|31$C*F0Uqc zsk`X%2wnEl zljCE>QuJg9N9ySP7y(j8AHYqgj_$)QUGb8UEIKUcEp=f>m%B16$sDQL3x7PaXMv48Jkg z$8n2I>lO(Dq+02)VHkjET;4@PWW&$L{d1nL2Wi9 zx9PkB49*?8q!UaZaKrTV9bn4MauJwvu}Z0$Axtl41Jh+2rVb)Q?lg0HR}X16XDfi8 zs~>JO3QM7rSvMfRJv>-k(mjLy3A;4s7(Dy1cOdlJ+(>bE2c+O;Q9|cp@@EsSqZuN_ zmt=z!D>hPC=R`{gq|No}F+`yTH1aO$_~Uw44jOx@qX&>0800 z@tM^soLuIx@rPVqCH_ho4(c+RTA%6Qo*T&eJAIze5|Tbpge#TXRpse}J)LAzvGvs% zD>26TM2Co0-$0iVT^e+GJ1(^HBoQH3o)!ZeM0y_oFg%vZI1s})>8$9Fjg+QFhl{gA zlLh=YRvex!_|yK_&}@0MI6T?Kit~MVfA)ij`DJ1Hy z;L0BP7W9G-V3+`sb_iSvzAIkzJt#V{CHP+4Xlkt~-YUU?m8dnvTuh-^Ka|o8$)jD( z=(ts(0A&D~k6<`A2$|r+=!54!48~&HH8`h8OW+xEiUh)4!QmD{0|o&9pEmPb+%wO` z`J|cW`smDa@go_|{I9I<%s;`HADwxc#n_bl64iH@l*Uv2ph;$w)=crul|amYpBwZ0 zEEL`*i%H>gVm>#!Ez*pODJI2I_->dJ{qFkC`Va7|%Oi!&*$UM;DI~jqiV)lh zKujhdvz4T^G^S@r(f89t`~+Qo5f_r3#9gH995r!Z@HxKkIxM(%CM|50?DPg91YG$}vlw;l#rD)ASM{ zjE}BQuR=WMSBEn!u+R5nzv3kwL|*yAX^AM_^H4G*Bwro1Do7b~&JW^wW;buPro{#A$*M{h!m zJZ`eEWI%`Oy)gDySRWK5n4=T#<#nEb=A#VF;Pn{t^46Ie$QOCqR{}5cyC1)?*SHHe znrdsxZ;?}u6`nQaT>KQK{K=GNIIz^!OznGQ3aKd!Y~3IgjG#AO^-bEMScRP0K=#53 zkL&{r*o<1Rx!rEb5W3SYr5!2(sm*RkZFWOytD-MAq`29R2&B09p$(y_<5@xK(a+lzh~YL_OxlH$hPc@sk!D;>$HZ9L#X9o1 zGg-mozbaKi>JauUQk1-wZ}y5Zx<3$U8KX4;U~%aN1&pWV0yde!8glz#nx-+jJcA2K zaN=iDf)ATmqZs?qdh3+mI^1mf3$xXw*ov}T93LwW7bZ)S@dg9zjKn03Jal+_W6O|Kb92z&EOu*%!p;o$!~01EC?;lOO5MYv`85#p7FO zM7IPDy44aEk9Aa%=rNy#*HF_@yf5TPv#7KwU}p7FJ^>&s>udB1A?u%6g{)8PQ%L-Q z)gVSF_k$3Lqhv6<)S~mt65tET^U~1O*~tNK=;~yFuH!{=;{yAb!z$o zJ1bde6wG5DmhZb*^IJz?n26v|5Tw>tQ48f_0XKrM1?kNaE1+ChkmlkAK)RjMEQ%o9 zYT*YV*LsK1t= zt`1~(fy&_cNeG2mpD>^x1%wa>Q@(`mb25rE{rQn-;AI9Zu( zAce+?AfeoA8Lg98dHasYc$$Qc%6u22o&Xz3UVs(<#1~7&1 z%M=^Ve;5`yIiaCFj$Qa;ph=p4WAQ^a1Im$aLx^(Gi_D4QNqWY%@W!*a(lbVedw#&~ zHGh^44}t~a*jw6#YA!)%(SD!Q=iA;EL7r$Q$pInG_AgK>$N>a;T>7=Lh8IKSV zW4wzC(%DA&aLq@Dn^Ep19Abd~Ua%M=PBW0+%&_A5lH=avT1+rf>@imo$}r(>AQ*0+ zo8i7nq5+gni*r6Ci^)9UWVqbyo=7t;j`=RG`{L|lnc~FxFRAM>~<|`568tx0}#WIMe9vu1u3J7NsFGqC!In5 zb)z}NadrI#zF{vc6UX`jx-8S>8|m_0bomin$b3kWRGJTSCT~~f!*gvU4vbk1hbIf= z;i>7-v8mGR?9j;Q(CGNEUmTqsDf^Sfk?BIzYUtSg`z^fq#Axu_xM{25j^oH~((-HK zt%j*^$SlvXgLR9BHsA@jZCP~aAY6*+ERn8v3il-15dW0McRctrx+U!t{s}6{!X%#E zBcFYs9el!3tPXSeO;p-8#8sr6Wru@78!Bu%{A21_m=32`VLFUHZ8Gy$4)7g9bc7DqfvG)E7~T!XC&j&{VOr1+4QBN7l& zAs=7DB|a54L@a_@^H8Sg>uCAYT%cr$4c#^TW4s)FVg+9| z1ixBuzwx#5j4*GnH;kGmpVZBw3nwCoJcX<1nR=;mfoACqg=*W+i2;OqAkCApszQ9f zk*Nn68!!6^P$2J`a3o7!ZVHEg(>IdKPQj}d8gu+rdQ4)$r(nWEKXAaC(vR4~rq2c~ z(`jtRuqR`~HjsgaPVW)TcFIKj-s6vpZZ!7fk0W3wuetzbM-o2F;zPsRtz|8dNtdBQgp#ygh12xw8ahARg>ue-AX4=q+2{65&g@?AVa z0b%h`E5RR7#dxfuD|Qu&G;|udJA7@aHMbq70LJ+Y=ho zvSXN^#;DeZVFsT1# zghLRs;B0cpeDYx$M*~kfd#SQ0m}ixaF%&I{^ee61P2?;A7cB`MrQ`&C3b6(-(gWbZ zP}JnV<~xa#61$LP#35zE;saj)8IWRUreLrv-A9DWM%Yz2E~54Dv`7cbnrTX`A=}F; z8Jb47=m*fd;|z#O<1B*4m%!qvf#yr}i~eG)jtbpxL*Jo*qSr)N9*}Fs0+H7^$+- zk!Gy1zI5Rb|10`}RV|IvZgF$k-5oeBH-lBpV$fWy4gt@O)86vkS#a7maoYIWxqCRg zbPCQ9PzRtB*5vVn7rYeMM3}LJpa2`R6f#~L)J@z*K$|$u4H>qHt#nj`#p_7-ooO1$ zg@{=Qjd*oBk4>jwx6k3&PUxrt^`Yn#+c;3=vR_@Y2#(nwXqjdM>6NX8nHfS)1Z-(g zOcs)44Wgt6?OA53HsbQFF|bLLPLkBj!C)W8G+7+A^CY?XXwppSr`LD7biWe05_s~u z&RKltMc9gknz>z|gj|&}8}v*wf-(_X&j}9K=hh`}k*o~Ll*Ov%WHDKWow{V7tcT;8 z)r^bDrOHku8+W047N;fy^_zV1b*}$hqq4AoK#l$Z zuYcy`$k62YzBlb|%~zUl+U;TeB@W*7N_DJ>YxS1bgb#hQyyU%UH>bseinMgNNQ+ay z^gJBH5PWpFg*d|5cFRW(SjUkTMGID}jpuw3jgI({ymt-@Rz`@+w0NYfwX}$pnGh&w z9gpc3i}m6{p;es6Sdso8gTYYhwPwB_Atn*eJOf8U>voU16ALuBR*$)RJ?2jNzCyL* z1_h#nx!bw=cvGTh(W5NhUKZ+!lJ@BaZzbHfzcDj0+4>vUsm=bW9#*I z$-4ZvblHSe0`0YueMRoI?ll)lYJZI*vuovgY{PYGdTe5BWMXn`dUD90nD)z4g;4}( z3=Nk{L*v6^vt4Ys?!+igctJmIdc*ZKGqub0ONjf1oQIp-bM?BJ#kCc$4a3JVNY?ge z@b3UG)3I`p9pR*9Fgp%N#W`Ujoxye_|8Yy`k@Vo_8+FeNlUw zlrV=7R~W^T94$6I-C0J+5RqTDjKk8Dwm4q8V5kgMP60Z9Zox-_F~U(=)#3-GLBKDu zNgP&VlUQ$i*j$Fx538FztiZC57>%UX6ir19uGP>sK>Pb>jK*vq^$~qX38QGzc0$puAzxQ5 zv{kApZE7&Mr;OJtA)C?Lx@t(&F8rfvHg80BzSI+^%QT|>8j%ksJ$by+Xtr`!X{YR} z+8Q!GQS25uhe0ocCH86*=kh20+8p-IfkQ?=7_*)a_-x9D?1@psmxP%M=VL(PlroPd z!jL+!#>x|GjHCOmwfHWQsmIHm6GkKI00qG5V^@p5JjPR+lN>er`{H<%*eE|!tN9Jx zJ8$~yzUVXU{-{JXpvX@ev0w;C3X82aTtm8j+n)Tn`9}Rp)UX|))fPRYshPEWnV#E{ z$id@a|I2sES%*ss(iRJ89OS6{P0{iWa(HzTH+TZ?!0!H&xRFq_gyVK89I?A^3CBH3 zz6PTy&7v}udsD#?8OzkCF|>7*slh(<$I|i}V!KbawA3){Mpmv0V1jZrUiYLTQFRwm zktg|(78{*dg%;84AruptENu{`@a`UiB>?kZmkicthN>ldxJ@M(>SN{#Ol?!e9~PXk z&&?UPNEQf&U~$HCvY7U&oSgAiS&tM>Rx>W9Ol8(y)w-@RPG-js-*GE;tb-CB5J=mbk04Gxd}xLb`}F z?LvuSbB8hSJ<|fsWb`lJGcCv|Nz{5Z5eqfjWwq#Oz6M%FXw_|6Fm@mwC1r0vF0}bT z3+=Sc2PG+*vCW6k$?=JaQn5HYJ5eZ>r$)ynC#R;0v(vL9llU=OPTzbWgTe*89H|~Z zA2+@Cuua%cX3B?aOGc>Ipf1hLobd~#)3xf7SmCM>9z!Gs@>#gkE;x#JLV*`KA>V|`8&>7jM{BU~cELP#zv}G*XMZW%1+M4W z0CIv73&YA$ymYQnz}``%RPt*V9HL%0kE{}`5$Q~FNdsNS4-IPt$X2G*xScjW-PKD& z7aWE>gVLODKIkRBSWu<#e-&w!=L#)fjm7u`!!oOEf`wofFkQY=JBM{CWnVdr%HvX@!{FA$>Bnwn>gez!%HEWmT}Xf=`L)-$hX1c3#s{A zri6MnR+%%DVR3rXk#NKND99fj`KQa}CfsQ2m;DADYr!-d-Nz`8BucJtps^nazL9Q8 zlI!bGNo+toJ0hRm*$%$RQLJ+0z6+JM_V#dgc>5nT%1)s(4JQADq>vyMcSDh;B#W~#}*b_O9Mhc z$xhXSz{vq@QXZ=zMc>u@(RM@Z-R+^sVC!A1&(rH7ldFqFrzW-!(2R)-;_S?dJv1`) z*@!n3o~_uBPuMiG=r#CC;MDTwGk&q&D6IrvO}{4PuN5B z;fBbo6*R{#*n4mzim@nXi=-Uvf?1UFfFi!&n^T%WRkWIMZq~H7 z93wcP+pTfN9b^SlZ-e58QVA>B>p+6i+>+G`$Z`dN6h_RFtuJ;-)0(asiy|~l^>)Wp z53TFFTi6`w9B#Ke7SuD?O4iiDpXDdDNE;c~oPEABs6XkI$l9W^}UriRyb zpayOhr3Nm}m>Pa`y{TdOy|zV@<_}@V#EQCLKJh7!kOQ+>?oi^0VqLjCRgEYA^LD){*Gw!^yy0btzdpt}3(cik z(OU!3!~qb&9H~m&7$dz>sI-_Dd={`%Un&w?m_f59VV#Gl_K4LpLS5){s|$S+yRp!; zn_&bFFyaV-D-dT8apw(h9@`*0(5@7?m$Ik#+kiiEW|Ai1BtBEiun zR+!})IFh9~M3~Wyi!s+Ad(4v%BwS;L`lY?Tr23nLLc&lJnofGF@Xw@GxM8<@H;In# zpvw=@<)gTe8IKmT(u}v;X~rYXH@3$#IX+n)9-o+o3C|y$8XlR3VQ;!Lj=m6qG*rvn_BMV=G zPhcLFZ$s`FjT$S#pHtzWRj6|L$WD!PF=5Q*O7KZEgCXfJaU(ce@ZKWf4MUOz@4FPr z1b?5>3`=LL8TXbwntaaptP`39|ANos{g-=Viz1Qyc9ruTK@ZxnBiI;TzAogTjEmQ< zbKphNE~1Prggr{eMI_)830nGNRVOh)f$B}>3X+XfvvL9H0iO~dBND6#gxq!5l_S&#H8Rx>V+oguwWtm(EaaPHe* z^;wx*MI(rF_0^+0qDE<66(o3b1(cy={VCXG@Nc+~YDHRrRINr#HlTJ$;p|YP&6TC2 zmBL)D-h|t<*e*Rzyk%wCD~$P*)1_&g+KO}EX3IkeB%Ylb8!nf}rpIT8ij(P{JVMKQ zJ%|#gy*+}P*0Q!-^e_9hmU(cvF6!fgc@3b`8!ksU-2F z8&3HSB*D$1aN=U+{;~nQsJPK^x?2JP`|5?W^>za%V%0+87(zrO>E+u?@F zLmi;P&7x4@;{FX3Meo{Zs4$B|vf{a;NctkYx)?fB5;|5@2qmb&!qH6%Air8zL{ikV zaO0?z5M7WehKAfQn&X$ zVJBf!tS`*MnTx#kx{*bXyP>qF1C+Q~6iQsYkx+VnW>E6wLggNp-GIT8aO9t3xyiKB z=T@!zuT-sp+G z6`ooUxrK$r5T}iTw5cw*r<#k0lBSyLaTJur<+*t022S;#W;WFa zJ{TEZd`b-{6a8864Eiu&wf(Zi{BbLO01Df1qlvaAe2WAQNZFcjE~f35*Q7MV_KT~T z+J4ypIK3Xj%Mea`li(zsi#)O2<$}v_An8oPCBA1PAmrM!5zyM~hSroDS{Gz7Fo)=u=}k%9JlcN_ zhuu^?VFYaM^R6*#khu%4N4rrYr#`JD#{OlP-D@FdQHRkY^)T{a|l4kJ2m>8(C}ySG@!8PKf?X0Ot0w*98{EJe4J)Ha5&l9NF-oL+gpFVBt|9Oc;U z*P9=rRX-9x)G4!w8Q?-gv)_P?l2!MQHi^AkA4AS+(U0Nm76*;5q%p{1jmW==f|@Fl!>uk*#%MJXTj)bvV~k~mrlwm2Nx(eigj5jq9hG{54MU}XX{ zCfJ%D`bIvn*$Gk0SlDmRO|)&SA2PiD>T{VA^_$_Vu6gu7jkG z)h<^W_1XgXJ9*_AKi`1-@Z__B!|h%?HFNIb(V4SHPQT&Una{(2ho3!l`s}%xBWL>& z_XmgGAqeB3OGC0wjL5;g!!p34?X-e+Tp5$)%6 z9ZB>H5u8YKAamEXKiU%xM|`wjc%qQ7BPWyV1KwG`McP>CXrix4k0 zwYpBEVbV@FCOz5#lek$Flek!IS8V_$y&+pn`p!g5()u0rrEu#o*@Gnwm8`A=9!akm z!W`i~L-u}P(+vD!2%VH)Oc(f+V`c%(opMRH)=i70kybU6t%cmd3tOBYL&7@ ztsm$DwZzh)BXU8~?d2443Cv1km|TnyuUbDGvprM4%o!aqS(a6 z%0p!Xu&I$LHl2T8EV{{%dSYc7qLHu>Bs&U47!|4M>tzH9SIuEY8fEhk4Pz-TZ6e}(V~_DF3O$zO?sdGUa1$`1O&)1CkZ->Ae4$pD z^Go4F)(fs1www5R!724Em!XwFP|^)}6Q$A9kei++I?xk0i_#MpZ=~RVd$#nnm_|<) zoI<)vb?p+Ek-(f^2n|rwtq}hw*-H$vKI|3Z|Csa^L!s?AcD-q?_Z1G3nXB5YdsoQV zNT+KTr43RTy>OtnU#ftNyvvnlWwuhSwDjRxt5{*Hv3v6vJdqJx;jp4Ew2Yy9g)&YE zhz%R-Gz_VvM&D5>whS;#9yjF3l|~?sy9s1Z2Lj<{Q3B!OjURPq!l7(8IlnPe%sJn@Jt<|6QV5JakT8O@QMpX)swt0W zQ5&Pq4L5;JNn3Oxy|;Rk&=lfZsiFtjjg_xvqYO?-@9!yfSPDZI(@LzEDbo4Ezl~Pv zx&T#V`4#d+y||aI#%f)U58Q|a-Ks|Za3tjju z7~+MOR1J|uT6>^rYpm9Zc(ETEUMUy9blDI0+$*&TZMuuziA5{x0G-2b*kgH%o*##z z+u#3GLZeWT@1_Zbi-%TN*O0CoNp4-B@=hZG*GG*6T&#ki-cKKq zt-0WP=oMK6K}nzJCu~$o!wSOz+6IgnB_%*(7Nh}Z)(spkrm!g|aJW7S94=O2QyT!B zAIlav12%BnoIv4v1Z7!3;bIk(wE;l+jckFEW1w^tr7LY; zMhV1%xCA_IAc#wVFTrGeQGzcT`Qgjr#8?7u7NsdJ&OV6i53>c@Uxmix&k9{>C5&AA z0L|(T)8%LA@~gOr$Ti_EL8K@n*Q~Pw2ana-3r$?-5Z~}TPGdJtP#YbZo*o}9m!>AC z#tM`aaCD+nDvy+hM*Q+bX?7}_5%4w3TZ{9RY6)BITowEc-g@G`;BRr$(Q4cDS?)&O zWvi6)0^YaW*T6=lzXF|ZxeuEOjh6WLmMTWOa-uIWFW|q^d;5Y---p}n33&nk4bPCS zXg&)<`W&>07NZLpIsGZLvGub9-KSc1Of}~M{8#E$=wuUJBwBX%Bl7=wR#2krIhkE| z*_>>V1<(Ri@M(-^`3~uF^la#Ny%PMByZE0`3?TmtZZvV$yxt;V5S>>pz6bOAYM$>^ zG`l-vaNLO@tphlMZRm$5{LaW^4v@SM)4Wa79?$UWOeo^aH4rGSA%U(0V!pSz=lfN1 zzVTWMk2lL=+QW3tH#gf6X~xC(p_#QPSr?>#c>QPjAWLf>a|U&C6-Q@>OH;G{(C}zssx&+l<)d5Td~`3ya$YA#dfRSc(GA27^z*{ zU53?UPWlwRxi8pHx8n(%bQ+aJ`R21YNAiH9Sb2mFpwdRF6Ww!CHOom;&wO=?ULyGF z(JuIE7rhEDn_nFogo*8+fnx7B5Xu(Y6$ku01C}teP=v5ia<)ZwnJ{EnAj55p48aJ# zarv&;!z;m9QpE%+PTU?$;zm%jpm&ReH2AdzJuZHM7(q%ioK)ay_GHMfHw5S>F~D^P zdT<=QGA~CcCW0o@u?uRt5cUGvVwR0WOy+0a$YZv zIa`Imh~o{o>RhQeE}ax0p_~W=8jhv2z!%goz~$R7$}=mD<7~-#V`(K=be1+yio6v~ z+-Rn)8NWk92g1ghaW0<3j9*J>mUB0o*f>CaDMptaphjbWnj!i;<2T#Y7SFn810fk& z+b=d{X!45{WXKYrvWwE-bf+6mTucYdIN`+gFcMneX8nX84e2 zOt%S?QRaY>gzh{7$HBU93PWaCQy%4^_IFfTztpQEG-Hj$6?0_cRtUrP#Ts*#U zX!3(uqRIJr3M=7#cOtw~FpyfnV5G6ioKT414P}yOafetY(7&YCw~$R@ClDljSI*9^ zkbh&PH6I?Gm_vws_}p2zS^GKag${TY@1k9OdW&ZJcuxdRV;C=bFgjrLrn98OSJ|Jc zUPZ6dui9t)ZwG178)z2ysn53$UULw^LsBF44^vnQ4dc0b{ZjKV9g)nmP)U9wM~55j zmu}|+9<}6Y9uUVXAAIS8H&5MJb>X4x10MUUSHyy==y%|`?{E{-S9BmIZWiUaT)csb z=TB!!OjU!Jj5As{40aI`Y&CQUm1gLK#|3e~HIGXpTaFP0t39Gq@=hlEAFx8Z#AuHi zBn~gmd*B5{Bp1MoC^i=P`qP+>J}>^wf_&(~HIU6AJwxfbO5060*E-M*H;d8@7pwer+3T0T zoF&~X|5_-4;zXk%DEZut11dr!mgnv~(0~w;?#*;$rblv2C^7O#)^`#y^UVpExj~Hm zx*I{iI1xeL^R`XkcKDN~1#Tb3R4(2?O#Qt~G4+qT$JBKL+3GIelSq+c|=jyqP^G2%GBxO>} z8sZ(gfRpj{JZY{qK6S|BNEW0I8eGSoG*~`OwKeZE4Vq$mBRS7}pM^2q!__35jK5L9R4*#hl275Xwcc4@r^&sb#Yn zUIbC1RMiNb&eQ_rmVj-vzUVhvORz;$&1|i*ANf#d(Gb}ynY6=K4oKUG{Yd0hJbs~` zvd-y&+ko>lu`}WGB#IM(#L7(#lfI2w@!AHTN0ts^FkB*e9{OpTvFb}zTzyZBXGVBsUi{8KQ5y~^f22^H z_e-H*(|Ww!7wLvborJzfXvkmA{v;wx`resW2Em5VP0RwQa}x02t<8l|2>Rp5SaWbhYh zu!3KS`9Iv4Yg6Lj)9u#jvT*QF6K!mwT$hYAS#Q28woGC6@OZ3Z4g6uBn?F3$fj@Aw z=w=%ik8Yd_e0Qe&p=j(6geYL`HhJB_Ai^wKpa5DbM^?W~Ra&x&=h7uLw_#DOxDD}z z@GWvd&T`u(aPf#z9;vTHI*p8~yXE7Jt{EBk&tblJ-OIQ?7GDrcP1Lq`Ks`0~I?@+| zU*)ER_jRBIZgy8hQgX4%51PHC+?gpQOdFC?q>x$*03u{S799U74$bgRV?iblNELYD{YTV96YO05*nrxGsdQ6d= z{uucsdQe)?^{Y*PbzdkYzwS%DH~j-;vm5+Aheaw`wmq1*+GaX`W8wq3$UZpi)kiDh z5amK+X}>(cI@~NjbWkn&<$}J0(p+(~f@TL+z|Ep|AuirPyU<{!tl-mzP&Dj989^$- zGpyaeMYiM!pwc#=RgkzJxNEUdm|G}#R|*ZXHsf%ZCW#Gi=H$rG2+gz&EuVB}^MW=i$Lf7_MP%0H|5}A?xCL9G;*P(5I4v!#{41BHdU#QmS!Y9QC zeqz#OV%tvyh){Dcg4&`xVfani7zna1sU_gyXzDHb*H)&QQ7r^HV%}a3o zktgMp=$B+A$#i`0OwD1%U>bh2v(lxjhV-hYZ9O)dKI$gs-|Rrl+$>7WT&!Y-vX|=z zG9~7}GvvBO%no?2Bgi6D9pB5*g0Yj7Z#RjCiSCLmI+!W8Eg)m;*s_H{nM+8wP1}~T zJXcKFt09U;uULN5mZvcJ$mMN{0Jo@;hDB-!5fR2FG!jh?ib4%y44DXV7&@s+&>xx_ zq=_@bYIM+1*s=5*%O6EjXITgr9NrSs(@86j@&m(f(#nhGPAQ6zZk$h_-ncE!-ZS3;?#X_#bZ)coO5bIc z<+K;A;ZfK@p?JW}gI?Q#2XV7IBWnvTet6?n*(b8(LCY67L{_XTx|r(-^DsR~4;V0s z3oRSeuZag3F~A+6M>%IiiVR5U0Q}dufq!2I;B&L>5#V#NO3#$N0Q$U4f&Xp>ejFI7 zQy#?u2?_8?juBEE%HH3=1EJ@zT<37mO30g_;`lNUA{jd#F~imJ@o}@6q0b!zu|t9# z(TMLRl!Ah_9Wk!D;>`Jk+5`1Owe^0UN&^ZAFA$BT?`j8Ce!&zp&tMpApL zoZe1i4a3I-YJ^sQ)nw)z#I%JIk*zVwPQrFt3fO@)a>M!Mh11rUvSG5;E3_Wj^ID3! zAH_A@p4Sp-fAp8Wqbqdh?##}HX4$0$n(;R^uBK<|PxI(o(?n}d5jv6(7w)+g!8=K; z*P2)uDoqA`N)N?BeXGTtoUIq8uir}zi?Ml#0edf3o*`mwfs6B%` z0s1rAAfE{PI9FV!sJY0x+uDwqhnFht!q7c&^F^{JdL%g*Yqg*CN{!s<^qtDb(2#EH z8$28VXR@nrlCTx9R>4WyW!11~YXk1h4?wkNyywVJZRM1HN!*hD#6qj*$Y7}qylr5k z53N;VAz8ij3lfXO^~TaK*t6a9&#m?Rb4BFoP4UmQkx`p}ncj7QYnNPZpXzN>HkOz> zS8K@8V-LyF{Cm6i%!PWp_n(2g_eM&|DuqCPF_KIQ@Z>e zT|S4lvhJYE>*(?%U8d>sEL~p2g|bu9wyMldx!2t8)7dFW_|KF$6M4O1q^6uM&JK?c z5BbQkJT^33DvXt9C+I$2D)`0e+39F%N=I(x%NWIp(clVhIyL1ThY{OcD}`YNO(R9+ zaHJ|H(|JA9M(TTi+24H*H!zxSC9suKtcw zFLIZflcA@f2j^Tq|FGdc3IDuSrRa%u$f`jYS-W8=?&ZkZQNbqn&{MeW7og6c^lNji zc@#YPq;})cvWOTZ?MhW}9Nv(AfQs#hsH8cYm*dRs9@uTH@u*I(^Xw-H-(IR*IAmm* z6LCPbcC{Lws;%3zlc7Zc!8HJFc{{lzwp%_N!sb_k>s0ihQ4}84TB+e7xMciCJaA%j z@OIn?1uaxODp3(xJ}p!{rLZ~pPbtliQrc?9y*(EC<7AA%@4?X45rc!TKz}lg^!fM1 zaZ`Fy)A8ux+}jf!!9sz61c7IkT5y^@fRy*edI=tS`4`U}pCad1Q3204g3?plb^-NH z9XmI1ap>adGZ&vdbL{ZBV`tQolzN*7xWmrQK6iLze1aVR=dl-6kiCdX>dNvD({6#y z`2reYDBN0ZqJ$nFgn7}|$QHr{mhmn6rdp{|R-+8JzUnmuyS0Gk&lH;e#2BYkRO8>1 zKii&_)0rC@@TT_U&-jbgLebCd9^5_P?Y_9%D0z}f_J$;862&l!1xXaQhi73(2E}wy zw@Y*6dMwuU91_hyUGQ7;_0lP1*)`>ZaKV6-L8=#NSRfEr)L?Z~ z8sJs6aWIQ2Efk1snzQUubyl1Qz#4~1Tv}v+A;{ze`Qu>ygm#7m(U0xUhiGrh5sj_x zW;wH&`U>ot9xjzU=~o0%BtkNqs#t-{=YZt8<2y7ESN9>ZT~}YCUva~qA~^_xDFh2qA4&kRm`j(? zkZocgq0!3f)EK>EvUQ`~drY{fK>`{fjd}$kp*&K*s&#mx&m7g*MHE6+ex3Xn;Xf&~wL8w)3nZ3I)=6IoRgt;=#i1*|aHoN`vHf5eS6NlI__l)*L;F zV^Dcd;wV<6{^>~^Vw=%Lutu8xp2VSbm?5`rj>HiND=wjLcF(F}KtjrHd3DVauN_Ps zf{Wx5U9{1v2dN#RB3zR9*7u=(;zri@hDCdcRE4ji%X@JlTQu2|Qcp@EL2rdFkTv>v z0eJ&fmc7Z5(dqG#q2UpKY;tU(P?(+`9UJ#2$~f?^P$*1wbJX8QFn|-o!AEh^=IGZ* zJBpb!z_3Ukj@RaF_hHgNWNMNDD@_L{?C9D;eSe~b`d4V!yMq5tw|Iqd;RD^~dQ2!bbh{YHif<9)*?qiR4X;Sc|qeebs__ z@N*c^GDF-<4!08gJk<O(1vOD7tjW#*%~~+HSAjA3^^|5& z&~a}Y2f9DN;MNs%!SA5QM3C@lELIjEhRJ>j6RRo_CFY%@t)9po;i7a@}|IuL$M{f*)X!IQeZ?Dxt7cj`8>ApQt4>S4Wq*yV8qR$Fyi8k zgV8@_1S4Ovvb$m;lOghYlTiw@gvB3u&imZFYm1y*7$z*<^^7bg!-SJ}akJ>0b1@mZ zEyKh*3!7Jee!8xyjjx7E za}RE>B$Z|-4SQG6Pq!qM<`GnqSQXFSFP{Z&?Q#?=x%e7XW{PF6rx&cJN+acB@Xn8K z+I0RqY1>kowKQF`W0t9(rm$9>aLf-=#zmdBXz2t03u4wVy4uRDo!y>|qjsdZSV+YU z3TNR0fCCoDiret{WOZ4VmqWKxh@q;{B15uLo>jlpH{v5v$)mJe9&O7MYr5Xso7hb_ z2lR0Gzug@#7#n0V##6^?mn)5Wjq+XQpGUINO3kMlH8?xXrA2+g1HcWpa`_O|tWvpr z7;T_jz798{0*e}MmDB*`(xQfY6+s1$r8J8Y5%;!nL^O=SWky6_kwQe>DfSLi!41%h zr*P+*{+Dn(g<|A5ZA9I8iXq1qdkpJMEN-=5P|FRf{b|(mn45Y=I#3Tci&764E0r>H z5p*a^>iO9e>RH1GA^@tex;alhhr6kTR;A+tLzvZdL5kK61{nI>fJATy+GyfiX8 zGCMIcJY1YD4^52^7s@4ndZaWuRw@=p3M0{wwp*6B!UR|?HT)V^1p(d+gZm}iw84Fw zd=ltFWc zL{n&ye7>UeA?B3#(i@rjpg%Ju7Jb3t=2ESQkRI8yJiyHumP%(5bEBfpD9T6#%*o-1 z#P^Mj{Sx!d#%J(E#7520Lly-Fbs*339h%a_oU8m)}T3bI2k| znT-6P0G8~gVbzD=!uE9&?}DYig&R?oMO_n;x?ridsB2mgXz;d_W>KQ#-pI#W9L<^` zQT`_kYyF9G`3G3@c2cCo=PZB}p<$i8i9wr)eXGW~na((8Fb)~6uolF6z>QdA9T1C~ zMG=dOHv+M~HWS1;fA!VMjJ7J=>Jk_c1R{>USZH8pu;n*s*HZ#g9Ezff&FC>5zlNBn zre^D+Ut-53R&IiQ>+-MY*^2ZRqxU^rs<)Hau9rL0XzVkK19!{vz zH7^Za$iEPNiHO(3P+ADTte1t{MB$#C3QN3Y1$(`&w%ha5GXGqfhe*GJYTdlzA+Df%|)D~4BJkvZj^fnfodYu7w6(o zm;9;vfxH&5T%SwG=&y3_` z^n}JKJtPHk9u9gG`B+7_n2xqj|0TlkN}#%QIC6<#DItfq(|pNKZLkb} zz|_yhDaoo{$jv^t+}tYp7<4&HZtj!CWRi5sO>Tzt@>Vl0egMrZ7o>GlVZSXKrnYah zVrtU*Xv{C!9gUy1#nH(EdkXI>P2m+>L0s0NHuXeXYuWQ{ckT-jxjdYH1CEbN+ zyDv~ZO6vtd&{Yq!<-mX;Zd0|Q!ldTP?2 zD$Nd0lqaT2{*+%R4^5XRi$l|eQY$+K%>eiN#4auYHt;y)F0| zx_xd!wy2**B^d(DXYXhSKkF#o8Ls62cU0QC$y$!SaYBu)Y(GVB5LULstFf{rbSa{7 zo?Hd)tjO383+%y1quCAvbAE*S|7E)TE?qu>3u!n+ z?5V-V@!2;bbJjt@+591);B3L|m89U@L&M${+)KA41?M%WBnfLi3$nh?QLIE{A1bp& zw7cjH>#E>L5h-GGmYCS~Y>lx9&#bF&SE^rIMEc95QmLApD4y=0)el_>$$8&sy!puF7;WiBQ$ z?SwMdN1@EcN=#=@&m);a`MDUB*XByr5$cu(wi1|7x2jg5oTWj1ha2i#oCtNUk3yY` zHxTMiZ!px?1_MCdXNDcuBN)h?l|2E+?QR~uMZyuvp2eeYlf|U$IjNVMLD{pKadGC# z-pMSXcm51KdQ^%y@lP3PXOrEpVw}&?j($_G!tRQ{9 zK%SF)hA<~lOP}h-_; zl**XgPT+JPpCH#7a^^7I52y#RFHTQ#0Dt)2NH)SD(iE7xe6VT}``#0v2T-6>)q3IYOPRG+X=C z@n6DAOEjYm$uPZlq2Mh>dlC)N(f))l&v$;IP-)1->8h809?()h+>m+HW{<|%=Ha)uo2~kS@fxq( zz;DvSLKiGJM-?s?D%HYlRj1@2k14@o_$eIFfhI>mv6X5we?;`k!y;I8@YQC)m4}Er z>d&_45Hfna-bOkSk#8DjDb!m2RUD3x@(MiEuC=av#pnl_eq%JF7HD~TmyXqNdZmJI zH}BH`r%v@|G5w-H%x`QK;0boLQfyV~wL)WQzhv?Q5<}&Wg9jA`%3dPF6?^A2Ol#cv zH;}iOJs@fx9~6~3<{Fp@&pXxWKJS{{KQQk4fotOB*Q3)(UD6-70I(IJryy#q{{iXp zW+JQX*K}5-676TF|Fh2Su)jL?wf(2+aU20s5VkRWhaQvWry7(K>k=Wx^;V&3Oab*Y zTbR=mNz)<`lsZ*FHgf&EpqXDz&n0t%WVv0HD2=`cyD53=a`Tt`*Te$s1M z4JntVUu?IC(uvj(vTgo^*L|9DH|Z90$2y2PZgy8h%yIFf8>ZZSU6x{QGvym#WiD9kMsyeox9jR>+-X%Z;Bb1xh_|AIoAbP&cmffs5E*`Xqxqyt*KOA`{Q ze2Z8DKw;D>X#_W(QsWa(Yiw4HbWtv`t%J72OwnvazMIZWpg|Fl;U*Z9HHL*kt2i(8 z02|AZVoFpNIYA~R4_hm(?XqX0 zyCzd`*(l0Ug@hX9#~J@EZTvnY^pR-kfH!l-FO*K#s!K=e)he8=(PF=RDkSZLq9ySR z$_1H5);ru}{cs1e=4OKtvgYD_8%EaOktJE5C9;-jM7o*sjRB{Fcv~j!Fb2ydVib1{ z2iHXVfe(4e%b^qC>`kDYP5Yj6M>?AqK0@iy-=KUUMbO1T%w;Mr5CMI z>cI85Som=#q(|4V%B(fjVw!6rT7_sdQ`)n~9&SX7uvG*41ea!JKQ$25i|sdDq+VXE z%@=AVWU!GR>|za?S0XY?O*^v%3t%{&Frpd8mAYibLZmN}!{Ds~W*vhB8>=EWBaOst zIJV8m9rT2)lKQcCW|^z%vY7VHoVHzVhCNWL85gTa_{^7y*=^hLa=ofkBoY~4Yq7I*z9TU znYtoMX}WFcGtAWGz=fz<>{_sjH9%x>BAJ0+k{I@cH%enEZ5c^Z0_+m%H6AVSJ1+kf zNthP@(DZ->4=>B@?=cMaz1>Q()!f+2nL;#s$)@{MmA1ztRt-}(!8w=$y=AmcVdIeav!W1}fre*aNy1aufUqhGo(d9#Q`ANEb92W}a zCFd0x%$qmO5IXT6ylzhVm;EX@@8wF#H&4$P8kruS9i1K|-nu3D7rG%> zZTa@5&#uU43bi?Zg@Qx>36*p=pM8Bh_*X|UoopuJc|VCtJD&G=xl;A_4Gyj*!=7Wt zIh^+&secj9d+3Hcq-fsdgu_x?BWTOCH;<}#dmJ*+suaEO*+YVB2&i$$u7K?*!#4OE zjD2}K7Rh0QmEiBF=r*G$2S2WVKp|puKaE=q4BI5g5Tk2>;ci(>F}nXNrP;laX55=H znPv^W?LV--&u_VPP3K;dZ)C2&TA$lnB}Rbwy?UF{fH!1ZR8xCHknBL#_+z#90`-J^@lAh!IGlqy z5vA3H7k8uCI^8(xmkUUVp4+4QL%R8R=gm*^S-A;HZ#P`8`ML1*c{-S- zu>hQ{*Lc%Z?gR)l-EX1k*02%dsPS8%=N315Zgrz47gHJ~Cwg-IJrVTeViiK3HF`dn z9eOTLaU?=GuZnAsKdR#P2(~_8Bdy6vhAj}?8Fm%QB?i@0v^+P1vpOSajwrflQ3uY` zCqWBxvpCN^vY0$bouK7rNI!2iarq}|9D!OPZ) zQucx}9IcIaJ!TnWmb7u|ODUd2dyktMq~6F1r&v>}V4{6)CYl+gS^HS)tCx-T=!+G0 z6-E>qphDpH=&RkRDY55JMvS~m{~wgtU<={Yy>!`y3oX@10gy|z1ht*EHTW%(h#R!m_{TOa~mBweR(M!cSUB+7N z&2ki~DkqQpLFjpSGM$kKAL`$1fI!egFI@=FSZnDIF={;=ks}mRgoQ5i5^!^RN~gyX zmw;#JlXAgXx?$nqTmrs;N?L=6XCIT#;-IW^j$%rrCPeuWRN70xwVWwqLy}j2r>SeP z`dihph|#`i;TOF3BPxy4_a_}Ck{$RW;+4-V(m=P5MPis+O1p)T!3<_5Jo8VDdL=kP z#m{xbMVX67oZE;UAEf0;z`5Xg^oOPCDclGxEcCcvq6e0y7JBSb7#6%CrCAiKxVMeK zs#y$c{juu&MXeUb&K^=Ait~joVG%(fT8r|DR;dSUS(rr2MbQuaL(5_A0Y19oIILF3 zld$LsbLmMP(cgxhvPD?vpoBX$%FFp=QsAQqY5HaPn&*Edl@@Mw)55(SXn~tWX@QF$ z-vAD~m<=twxdScSATWBw0J{$@PJ|fPPUy{A5aYdl zTJt+uIyb|b-)hFi>vH6r@d;4$SUq@KHpu&f`W#Ii9m?}dN6r~z2?If;r;(HG_fY-D zPgfN5E-q`(+#~=xDmy)%5~lN7>qOt+3MT@9RjJ6vQu0}13ZGAxDlW8&qy>sxMLuDg zYxIVnbm$bedvmjIwv27P(#Y6Iu{=IjEYD6)`Qzimvr|*kW5Z*^v!yPUkzbBiBXRG$ zansAl+b+uda`LstA~ITWqnm!;L~q{`{1>_*f4OtT_YJ5drOJF3cKL616z>f6k!4ic zE52veu;~|>b>`_`PkoCe-&3pE@QZaOHv1my3f?Qc(f9h$f+N9$?L8AtY?v1i9cG9I zUyad<{XCKh49{SN3J0*MqzgGusm~tC?79)Awu2@9YtaS^t*^t4pkYDfRtZ5Yv@EFH zBa3Md@VzO`kf+yb#=WUMz$}6JeHhnz0WgG>i4ieuMBR))&&zC0F7_Y4y&x zIp5N9y&Ao{%ALK6{44tK>TriuA6i{Q0%4q}9hrAyFVvBb#Uf0xhjzBrKvud+c}Wss zPQsJDT{!^CLArND+O070MvC15Q2dT`;=SKZygNG(FE@KALcCnOXCpZAhchDHkLa}_ zJ5+=;yqZ~$&@gX(Ga08QPqI=ZQ6?pu=!gtfkpn`GJ^vr-m0GTUpx^F`Od~`ovHt8F zN@s;Hj?7?omGj50Hc^tD6lpc2c)Hy>T^3$IF`{G)*X|B{YCWwz-*d+%01|&v2<|v8 zIH**jn2h>O@vC>o>?eif>vK!KK1n5D`<4jXC5vf2>Xdxk4C_&=85ci@X4cNw`YA6T z%ZOxJx2Vj9az$!RVYmjhl4(Sh7b_wrq__W{y*GiABf08?WsmNAW<2+mlIEzMX;t5s zM#pG$%(QzX4N_}HW~^_VU6s|UQgv0k4rv;VeBfmOyM18VHs&yxZ`Xj$vIcChISgxd z&9Y`c%&uYmdB4veu-wZ6Hkf4%nD4!a7m*Q>k(pJk&g_~|={J+v^&%rOGX5`Kym;~A zMR&|Z*BCL!vEiAC zk-?Gt#Ms!#fak*BqvN?2=GFfd-VXEXFTu^9SKsQqBb(0dxf2`dxq z&?j1(X>Si*Tm2)f&-T(E<83fxrv2X`5$AU5voJaP6AM}DcfSjX`e1de(6W22XnG42 zG}-j`vhYKJNV5-c0 zCOC|bYD8H5#_;w5;SW6i4>+Q%Nwj=*hPDX2q z6?w`A;czvEA+q#aOc?naVC^9p_4+mZ+LTA;LJvG&dWXngBGZRU`EJJ>o1gf;J_MLF8jt2g(?C^e?WjpbUdcnW%en^mBC$gvJzOe^^J7ODkASqgEsedDwF_BN$B8Qn!=F;D%#9QYr$J?%cu{b|3TTaj7qrH4qqoXCSrHaK0Fy|~N#Tam&^#{LV zT7{S0j+62YA@x)NmajzC>|tnkz6l26^zGTR$GIXz zC(227`jQ}IdJg%=&hg0nPUeaskgxV=(fV;b*u~$Novfb({q9ul*xY<$A;ZlUifvaP z8KP^s$Kl!cId8ba|GN4HH9(uP5hk=CCHz6?GrM18(J~w^2VaCnbsNpP^P>8$sLXr! z?sZ;t*tMlB_rnX}&=e_puR?AvCR=| z`k~PA6=9+Njn$Q%R*O2>5X%YbWDHL@W5W|WdrsM&r~`(>1}?Y3U}h~wu1aJTHC3sI z(0Vwh2)!-7G}sOK8+5cr`91?Q~B zSlaT2j^dW1zHOH9(@9at?X@FECXbHc;*v&rGIN9#F<$Yv@eU7d+L9tDUg=0nC=pns*Tv`+Z7gQcREzf$>?H%Jrhf30Hscyk_Opkr?g#vvvf(#L1xxwUo_7kjQEE zEH5zx&-LT>GtHR~BT0zqaN8glS``{kH1u#)F2eYr%~IiTVVHyB!jc#!&!~)GJ{w~- zkdOOQ37n9VK6U@@{qr^N;1&4xW3^hfrq{aX>i#}V-tC))l&PxqBO|RPWX-mIR*d~K zDr@%G3t)q&aHAls@$RNdI2kx`8C)>x)e3eP3^SPTY2#bsmW@K1mZ{X5X#q4Jcz?*! z?Q)G75{4i3YwuUBO~j7VyN34 z)d>xwy6$gHw0T(XtWwu9Rk4 z?@q2OKDNo@R=>-|98(jYDi*xlLayu`am(cyH+QiP z&+z&2X)os$VMX8A@sk59dIL^}2SdpT_XS*uKU4fRZ?f|ELc_xqxB=&3XP|#@m~M|c zeSOZriN_gh=|gs$m$tTx$d7ihAJ5-7=uE=WCp!J*nLVFeC4F&&O8K$MrDCmG!5F*T z)kyw)#;p~Z$KdXxlV=V;{?xJOpO~C}^6cZ!pFZ~VsngTPPVer)nM$SFU>@T!I(fk@ z*Xf{8oKhH5gH~!mZ$Erwdh*oCGxTy871Mh0ndxIsKY!-zi4%uUzs~>kD`2ZE0KftN z(HCEIb|Lbh8$j&hI_`gE4~6<#k*XEmP@xX{qG-j=PKEK14Zd~GWC%W2BQP{Og#(6n zVWU86?ESm1_{BilRlRS4+RwR{$6etopAI?jqA2$>6VaMM@p8~JDGBzBt=J=}ilh^- zxWB#D0^OAvkMKmx}N>5JJ9F& zjw9)xu6WH$og7t*WqW?hiIUYo(bJh_HM%S~y z>)Fpcn4@p2PMY4J*=<{$~FsKa~%RjA?y}ISJ$(@TyLo-!mOZ`4vr%Vv^2M) z!XLEgihl{;T+KT+wBzc+qU+huyaViR&;l2{cRl-QH$bG(Icz&Xq{%rflN4=sZAzI( zAV8>q;_6)2v!6S>*jZZ28qs90G|zsrIgn|K8K2BuU_6jwr9qpKd^0ez5SkEKKwb#{ z0ozv5aEU)NcAKLjyfHIHtH4ZX=LY><6i3ES=a5g~`ys*V-tUh9%u){T1sgp05jLoh zW0hPr56*_!v(v}N(KwCfb2ekQtMmw_Da9+j2t}O8c+g_653?`h zfc0M>Eoqfr|*fo0i0?GEdFQIUaN=f z=n(nwFmx#0+yh7CTT+s)pH2>)gV*N66bjA;a#|vQ{GU-E_1Hloa$guolx~7VE82-w7{Q1KQ_q?Yvyot( zU71SEVP88nV?_gz|9*0U<>9WIekJFiDZlHcFIP6Y^FGBz-ZZuFRW7mgp}E+1-Soj& z-|IXDdo1>g1#>M@Odu@2W+Lml>37}qVV@V1#!lBwzw4&2I0oQipyDek+>*Hm0tWAw zOV?<_T(;Xe_dgY~3q9Ss0r>Tht@?olG5%3qH~sLl9-^GslzoZF&RsWsh`l{GQ(ou> z;0MR1ZUBDl6A^n6x&ipFblvpjWY#oA)A=7tq#DI>QQ5N)>bUT@>s>c} zT%4n@I$4XC)eVYht52!+^<8R;A6SwrCtUv|i$ z(NHllBegZi7&mVyd1;J8N9f7sp91-UfzM1 z58~y=@bXE#{2E?<8!q1Yr4okMcVAk1X=!n2`fLR@ARepC!j{IqNpPX772wRSdLN6D zc&6H{<-F4#?0mfB)v~$z-sxJ?TUvC62fSg|8yFm)afjX9$k_Pcz))^r%pDt<@Fw~P z`j^fxWnjO-;=0-L!u*A$sm$WW+=XH}U-K%IRQej!Won@GH*h<@w73?}$68w4N$CF7eram`;<}n!ne~=fZD8wkt-=0W zTZZpln%ca$DR;rGxjFdmrKz>e#T#JnAwE!A^D|Jr&81i2?L@P=xV`R`y<7thy*Mq( zD}58{Za%xKS$Z|(G06kML-4DRr=&UZOre^;udlD~LUqpTYryqFU*5aa$B^OImho9C z9eK-|HKl*TmmGz^7LTq>smHO@zxlUoAPDJ8pNC>6nLo>P!im=g@QKVFkVo zpy*5rjTuV+3#z|(qf!b-b*c2fF`+k*5XA_ke}Ftw>r4L#Hv~n)Y!k6m<7@!TDtPmj% zBDr9ToePM3I*bb_9Xz+S4o_scc`20+e{a%UaFTHWb#mFm)z;^m%vDM_9>576@8vgJ z#u@78jyg1Dtrt4k#HMz~xyI=(No(y#vt;U zFvg&ClQD>#5@XCJ#u%qsWQ-OeV7e5O5L+h|skFq!!yW2SmDL|$eR_+%PjBSVf%c^J z>1~{h+LN_UQ#R0^v}{Di!{IdTX(eTOJt@G>?Xv1iN?X%;5C*O-i+rgTDdR<$v}lzn z+9~te$A?E1#pxj8a278)xS-;MV>nlw!mSxh&nwn*Rj@N@y3^qB(9m#hU|?j_9Ud9& zpXnbO&3O}}Lj#4Gv5^5UMt8!o>R-U?L3R2LxcREnO>o2jdl|mC&IeTA)YJ^7W>nI# z7rb1P*@C<`HZf*pjo;y<5DJ6;I7H~1^XheX)`LG=JRiG7qt%vBqt$!yQ@5AC7jJt* zw6OO;A~p+qb_;*jX_l5OWNFEG8zkyI_lf0cVF8#)5qmejfGJ{+wW)|%N@Tj&n|)pE zW7skGtHvtKgr`@7txAQJ^FfC79b7I`(?TJaPlrG+)5*%t4w+#GqKhNId`b@pbGP)} z&={cZ>0h=~dIys4*5$eR%sb(ksV${OSRO&l;7 z54D!x#>qGyS^=YMFdk~zh`dq;;^4=?>MQl!|CTgNUk;9o!TQkH*fOGWMiR1dHw}@X zjEVN+Wi)SO}!DUQVI8Ia^8#DjVA2WZN*$_00<@_NYZ2wWe;z7{;r|ff8ncnh* z<*U#ji`x`VtJaoEe}lw3)$Wuvp7=UE0h5)#gBv2OA-$0!4Z>MNdIu+?aQnYLUVOp>toW9iFUmotlF0(R%G$#uDcVx&zDH=28B{8YLZ zK1!_O$yYCx93(#(%Sjf)ujD6{V@kWBJeZ^Gfg6IVfxDSA0?bh~aEXkbE{{ZHGkJot zrNk3sP_txsg88zPcQ@0uZp7E9>f8nYu#*6+vw*$Km_r1FYk2v3J}J96C^kw2r%# zlTjVALPyy^9n!K9d8L-)l&|n7so#&97#scSG#BJL)p=w9y7cwuy=Fg7|eo*y3tucpD# z{J=zRywE>9GCVjl7Oi{XFf{{J0M#o8H%0Y=Q-IX>D)ZnQjU)(A-=eM*ZqA*@I&3Yy z5pSa*x>5xavA*iF_cu#53wa27B{S!`kf`fQ%QWYzZ6Prrm1z!NvMh6MNU2P7ddAnB z2AMfmok*w|VI?hq2#7+rGz;}wyqSqY=oSk5ER~9wWEk<(GWjPil`g__pu?8ohE1DED8z-Y+Y(!)O!Kh`U(pJid7yKAsKE4U6l_*{xx6c`M5J*(Q<^yMcy*W4M z))si2E2IFRb!J9F7a;CJSg2L!;1nx3a;MI=hA;`na`$Q3+vgQUKzYzKD3-9_*u>KD z8tfIhT&-Q??gVGN+NEL+qi9_!<~84enX$q^e|`d-EeF9Wmme6)7u=ctnF((=SIGD0 z2TifGA-GHB-B5?A2TSjPn=h9(JzwYVR4sEVkv5-fjNW{5OX$MV58+#HDSZfUkA+C0 zAAm&c4(hYnX6c75R_lG5XA0$j| zD18uaSe%B%y&N}~WNBCs`2b+?;fQQ|?AeA>h45cP1rvpEf`k*_cNS=QCrF{=Z0H;t z3w}2pse=5fvLhJ{9PGBWdVH2s%_x%vP5^ zPXY#Uj+EN*1~kFB70Q^e);(?= zN>yO~*Mu=U_k;eV*R3x=K=EhXa?@jTN4=?;M&|DqFH~WW%w2FY7*B?@7MQ8}17nsI zM5n}})0>|cf8jAqG8-JU$Ux?AL{}V#RmT7Ahh+&Cg%tO)TWpw_vicYBnKnL+|E|jA zDEx&7k_PJJzuw6+R>Ydc)x>{NydIPT?Opzxm6&Z(p~xO7du~nS3GW@7L5tQU+TA`S zgW8IK1^fu zwFSt|dWh%+q+d20{48!h59om-k3}!p=Tw^IGG`@~Erv9qdFN#Pv{#@Vuf0Hyb{k)iJ%v7so z=h_i57!D@cN4(oGeL$Pc87(T=1sdRVBv81ck!YDf9g z0+BAZH=g!p;p_?7fo>JQ_fH?pOp7rfM(|#=gH??Yyp(ObA$W;=YpP(~lQdW_3c))K z(L{KY>rL!jz5qLgoM~sDlPkORx*=KR82(%X)T(MBGu?9@Y(O+f`-+~3r^Ltc;Ha%j z&#gFR5)NF{M-5t3FTL9iJdx4FW0j|J&S%X4z5iE0l|-(oNrk?%{D!OkYkVCQ~s^O`l! zA(F+KS3kM{0o{tZBe3%)v-=4TX18$c5)Q?%RTiSjvCXq=*DOBl)S8tBgx2E^%;M8* zPh@s?&v`bk%VN(~YF+`xeV8KUqszt_lbeG`cCdsAudTD`(>%NkMtX?hH?!ctv9WV= zu}RxgEmK^0BzBqOJ3{UnG;Iq8o(sIm>WGX5-7ee*X~~ z64$5Daye%sp)W_tAe!SC!*zcVn_Li-EVntu`wrp%elQuNtX zOKlRYx&CEgY@$EK4uFPWM(Rfg*Ab2ChAcp4v{Imx5Q{XRjUve4{q4Z>SC zAOK>s=G$ek=U@i%@Kf4*zv>!zP_{lj$X<@Tg8#6P3x4b(tq>&y1usM)1PZ|rP~4;D zG{y7O%JPG3iDX`6kRB+R3G8AHEu$i@Ry2u!HJz7jNzfaf@hsQil@eup2_d62aQL|phQe6}6Nf-f&ZW+SOgR=|#kEqw!G_ zM5?38lq7RmsnWBC`_t4xB!Y*Hc$a(wa)Ef_08`k6ACG)5h)fP|Js{pLc)5$XY64>? zS)6g9goVFYaKM+xrru;h0QGcUADtFHNC2P1R$ma8Y^yay7zFNy zR-I>OhloyvO$i^ax2D{44XsFG9nRurp;ofAH(T6cW43S234R|u=I`}}H5^tI+|2D~ zQd>0Uaj>g<+*>GW0`v$Qt|?}3R?a=Lws{e)jIXn=jNi=X58&OXnG?Q~lhM1;IvxWt)thi-v0OTr}p^$=g(A1@2N@y%% zlM|${I4;MljH{EVCj@jzbygvpk9Q<lki0tHUH1HYPAX z^}PHuWyf%3U*mhxTlFXK^7DB4_jvg)c=>(2{1smQ2`^jFcyb3`9>U8AUXI}9Ti}8l zBhgWtZ;YH!O-+5$ywHax0I;e(U3ME_a+{+Q$x-1_c5N4i1}4V5fsygtz|3I($l$>E z*ide4c+~a0{z87nGq*>s)wW0CzPB1w2zG7P;pXp-+;%vhmy7-C4#`O^A;Z={4$se* zi#fL1OO<4X!63QU;RmNZciwrv<-Oh;LU&lc1#7;!^j5sVQ9ai4D&7Q%_?7J04g6W~ z?D=*J8FvgbUy(OLqHbOLmewOBw}>Cv*skKM*gnhGwh)G_<+5?N<>K&i_-cs`2m1js zVZr$m4OsPO5dwASnXv`coHltt=2Lh94(5~O2C#jQb+Yhs_C2sLf?LurL&HI2vd}KF zR9e6%2GllC&A1U6uRzABb)^^KhMc2u&^pdRV9eDxXbUH!G523YWP6Q~jY>l&CC!+d z7`we2DwhzumEHkm6Z8CMoq3pVC$rnx#hI|(^5cv;k>ivBpb4Le@*9N&m*0abj~Vit z7CfGWJ*{QFt^K$Q+n?a{#gSn+JZLOG1}88M47tPoUZLL|&y9@_kB{g22PVc%!EM>s z{v%L@siD$`;pR*3yZF1L?U-u7%;ie#jW~i~ zx3~0f@CM#lR`LFmkcgd>J$oO27R39jzfpLqRZ4lWmb_95O&0QuOa)&d0XV+55QulQBS3HnYnUxi>|iKc5)T9(7!7e7&PDaa4QM0mx8t%nS^Jb@tA-i8nTk;#y~$ zi@YfW~*ukGp zUXC66-*>|r*eeeI&g(}oTaxKTv-k05 zK_dK}g)EhTKZ3-B`SPpyij`FYxaeocH=p}Uj3z)fH*Pgzkp#Gex2k`>A-1J~Th7R$ zeBNKKDfPMDfVyn-6Z7K z!YkGCjn}KO3$R$)5X?IK0Co7%{{SYl>vaDUQ&vl-`zv@k=yZP#H|&{O58c9hDCl%r z54}fr^3vZ&WP@Qw%SNS1oi2rrz4nudcI?l*S|05i=-0%nOs7jhIXC)t9h@mK4oQt` zcz!?7`#{cx03V`@V~;jf#(i2h^Sexx>@q}1uju1Or@_Kz!29c>vO552tWKdCtW=hx zYX00MP_Juvh@yYS%H@B>LDJYRNSqB&fS@w>`BOGe|GoT%Ee0caz)Gl*{+=33IbeYse(#qCR|X3 zO-`7sTHVP>l*H<@OROhjBo<{eRS_b~$w>+l>!xHS*3aJ%p^BKDM)v*ol#tNA%Vm+z zu-BrkWb8w?kYysCmK?xQxPh-jPji46b_n9jRjZP10&Pib!&a{9PR8^14`4&W3KwiPgl!~s5RQZ@D58KZ_%4?h z{1&q_kUt2*nKASx4za8P%44C{`pk?}A)z^E=xIXH^_5F|dH^yK+RPcA>yTKV)4VhB zaTo&3FuB~0d4WmMb#}dP6Bn0YUeFY{Nlr%df>rOMY^L5vU8S+BG$Nmf ze;s6slY-~^RT>p{h(7~UU1<%fNZa9pYa=+FjaeJPWn)w~c=|;jSgrJIg zAPTvicI1c*hi%xAqx1(2KY#M?rV9 z9XcY9gh5B?4;au9SstvBf{ZLC3*A7l)9EvQ$3P(*ue(J2OwsG=PkS|ryg(f=`jIFc zZ?fY^8}l>VfFBaw3{cEQWZ;&>r|BP=54nl%V}2K)NuNjKaF+U`l`pL}Bh5Nyd1 zZ-hBR$;bJ_o-aeqd)y@;& z&B+*G&pMz|HaPc48;6N}Bt@S1jzoFl-0RHqAJ_?7W}8EhBZwt_&@t)U>|s((gxKuF zHz44=DMAcnAvpeNZ?1aD%Mip$NEUvo1f0X9$H^DW*b`>32sM+)14dLw3*}q}isOrM zbj;7>jRKJ}ChKRKJR;x$2>#dfoU4zrPo_0T)(?iXesCK!QK2{sLA{Q8GtJqjF!VD7 zCxnBA*zk2nNHQLH62zW{6FXD1;NmJ6W^{CIz7769Zqu*A8ul`8C_%GH6>-JF+| z==(>1sPlQ)WCHA7b8^jk144L-H_{8Ml}la?yqX|VHQe!VDvbE=iA8w-^~?uKJS1Mp zB{uj)D0RYl(_!;LwRg1eAyDUxtdV#bEbpk_B^wU>X>t21s{dMuC*DSF}VxaZ=!&U7KHs=N2_ygv64MPDiHs5 zRum!m!g=HX9#&L=Lm*+UB0m(%h88+r ztwC&5?*%v~2|64^ti1$kp96)?s$tUbVH}`Yy(jC_UJXLo!gjmLtUt8kGx}E}1;)0 zK)P(vcHoL?Z&A2W8)#@9RBLOWaBCM4XTK1?&F5=X9zR$#t`hPQ8;TVV@#RiYbEv}C zqFU%G_N_edV2F-AZcohw$j~qiuwqG%wrIs;+AisyjgfSet;bM2h@7VJ<@s?bSkOM7EP}&w^KlJEQaGDSHZ@}B+pV)oN)%KO zbfWAopi``bN+m@>bDJoR@XneEo+o77f1}#Y$ zoz~tU{5m_bZ|3AsQ`hr69emj|Qx}nYQWT?qk|?t0{&GE>BXPEpt5)(5g}Vw)l4l^| zat%WFl6=hUo~EN4cK15FC!ZSX9~sz(mTu$ViNg&z;$f!Q@OJx-jjx5-IUFp+BaVRH zzk3=SGnq4H0p|ElzUtL0523mZ#sl=(bVV7x4wU3v_D~at{rJw|Q`39vZozZr-NuEw z;?F71tZ3&G2K$Fcy^Sfs!sJ9wFNot^A$pzQy3*%{G~;F`MPg+4fD{&0`VWWsv3(w z*(VtzYYk!D7Ssbh5$70LdK4n@=$~(Mkn|^!(A99?k3a46dhqPFij$eFs}+|IWV}%G zFib*^h+y`O3lO;;{&T@7Rhz>o&@P+`Q-+8~ATu0@GhTpmGWQl-*!8ET$acqu!5Osp zI<+p`GhMGAeZ7~Dn_$~**gWEM7H-UDz!{H8p9biF=w+DQZ0wLmi z{4cZciu_3Z1KX&fXEY?w%J)A=YmLu+#1FlWnUC$J@-gviT>#4qIP!>cZQ1aTX!-Jv z7A`_A;yQvcWJQf;ZH<*=;)q&BWc-Wk5VHHA01};sgsxaw6n8klfmRr`T+h=C+ZtR( ze*wP4pU?UFA=2@mkOEryNL3$*kLId|2Yq1vaDi}}J|;=2MbhB@kYsK2 zjW!W}(BAQXFs9>EHghqA$Z4)k-tcpYdbYh&IA_pG2n7sPwFilc*6a*fe-NXt0h5oq zgNi9Hz=Oz%wBUd$%&B=g2``WuWE6cuyM3~LjGyYG&SiJ%)VPJQ({^4U^6@Zp5v7|m zRU*q!i7A+iZcLUJ9v22bG#4Wy90VT&wb?Vc0;R~AteLD@By`t<+rtzT>grF0rAH6@ z7^%u|>ME=l%C9PBBJm!) zL+#-m=vgFNrkKw>(F7gjq<0zb5cpuadIpS5m08%(9sE=*1==2jIXicj7e<7I$K6@B z=EJ6i;tgjYbSjz`Fv|jLD5fr}OpLKi{CCx+H0Wc&O>CPR7A@W7Nr=1{ObI!tH{b*u z=APZoiMvrgQn%QJ&iye$hqA$myPD7;a+>zs8y?{?7f!AxZ&Qq zz)0!lsuhuMNzrWZXrjG#@qT@Qkqs@Hf(R55P?k^93S zp>z`xBHxiBB$LTP(yK#4O>F4xLjMzW7_ zGKRdcb|uPYPQHk|LLn~#p8}gOX&>O(MA1680^J0iGK3l|0$`Bp z?(ZzLZdGG4Td4W|v*rjII*@TW8!SMpp*EgswxN*hAm5YN84~ib`ZyWbPDH^Ncr5m= zR-)n8)k>D5l@Lc!54AcUo0=12-78YV0{xBeQt9pmh~CuD33~xrfIC!=4dTw#`L3@y z^A)suKX-l2aqel@m|#c^_3iiF#L<^T+GRS!*IXNZ`R-6|yb8=P`0y^yOkuu`(R!~X zgJy!$-k_wA)}p;h@triZY$Zj@h|bH`>QJjS4lcMX(_kMgC&XDBc42m;pE&=3u7e$f z)&zf{{1GrgcOC4S%xP-Q1s@^4L$-nY1=w~!^t|M|eP&>97CBymH_v%hCb(S(yM{R( z>N?nU9qh;*k#!ZOYS5((_qE+SU6X^IHfZ~@YQH^HKsSDZ7W;$mOSA4h<60Vp zVd%QUHDKzX?Z#yN-nT_`-Qf(!@qk>^OlERro4T)V1zKIlE4@m-NTImu7Qf<1$4R?e zj=?@%uaB+Nb#kmVFJ$M7_n;&_UGC%G~3eD=Fo7U4gA#2r6%6q91;$+ z28p=wTYYv@vvkQqzDq3HdXT7x13eChIC%T|`r0~iGzc@T0lpE-XR$yJU2}mL2y{_f zQ;lS_r6wHkd=cKixWlO4QfUs!52`$?9C#Rbx(ZKEZ7I#e4ck|1=Zzc_Sew<_c?&1w z+UyGv*={znQE9s&n|9ja%7XIkP@|OurSxVfkni1xa}JB}1BC;!78ed#wV@+1+e=3q zUb}2~FT5RO!}r4Nl`b281V43i>BD#nlMNq&MC4udS&$7sY9UM6@I8>2Bpdz^mcN3s zf!Oe+&x4q_!ghFC_BG-Zn(JTSJwuDw;y40(0L9=Q$4LE+A1wa?_%@5&`5=;8mODQH zPlMd~LAW7y8ipG=-q7td47YGH%AJ21kqzXImW@hFSnm83)F>&yKO&CNQMPa!f}ET@ zR*^Fl4efo<7APgLlW{3I6e1;s-yYk|dN}XS!*M}Mr1Q~{fsw)S2~e2|BO~sBJDMvD zjpSzXW5a`m;epXHQ;o75{`xCW2auJ&3O8R?zQ*=mCE)p>Ej=@-QPCTm1x;jiZ}~9y zwVE2Vrnz_nMDjvCsq~+)rkhLu7v6x!t%tdP9unoVYx%P~nx)^ekY&V~&p@Is>ZX>X z25BGfLq)pKf5ewCd3UreT`06vrVxbF?A+JIPs#q0D?Dj7sSu~p9Q+1?T z^Rkn8eiepHsAqNbg;SNfES)-)VRRxl zJTw6|h_M-Wbjb5y^qla#e160oc1K1=yrC9`(SLxqPwg-LBi#I9REx;v+aYu^SqC;m zTL-pk!{SuYRKS_9v>xJB`USt`9cNLmY|sSTxda6^nVtTu97VR+K8A~HsM+7^+` zgqX6W1@WCwwH1W8^cpCSzE+KwXn#64(~aV6kkAX4tH^W3%0k z4UzE(5i2&74xafMq(qk6q7&|ZndGq9PuRqGS7EXm@DgJ|fTbJpO-BqT{%2IT zS#O7i$hg_X3Js;3-G<0=|53uwj3x(-vB`z@9nm4*x@3)j!rySj;P8J&L9*En36Tq7 zkWjh_36bUgql6(jnj9oEx+GKlFVXi3V}qhBlUhqp7K6Rd&6F2#FEfUegk8s!>5#Jh z*g15_**%c$&-SAj^hoUKWzlH#0Hf0KjiPIt4>NSv*=6BcjxLC2O{neQWVA?GI~-+$ z8M>B@$T&`ETK0-6AWtWT>ACNMgA0r)w%(YyB}qbRn<@*3-H@)SIkM1%T2V95pH_^4 zwnvj-GTVC;M_#{5ZRk{5nadhZ6r>9?d81U zCCvs0F&iQBqKFatM#?y#P} zP%*kmN^3I)-H@iv7^?WbwWWEyfx+KuNSlL19EsIuw>C>}w2*ItZpy43Z-7L-!!B>> zD$vw4Whi6$%ULt96d1jp7|cL==WV>R9dh^+;0;yx8jm_)m~u-6s2-U8^}I`^3rG$% z``hRkmBg&{ZBQVA z@fZ!AOw_Wttw!UMWDUVgkqvn$6y*SNFqZ?mPXk76gy~)%n4fS@2(x-(EDkvI0h}6W z-Ev|yH#m~>2F7PbhWg#X@!`Qd*x&~z`p5c5$Hr$SOhI5V#=jfh561ZSz|EHg>zI3@ zA_z7x0z_?U&9mUd!mC1!2R{UFI`QJGN*}@(gSFEt3w{6+kr~;;3-s_E&C(Cs==Ta~ z@GeNzrNI-0mc0ui8=SM1529iQ?pWripXJ zPeJ8Ylp{(%4kdD=&wYBoqSU!FAXHp98%8dm7;>RiKtL0m_FibPqho5iCMa3z7zDx2 zqqRx?0s7r(FJG*|=`>#cRI_miw0C+2^nUSo_U!cWaf)FwU#m9Q(~hjV|K3A-X)vnI zvQdrnFLJnyEP}_1EP|AD%TOU1xkPMqw`68L#q1NC_dqb-lgFl6*CF{X8{!$a-1OKI zE-Jg#y2k@tnL%dEGKI%I`Q6G=ve0K(EY>`hDHfUbzMxf zK!AfwK(A%>R3&|M6cr8Qx*XO-l5rbA=hrs8nur>_i<@Lw%ps!w!pIxrP5Oy8HU1g`p9l9Pr zy-=>Y*Cns>DJL!(&bbXZ|CU$)j*9E=v>{H^k=3pBfzFaGez=Qh7Ojy6I=PY9p_1xp ziE#>%+EiNR6>KoA`35_``B*y)YG)uY4H*?ot5z9oM6HOnn{wW*xpR2nBOdX22*OGL z|95b+Ew80SAo+;d4A-y4|nVoo7Jw(X?7q_ zYi)qj?T*w$1K-nvsUeW3^)~2OlLPxE&5F=!Lui@WX$i8u^y2Ob_&@Kx!2iruo0Uc< z3JLzDSV>k_UeERfM??{=HC-oLZUX(HRTffZP>apbxmKJMTcK06rxcr@V-=|s+dxe7 zJJHCMVl#BE)hES9;HHkwwECsq3@-;m7;6;O%Fz0hJ1lE!L+H!ZC>Ho?&9>F5%AvNn zR=^53UPl|qLYh*ua4o+q@{gLQHD>8t zBU+M;palD3HdK6<-5(`22M!(?%uOn8vfQsJH93T zYR6f-V;k05)XKGUXLQf_7EPWvqr8|E=hxGon?F@4FPxcoEBmoqAG}WeV9&5qb02RO z%iyovnMSkp&@B|(}ql`GB>nE zH{Q!}?&-IxkS+1vRxLHMwYZgS^E#VNtoAg5w?_D2$OkBObTjN{Ej1_4AJcy7F7y4` zF7u6IvoP%~SAMgd;v4Kc#W(XE;SiTj+wo0g2t#P!C{F43*t0#5TIhgZN^qn2q6jP~ z7b-*(%Z=H%GGSVss)T!-uDNE!>L*NwI z9@fzmQ5yY>*h5Oz|ibGbr00ogGCs40M|gH||W38y80`!GnBR5f;2i!Ah6$Th;hLV!&2u zaq@kq9V;Rag<(bM#%Mi7Vl<_Z4NW4oMQT&0xA^ZF_Bd^fxBC0F#%K?7X@+eOXBm#>z;}jl z;QQh@P-HYYP|(xkz$X*rz;itoHCB;!tpLzr+-WtQTi21S%o>qhH4#S$$y-$3l~Ma5 z*>tMMJ{k|ijK-AB;89UpdMx@(f-JiD_YtEp=TF(l9m$IJ)wT%cqYN#w+iN(x>6`7N zxoybKZI8xq8)Y-OjmYV7TRur{`+5Yo>22I$%oedqX5}^Y`4(C2W@0rppg}aJ9k6rS zu^3LHY$m4>IXzCRCCO=j8^vjA6JLLfb`xhbb(efJpLupZn~UKy%4YHzk<;U|w zqIv9F>^%0m7#^c+CXW$0Js$hPBzY{#ET=T^^~Yp11<+&bMDy8mc0S9+@EK(@`HaZv z@!3a{Or|7qdQADL z1ex;Ov1mixaslZu4i*fBk+ylL8!a+RE7sI?zq@1kH-=-Yc8;1k{7K~W`122vpM;!kVicdlNr zJT{Hv()YdeDrhwLx44c;PV%aunH6VOv0EmRF;9FTWX1W1<5rwSMuRtHf$1^lUnj_% zi&3*Hy`4LZ2h|0WRuob7`4&fQvKA>3^CEd|>H~Hm_`@+mkg^$!CQ3_>&%T)?pG8@V zlm@>3n2Z)z)R2VHT=ro*m;FQxmr*v8%ZQvFmu>xYa&F*@QHv{T3tty(wwVo`>fWte zeM&}gXp7{x6Cb9L((v>?@e@Q3b54~R@6&y~CA}v#XYV@`<-sr8pp&o}pcI`9R_1b(7KNiBrKO4u#BBRO2f}S29XOiUO znYQ>i4vWrZ@CcW}cKO{})QYkH9SZyFs(7@({$vQF|8g9oi;O0t3wnBtKAI$>XIo}; zz12IHrB_X6Z(=NpkvC|DzC{w^_9T7GuEzdsj2cVXOf{Cs>Fs7bnjnWR{&~3j2DWwJ zDEC#~g23z4vQxMEc=${_z*^jqn`Lf!Th%A+O!mt$Oh(yECL?lsOm;d+Ci`X#lPQh7 zT9VJc=ZDCPxxEJ&vp-$dTtpEE=J|?W$z}I*?nfGnDp5>WCuR z5TblCqco-5B^1rJzhP(F-;QBh%4V`Hk<(+_7n5Y$wXL$PZ0nBY(AJj`84Gcqj9W!q z4Cs)z`_mJB_fRww{=ar6{G%8qq--V=5;;94e0!2ihzqqbnxx*;9mslxzaPgmG1fbf|*Ejod4<5#T{ywBg=9~JeUH1L&7}-bJ49*j!rN?-m zNRsjXDTeXh76v=!i)`g6?+hVv+W;EDO($nL=FC@r+=USL`=*@k7bK&Futb?y2dNmlH}xju8EU7op-N+Yuo2nWku5%?yTFMqIKlMA$&U-$G0M* z$+v=@9^Y>Kh2)&!&+TcOZ>=D7wtlgE_HCbgmARbm85qr{cZBfit~fpw8BIPF^z``j z)+G6~g}I#G+#Se~DXt(Xwk&1iR5S}tg|Oh6I2IHcO%@dN^jPrz1X*w~&YYz*^!3er z%JPxApDLRB&W3Q``8e(q8BOjJ^z^uIFiGxXl{oP^u4L=UwbS;?z5_iZhfJWbJ%fYIs~iddLFfNP2mNrZ(GF1 zH6`mZH}2S(^iHGQ6sOi`VR_@L?dwi=5IuCerO0TqtDvXHt|yaZSDRfaoL!Y>UoFYm z8skPNkS%d9&%dH9JY-?vYw|%paaRa$?}_7WkC}S-8(;ZI82a|JK_k-JQ_7Nv+dly&71eYHrJEKrmYR}j9YGcY`$`| zSf8)f#njLc48~c0EEPwZn%8L7Dvm4#dd1v)*@H&GGWne1>gGLOC0{I1?VB^@V$P9A zrn4$9>+J1_^4MteNw+`LAlF_!H7}|<$2dbXoYV6l{@}`MQ#E547cJ=ud zKD~3@^%MT`PW9JK__I6KTQuSC?qnCmgg?D=w?riT;e6s^^}p;eR}n2_cI)fxwrue- zKcZQ5x71E8cwm2_g?6Q8`w6h%}S%gR0-uv zv68H=yq;E{0Gpj6u87u}u9Gb{>F5%Aq!!R=^53 zp4OC|W*}p7DcBO4g=_f@sui=WW_=kL%giQRe(!D7XvW^yv4*o0hq}%+q9xe~;Vzr2 zCZ}6-Lbmsemi&)^Q)!mVoE`W> zj-$T=samFN;3Xm>-ml6E^1q^l`H?a>NCj-XHs7d_QkbI^b9Oq68$|*|kvmnOnba)2 zokL#Wn`hN?sth1k`P74C&G78IJJq{804zDGH46o=wp`;IIY?Qv$FoT%PpXpO6myK> z9kBy!_)#MbuVjSzF=D7u^Dbws32(4Y?Pc*T>09UHtlhB=#D&>VU^KNB7cI$(*7PD$9WTeoyYmS=!a)<|iY1a?-Orr+d6drFD%b+2O zGoN4int)wg39dNd%~fj)8ejA}N8C!zE0;CpJgw-=*VM|S$x&)@b6180uOmG6tEby=~zDb@+VKXcoJ$ZM|8SW#f!)yqDwL({EKF zTjIT~T54o#aWQ<$W&-B6*zh*5v)ROIPa}A1gb#*?nN?LC-MEQY+IU-PPM$xe{jM&R z4#EcMlg-k5e;#5{eiSdC!prCI@7tc|ZEW ze2vFLkWm2?JWVJJ6BaF*si@Nm*-{gMVwewTm~Wnha2`dsT>LgTeVyUG)u+T^eTNZg;y6pygx7}oilE|+M>$a3WXh2EieX9fIXH$dntS)(DB)%h{5u#Xhb#M{@ zxeN>cxSqf3QKhpU&^qfj&4@t&o5U!Tx7kr9@-ty5Q~DkQWg_>l4$5Ch4dv6maJC3# zGrA49g+R}3crP@vN18Rz!ysA`s(GiHjrnGSEppdXi1jgetLi~P2ya(uaWZ+29pVRL zWHM#D-+-9Ns|4{^QiFKLhgft<2{n_`Is|c&S{;Ec5_?GN)%V4S4dQ}bF^|PD#tu7U z+!VtYlx>T_7(~X9TR8PArK_0zMQV)ktuUCPQXSj)21}?M0D@hN0~W3#1nCK zYB5Gwv_AhDJKNkA!#0%7WE&!{65D(uHMV&dDF!P95rlD@alzfr65-9@JE>wEa8O;8 ztmbj;utnAyR%fI#%3sXK5Ff3xE0`NN!@z_`o7g|Z$r$m^IxnPbJB(~Z&O$aV;$Mc+V0C@<&n6?K737V1gcz^Yl1X-&(s^&9GMJp3kP5cSN1LcvS0_6zn zXIz#t#kv5ywDyewS5vLFc44i3Zwwf11ZTXaUhRMPO3WxtbOL&ik5a&Q*$_hEc8J)Q ztdO#`**8hQ9fkgn;^pIb`3zou6E9!J%b()q@8E)FTU27W*>;~Q00U-QQ00TYO)=Vz zxub=VL2qPcBA1^jj13Ksc>Oc^k-2JYkdm9KFFxuV@H{WQxnHUw`ub6B# z>a`kdAHer+DLsfc(E6(xrT8g>`^zJd6_ti4#h9!?y(uwf7>`VyJb14u;xY za6`Z};O^xhgP~RfZWkw`p|&R?8yIS}Y*d;w)TW8|DAY44yi5I1I2mcrM@$kGB-=95 z0=G#W4IyG^4`^s>CR&EHVWN#f`3^hEcgLVi*}z1rp-g0HqD>R!qbZ^Mc>9AXfM_w! zY9gF>T*Vm6fK+}n5I5Mn>LxpgM1D4`t5SNu0V0uCrK_G!3B)tHoD~Y2RkpXP@^Z5* zL-l~xK}`!RgVrQQ;k(U_FOi=P!8B`Q@$v+%p&wXZ@5v&JqnKfbof&S5VFt9`K#?C0W#V`tGGZ}@*tHLO6Pl-_$X}Dhz za8|8G1Qv(Bz8Zs2SJlNL>0JjBUpXtmDkC>t1BwQNN0g>0Ik zHM!aQ`_ti>b56LC)!ORqn^^6|NDDogMa3{@I00w|N0NieBvTP`ZJ1ZvRE&5Xk`Th$ z*L6g%y%u9C0IkjcVy&DCkju0d#J*w$lqJQ8dM9?uLA*SMmy>vTJzh$9c>ymk!3B+| zsFiXf>Rwf}Nh9is>8J6qC9ifk@6Ln6sA4xAEO;~C&|v>ie#9I1M#uVxXS@NhqZUTI z-0;ZQXbX1JAA`3~4U~QyZob`g(`5Zv#hod8dBtpcw$fkyOFvuaj4o`AWI(og%u@~@|H1KOa4Ghhjt2wK<7}A2&jI zY$FFTWnKL47|vX8=gdtpoJra4G8mf3ds5=eFDA#CzfYXWw-G%fkCs~n01Zy%`+mxj zU-?F%6=d2Qpe*9oTd`R9WOI0p6n3}RS!#C-OHnqHrHFiQN-XsUiLunV{V-!8u0ojt zUTLyrv6*Mf)fuvMcg0{ME(_v(vCk$U}>)r~;?-F1x^^-b`~=E09r^U*Kegi)R?iwPF?e z@(X{~tyKUKtze=pzfk5>s1?a5%P;Uq4fcfO;2csFCqZ0(u_vn)9eO0_#XXO&Y+R^S zFJp`m=WuPdIR_rpFu^)iU^~X7o|VCUY}JCV+x1HAz1N6~cQtO5y;gyBzg=Jr#0V_P zcH9^Pi9DH-!20Vn1=ez8lzj*>2DP>XmM(jc<=PfuI@`(ur8H`%K#RbV1u9af-Fhln zLu#u?qju_R6V${?u~tI+lFqn*N)@l_5x z*1@x#Lgn}>i?j@$?Gz}+N$vXuarqxF##dR*v@BJv6{XUDAFW}`X zc=-#wd;>1%kA@CY+#hW~)k>v58Y3RB!D`awYV9I4F1m5}0T_n|2M2QA*i1e@oX?L= zjCwOO;G;H^8_$guX8H#QO`o*2!2pbRfm%5AVCinS`95hIpLeC( zj!^fr9(?DH(!+Q=5aNFJ5G10fk^1a|&C(+lG6q^;abE6(MBV*tvVHfnkR~S=vfPQL>g4vIIQ3dra?vI1%PUAM7BHa*<@(V z6cFAA)mveNOT$nmIfXR?xG}q|(ewaWFq{e~z^9lS9|YaYJgGr-q&hbTQCpv;bLO&o zYLANfe(LKS^DRfcdahPv#S-2+iDA9Lj`baOtcg4phBc+%WMEC?ds6JpPbQ1?khJ8X zLnQ<}l}(MKA_QUcDs}MW098UJL?KnI&zIeWlNchG_slIvRZDukS5JGaQ zZOB@ z29f1{gcNwXmMBjzem4yv%UrzOW$G0VK4`I~nVVj4`AG16kM0I;VTbKJ4vB9sFf=@MH9kMvD3dsh{d_>Isnd6Wsp^fc67CEnM_hFJ@ zb+-FN4I+2h#lzkh@j%&NZ-%B!5Ls^bNkKgPV6x)D^~FQy`R{dtxZt~wu3MqOKVKCc zTvo1({MZJX1e?XMLdB$5BWC0d3Pqeps|2sN_xa~z`aESb6-Oec+2=o+XrEvFm!vrI z4v*R(PGfx>tWC~_5r3fKd;!@wJHQ{@myxgk_)uj}c=ftFs}9D!P6mcquZNjY4rQmS z{KUfyJ88~1FvK$ESb63i{R8-RWoM4RJ7%8otesuHHHKX%o5?OjPLo|el`OlwIgVY7 z)^3ke2qV4+inGS^j5Xpp;Wf536cQqDvZZAvj|l^-Z))vzCRGj3QAItZ0b}|55#TqO z)$u$)Zh5a;%rEHOumwV;h~`Wg4{cjXql4k5#a2en7W2BD9SD3PNaBd3&NE&O7fkeLiD-LXSs&5! zC<)el{(_8=&rjg_cuVtU;zMjF?WXVQ)T=%bUlE;J>oZ-;4q7_Yk-KZzY00ufT-045 z^Vl*MTavq`6*8?`uKo&5VB8L!^Chgrw_Xw3e4pjM!milS6Q6uSB)R7Mj%|X)WB7;u zOl%&iyUE-D3JFa%_@B%S8R8amt9_11WIT1ks_|30>1;vdTT;~cznG}Tzqm(N>a5Bi zk7sT{Vgsprgogh!3X$9Fh!7cFAgqW`x`_yp(_Cf#gJcnTL`Ni2&Bpyz%v~^QM&83G zN5?9&Fm;yGBiqc5tb6P1E-#5qp0#~eEAA!wmx;pFoibajFxTK5sSH=43IE64EO?6`#b1||8cf@()?DSeZf7{%DYI}PTv@idZW&5l(Ug8D-6?aK zpZy)?-J&~*cBjnDQY}^)+nc1uuX`yvh-ysk(Dhm+`1-x5>W(sf7cZyr@&>$A@bV&F z-j0{=!^=nT@(H|r7B64G%U9rnTj9{XhHr&Cq)s0Cjuze7N)=*-=IVVc;c&g~)i9d% zakmIj)1?Uk_r)D|%XM#Q(HWS?je7kP0;|m%Arr)6-vl>&tp?r(4jyd3)45ztWE z!O7?&U`36xfscTejmUV8eTw}vlL}UBqwmRP>DBnQJK%yt2Z|y-bR1OCX>aJ52FLi7 z89BzGS}<}GcHU|1n}jwK{%k1`_|b?u@RQdkVTO^6quy0rj%3WppPOb zr{RLi0FEwP85nO-8F;D)8+KsUrA{Ed(TTA^cOvhNjZeTyUxVZB*l>QlFgP%the_o` z-kd;g2u4<^Lq$LhXu!=^1J>fCRhcLD;%~y>knmwf(-h7R4>?>ZI3Zk{TRiw{d+22F ztyrf!O5cvRup#};kcg6;J-eMhdq=bMHVaus0H{HtKBS*oiOHaX49x=HgfC)a`IFZ) z3)D(x(?9L3%Lvs`&B^C|8qlQ|poWVa=F+#}-?!KxhH2c3kO%|kRk&euYt6oiH#-cR zTC;DJ$d$e$BAba8m6kqQ-vgCQ1g+8{lpNan>z;)(LLf*6YyMl=53`HKwEtc9_P;Nt z{VAK-{zR6i{G`@fKD0XRzlk+Ddd(9CcS=H=IP9|H@IVX>l+DC}$h$$)VDX|-!{K8I zQ+I(l`t{`9`+r=7jd742nLcl*oXtnT>AzCMSIEl#8AKtoh( zSZmLna|*>;y&)f?E%toDGwY8=$_Lwa(L?Fe7rY7``sG&qt&Tu)8%_>LGalTUvlkl9 z%mPq72vAUOz=K|{*{IfJ4g7P%bRo@KNzU9d!5Wc0N9(Pn&jXtYE%QI&-(gzjZ$Tnx znO}e#_8G13Y~pmWhdK+)H-5jibIe`^YSa_&=b^lh;MCuUdRRMNWVg4W~M47Oro1(sTN(yaKc zTWeQxfMLRiU97C!)fQiY+F}gmt1zs!Qlr%osLC3`Z=j~}dwBUvy!<0vaITIc8lS6c z#|HJiwqC8U3k>TRB1{R&KJMj*`wKG@-r&SYesE}FW^iC+VB8%T85$iO8p;pB(gA4V zi|b~~3-cG2ru3DA#kF{J@Y3QId;yiMEEjMu0%60!XR_LZ6q$WpbY%8*+WNqn=Hd-r zC6ARV^?_;ndo(OEJ0zOV-UeYREM!y+G#8Wut*;7LT3Ezjhc|J3f3$@)0BbqS z;_qnI7u$0@X7{$nX zGW1f65q}02rN9Xji|L7bRy-s}$$1wV07gqbOky(eI*g61V)Rn4M)XIQ$f)K*r@R{& zfOpE>K?t#KScK9ehek(ogA?PUh4G=B>$zhCBi_(xVa6SG2VJj!rWJ3{1MteJ{iTC& z^KE6Dk3i(X*=h}-RQjk!r4G3vxh+GJRgwmfdAR+RzNkURuVMu07NMtuTTFjvfy<1zL&H~Y{ zY+VTYkby<3AnJz`u)d^|qM+MghmOdhy@}ExlBd=QiTq%a(7mw2(1r9SM~Pe{kf@_z zix6q2W=dYJ@whuHM4Cc~0^wde2tdijjvW#rkB31*>GvCu5E)(Q*m`&pO2N_!Lo#eag4zLZNYwfc zIs9*dK}_G+eA;W&7M?2372&iaCZjY;6cjhxp&;@=7!;I#y8#7}r6n~9D1LN>q1bCe z0qQ+8zi3baL0mV$7H`%niq54`qA<9_jscNJ!Z4t8Q|TgdqQk_;R~Ul<69b`i`Hk8t z4mV*>V!GPl+H7+Urm=PE6V{X{Tz1%TA@XBkxKR3iM&BSZcB#a~)Mr*0m;EL#G)z2q z{*V)F=T;%QO=f-C#X|wX7=YbI;1r%51=e;uSVTS+1{S58U=evVNw9u%g~2*(f<>K3 z150o5RuS8Zh#dz?z$;xQLwSVE=b33`JnDM}77Z z!8+7ax;fGiS)NRg#C+0OVNkMmP?&_n_G}e^4b#Or4}u+0C-HwqHUBO4<|lHf#gWqQ zHKr^?PSk#%UE$^rSRAn#&&<1EQ=tY80O0XO6UO0aeW4b=Q(cu~3)ETc6Z{DV0&L!d zu`#fS@@ftOtSD&q+g+TDzDCwQK-sn%*@%2AWYZR*uYIL!-^w=qx#C*6)3fH~s^Cp1 z+DrEhlFMCOT(PGDI#|Hn!j{X@pIE+-E*NTcj(gc5Cv5d6Hm8_ zb0PLS&V+g3h3*zmSbI{318<7|Ex$`ofgDl)^yC~~3V3PY<=gS{ z9=v=AFF%QwU%<KfcV;~{k*@E7wL_nST% z!vlrELIJLYf&BPHZf0!2^+w#8{+XGHfuXS(bHnx8;D+ldct7}PJOwx3M`Il}it3&r z2(5W$=&n+#XU6OBZR<+kinpN<&x~gw5eGT-Sx}#!vykOkwXcOleY`rf49^U;iOD_V z87!E&XN?xZfI*rKh3di);D%z-i_0 zY4{u5G0wsb8(C}YwHz35$Iu#^$Qbead_*=_8L(w@AR9BBC5BN6DzzdQmGV#$VIZP= zOF=F~BsOWF{XO2^+Yl&;=u(L_{C#SF_7ywjF^0)HJ0`E@m_W6(#$C_JsNGpHp=_Yt zY1xQ;m#N*YP;a@E1QH@TkfP+twu{vCKm`wCWgU!S`j;a9PvRFA;DRz6IhxDtjEb=@ zv;A>JajeS^xcRZcq5j-pZY($K^$$b1jFAa&fE~z<=f?9BEeP%JgcpO*{w}!rLVGJ5 zyf)v2)eSa{_G4oi^wvapcxc4;;k&n#-j6r1r7v!;du8yH0Kb^iZe`YE9WvrDCS8Nc5Hzd@jX58N=b*7Tb=Od!y;rYAC5e?J(J?f+-*Tj1o# zs=AjYlSwAeP4>OZQkjI^&Ti6~p7-o#6S8^iX0yreCRui5h0xPolXPX$J@zBXutelj z5OF?y&5DXBq9P#r@ySC$MMXgoLEuB=1C^(UfPgQ2ed_l=_nx|SZ`G~pp4qMnkI8Sh zYWm!Jt8ShDx#ym9?hF38t(c1bria*TQLFAC=Diw^Vn8C1;J`Nb+1n`|Pd$ja-x3P> zXA%ml>?kmq#-pq#a60Cn7$`6~gLda5)uziPh;ZAUI(o06o%Dm2{419 z6Oth5vqQpUOyajg!s%N>kT99nX9-Iuy@v6wR3I4(+nb85a(0mV*(ok79~4K(Gbrj; z5+ZBuh%lL^F<2W3r^EI%8VQrt%%JoT`CuxDL}m&3)~94_r#SRrK|>uOUD0RwKax=B zwWGjfnkr{Sfz!jPipks4Zx?@+3JQ^Fb755_*xM->E9L4Ezft(VlHgcrhl9y9kZy&8 z)58`Qlhr_adX3`CslX8#RF^Dt_!eHQ;7Zd;43`JC9JAli4Y|N6)AI>ndhCYP3JDA> z3q$R!lVtMBtiW(Fcx6U0Cf|%=M$Eli2JpY80mtM|2m7gLu35mr7~d=jG^=ygNu%qi zVAQa%7Hex2T1%-uGP%pNmgRwo1jitu*j~rlCulzF%LxA0(B(~Zc_&@|gf1Va%NKAV zXO^^qbY^eY+eYBb(k3PggIxW) z!kz8IO><}c_l4bAliry-yCQb2*md;o72fr9!)UzKoxKK$+uQmy&{f7Gch-sKR4kgeA>;p5#J5|_eiYZ(;EC|@}1D3HzgETcxY^VusGgHNb?}xi;(6a z+=4z}{bA!^7j3<8B&D-{pf|Q3I6?34^-j_abM3ADz{5x+eWd3_EZ`9fSnJ8<~neDQ;vcl9N?UWQM+xaj#?I6;U|EJOgO&etgAz?@_r|^Mdz) z`STcl0+a`FqoM}?dn8uq2Mqo*nfU)`LNWM8wqhz^kQ!`dRH`emdC$d@7?zlDfx~?5 z6o)?8=B2aEda;Cs+yV-Nl7z-eI~q);NV63UPKPmNpuuDnX-*A|dKzd%;>^A#57^r& zB0PXAu;9OwP*`C{fyp$0Yej+6!zeIW4dAAR!uO#w>INi1O<+4#udq z#lWbkkXPfiq%%m=rOp`AG2EpzQ)AbCwc6Rx4#}GK7{xr3qB}iZo*EdKDh&>dPE26N z;8bw}lLm(h6SUJ>4tT4r)+}=d--kM25A;95El?kuEw9xawwxt7rz#!n5#90Oo$*@c z|5Ei_^cP!(TK8T!edV1%zkJG?m--qOCjbW~cX!!bKQOF66V z_l3l+Ka2$ywnwHUj#@AL0b=>*aiOl5`UBY&59`9Ht5+Lqw7%FKFHQ{&j*ViA#i4Sk zJX9by%^u-$wRc0^|RKy#^uE|h(15TDrw`!kdvuI$7l1B=g?b@~*Rx)pkoOk!ZH82bRjnUPOPXKj?gv8EjxcyRQb1-;zHu zJ5y=q9y?e)U#Zusv~5oQn0tY?I(W_w%;%tU{6rSsD>i?uR&}xAzk04&kNaztYR>X3 zxrr-Pi2jLsy>l4?fDZlRjTo5rFkaTk5ftnkp0`Y zo5u`@*0!5lo3|EHGA~1Aj=-_Zn`2YDXF}RRlcu|)S~Yldkk6tS zIv2WUT0edf228RnuCdGF`Zlu2#lo`4$VkAaG;V6C3TA=KP9fG;$k?@ z#3;t($SKrmSaQeGmZHi3iIYsYiz-e*WQrx6aVFd)TO0TNB?X7?DSfM{MfTQ`KkFN} zg&EFf2d0NGO~qx|P`|8(y5_C-QQPmQ%K%;W;6i>onNn>+=oF+6DM-z2A097^jgF0s zPK}OFj2DU{BjZzLcWPo}VxUwS8ZHz%aNAFz4hW$?54XT=7n_KMUaNWTIZLgq_R>O! zN1n%r(9cozR(e&s#d+^%kw`9$$h$)3MM$(}A*+z+bCGCz?@Nn|SvUcF*m?KpB})mR z$2~PUgdS6hy%#@(ZpmfE&Nn2K#i<*r?BE!}upyVR_-FWh*b=jS6;MUc8HVYAA&MB!TcnqXQdL7>Mlz zBQ}I?sV56Tk6j3^lxX974Ix+~$z&c{g@B78gl-gLa+gBrmX8Tk#miELJ{m%|RL3_7 zLz>?=3|mt(i1%5_EkS=6R*mhEi_i;;5l5|4o+6e%9~bJ1sXvfi@lM@YF+!tf>NP|L z8%;VuO6!E(k~=swG*X@z8A8`P<&F-Gjg)a%(dhW7i>+|R!=12sWEc%`d#}XX(Fy-F zZb2u!f?&{k-5vB>#mH6L^BHBFw%l>td~Iyp{Pk3)4c;5*7T5Fs5)!HYBJWz67pIK= zvW2V;7XB$DnmzBqrNzxdaB!ddT6((HF4&NOJ|#rnuOt);3l2XmE5UgOs@6rp@!o>xu}Bm<775+PqVP;C_6&RgsVgB| zXNcv3C$KbDR_R03q09o?9y_)@5=4BGf$c^~rk>S`Ef?DmD#ql6`=;XZ^ z2gAm3^3Yh0vFQ4MdQzM#DGn8^iy;}m<1jl@<x|>W`_Hkp1z5(I4+G&K9RC7_-CV&|N2*wb_Fg-BOEY_^6aQ zt#2+276&GV$6R+})EyWapDGRx3=K_;V3WG?)JS1^EZjF+=9v9CYJw@MAHyx^n>QS8 z(94hG06RG7ZdvQ5qe-1jR=qy9C;n@y!Oh<1=@!=$e-??Pk44_=W!{Y~?{6&Rr=zWk zC59hGqS+Ha+<8x|*qsan_sXB4SBYNv{tkNOj-M@hXmid(r)60+A7<4&RjbW7Ay7lI zPbUxx5-DaCTl0zR5gXFt{RKXIe#3)RQ&zmcvXegrGDc`WjT=E}K)PB&imugwl*xMm z>E9+4>$ewE)0Q)ogs-ETDM^C&H9VVfy^C?(*O;r84xY!j{%&!_cKMAxSgCG8;*ZMD3*7D{lGhTBcapdgD+F7^il){wl3!VUfr5*e= zcJQxND!~pu7sH^3Au~)?n*?PD{)%^H0siE71=GcfguipL*f@)URU3F6!4uL1Aw9td z0c*i#n%NQ-u`PEy)z-|6?9WMs1idQ#n#LK!#nKrkM>AC_)$_HI5E%R!7FLWO`>AA9 z$4}Mlie>Q&2RH9(&_hDO&*=z9HpLlVmbX zt(vh{rX%EI6k{^&=W5KFOs!|!m`#&7cO?$NK6nvFS7U>-YO^?#>p%I>!O4gEariT< zN@>Q%U;u;m@V&GibGkJXX-EphIn%mbit;t=*5%eqP0dskMCpF(HQ4^-jUmmf|2TE{ z|3H^3AnIh>Q->pM`w?9i>{4PxCgsWc#pCX5t=?2r-L4-gj19VjC3m1ufOTJ*7#x@$ zFOLkA-SP1OZ2vMGw(Bi1w=Jj*Vs8Do1$O<)gH<{yT{GubNlLEch}z0nJAN0vag{ef zw>Ud~Clbl{6M0w4ys+a77BZcTAnbStiKezXx8=)qgFBwcXbyj+xYJ4i6a@4$`FFi`1} zsK69AP+>Cl9774k!eDYST1T5Dn9oENQvlPu6VGK6+=s{4CO*SywrjKAa_^$KLjsP? z7WrUUjA*=REm#W);Ck%9t&qT>eg<%BB$+G)D{x#4AuOX9lW8uRVJW22_8v$du9t@6 zSy2T{Mu3IuW~U$98m(PSL@2bLV;g<+Zd|C-ASEX|jlp<*aZi!9X|eVg!$XDP!NOFj z;1&vF!-FFeqtipB^6 z&mFGPRhsy-Q5w#3$0ls&iq$erMd!)qPANj_xK~=AY_f<6zQlXX&d>c{6lF z8?f#-Q$eE2yH4gsdpKtytLV~qBGGIa_b;(m3Ue_SH9bS`5M9###db;7hl>8lP&uYi zVk;!I-Q=tLA`#(m?(U;6Iy*E<`KF_C^O^@Q7;S)CXQ@_gH2uXIC)`<_K-;X<;kx!a zFL3(VcjXS1+~wUouDHj+{AT0%(nk!(rOD-u$|n|fNZ~!WWTYNu-~+z-`j z=PU4D^IDSTx|)VBFSVe`Wsvr83 zJZ$-O_p~ZAcs;mKbuaL852oc*sE>+l>+kOm9zYc5Ge7=P`+rZog6U7ZBFLtQC}pMV z8A4Bf;uS_+oXOlr@8UOh`XXlTtMJVlcoIUo zzDiM%B|ujs`9GS^>R&e2-g#X1F)p}%t5!#PRXWdX-Q z+(-Sr6|MZ(!ISDYHTo^w=nlC>90c#8#UGff7SB~m`|)UHWe4#nvr!xEFu!kh7TuEB z^r#-u*2lHm_uxtD6=y3lyh?*tVo68d;YuL2>^i4u$_B^N8cwwaMd%wI`QYpPFV?@F zXjgMo_d$UNoy0)0w-#%dda<4ij`ZIrMQHTmIRrQ z3U^B(%=DwvoQ8Xv0(4lXsA}?<`ipA6O)|nc|9BItj%w4nu$i$v?{k}=pfyQYn)EEU z-oPN~7OX@vo`xJ~bePvATE|iMT&+HLqVjwcG4t^!Xl85v!4n7EMyXyA`z!3|3+o1| ztEH4rD&r$7(-pUllI~2yHEPwLhn8^;)lv5gwfb4qnVTCu)c@x{DX^qr7H|opW_|&> zZ|gr=Db;I@+O#}-8S6V8-zEo3EvC57x=Vpde2%6PSvDltd9eUgSyvcTXEg2YIgpST z3uLt1=}TON=D@BQ$6>jhY>p(fYccoP zTg-Q~X)#^(4<252)g9ABGqi@6!odZG@5$$pNo1a9PVyy4p>-k`P8wT8#PS_LWm zUQ8nhkAA(~qu*$6lT6+k=h1WeRiR#t$v0-%Cf|~7o1A}oo1r$E_8_7z(V=4*Z846$ zGUq&mV|^Tb>9J$QBee)M7#?&m*lUlzv>)I#COmY1Soe3+MQC}fc6qGU_mkD2;qq9m z7|zDqY!P;#(se=8!n-<(0QeJL+dkC6}KM=p=mE|1kJ=be1{<+0l3v06lF z^2=kj)#b5T5#0Nx8mkpSieoMBd1MSl93OKv z1r7Rs2z5B(cpt_sm>S!Avi5MxZRx8ip24KuC->wI2eraa$5nOgcv5Tpwqc*7`t*9A zqFdZji@!u7)m`LWA@gD@<4;@2YQxbFBGH`Gx~Q!p+X2EWE&hVuBBr%=w&{2K$BK!q z;Z48W7E?pia_66h-0)jqN{DG#(uzSR9#H!{2AXr}KP;!g&+`=)T1D@p;KcmZfuIE9 zyWo9{(!yJd`rm}jMx!FX;C&oraFoy|a3kmq5x7!{0K8>G1Xf8hEf4r?LNTneHHz`m zp4`@={@27cV3wD!pkCdV7w?OBEQ`SF)#3ma0=Zbw#$-X-NAIaCjZ^Bq8u@1|F6(y|F1*6j_mQ) z(=AR>u0bNT7Lj*E=DoA!ZLpA!_<_9t!e^U`@=)iq|ASV(D*_FRd>>veMSgDwGyjtx zNXpUshj(AW!an)E!SZnyUtP0dGNPDp_)xKeb1mqA07h|cj}t{sC`S4S8+;+PXe?s+-CGLW9QnU2;cirUi?jaTFaId~8mOu>+WFrRRltGF{|e*z`x z?|5$H%*P|+4)sR)E~)4JM+fej{ENq5Mf=&x?Z;aI*ysCB)`+9W#1QOCqHGN)qOI(& zVQ-#`O~Et%8xz%5AuA@Tt;UVS*%0g1Qmipi%@FG$)iS)R5{f-7RE(c?TUM>%X{cLT zt>G)Hw1q9)9(?x01n~b9n+Ax@0d33=Njj~-(BzpmPynD@Fi(&4o6Fw4+8$Wgi~yZ_ zwRsHtC z_{Af&rc4hNn`d^2)i1Qr?4eo%J1fi(? zU%B1#T>r~4!~9IGd{|8{R$m`^3e|=HYRqC=gFAJ3%T zgvz{>Wv`j1|K6F}RB=YVAvE#Y=Y>C4`w(QB@+MSdudIn*BJUSTsF5{q|0C72)!K!s zpBPg!`lg^pe&dAv3hwx+Vd?e1OX3ie*P9Db&FSTSsfVyE?Htx{)amj5_cctOkbKLh z8@U@ep1`Gr4gN+be(^2a^CxTj>h&U4ClIT|pK?zVUOa|H2=?k67pDyAbup_Fq#I!L z(;C)1b?dOu$tvkigV^tjwsC=-vBkSk`70UsO9n-?ht;=7A&D$vS~L ziDb>^^$P4SHr>;;y4Z+CG7^gdh%!ejwzc*pDyZ6(pUKuJ^Vn=KWa#P&Bc}TMU=dHl zI&Q>N*cU~WFaPKnx6bD%U6h6ltpOqZ=I6n&N`Y`ho@?rSUl^&kz)?)1E>Oie<9Ym^ zEv6CU7v)G3F-=~h)xYwU1%$l{5M~UVd}}_laAa_ zBS|6z%JqxXbmksz6=!ILM%i!bs`iG|=&F)6l;83a6qBCC*GKf8eoIT_N(J(%D)LyI z1V1PAnCAqB?Iq0~V3_E8$Oe#D#v7h%=}<2J<=DO-R@eNHP7}tbFfRN@Vj;I*Kv}G92x08kCR(zWQtQ+ zT@@~dIF(V1$&n4Oy6diwr6(1WN7h6g6d9f}G2p;dtPCytGRwY% z`HkYhU;y=rr(A&nF#Pjppj=7D`weut4Hp_yrO`b(rut0Xqrqu8zDKi*Y;SELJMXF# zWY9)gr-w^JW8)LUI4@^lY+`g|VxlxWI$E3<7#kZLD2{e=irsyv7)DtS;}*<6Sq0Zk zR8JdR9rtOu!}c1Am|V2t9S^l`h#hKu7S-`q?@_wN4Yi&`B8^Rnyc=X*to)m_kkv+O z_af08YMq=$AnDFsyB0q(8vSqsF&=z9L2o?pJy%>Y|8NSg5OY=TdJ=NwA69?!O0}w< z$F0QPgh~SBq?N^qK`3A#YN=R+GoD%g<;YDgJoa=N@uSw148y5y$L_5(?+b`I^$ac8 zpaPanYpcTkHK*xZsycm(+5^QLz-hSk^Ocf|z=qgy&Cz4Js)*V-5rL1~er!nIbPZDI zA>oj3uB4sLL7Sf#uiUO)`AD@Q2Eo*OgO84s+JW8jgCjrm9o^b7g>bIBE(L)QSOs@Z z$od2?(>NT%SUlrs@nYp%>zq6jjTqcWdQQ7a@m@>hSyE)lha-of2@bN~hYj)QH4nC$ zvn`B?id`U8zCb$KSHAtb_}ge4WoE{m5nq??8`Y3aBi;89T!)G@rkp1Kv~3Ghev#PG z&@G>6;s9E%72~I!@WcJt8waOR z+jNZsuZUOhwyV$AwhZtmYaMrsQDr-FWYU~P?(0Z!$K%_<&!Fd`X1g< z7(1kz1K(7Qm=hrM8e;=A`Zly6SGE{2=|pRY5p$p0&$w>Zg$F>A%ZoPDV{b$2WMhF) z7;UH^$uuNlZ9`n_>QFHz52Ki|&^2wdx{+zi`Mo^!RNkYOpzjxWNR@&dUbDy{f33AZ#lfz!?>3OH_QxHLFk3@?SToTU1Fcs+u&FUBnh(ylpKqj%DNYWiX4IgOn2 zC#v38tDWV^f7sVsO!4nRT=qw)TGx6%Mz^@Q><=T6JU5YdgUq|N|Js_oyW>*GHDX2v57waL-N6%+Uid^oqviE~T!g|->sp7p>8TS4sG9y6na@^?QhPYiX z#SH-hL)@OOB-Z=!gknyp7(Y$zp`5mqz6NzmOG;^+ijOSePDa5?T#t%qECR{$DT*Zs zCrw<{WK3iynwk`DN+ne?ER#6=GMJy7mNXg+Q444=YEg2b&yoz#X(r7e z!MQv64CUsTdhLR+DsV(H7B7?^#Oi8su!WLG9DA!h4~s?#4hnTX%A1ywI zYGzs|!O{eLkyc@B-si8WFI*LXFU@@Rp9>x@~6jLjuXl6~1yEqx=fyy}?v~5a7kPs=*s#jU#>SBZf zoUm7ET`@1$ve1m=`!Fq9)gK^<=G%zI=5#n~bb%ga7DDT!!NfXw5X+7@_;@UG>p6T{Rcm66&g%yd$fw`cG2q zs$Ur~LId8$ci1NHL*2C;*;IbI%$s0@9%%6?YjQFg`Eb~|b<)TDa`7{gquHW%9%R99GY{hNn4II*S$}d)ovQk*rL>US z!Y$+k4tK&hb|mRF4!SjJg}{ z&v!^Njk;R{Q(O$A?nW^tN6ypkZqW4e=}Fb(@wMS_REf-a$Kml)}?{%q_rkG-=^q@On(|`B&V6={

    POTP(>rVUadb(~c+i#BT)N^9QKZI&UT2;wJYz6^Zl#BJT>B zcU#NrwUEdB=*QRbmED-!69I%L_gsmWFKOC@<$+>B<#v7My|GX?EE4|m$)`r*iTc8E zde0s@nlX$nZv={DM__2N&}qz#HlwF!P}hQ+wkg+zGZ-dtaz>^t$pe4pLT>Hp!B8S~ zZ^k3#6a8xBed!EJ7~9Yq!tMP(pg(^zKK_v^CQi=GVH4nEwdyhL#aJUvd2UO}qYJus z1xe^i?gdGKm>LhD>f!V(qO?D2DaJMlpWcP*$RRZI?ya+lUA9zU1E*3gnSM zC9+%wQ{se^4FVrXS~L?NOwyVYB2A+;QfNu4#3~pe5$h>Spk7%9Vq>_Zb z#2VjiV7Xb6Db{8c0WOA3zl>r`?$)MX##f_LVI9_=9`KXzfN~0Nrce^mHj}H?Xxq1? z9W8fBSrX;~jlS2~M{ z>!rrdLq(kFxiIexxxSaM-9tC0)tX=55OV|Z#mD{Ud3%vaMvIu6J}tsQnAo#5sM5!y>ZlTe&wmt_2TTA1@BJd*KYhevdX&~H!5iG zc(ud>ov^`UChvy^KA2E!x4qasekYs}G!LVSDL~^rfak_CyXVwQt#p=o?f*z(^%^^? znOultHK*SkVl|VuWX$U4UJh2TIfYF-%GkP>j$M+%ZIY7M-e+e!lMlwRozo{mY-jR; zjM;wn^02*GYZhl@&)~CNCnd3cot^DWzB!KVoF3NsOui{&wqMMK?Yp^KmRkI(eKTs$ z5;6(gGRwRzK|s)J*X=jjAz(6zuvNEndKdyGXRUBvd^sRk&(@f47D?fcP?MN{y`A|? zj@9;@z9FP`nEbSi<^M;sVSd4o|4r~u4_AG|l%n!*y@W+`bu=Z1iFE>omG(9;V25E` zk`X(zw*fA8M+gQc-<>fGKYKY~*zjPLc&}OlV^9c@#pdt_FS@0cIAR51cNY_WgfD|V z_VIu=0Nrc{DBlJkE*4f&OwQUjc;n>&=o$^4z-?rh8rH;IFg=|Q3E3e=$4vaNc@eo0 zI~+{RE4Au%oK3_B8UoI6*1$4r1M~(v(ATyBnv1OowL~Vvj}-ekdKq~dZ_fs3(;&df zU?DTipd|G|H`tlZWI8^T#>~iOHXsO7EXFO(pU`{~h|42e?jU6#2liy}VjMEXN zGZ164a+)(jY~8z4M{H*Vv6@&z=!mc=#=mKSsU%^;;Mg{0#_7*q5*4go6GQ|k3_;Gr;yJE76 z5oUzn_Vn?)-p5aLR{?i*Sa!3;A-gJDs8E1oOArwC+B>it?GQ1U+KLq-P7g!Glc#J<)oL?NB!ElHzC&h)v*&K-R3}hIqK*Q`2sH`B>+K*iIkr#Zba;V=o@BC$ zMP}5_4yF&{P6m;hnTmUf;SURddgCh?jn5ju6sW}nFa>ri?G13ij@`H8$#Q@G*yIyuE3>n1IjAC4jQ(LK z3feq^j%ttuOz0AS@%G@tyD_CU8t)Y%yOelul04sRm*;#NdFEo_4u#2CyQszV<=MMZ zExQ!k5HC9H9+K$8*jTVmV(pgm7+tBmbmV-l?oNk0CQW3N?BMie>;zoGa&4#V&bpW$ zTGh@mp02@bE1hw2v`$T>W4De<)f@`QA5et@ku_Tt?Ty1t>STQmEmdrJlGC2L!=cSv zj8}=Kv^{tviM;t(qEHchcCk{$oGUme>Y1`79&ni{$NfBhZA-MhvBnm982wZ1kw4|e zKH3}Z#!>N+JkfelX)u^{0-f(H0_sk)=G0rkf&l*wbl2?i{K4vX(WHogKav$etM?1a z)*t=VPAkNPMTKs-JcA5L+GT@XyIk8wyKpfKG8nxjlhq(YM!jV%b?q|$Pi*PfM~Rfs zb{K?_!$qo8C(fldY$VDB%|f<*v`_KWK$11FM`BQ3%MqBodJ2V>m@f zwn0fUt#7ak9Fr+5Z#B<2J#1PtSq-pcByg9~7r19=ru9iRoF&Za05zD@uJm6M)y`r^ zV+4LZcJsPd;)l@~qvcOXGL6Pq@#A6`jWLQbIh)a#A4naw$#dF1d2VqAhAPiSM_&~g z_VOpCb7-Af=n^8iLL2z;4)u&qREnk`WP^`9B`HE_yw^4?5Y3u8zpua%>_YHlZz{`5cWo{s&!F zQ#W@VU7kUgA-e3N%Y$@z4qeXDWeyjb1wb~FoCQ#bn+2feFkx4KdZi=|1n`&IxFdzB ziGk6fkz!$NdT@HGFg`KvmP*Cp!NN4oZ5*bsjy4?C*4xCS^P-#H=Yh^9Bn!2ZLx2 zj!5->5{c$qfcuuT=ti+4fP&ZC{35+UOas`rxb-&HM~bC3cPv66c$JNTrT4R_)BGkz zl6JVD^Cc^da|_2@IwO7|dq!AejBegkqcQ#kOUK(Qlx3 z-NndzGaf0|+*nw@fm#1(5l5|3`;mN)l9QOe*3NV$(`bm5>6{*J7);)p9n;^PG1J#S zi?4&vwV$Ut{iV+5jROm%wBD0Hj}B-v@)C1!^~## zjoHcfmosMe2EpvZRSYVe#xAp1-ysA%N={<>Dm&AeOq(BDna=59rZf4L?3n&<88dyY zU^)*OGRH%-BzE`N+0A4Md0E-b>0x#=SxweSU!kmgPfE6mE6u`_?!|P|O=7nF5to_H(hY)xu;l6^&`*-8SN{N{Q+IWbs!~8+r>}evd96 zpvx!d@&&s5GhMDk7053n36p-|fR2bhJ3Netwv$vB+`=uW2;9Pc+%CIYxQptt&Ksax zoLjgPiR7{9c_Bvy3t72^4ieLqs2%i%uDXTN<&YD@2mNs|I2R{oi&e+wwL6bHr`_gV zIE)$>9#t~H^=?Ha?S5h|HsyAtz)!pbH{!a%{WTIP_=yJhnM{7-P(m^IiMC?OPfQ=Q zy{KJ!pye5~at*O}*N04V&pQMx>P8B*qU0o~*4m+BGI^I)s5m{`zL>1M%k-f-nkrQO z3_Eh(_4egE^c^A+Lu(nOssUPMi*x)M!#nRxWA!I6amsPWN(?ikSew zp@2P(85;1>yM*C)O#fH&{w>Ne;>$_|!yaxDg1vSGnM@w86+upiL24k#WaZ(ek6L00k5ZfN%k+K)JSHg#o7Hw~m`vt^6&p?uW5Zj^p50-+Es37$SX zJWM8M+X@e-hv8wea<+0cu0X7nbNQ0${enbNKod$LxWHV(gy#N;lz9Hz^obaCm@pv#Ns z@4G2#o#kzfN+@2#lc{KiwYD(1S+%-{?doLowKr2Tpf{q3Lwk9Xik zEH_xcTEc|Diotp&BQoZ_E1}pk?8Qd1M(hKqV;YEg@5O^-Ay{{+K>&~{!io&$f0&rW z{9ZfrnM`tTWj?2en+uc4@5{8gd?F*}7g(c7`M=iQW*CJ__SBr;1MPKm=*U}d&CFmc zD2~ePbqr;x()Wq8jd|y&J$s!{6Xbl@2TGv6(%$6O*iqjs$+V!+iaHm=5)GrJGFh!C z&Pqvs;j*B9HTRf)2fD8@S1mE-leRRmJ6mL?w$qebOk;}$Rkd-C70f|`%(oOW9 z6f9Y37s(OB?U7X`elLoJwYtl}`vn-7de@+aHe2?(82SyM1CbkXBc>b7UoC-xEo(5J z$z;p+ClrG%Yb&N~*{m?jqmF4~HWvx04R2C(HKumw#`w`X;*3amY4ON+Id1!|YuY8Fzm(%!h&*rjB%B$L%_l@cxn ztJ!GWOjcHNR#I|*`cg9aSP*)&_t7~KDx;$O>$~VcX(M)F0Xui5a?KV;*pVB#5 zY@Bt{@+d`{~T^QyV=ygidM5adx!i_hHK z67gyCha0-*d)&n?8Vv*yX``Jj>>TGKyLbhgc?7MO>eQ^ysaMi(GnFXC3s|rsc#17h zW{Pt;v&rtTc-_J0&;!ivJ4(eSZMQ-g$KxIal2k5Q73?%}@ZzipnK~EFgdBdk z{|Ga~_$GST6c$LHO{$ksf{^0f!xdOS*5|IGX*)E~OXweM0uw2^N63g-tlh_UDpm5e zj^z!cP30Eo>di?UaB*IjsD4O*ot>tHV>>uq&$s&y;^jHalgIi&RA^g24fW%ASzbvf zy9`M0PN!OPW_eCM?Y{H4@fK_fg@7%0A(xzUvMV}MA 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

    q#7hs8l&DVOJNOVeB!5yiU}d(HHE&g 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 VIf``1&A2)|P;I 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

    YYMDQa%)@Q=D{&*VD5z-> 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%0A{-ERXzii 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

    dxfmKPaHY-dii9E^4nAlG8 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

    kiV$hF0nepO1TB%kB%!ZEBY4-4+o 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≤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

  1. _OJ(?9%v2$CNQI1 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
    &2 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 !=2apb@uUx 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
    silm>BL#^gs+ST+H?)^HYORNIX=3#Z=hDoj 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%0A@lBiv*r%L5q*@iVGD&H`R8WBYe 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

    YQcYXBXtb*0n%hxyemvW~ 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

    p{x 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 Date: Tue, 9 Dec 2025 22:58:25 +0000 Subject: [PATCH 189/192] chore(cleanup): remove obsolete Copilot migration XML files --- .idea/.idea.TUnit/.idea/copilot.data.migration.ask.xml | 6 ------ .../.idea/copilot.data.migration.ask2agent.xml | 6 ------ .idea/.idea.TUnit/.idea/indexLayout.xml | 8 -------- 3 files changed, 20 deletions(-) delete mode 100644 .idea/.idea.TUnit/.idea/copilot.data.migration.ask.xml delete mode 100644 .idea/.idea.TUnit/.idea/copilot.data.migration.ask2agent.xml delete mode 100644 .idea/.idea.TUnit/.idea/indexLayout.xml diff --git a/.idea/.idea.TUnit/.idea/copilot.data.migration.ask.xml b/.idea/.idea.TUnit/.idea/copilot.data.migration.ask.xml deleted file mode 100644 index 7ef04e2ea0..0000000000 --- a/.idea/.idea.TUnit/.idea/copilot.data.migration.ask.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/.idea.TUnit/.idea/copilot.data.migration.ask2agent.xml b/.idea/.idea.TUnit/.idea/copilot.data.migration.ask2agent.xml deleted file mode 100644 index 1f2ea11e7f..0000000000 --- a/.idea/.idea.TUnit/.idea/copilot.data.migration.ask2agent.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/.idea.TUnit/.idea/indexLayout.xml b/.idea/.idea.TUnit/.idea/indexLayout.xml deleted file mode 100644 index 7b08163ceb..0000000000 --- a/.idea/.idea.TUnit/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 7cd26d8f37a5b0b8190395de45c37df9db0dc606 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:30:07 +0000 Subject: [PATCH 190/192] chore: update benchmark results (#4031) --- docs/docs/benchmarks/AsyncTests.md | 20 +- docs/docs/benchmarks/BuildTime.md | 16 +- docs/docs/benchmarks/DataDrivenTests.md | 20 +- docs/docs/benchmarks/MassiveParallelTests.md | 20 +- docs/docs/benchmarks/MatrixTests.md | 20 +- docs/docs/benchmarks/ScaleTests.md | 20 +- docs/docs/benchmarks/SetupTeardownTests.md | 18 +- docs/docs/benchmarks/index.md | 10 +- docs/static/benchmarks/AsyncTests.json | 46 +-- docs/static/benchmarks/BuildTime.json | 38 +-- docs/static/benchmarks/DataDrivenTests.json | 46 +-- .../benchmarks/MassiveParallelTests.json | 46 +-- docs/static/benchmarks/MatrixTests.json | 46 +-- docs/static/benchmarks/ScaleTests.json | 46 +-- .../static/benchmarks/SetupTeardownTests.json | 38 +-- docs/static/benchmarks/historical.json | 4 + docs/static/benchmarks/latest.json | 272 +++++++++--------- docs/static/benchmarks/summary.json | 4 +- 18 files changed, 367 insertions(+), 363 deletions(-) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 707909493d..3a0ac3d0da 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,20 +7,20 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 583.0 ms | 583.5 ms | 2.75 ms | -| NUnit | 4.4.0 | 811.7 ms | 812.7 ms | 5.89 ms | -| MSTest | 4.0.2 | 688.5 ms | 689.0 ms | 8.46 ms | -| xUnit3 | 3.2.1 | 773.6 ms | 773.2 ms | 5.60 ms | -| **TUnit (AOT)** | 1.5.6 | 124.6 ms | 124.6 ms | 0.41 ms | +| **TUnit** | 1.5.6 | 567.5 ms | 566.7 ms | 5.32 ms | +| NUnit | 4.4.0 | 736.1 ms | 735.9 ms | 6.54 ms | +| MSTest | 4.0.2 | 620.1 ms | 620.1 ms | 5.46 ms | +| xUnit3 | 3.2.1 | 710.4 ms | 713.3 ms | 8.37 ms | +| **TUnit (AOT)** | 1.5.6 | 122.6 ms | 122.5 ms | 0.37 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-09** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 975 - bar [583, 811.7, 688.5, 773.6, 124.6] + y-axis "Time (ms)" 0 --> 884 + bar [567.5, 736.1, 620.1, 710.4, 122.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.178Z* +*Last generated: 2025-12-10T00:29:52.680Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 4fa3e24770..851ef90716 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,9 +7,9 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 2.067 s | 2.075 s | 0.0363 s | -| Build_NUnit | 4.4.0 | 1.654 s | 1.649 s | 0.0139 s | -| Build_MSTest | 4.0.2 | 1.679 s | 1.678 s | 0.0132 s | -| Build_xUnit3 | 3.2.1 | 1.611 s | 1.616 s | 0.0301 s | +| **TUnit** | 1.5.6 | 2.039 s | 2.039 s | 0.0181 s | +| Build_NUnit | 4.4.0 | 1.630 s | 1.630 s | 0.0141 s | +| Build_MSTest | 4.0.2 | 1.720 s | 1.719 s | 0.0102 s | +| Build_xUnit3 | 3.2.1 | 1.627 s | 1.625 s | 0.0196 s | ## šŸ“ˆ Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.067, 1.654, 1.679, 1.611] + bar [2.039, 1.63, 1.72, 1.627] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.180Z* +*Last generated: 2025-12-10T00:29:52.682Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index d665c3f7e1..4d69d86387 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,20 +7,20 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 496.09 ms | 495.80 ms | 6.452 ms | -| NUnit | 4.4.0 | 604.12 ms | 603.02 ms | 7.033 ms | -| MSTest | 4.0.2 | 471.16 ms | 470.20 ms | 6.149 ms | -| xUnit3 | 3.2.1 | 568.44 ms | 567.48 ms | 4.891 ms | -| **TUnit (AOT)** | 1.5.6 | 24.13 ms | 24.14 ms | 0.074 ms | +| **TUnit** | 1.5.6 | 511.20 ms | 508.62 ms | 7.821 ms | +| NUnit | 4.4.0 | 654.61 ms | 651.83 ms | 10.449 ms | +| MSTest | 4.0.2 | 612.10 ms | 611.26 ms | 7.900 ms | +| xUnit3 | 3.2.1 | 623.96 ms | 615.51 ms | 18.949 ms | +| **TUnit (AOT)** | 1.5.6 | 25.28 ms | 25.31 ms | 0.157 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-09** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 725 - bar [496.09, 604.12, 471.16, 568.44, 24.13] + y-axis "Time (ms)" 0 --> 786 + bar [511.2, 654.61, 612.1, 623.96, 25.28] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.178Z* +*Last generated: 2025-12-10T00:29:52.680Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 59c8e23054..d44ebd2e19 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,20 +7,20 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 582.8 ms | 583.4 ms | 6.12 ms | -| NUnit | 4.4.0 | 1,263.7 ms | 1,262.1 ms | 8.97 ms | -| MSTest | 4.0.2 | 2,970.4 ms | 2,969.5 ms | 10.25 ms | -| xUnit3 | 3.2.1 | 3,045.0 ms | 3,045.9 ms | 6.20 ms | -| **TUnit (AOT)** | 1.5.6 | 130.3 ms | 130.3 ms | 0.46 ms | +| **TUnit** | 1.5.6 | 602.8 ms | 602.8 ms | 5.09 ms | +| NUnit | 4.4.0 | 1,271.1 ms | 1,269.1 ms | 12.12 ms | +| MSTest | 4.0.2 | 2,955.5 ms | 2,953.9 ms | 6.21 ms | +| xUnit3 | 3.2.1 | 3,055.2 ms | 3,052.6 ms | 8.18 ms | +| **TUnit (AOT)** | 1.5.6 | 130.6 ms | 130.7 ms | 0.35 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-09** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3654 - bar [582.8, 1263.7, 2970.4, 3045, 130.3] + y-axis "Time (ms)" 0 --> 3667 + bar [602.8, 1271.1, 2955.5, 3055.2, 130.6] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.178Z* +*Last generated: 2025-12-10T00:29:52.681Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index fcc8874530..6e23a71487 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,20 +7,20 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 558.40 ms | 558.35 ms | 6.603 ms | -| NUnit | 4.4.0 | 1,614.95 ms | 1,615.43 ms | 8.118 ms | -| MSTest | 4.0.2 | 1,484.96 ms | 1,484.91 ms | 4.242 ms | -| xUnit3 | 3.2.1 | 1,576.63 ms | 1,575.42 ms | 6.563 ms | -| **TUnit (AOT)** | 1.5.6 | 78.58 ms | 78.49 ms | 0.440 ms | +| **TUnit** | 1.5.6 | 558.23 ms | 558.59 ms | 2.610 ms | +| NUnit | 4.4.0 | 1,630.43 ms | 1,629.39 ms | 6.793 ms | +| MSTest | 4.0.2 | 1,503.23 ms | 1,500.75 ms | 11.131 ms | +| xUnit3 | 3.2.1 | 1,590.84 ms | 1,590.40 ms | 10.966 ms | +| **TUnit (AOT)** | 1.5.6 | 77.58 ms | 77.58 ms | 0.269 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-09** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1938 - bar [558.4, 1614.95, 1484.96, 1576.63, 78.58] + y-axis "Time (ms)" 0 --> 1957 + bar [558.23, 1630.43, 1503.23, 1590.84, 77.58] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.179Z* +*Last generated: 2025-12-10T00:29:52.681Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index b276a68082..63c8629157 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,20 +7,20 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 512.24 ms | 511.92 ms | 3.757 ms | -| NUnit | 4.4.0 | 671.21 ms | 672.67 ms | 11.866 ms | -| MSTest | 4.0.2 | 494.89 ms | 491.23 ms | 9.087 ms | -| xUnit3 | 3.2.1 | 578.72 ms | 577.43 ms | 5.419 ms | -| **TUnit (AOT)** | 1.5.6 | 39.20 ms | 39.33 ms | 3.165 ms | +| **TUnit** | 1.5.6 | 518.74 ms | 518.92 ms | 2.688 ms | +| NUnit | 4.4.0 | 705.62 ms | 706.08 ms | 8.872 ms | +| MSTest | 4.0.2 | 673.90 ms | 672.14 ms | 9.096 ms | +| xUnit3 | 3.2.1 | 672.99 ms | 672.70 ms | 8.166 ms | +| **TUnit (AOT)** | 1.5.6 | 39.44 ms | 39.32 ms | 3.059 ms | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-09** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 806 - bar [512.24, 671.21, 494.89, 578.72, 39.2] + y-axis "Time (ms)" 0 --> 847 + bar [518.74, 705.62, 673.9, 672.99, 39.44] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.179Z* +*Last generated: 2025-12-10T00:29:52.681Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 8226e0e2f9..b2356fba2f 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,19 +7,19 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-12-09** from the latest CI run. +This benchmark was automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸ“Š Results | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.5.6 | 564.3 ms | 564.5 ms | 4.53 ms | -| NUnit | 4.4.0 | 1,270.7 ms | 1,269.2 ms | 7.74 ms | -| MSTest | 4.0.2 | 1,105.3 ms | 1,101.4 ms | 8.42 ms | -| xUnit3 | 3.2.1 | 1,204.2 ms | 1,201.9 ms | 13.76 ms | +| **TUnit** | 1.5.6 | 555.3 ms | 554.9 ms | 12.00 ms | +| NUnit | 4.4.0 | 1,253.5 ms | 1,252.7 ms | 7.13 ms | +| MSTest | 4.0.2 | 1,091.2 ms | 1,091.0 ms | 9.74 ms | +| xUnit3 | 3.2.1 | 1,177.5 ms | 1,175.1 ms | 10.72 ms | | **TUnit (AOT)** | 1.5.6 | NA | NA | NA | ## šŸ“ˆ Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-12-09** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1525 - bar [564.3, 1270.7, 1105.3, 1204.2, 0] + y-axis "Time (ms)" 0 --> 1505 + bar [555.3, 1253.5, 1091.2, 1177.5, 0] ``` ## šŸŽÆ Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-12-09T00:29:13.179Z* +*Last generated: 2025-12-10T00:29:52.682Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 0e1beab983..23a17ed309 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,9 +7,9 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-12-09** from the latest CI run. +These benchmarks were automatically generated on **2025-12-10** from the latest CI run. -**Environment:** Ubuntu Latest • .NET SDK 10.0.100 +**Environment:** Ubuntu Latest • .NET SDK 10.0.101 ::: ## šŸš€ Runtime Benchmarks @@ -56,8 +56,8 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 -- **SDK**: .NET SDK 10.0.100 +- **Runtime**: .NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3 +- **SDK**: .NET SDK 10.0.101 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) - **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat) @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-12-09T00:29:13.180Z* +*Last generated: 2025-12-10T00:29:52.683Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 6411918aa7..9778baf8a4 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-09T00:29:13.178Z", + "timestamp": "2025-12-10T00:29:52.680Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "583.0 ms", - "Error": "3.10 ms", - "StdDev": "2.75 ms", - "Median": "583.5 ms" + "Mean": "567.5 ms", + "Error": "5.69 ms", + "StdDev": "5.32 ms", + "Median": "566.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "811.7 ms", - "Error": "7.54 ms", - "StdDev": "5.89 ms", - "Median": "812.7 ms" + "Mean": "736.1 ms", + "Error": "7.38 ms", + "StdDev": "6.54 ms", + "Median": "735.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "688.5 ms", - "Error": "10.13 ms", - "StdDev": "8.46 ms", - "Median": "689.0 ms" + "Mean": "620.1 ms", + "Error": "6.16 ms", + "StdDev": "5.46 ms", + "Median": "620.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "773.6 ms", - "Error": "6.70 ms", - "StdDev": "5.60 ms", - "Median": "773.2 ms" + "Mean": "710.4 ms", + "Error": "8.95 ms", + "StdDev": "8.37 ms", + "Median": "713.3 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "124.6 ms", - "Error": "0.43 ms", - "StdDev": "0.41 ms", - "Median": "124.6 ms" + "Mean": "122.6 ms", + "Error": "0.40 ms", + "StdDev": "0.37 ms", + "Median": "122.5 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 158c28baee..11685d8f06 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-12-09T00:29:13.180Z", + "timestamp": "2025-12-10T00:29:52.682Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "Build_TUnit", "Version": "1.5.6", - "Mean": "2.067 s", - "Error": "0.0389 s", - "StdDev": "0.0363 s", - "Median": "2.075 s" + "Mean": "2.039 s", + "Error": "0.0194 s", + "StdDev": "0.0181 s", + "Median": "2.039 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.654 s", - "Error": "0.0167 s", - "StdDev": "0.0139 s", - "Median": "1.649 s" + "Mean": "1.630 s", + "Error": "0.0159 s", + "StdDev": "0.0141 s", + "Median": "1.630 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.679 s", - "Error": "0.0149 s", - "StdDev": "0.0132 s", - "Median": "1.678 s" + "Mean": "1.720 s", + "Error": "0.0115 s", + "StdDev": "0.0102 s", + "Median": "1.719 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.611 s", - "Error": "0.0322 s", - "StdDev": "0.0301 s", - "Median": "1.616 s" + "Mean": "1.627 s", + "Error": "0.0210 s", + "StdDev": "0.0196 s", + "Median": "1.625 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 24622d00a3..e979438fb3 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-09T00:29:13.178Z", + "timestamp": "2025-12-10T00:29:52.681Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "496.09 ms", - "Error": "6.897 ms", - "StdDev": "6.452 ms", - "Median": "495.80 ms" + "Mean": "511.20 ms", + "Error": "8.823 ms", + "StdDev": "7.821 ms", + "Median": "508.62 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "604.12 ms", - "Error": "7.933 ms", - "StdDev": "7.033 ms", - "Median": "603.02 ms" + "Mean": "654.61 ms", + "Error": "10.639 ms", + "StdDev": "10.449 ms", + "Median": "651.83 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "471.16 ms", - "Error": "6.936 ms", - "StdDev": "6.149 ms", - "Median": "470.20 ms" + "Mean": "612.10 ms", + "Error": "8.912 ms", + "StdDev": "7.900 ms", + "Median": "611.26 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "568.44 ms", - "Error": "5.517 ms", - "StdDev": "4.891 ms", - "Median": "567.48 ms" + "Mean": "623.96 ms", + "Error": "12.171 ms", + "StdDev": "18.949 ms", + "Median": "615.51 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "24.13 ms", - "Error": "0.088 ms", - "StdDev": "0.074 ms", - "Median": "24.14 ms" + "Mean": "25.28 ms", + "Error": "0.188 ms", + "StdDev": "0.157 ms", + "Median": "25.31 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index b09c1c7f40..8c25880924 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-09T00:29:13.179Z", + "timestamp": "2025-12-10T00:29:52.681Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "582.8 ms", - "Error": "6.55 ms", - "StdDev": "6.12 ms", - "Median": "583.4 ms" + "Mean": "602.8 ms", + "Error": "5.74 ms", + "StdDev": "5.09 ms", + "Median": "602.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,263.7 ms", - "Error": "9.59 ms", - "StdDev": "8.97 ms", - "Median": "1,262.1 ms" + "Mean": "1,271.1 ms", + "Error": "13.68 ms", + "StdDev": "12.12 ms", + "Median": "1,269.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,970.4 ms", - "Error": "12.27 ms", - "StdDev": "10.25 ms", - "Median": "2,969.5 ms" + "Mean": "2,955.5 ms", + "Error": "7.00 ms", + "StdDev": "6.21 ms", + "Median": "2,953.9 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,045.0 ms", - "Error": "7.42 ms", - "StdDev": "6.20 ms", - "Median": "3,045.9 ms" + "Mean": "3,055.2 ms", + "Error": "8.74 ms", + "StdDev": "8.18 ms", + "Median": "3,052.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "130.3 ms", - "Error": "0.50 ms", - "StdDev": "0.46 ms", - "Median": "130.3 ms" + "Mean": "130.6 ms", + "Error": "0.45 ms", + "StdDev": "0.35 ms", + "Median": "130.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 1533554c7c..d007288f6a 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-09T00:29:13.179Z", + "timestamp": "2025-12-10T00:29:52.681Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "558.40 ms", - "Error": "7.059 ms", - "StdDev": "6.603 ms", - "Median": "558.35 ms" + "Mean": "558.23 ms", + "Error": "3.125 ms", + "StdDev": "2.610 ms", + "Median": "558.59 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,614.95 ms", - "Error": "9.157 ms", - "StdDev": "8.118 ms", - "Median": "1,615.43 ms" + "Mean": "1,630.43 ms", + "Error": "8.135 ms", + "StdDev": "6.793 ms", + "Median": "1,629.39 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,484.96 ms", - "Error": "5.434 ms", - "StdDev": "4.242 ms", - "Median": "1,484.91 ms" + "Mean": "1,503.23 ms", + "Error": "11.899 ms", + "StdDev": "11.131 ms", + "Median": "1,500.75 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,576.63 ms", - "Error": "7.017 ms", - "StdDev": "6.563 ms", - "Median": "1,575.42 ms" + "Mean": "1,590.84 ms", + "Error": "11.724 ms", + "StdDev": "10.966 ms", + "Median": "1,590.40 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "78.58 ms", - "Error": "0.470 ms", - "StdDev": "0.440 ms", - "Median": "78.49 ms" + "Mean": "77.58 ms", + "Error": "0.288 ms", + "StdDev": "0.269 ms", + "Median": "77.58 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 09400155ab..4b984f2f13 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-12-09T00:29:13.179Z", + "timestamp": "2025-12-10T00:29:52.682Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "512.24 ms", - "Error": "4.238 ms", - "StdDev": "3.757 ms", - "Median": "511.92 ms" + "Mean": "518.74 ms", + "Error": "2.874 ms", + "StdDev": "2.688 ms", + "Median": "518.92 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "671.21 ms", - "Error": "12.685 ms", - "StdDev": "11.866 ms", - "Median": "672.67 ms" + "Mean": "705.62 ms", + "Error": "9.484 ms", + "StdDev": "8.872 ms", + "Median": "706.08 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "494.89 ms", - "Error": "9.714 ms", - "StdDev": "9.087 ms", - "Median": "491.23 ms" + "Mean": "673.90 ms", + "Error": "10.260 ms", + "StdDev": "9.096 ms", + "Median": "672.14 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "578.72 ms", - "Error": "5.793 ms", - "StdDev": "5.419 ms", - "Median": "577.43 ms" + "Mean": "672.99 ms", + "Error": "9.211 ms", + "StdDev": "8.166 ms", + "Median": "672.70 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "39.20 ms", - "Error": "1.079 ms", - "StdDev": "3.165 ms", - "Median": "39.33 ms" + "Mean": "39.44 ms", + "Error": "1.037 ms", + "StdDev": "3.059 ms", + "Median": "39.32 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 4cf336c27e..7db78afa7c 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-12-09T00:29:13.179Z", + "timestamp": "2025-12-10T00:29:52.682Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "564.3 ms", - "Error": "5.11 ms", - "StdDev": "4.53 ms", - "Median": "564.5 ms" + "Mean": "555.3 ms", + "Error": "10.80 ms", + "StdDev": "12.00 ms", + "Median": "554.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,270.7 ms", - "Error": "9.27 ms", - "StdDev": "7.74 ms", - "Median": "1,269.2 ms" + "Mean": "1,253.5 ms", + "Error": "7.62 ms", + "StdDev": "7.13 ms", + "Median": "1,252.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,105.3 ms", - "Error": "9.00 ms", - "StdDev": "8.42 ms", - "Median": "1,101.4 ms" + "Mean": "1,091.2 ms", + "Error": "10.41 ms", + "StdDev": "9.74 ms", + "Median": "1,091.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,204.2 ms", - "Error": "14.71 ms", - "StdDev": "13.76 ms", - "Median": "1,201.9 ms" + "Mean": "1,177.5 ms", + "Error": "11.46 ms", + "StdDev": "10.72 ms", + "Median": "1,175.1 ms" }, { "Method": "TUnit_AOT", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 1c741e7941..74305c85d8 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -118,5 +118,9 @@ { "date": "2025-12-09", "environment": "Ubuntu" + }, + { + "date": "2025-12-10", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 077c374a55..19f6a0365c 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,253 +1,253 @@ { - "timestamp": "2025-12-09T00:29:13.180Z", + "timestamp": "2025-12-10T00:29:52.683Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", - "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "sdk": ".NET SDK 10.0.101", + "host": ".NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3" }, "categories": { "AsyncTests": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "583.0 ms", - "Error": "3.10 ms", - "StdDev": "2.75 ms", - "Median": "583.5 ms" + "Mean": "567.5 ms", + "Error": "5.69 ms", + "StdDev": "5.32 ms", + "Median": "566.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "811.7 ms", - "Error": "7.54 ms", - "StdDev": "5.89 ms", - "Median": "812.7 ms" + "Mean": "736.1 ms", + "Error": "7.38 ms", + "StdDev": "6.54 ms", + "Median": "735.9 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "688.5 ms", - "Error": "10.13 ms", - "StdDev": "8.46 ms", - "Median": "689.0 ms" + "Mean": "620.1 ms", + "Error": "6.16 ms", + "StdDev": "5.46 ms", + "Median": "620.1 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "773.6 ms", - "Error": "6.70 ms", - "StdDev": "5.60 ms", - "Median": "773.2 ms" + "Mean": "710.4 ms", + "Error": "8.95 ms", + "StdDev": "8.37 ms", + "Median": "713.3 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "124.6 ms", - "Error": "0.43 ms", - "StdDev": "0.41 ms", - "Median": "124.6 ms" + "Mean": "122.6 ms", + "Error": "0.40 ms", + "StdDev": "0.37 ms", + "Median": "122.5 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "496.09 ms", - "Error": "6.897 ms", - "StdDev": "6.452 ms", - "Median": "495.80 ms" + "Mean": "511.20 ms", + "Error": "8.823 ms", + "StdDev": "7.821 ms", + "Median": "508.62 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "604.12 ms", - "Error": "7.933 ms", - "StdDev": "7.033 ms", - "Median": "603.02 ms" + "Mean": "654.61 ms", + "Error": "10.639 ms", + "StdDev": "10.449 ms", + "Median": "651.83 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "471.16 ms", - "Error": "6.936 ms", - "StdDev": "6.149 ms", - "Median": "470.20 ms" + "Mean": "612.10 ms", + "Error": "8.912 ms", + "StdDev": "7.900 ms", + "Median": "611.26 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "568.44 ms", - "Error": "5.517 ms", - "StdDev": "4.891 ms", - "Median": "567.48 ms" + "Mean": "623.96 ms", + "Error": "12.171 ms", + "StdDev": "18.949 ms", + "Median": "615.51 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "24.13 ms", - "Error": "0.088 ms", - "StdDev": "0.074 ms", - "Median": "24.14 ms" + "Mean": "25.28 ms", + "Error": "0.188 ms", + "StdDev": "0.157 ms", + "Median": "25.31 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "582.8 ms", - "Error": "6.55 ms", - "StdDev": "6.12 ms", - "Median": "583.4 ms" + "Mean": "602.8 ms", + "Error": "5.74 ms", + "StdDev": "5.09 ms", + "Median": "602.8 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,263.7 ms", - "Error": "9.59 ms", - "StdDev": "8.97 ms", - "Median": "1,262.1 ms" + "Mean": "1,271.1 ms", + "Error": "13.68 ms", + "StdDev": "12.12 ms", + "Median": "1,269.1 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "2,970.4 ms", - "Error": "12.27 ms", - "StdDev": "10.25 ms", - "Median": "2,969.5 ms" + "Mean": "2,955.5 ms", + "Error": "7.00 ms", + "StdDev": "6.21 ms", + "Median": "2,953.9 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "3,045.0 ms", - "Error": "7.42 ms", - "StdDev": "6.20 ms", - "Median": "3,045.9 ms" + "Mean": "3,055.2 ms", + "Error": "8.74 ms", + "StdDev": "8.18 ms", + "Median": "3,052.6 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "130.3 ms", - "Error": "0.50 ms", - "StdDev": "0.46 ms", - "Median": "130.3 ms" + "Mean": "130.6 ms", + "Error": "0.45 ms", + "StdDev": "0.35 ms", + "Median": "130.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "558.40 ms", - "Error": "7.059 ms", - "StdDev": "6.603 ms", - "Median": "558.35 ms" + "Mean": "558.23 ms", + "Error": "3.125 ms", + "StdDev": "2.610 ms", + "Median": "558.59 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,614.95 ms", - "Error": "9.157 ms", - "StdDev": "8.118 ms", - "Median": "1,615.43 ms" + "Mean": "1,630.43 ms", + "Error": "8.135 ms", + "StdDev": "6.793 ms", + "Median": "1,629.39 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,484.96 ms", - "Error": "5.434 ms", - "StdDev": "4.242 ms", - "Median": "1,484.91 ms" + "Mean": "1,503.23 ms", + "Error": "11.899 ms", + "StdDev": "11.131 ms", + "Median": "1,500.75 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,576.63 ms", - "Error": "7.017 ms", - "StdDev": "6.563 ms", - "Median": "1,575.42 ms" + "Mean": "1,590.84 ms", + "Error": "11.724 ms", + "StdDev": "10.966 ms", + "Median": "1,590.40 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "78.58 ms", - "Error": "0.470 ms", - "StdDev": "0.440 ms", - "Median": "78.49 ms" + "Mean": "77.58 ms", + "Error": "0.288 ms", + "StdDev": "0.269 ms", + "Median": "77.58 ms" } ], "ScaleTests": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "512.24 ms", - "Error": "4.238 ms", - "StdDev": "3.757 ms", - "Median": "511.92 ms" + "Mean": "518.74 ms", + "Error": "2.874 ms", + "StdDev": "2.688 ms", + "Median": "518.92 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "671.21 ms", - "Error": "12.685 ms", - "StdDev": "11.866 ms", - "Median": "672.67 ms" + "Mean": "705.62 ms", + "Error": "9.484 ms", + "StdDev": "8.872 ms", + "Median": "706.08 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "494.89 ms", - "Error": "9.714 ms", - "StdDev": "9.087 ms", - "Median": "491.23 ms" + "Mean": "673.90 ms", + "Error": "10.260 ms", + "StdDev": "9.096 ms", + "Median": "672.14 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "578.72 ms", - "Error": "5.793 ms", - "StdDev": "5.419 ms", - "Median": "577.43 ms" + "Mean": "672.99 ms", + "Error": "9.211 ms", + "StdDev": "8.166 ms", + "Median": "672.70 ms" }, { "Method": "TUnit_AOT", "Version": "1.5.6", - "Mean": "39.20 ms", - "Error": "1.079 ms", - "StdDev": "3.165 ms", - "Median": "39.33 ms" + "Mean": "39.44 ms", + "Error": "1.037 ms", + "StdDev": "3.059 ms", + "Median": "39.32 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", "Version": "1.5.6", - "Mean": "564.3 ms", - "Error": "5.11 ms", - "StdDev": "4.53 ms", - "Median": "564.5 ms" + "Mean": "555.3 ms", + "Error": "10.80 ms", + "StdDev": "12.00 ms", + "Median": "554.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,270.7 ms", - "Error": "9.27 ms", - "StdDev": "7.74 ms", - "Median": "1,269.2 ms" + "Mean": "1,253.5 ms", + "Error": "7.62 ms", + "StdDev": "7.13 ms", + "Median": "1,252.7 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,105.3 ms", - "Error": "9.00 ms", - "StdDev": "8.42 ms", - "Median": "1,101.4 ms" + "Mean": "1,091.2 ms", + "Error": "10.41 ms", + "StdDev": "9.74 ms", + "Median": "1,091.0 ms" }, { "Method": "xUnit3", "Version": "3.2.1", - "Mean": "1,204.2 ms", - "Error": "14.71 ms", - "StdDev": "13.76 ms", - "Median": "1,201.9 ms" + "Mean": "1,177.5 ms", + "Error": "11.46 ms", + "StdDev": "10.72 ms", + "Median": "1,175.1 ms" }, { "Method": "TUnit_AOT", @@ -264,34 +264,34 @@ { "Method": "Build_TUnit", "Version": "1.5.6", - "Mean": "2.067 s", - "Error": "0.0389 s", - "StdDev": "0.0363 s", - "Median": "2.075 s" + "Mean": "2.039 s", + "Error": "0.0194 s", + "StdDev": "0.0181 s", + "Median": "2.039 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.654 s", - "Error": "0.0167 s", - "StdDev": "0.0139 s", - "Median": "1.649 s" + "Mean": "1.630 s", + "Error": "0.0159 s", + "StdDev": "0.0141 s", + "Median": "1.630 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.679 s", - "Error": "0.0149 s", - "StdDev": "0.0132 s", - "Median": "1.678 s" + "Mean": "1.720 s", + "Error": "0.0115 s", + "StdDev": "0.0102 s", + "Median": "1.719 s" }, { "Method": "Build_xUnit3", "Version": "3.2.1", - "Mean": "1.611 s", - "Error": "0.0322 s", - "StdDev": "0.0301 s", - "Median": "1.616 s" + "Mean": "1.627 s", + "Error": "0.0210 s", + "StdDev": "0.0196 s", + "Median": "1.625 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-12-09T00:29:13.177Z" + "lastUpdated": "2025-12-10T00:29:52.679Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index 1e364879c4..a562352763 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-12-09", - "environment": "Ubuntu Latest • .NET SDK 10.0.100" + "timestamp": "2025-12-10", + "environment": "Ubuntu Latest • .NET SDK 10.0.101" } \ No newline at end of file From e4cc4a23dfd666d6635a0fc9d7146844ef86ab28 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:02:21 +0000 Subject: [PATCH 191/192] chore(deps): update dependency polyfill to 9.3.4 (#4035) Co-authored-by: Renovate Bot --- TUnit.Core/TUnit.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index 333e0ee910..fd6824ed49 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.3.2 + <_TUnitPolyfillVersion>9.3.4 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true From aa5f18d69761a367b27a61c00da3896fe0fc35c5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 10 Dec 2025 14:11:24 +0000 Subject: [PATCH 192/192] fix IAsyncInitializer order when using nested property injection (#4036) * fix IAsyncInitializer order when using nested property injection * fix: enhance direct property detection for injected properties in object graph discovery --- CLAUDE.md | 11 + TUnit.Core/Discovery/ObjectGraphDiscoverer.cs | 72 ++- .../Bugs/4032/NestedAsyncInitializerTests.cs | 417 ++++++++++++++++++ 3 files changed, 498 insertions(+), 2 deletions(-) create mode 100644 TUnit.TestProject/Bugs/4032/NestedAsyncInitializerTests.cs diff --git a/CLAUDE.md b/CLAUDE.md index 1ed9227dd1..925f3571f6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -147,6 +147,17 @@ dotnet test TUnit.Core.SourceGenerator.Tests **Rule**: Only run TUnit.TestProject with explicit `--treenode-filter` to target specific tests or classes. +**IMPORTANT: Run filters ONE AT A TIME!** Using OR patterns (`Pattern1|Pattern2`) can match thousands of unintended tests. Always run one specific filter per command: + +```bash +# āŒ WRONG - OR patterns can match too broadly +--treenode-filter "/*/*/ClassA/*|/*/*/ClassB/*" + +# āœ… CORRECT - Run separate commands for each class +dotnet run -- --treenode-filter "/*/*/ClassA/*" +dotnet run -- --treenode-filter "/*/*/ClassB/*" +``` + --- ### Most Common Commands diff --git a/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs b/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs index f2389fda28..a4591d65b4 100644 --- a/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs +++ b/TUnit.Core/Discovery/ObjectGraphDiscoverer.cs @@ -476,6 +476,12 @@ private static void TraverseInitializerProperties( /// Collects root-level objects (class args, method args, properties) from test details. /// Eliminates duplicate loops in DiscoverObjectGraph and DiscoverAndTrackObjects. /// + /// + /// For injected properties, only DIRECT test class properties (including inherited) are added at depth 0. + /// Nested properties (properties of injected objects) are discovered through normal + /// graph traversal at appropriate depths (1+), ensuring correct initialization order + /// for nested IAsyncInitializer dependencies. See GitHub issue #4032. + /// private static void CollectRootObjects( TestDetails testDetails, TryAddObjectFunc tryAdd, @@ -488,8 +494,70 @@ private static void CollectRootObjects( // Process method arguments ProcessRootCollection(testDetails.TestMethodArguments, tryAdd, onRootObjectAdded, cancellationToken); - // Process injected property values - ProcessRootCollection(testDetails.TestClassInjectedPropertyArguments.Values, tryAdd, onRootObjectAdded, cancellationToken); + // Build set of types in the test class hierarchy (for identifying direct properties) + var hierarchyTypes = GetTypeHierarchy(testDetails.ClassType); + + // Process ONLY direct test class injected properties at depth 0. + // Nested properties will be discovered through normal graph traversal at depth 1+. + // This ensures proper initialization order for nested IAsyncInitializer dependencies. + foreach (var kvp in testDetails.TestClassInjectedPropertyArguments) + { + cancellationToken.ThrowIfCancellationRequested(); + + if (kvp.Value == null) + { + continue; + } + + // Check if this property belongs to the test class hierarchy (not nested object properties) + // Cache key format: "{DeclaringType.FullName}.{PropertyName}" + if (IsDirectProperty(kvp.Key, hierarchyTypes)) + { + if (tryAdd(kvp.Value, 0)) + { + onRootObjectAdded(kvp.Value); + } + } + } + } + + ///

    + /// Gets all types in the inheritance hierarchy from the given type up to (but not including) object. + /// + private static HashSet GetTypeHierarchy(Type type) + { + var result = new HashSet(); + var currentType = type; + + while (currentType != null && currentType != typeof(object)) + { + if (currentType.FullName != null) + { + result.Add(currentType.FullName); + } + + currentType = currentType.BaseType; + } + + return result; + } + + /// + /// Determines if a cache key represents a direct property (belonging to test class hierarchy) + /// vs a nested property (belonging to an injected object). + /// Cache key format: "{DeclaringType.FullName}.{PropertyName}" + /// + private static bool IsDirectProperty(string cacheKey, HashSet hierarchyTypes) + { + // Find the last dot to separate type from property name + var lastDotIndex = cacheKey.LastIndexOf('.'); + if (lastDotIndex <= 0) + { + return true; // Malformed key, treat as direct + } + + var declaringTypeName = cacheKey.Substring(0, lastDotIndex); + return hierarchyTypes.Contains(declaringTypeName); } /// diff --git a/TUnit.TestProject/Bugs/4032/NestedAsyncInitializerTests.cs b/TUnit.TestProject/Bugs/4032/NestedAsyncInitializerTests.cs new file mode 100644 index 0000000000..f04d018ba2 --- /dev/null +++ b/TUnit.TestProject/Bugs/4032/NestedAsyncInitializerTests.cs @@ -0,0 +1,417 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._4032; + +/// +/// Regression tests for issue #4032: IAsyncInitializer lifecycle change broke complex test infrastructure orchestration. +/// The problem was that nested IAsyncInitializer dependencies weren't initialized before the parent's InitializeAsync was called. +/// This broke patterns like WebApplicationFactory + Testcontainers where the container must be initialized +/// before the WebApplicationFactory tries to access the container's connection string. +/// + +#region Mock Classes + +/// +/// Simulates a Testcontainers PostgreSQL container. +/// Must be initialized before any parent object tries to access GetConnectionString(). +/// +public class MockDatabaseContainer : IAsyncInitializer +{ + private static int _instanceCount; + private static int _initializeCount; + private static readonly List _initializationOrder = []; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + public static IReadOnlyList InitializationOrder => _initializationOrder; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public string? ConnectionString { get; private set; } + + public MockDatabaseContainer() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + IsInitialized = true; + ConnectionString = $"Host=localhost;Database=test_{InstanceId};User=test;Password=test"; + + lock (_initializationOrder) + { + _initializationOrder.Add(InstanceId); + } + + Console.WriteLine($"[MockDatabaseContainer #{InstanceId}] InitializeAsync called - ConnectionString: {ConnectionString}"); + return Task.CompletedTask; + } + + public string GetConnectionString() + { + if (!IsInitialized || ConnectionString == null) + { + throw new InvalidOperationException( + $"MockDatabaseContainer #{InstanceId} is not initialized! " + + "This indicates a bug in the IAsyncInitializer lifecycle ordering. " + + "Nested dependencies must be initialized before parent objects."); + } + + return ConnectionString; + } + + public static void Reset() + { + _instanceCount = 0; + _initializeCount = 0; + lock (_initializationOrder) + { + _initializationOrder.Clear(); + } + } +} + +/// +/// Simulates a WebApplicationFactory that depends on a database container. +/// The container MUST be initialized before this class's InitializeAsync is called, +/// because InitializeAsync accesses the container's connection string. +/// +public class MockWebApplicationFactory : IAsyncInitializer +{ + private static int _instanceCount; + private static int _initializeCount; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public string? ConfiguredConnectionString { get; private set; } + + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required MockDatabaseContainer Database { get; init; } + + public MockWebApplicationFactory() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + + // This is the critical part: we need to access the container's connection string + // during initialization. If the container isn't initialized yet, this will throw. + ConfiguredConnectionString = Database.GetConnectionString(); + IsInitialized = true; + + Console.WriteLine($"[MockWebApplicationFactory #{InstanceId}] InitializeAsync called - Using connection: {ConfiguredConnectionString}"); + return Task.CompletedTask; + } + + public static void Reset() + { + _instanceCount = 0; + _initializeCount = 0; + } +} + +#endregion + +#region Tests + +/// +/// Tests that nested IAsyncInitializer dependencies are initialized before the parent's InitializeAsync. +/// This is the exact pattern from issue #4032. +/// +[NotInParallel] +[EngineTest(ExpectedResult.Pass)] +public class NestedAsyncInitializerOrderTests +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required MockWebApplicationFactory Factory { get; init; } + + [Before(Class)] + public static void ResetCounters() + { + MockDatabaseContainer.Reset(); + MockWebApplicationFactory.Reset(); + } + + [Test] + public async Task Factory_ShouldBeInitialized() + { + // The factory should be initialized (which means the database must have been initialized first) + await Assert.That(Factory.IsInitialized).IsTrue() + .Because("the factory's InitializeAsync should have been called"); + } + + [Test] + public async Task Factory_ShouldHaveConfiguredConnectionString() + { + // The factory should have captured the connection string during initialization + await Assert.That(Factory.ConfiguredConnectionString).IsNotNull() + .Because("the factory should have accessed the database connection string during InitializeAsync"); + } + + [Test] + public async Task Database_ShouldBeInitializedBeforeFactory() + { + // The database should be initialized + await Assert.That(Factory.Database.IsInitialized).IsTrue() + .Because("the database container should be initialized before the factory accesses it"); + } + + [Test] + public async Task Database_InitializeCount_ShouldBeOne() + { + // The database should only be initialized once (shared per test session) + await Assert.That(MockDatabaseContainer.InitializeCount).IsEqualTo(1) + .Because("the database container is shared PerTestSession and should only be initialized once"); + } + + [Test] + public async Task Factory_InitializeCount_ShouldBeOne() + { + // The factory should only be initialized once (shared per test session) + await Assert.That(MockWebApplicationFactory.InitializeCount).IsEqualTo(1) + .Because("the factory is shared PerTestSession and should only be initialized once"); + } +} + +/// +/// Tests deep nesting (3 levels) of IAsyncInitializer dependencies. +/// Uses a shared static list to track initialization order reliably. +/// +public static class DeepNestingInitializationTracker +{ + private static readonly List _initializationOrder = []; + private static readonly object _lock = new(); + + public static void RecordInitialization(string name) + { + lock (_lock) + { + _initializationOrder.Add(name); + } + } + + public static IReadOnlyList GetOrder() + { + lock (_lock) + { + return _initializationOrder.ToList(); + } + } + + public static void Reset() + { + lock (_lock) + { + _initializationOrder.Clear(); + } + } +} + +public class DeepNestedDependency : IAsyncInitializer +{ + private static int _instanceCount; + private static int _initializeCount; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public string? Value { get; private set; } + + public DeepNestedDependency() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + IsInitialized = true; + Value = $"DeepValue_{InstanceId}"; + DeepNestingInitializationTracker.RecordInitialization("Deep"); + Console.WriteLine($"[DeepNestedDependency #{InstanceId}] InitializeAsync called"); + return Task.CompletedTask; + } + + public string GetValue() + { + if (!IsInitialized || Value == null) + { + throw new InvalidOperationException($"DeepNestedDependency #{InstanceId} is not initialized!"); + } + + return Value; + } + + public static void Reset() + { + _instanceCount = 0; + _initializeCount = 0; + } +} + +public class MiddleDependency : IAsyncInitializer +{ + private static int _instanceCount; + private static int _initializeCount; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public string? CombinedValue { get; private set; } + + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required DeepNestedDependency DeepDependency { get; init; } + + public MiddleDependency() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + + // Access the deep dependency - must be initialized first + CombinedValue = $"Middle_{InstanceId}_{DeepDependency.GetValue()}"; + IsInitialized = true; + DeepNestingInitializationTracker.RecordInitialization("Middle"); + Console.WriteLine($"[MiddleDependency #{InstanceId}] InitializeAsync called - CombinedValue: {CombinedValue}"); + return Task.CompletedTask; + } + + public string GetCombinedValue() + { + if (!IsInitialized || CombinedValue == null) + { + throw new InvalidOperationException($"MiddleDependency #{InstanceId} is not initialized!"); + } + + return CombinedValue; + } + + public static void Reset() + { + _instanceCount = 0; + _initializeCount = 0; + } +} + +public class TopLevelDependency : IAsyncInitializer +{ + private static int _instanceCount; + private static int _initializeCount; + + public static int InstanceCount => _instanceCount; + public static int InitializeCount => _initializeCount; + + public int InstanceId { get; } + public bool IsInitialized { get; private set; } + public string? FinalValue { get; private set; } + + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required MiddleDependency MiddleDependency { get; init; } + + public TopLevelDependency() + { + InstanceId = Interlocked.Increment(ref _instanceCount); + } + + public Task InitializeAsync() + { + Interlocked.Increment(ref _initializeCount); + + // Access the middle dependency - must be initialized first + FinalValue = $"Top_{InstanceId}_{MiddleDependency.GetCombinedValue()}"; + IsInitialized = true; + DeepNestingInitializationTracker.RecordInitialization("Top"); + Console.WriteLine($"[TopLevelDependency #{InstanceId}] InitializeAsync called - FinalValue: {FinalValue}"); + return Task.CompletedTask; + } + + public static void Reset() + { + _instanceCount = 0; + _initializeCount = 0; + } +} + +/// +/// Tests 3-level deep nesting of IAsyncInitializer dependencies. +/// Order must be: DeepNestedDependency -> MiddleDependency -> TopLevelDependency +/// +[NotInParallel] +[EngineTest(ExpectedResult.Pass)] +public class DeepNestedAsyncInitializerOrderTests +{ + [ClassDataSource(Shared = SharedType.PerTestSession)] + public required TopLevelDependency TopLevel { get; init; } + + [Before(Class)] + public static void ResetCounters() + { + DeepNestedDependency.Reset(); + MiddleDependency.Reset(); + TopLevelDependency.Reset(); + DeepNestingInitializationTracker.Reset(); + } + + [Test] + public async Task AllLevels_ShouldBeInitialized() + { + await Assert.That(TopLevel.IsInitialized).IsTrue(); + await Assert.That(TopLevel.MiddleDependency.IsInitialized).IsTrue(); + await Assert.That(TopLevel.MiddleDependency.DeepDependency.IsInitialized).IsTrue(); + } + + [Test] + public async Task InitializationOrder_ShouldBeDeepestFirst() + { + // Get the recorded initialization order + var order = DeepNestingInitializationTracker.GetOrder(); + + // Deep should be initialized first, then Middle, then Top + await Assert.That(order).HasCount().EqualTo(3) + .Because("there should be exactly 3 initializations"); + + await Assert.That(order[0]).IsEqualTo("Deep") + .Because("the deepest dependency should be initialized first"); + + await Assert.That(order[1]).IsEqualTo("Middle") + .Because("the middle dependency should be initialized second"); + + await Assert.That(order[2]).IsEqualTo("Top") + .Because("the top-level dependency should be initialized last"); + } + + [Test] + public async Task FinalValue_ShouldContainAllLevels() + { + // The final value should contain data from all three levels + await Assert.That(TopLevel.FinalValue).Contains("Top_"); + await Assert.That(TopLevel.FinalValue).Contains("Middle_"); + await Assert.That(TopLevel.FinalValue).Contains("DeepValue_"); + } + + [Test] + public async Task EachLevel_ShouldBeInitializedOnce() + { + await Assert.That(DeepNestedDependency.InitializeCount).IsEqualTo(1); + await Assert.That(MiddleDependency.InitializeCount).IsEqualTo(1); + await Assert.That(TopLevelDependency.InitializeCount).IsEqualTo(1); + } +} + +#endregion

    md+=UG{0Z)M*WUR$wi5q&w)isX$# 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�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 p!vTSRC`xYOQTts> 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�&IuSo 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µm431CGd~+>-s4^k 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

  2. x*W#bXEk~g4;WDC5$U8__}K~Kje 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ȵ&D_h4xLNBEKVVkUXR6&Iebm_B$ z=31J-cu&3sRqald7E}RBnSji)t|A#i%esoDy0TdRsTglj0iCk0qNyQ%h`6X9`={dm zlKy&Hr=aS36f2dXAumR{7$uebQJ4o~B(6z{DmkGUroZ{e_(hG%nod)%=@bJub5d=p zn%OQ$08mBl^8l|bI^rWTq%yQjrRYfP7$Ljma&kp8s6?<@V}_51XNRE*sf0LAY`##C zOobo-O8wAr0Hbn-JWK1y#3k);Wj`F}kQIdq<<2exvFtqdw91eXWUgg=U8CkycA}9} zLY{ZRGgL-YK?p|fq%oV$$jS8?yN<0)PS*GzF2h|gR}_z2fOc89nyHhQ27$H6sgk=J zdR)gkJ~}~7?}n=-uh)8{C{fOnv#JRp-&un}g3*i7;=QA%XHF(+*vQ=zJ)$)}Y;JRr z-0yyK-@aju|NXmPr+=eP={LT*Z{OC(E)IHK^8RdqTr^&$I#E=M@Jy4E(nwEDd)uvV z(p#%vX{GcFoxUZ%zfHf-?rVKV{TjBu>olKx;uda4@uOS5Ms;tAuhv;f)msPpgIaIE9oo%K zx_$P0w(h8}60Ft5B1Au zzlYyFMD>0n&5zR%2kWcNcB7Yewl8g~0#tX=i=%<%9xUNN>s}evoAe-0N|my_N&nQW zyY-=hZg&UWWVB}p#6CjZ+*RK3b}wCNk{YwI-BJrW7+=sKo|$gs@fIY_&(p}!1&!{; z3u0`0oEGQjt4FL~UbewGRO~C+z6eBK@WxCd>Q;}?iskgw}N^eHbReDZRweg%~?ucfss6e&4?=%l~Myqv#`&#P{(z@z@sQ%Pz zUM2BBqtBQJQiO^(fO+6}%2;%&x6;orJ!Ju+ClWt@@}zf9r6wD2rGO>k$NWRsB5@JA zk5pYiKsQlQRyO!B`R?M}@^YzI8qtB|kS3<~~fR$F}~?W_z|lNVo1j`0p) z0Y0y!RTz^+JEe=&9Mgyy72U88nrFY5SRPIOW{<0?9T79a@t234x)9G3Cp6o(dx3GW zVm_3)@R=~(-7{s&;=y^&;d zX{a$z;S5FVt`Jb2sCeV>iX70y-r_jCxAbh2olR_r;GoR6k8@&XZwITr?zN}E0Z_>nmCxH^J)NVkxANb_g+ka@Ib#5_KR%OXcIkL+>0*I38I zRK9?CyYzZW6xwBfKuJr8?Y|00^0)->yf);6+>ZBIF*23hIHj{JIH0cfd+omrwb~hJ z8;h3dz(0>tF~b}o%okIt>v2l;DGjsJOLPoc!?%x5^?DRfcDlR1AsONrX(2hb zpr>0%o?CE$N+xm6#jKIOlaDbUO3b_Xo}P+^RI5^;6NsI%@SK@`kjhz7Fg2qjk7R3q z0aRpk$^(UAC>hXyth(ZZ3tK1fhTRvOrCBZhps#!BodLXhdg05x?iyR2mQFw%U#BT4 zIos=n@5I0`A<~!PpEmHey10gg;3r%RodfyC^A0md>6Km-P#QauM|5i>Yx83ss}6x?+_4oj6MV z{s@$mZubSMh%`U7hbZ~8GeXIly-FB_m9o|&dw)Ynr$i89o^NO$b5*k{#iq!r&XAnE z`)=S<_TM9Ul5E|D=4^&K%ZDP&0m#Q%0AvDhSxfYn>%zvX>mn)8wx}4v!0M`3D37xk zYnYN(0imLYMas{DnMCc!Jkf?=VR{zcFU$LUu8e)w#@010VLj2v)*d2R;|38Fi+#lz8e zt$hl<-1t(#;N+Nv7rb-L21G>Oh@+6;FyV?_ToGp2RgWE30#LU5fWPpg4HeKO8fv-E zJYzoxZ&>ihU!G|b4cQ^X@6R954sCWt3(2It$4}Y3=})}W9n{pR;!N!xGL_}HZmbqR zo`(;BfG*j6@H;u8o9+^Rr{BS$3K!tgi7YEQksM1-CY45)z&f4JE+ILZ`IO}O9PF3|+0 zEunhkn;z7f%2J{w>!gm*N?i4fyz}En)qs4dh?;rJ(dhx z`8eSsokju&-$LxjLn)Xh$r>j1T1{Qp%8^-09Le%cBEYzF$_G<~Z@cOBF$@z{*KGW* zoO2m+m}5XxnxG-ynJ7ppyrO7wf4H_*>up#nZ8%paI$OMLgqbZ_p*@U@u$s%vS zdo<(sh`c87>H}l)LlGq20OhBJml1a)5MUof6bY3s?=(*1Hgpl`%7{D8jd zC}oYJ(04GKCT~$ksc)@77qN6mFW1n7r`9xL|K-_U`~k6eCCVZ98}vd>Eu^*Q%doOh z5h{hkjMX$eB_ohzjM}g}f=s?3%|dimrr~Awig0!}rE5SR?}r56KxTVGYxY%MB|X|% zVgZ?T^P^?7>(L1KSc?|t1M99QXz-$Bqso{n)atXLSKe+CH<4p4W2%xerm7BCK^ap; zJi3gjf}|opzC5B^@msreZt|F_A}O5N1PqMK=EUIciQvL?=%ooH@Ud9CBa92bdLJX_(p06;hXh?lEakzF8x8XP9**^0*TYL{mWf9`}zUs^>>7cRcz&YQ@TaQA<{bl$rD_g5Z@&u#xuby{0NH1t>#+9pSx>^-fGt zZZ>p`S}AQtN#;OqH=&xQvr4?UZ${+pjU)T^A$*_e=hxH3R*SFda_^Ka;Rk);6emrB+t8mM8yvIxk4GLUS^tR81#}>Ckqhqz;*Awo z07Z%ix-*V#Ofk@%0~YmHW;lDjYgj`%R<#fP6776!V#>>#p2dQ$eAB29Y_LJ(%78< zO^?WrCVgN7COT3P67$y$P=44AOu#dl4M3pGxK$OxyyFl|q)e5yoo_J2J4j#{CvTx3 z;+vSF7tCGOc9uIhCJVoh1KQk>OcdvqPaz$w zWAw4iG(mb+nQ4OB>})kKT2{OmySCMrnI=$F+2a9eWsE`!5OP@QDl<(cx;X&*9OE#% z66Xq8q^#bn3K|&x4@l)wrbHRF6~MpULlSEo=@J6dL%l$j>LTKtrmCcF>ozrNMO zd7z!%H+%KoA}O3LGcYiEwna|_7ivN;m6;|lt*s9>%$0U-7PXv9mggVxobwIQUi{BbKH3;#9G#j{eaYrEu#5lrpbmaKT0IJtf%S< zHJN&{Wj)pD*Hb-2wwY{XixY_HWN)c(6*zyj*@rIrSjXKHX)iChqzo2J5+`o)qFYrN z*57^^EGQMl%V0s!LWuA-JegR;dpjnYf(1Df>lO;+8`k*Wzx#FiH0KFg6+=C1LlDPV$*^@BeeR`g+NZ7kh-2K|I;cNjdu#s{y7zYb?5$e|dbQ3Gs+ETX&e4*zL3XhFiC$)C)U*Kkee#h1LW3MO(XdPoHk4ts}Paf*!AR zFFiEx?&o(84OmXgh+ivvI&bC@~>kz${4+(c+<^!#}WiW59Lp&FyH+pl~ z<+dJNY(ms7-F=M6d5RkDkS%Xn(8=_+F7;QtgNwuU z^=@yFHgc{?o;&s05(nuurM9=NCN2vd_UUSJ^+B=KRFk>n88bJy(A?501@((vPR2ki zF+P}V`SdAte*>oNQ}PZ~KkN3Z#?{BErwV26XL}Rdp2k3!$KnX{G- z0cM<|5l$+$y?p+{3yiI6_D1B~FZFH=B> zyv0TFK~}Nb=pYG`cK|57t6X+phIxF-fOq7!ef!>ey+e0{G|^zL+35XeX}G(0x0L z5k1UJleiR7l6OB8cV@#7p_DL=eZPgTNb#g~S0syBoD zFz$JlTrc++_nzw^f3`MlZg2t6P#LmF&n63? zNifv@1$HVZT{P%XL#0F#ij3+^ca%4hYu(-z%7|?aRk7L`+`tdvRXq^f?T5n`j<&$H3v?6P=ZY(vhvhja*v>PjLB;~uBbA4AiZ$=ze z`{8yQ*I9LIuCr>HHt6j4w^r~g&so)=hj3P@cW>o)$yv1;X?`f;ta_W?+sZlO8s6krCIM$u73lD(FUqIK6H%8fs;BsGGQ|)Y@)SdVFKMrB-u$d^LCRYREg~ z4J*wk@)%u>JpV|%+mmKBY;0ermHD#nE`jTH3_L?{h1q>e7kBKXUm7-1uZps*Vb@dDAN4&tPbTTck57Ee}P6~U&q#S zVq*$7-PzOpoxcl5^D?>o&y&NgcKd_6o%oaLu*i-M=@!`_h~X`0|{5_QkDK z!~^b&@47S}&4YP)P7YUZ*QFV5CFV#|<^jJtja`2xg!#+eZab0P%-`=j7W)^kG|AC9 zg6rNN-*IV1QP?Pfm*?S*OEXHs&Sb}ba~eCYi@h2GFFP*#nZM_U@WzF-*6((TiOU1= zO_%0{yiJ$q4+dZ^&8YJ_lTH6Gr?Kf30dtmMP9}CM^Y{DqrRG{nCGLth`@#5TOEbck zq7W|69}YHKnm;$T3wM0PTNukXB&uBWxZY09e~vEL8H_gk7j znYZ8aJmj3xi~zWq0Qa9vW525*4F~6RHZ*_R?}p5xDhMHXtQgQAjc@!D+?*@2$n%ht zOY_V`mj7c48~^4z6n*iQq<&MJ*v6@Pot)ok<6MejzkTag%Y6si-mjilm4;7uDW0u2 ztW(jAe)6ty$&KjyYPWME-MQ~MmEyjWStstv6Q1Y56N(KaZ#`Ve>s)NvFhv#2=s{;b z6hDCXcp>y(<@P8B<->7MmgX~gG(?_%JfPXq3=EhF4f)O#KzZx?!vpa5^Z#e>O~5QW zt}?-LsVYmVlvLVx$ycc@OUlZUEU%@klv1@wsVu3=RVk^w$mr$Eo0;$G<$LM3R8>k8 zW{2^l8yd=h8yIjyo3$G=&~Cupi;8*yLU z`<8t7WeLCfY-MKL8xiNmIdS5g6K7$aKhfkX!NL0f<;+oxV|$iFe!m|R()>gkCgk}< z0u$2w=0Ra%^viv+%Gd^gLrF{=ZB~l<_TwEdXjd)x0GA8(x~y{g=D0#(O}VDlviHS< zer!l{Aq^Yy{73>D(tL7I*tjVVY`lBwdrb?mV2|T1D?rPqLhjG{58O{#)aVE`=r{PSV zk0o#>%?}R>XRpfxXVXcX&DzVU7@gCSdh}eQxSjoSHp_d|j}2))l!gs?p2UVUzkX2I zcr*`eJerM-))j8q8*)kbE)rB6Ki59phSYM9fKE?d<}dl-yW7;xqq+=CwPyTAl~-x} zAmRMu6?U`kRkAvy-w9;(B57IQ5hPIO?bg-~>+O|cN6dQPZw0e^v^C+_FSj#6*zX$M zBU^puF8m)ij-0d@YMDpCINYL($l8o>EUdNU4s1Zxn+#^kXAA4~;H66SEXw@iS#@;{ z_ccKSwi1pv=VGKq?wDTwWT*c5$N^BO)e7tE!YH}oIc$-l>_GhxqvKJg+;Y~*@9#l1YPSTUD4E<37CO85ZtkT& zXF_{ZCstsBm!N1V4#>sLnuA^z(jaWp-hTbse~{T2fV&- zF_9QDK}JFEfFIF%3fOc^voA=)KG-qlvwP{0ge z5$Oe%!E1>xhLl>gT0YatS%U>+>W66I25MJ3%S1DjVR0ie4_Pes&qz`;?cwC{GL&J5 zGHmO;j(umNxMUZSsJX7`y5~@at&|#%pdcUZRQ``&{~F4$5+P9=%COm#GL&IiP5H`} zVU^R~JVZ{Nugi^X*gac;4zq+hnaF^}Il4aK+B9F+X+VNKP&Zk=O!BX$@&JFJZNP#( z6UQiAZ^bBB4|P}qXMN)AWOvRUE!FChplk-d466&}^&@8>37-s$Vd)HANcE7Y?7l=; z$GgaG?O2AN?|v2cw}mwh_uvWHfBr-ltJmQSyu=5*OWfHA8V?B4(D}@4vgr8u-nij6` z&a^S)Q7xm})roF08o7j>K{u6ojp4lhc*R5J7b1pj#1Gp&3O2-#IIu}G-I;n}ljm3Z zyOH0Sf=#iZbAWT8`{EmD!i#uca2(2Wd?ik{u)vGBam}cntX5xw7gZxXM}~F&iCcK6 zeY%m(JNbR@BNUhZBH~=4r9rRy%XzPQ^ghg>0!mJwzr@^YmGn^-v}K)i!{zXObHTMg zm})6Ae+XI0BtscL?brhGB>u}7@%Nv zuE8vAYFNk6%z}^rJ|IP&AQ*R$GD#IxH#3O24Z)zzwV(kSMY_Bu%%3RXP=dlzDwInv zQ_vLIbtuIiz$Lqpq()i@jV5CXSF_lT1!aI~6t??lU}M;*E^%UArnu@In^q5w$qpEs zrW+~UJy^jW(VK&R762yTbF5MdLv}YZZI!S_yohWDh2P@Tex5JJi!;Bq*%S-{kSO3OFf4JffvE> zjH|q2ty%{<(m4+=6YqJoPQ2aKuf$`jH8`x%?lz26u`=QP!YP?;Kd%W$LMSFiAc(udvTUWQ%tW53a!2<;W|2~h?K_3AsCu)N6 zdivPF9V=w2O$xTc5(qneg@cvC8FC&V@N&qk6)&jPQq&Dtm3C{swz47ABWgS~$Z;$s^TNDq) z6813}iY3Z2!S`oFv4pKO-6=mN!^b;GQxHYyB>hfC0Ja5PJ9`2rA_V*LA@<^cporM4 z9;`pND(lZZPV!mGx$+{}DVSbn?5~)Vr|h{Di03XVdxTcyGf`1wTyFjz<4NMsg++prC&` z6UDGb|1zT+tT?`IcY}C-8r@!y0t+9+?>W=Zzosd+n1X1obO}Jd?W#yBx5JC(qc|0pJ zbq1Ew<7w+*?F{KQ_+PM4Kt6hbL%D^<0JX?bESoPv{Hq~%ZU}Y#tk?m_Iiy-!E>ub{ zhl?zbkxs7F1bngi5WI#I%O~qvFwGlblpZM)pW_w1P$rAZrW$-#AO@rAxpE+`hCv#S83_6Oi8GekdI4$%%vM@A1Vr5fRK1w2M9OXfSDjjQHGupt77w#x6F~^O5a?#PTwS0g zqa_qmQGG2emX=CTkSwgd6t0u`!+}WY6qZUc<tr@%La}g**3cXWF)JJ7e2GwjJ7exif~Ztk>U79MmhoUFlkIdy?I5OWfRj zoX!B}m^s{w?B=SbrnnG~&PVRSuEe(1;aFn3FGXT&c|C7o?YFUNbGJsHr5|Y*aG$|L z64v(b->&y{@8U1cXH^^yDHyI6} zMZb@3>b8x6+R2uO3lYPz%MZ)V3Krb1IfF_w38!w==G?q+)3NGV9Mos1dh%JUyi?1&QB0k9SZ%V##wy($7=nH*=%RRoty^=IVn8lC^`Fu1QY-EwrFo z$cRrg7O;qhmTCy1pfuoG1~NCZt-1;ydWOK2^hT!UYDEdibSHpIO8m_-94a%G=(>z# zIY@3xVR5|(6@a&i=m11Q3LXQ8(kI-#gfXhI3J@$IuBeHLlsL%4*C~}4zGs4^ByK9o zr3GsY5-8KGHz22UDMyf<@E z7l|TelHZi$+DJnD-Tn_r5#o3+;_o~*l@G?)fXNfFH1T9tl5pn8EEK;kMJUednYVm= z4VD#Ygs-I^Y4Y(^cu4Xwzq?Jn3;FmuPqR-x9>sebS=4a_O+Ff3DdRcQZCBGlAaSOP zA&zdy=mt^Q=_aF5rM_FxO^M13-xbFz78))@4AY1orX30EK~1$j>I`}JhKopPQSwzU^|*w{$#rcwP<(bwP?{p z7+Fc*8}DvCQmv(MSZvzuY*)+Z5e9RjxjlnezVGVDJ7(}}toHXd!n5}vy@3zX=O6{L z2zKOLSZpFQT~9`&r2F?lT6o8Zbgb7?v<1NU2<2Irr5x${2=x!k=cipYdsaIt)%W|C zi=gSx;kiB4yZdRZCcL|!p&x07=Nul=;mPlASMTERJnm`s9iB(=-bN}#JV`T;Mzb=Q zGuNeRE-({kt{B|ttr^{Lays2)G)go6EV{j*>QyszHy+}I1;mLyy3zsO?(pMHnvbU8O`cztz?(FaP&@ej zcs_T$Jk{{dtE;8(dfn{D3sDy9yvL6!X{Hot-Yq82lch`g1#cVJO69483U?Gdt9Tk9l&dXrQm;*3!&}y)4M6 zYEBY6T*4SfjR9;8jti?2E@8T;U__Z=NU3tBT4XIGeNFpt zZe^`8n5>n$h;5{}eNi_%4%Ty{w_etG^XEg>n(&nxoWen4L}(PGAW9-4pw`x^6jDX> zw~VmiO1vZQ)9;~bc(7VsOiu#EcNq3}o9$>3mubtOu38iR>Ps4`aB%_^S8+F`ZqCk@ z>S2Pex@FcLlSLj1?Nhlk>7RlNUN84qigV*m$K{$Fdr@E{?-MtwB0Tge72GiLRgVd@ z5y!94)fbrp40lq@Z_1d58`;U z?nUI5IW31LPpu+BsMcvdJb9Gj=kVX*$V4+DGQk>|Mi^mV(@z@s+Q z&jU7B@6Lg?e~Bi!2xyxvwtJJ;bU*|fDAI2_e`FAg^wB&PDf%^xD)!HR<(CeVY#{A+ zQ@NNoS1HsXPK98n#1LCWSXr#c(v+LoxZ}0==o&c?=1=Cl=BMw1PiHTh#wm&=QQ;V_ z&m3zWSmC7OoN~O67yDI)YsHMdpNQ3aO*=aKWTAenO8HN8ezKp7y2&nfW8zHz9AVzE zH_r5OrpHjlCpizz-0nbECwXElKELlyIltX^^FFoz42v~)L-b$iN7||VCwNGwHov=F zy^B-(&ppk)Q~M9`-iC|iKceYIqyHi!I1}tr6M(fj6T~n^f05A*XSLH!Mx%0+e~E7D ztY(OI8Jc5gcKM;XUO|JC+8I`w>7@2TBhPR5ccV~H1&!Jqe+|fTqS$|+p$AN{>MRyE zbqpyKrkK>#dQS(k?ycVa|95`N@P+;@Lv-1;*T}hhdUd<+N+90BnfCz3p}$x~q#ze` zBHM9UvBJR3rbMmeFCFJ+$+puPcVcb(m?tZLJQ2K;$sfONN3&U2q7XK1^d=i96-kJ* zNEs0TZqZ2Sf&?3=4^XccmSI1`n`F==$7{eGaHe@00g-~sE1Whq z?}Ry1zTJ#3sq2FULC8z5`?j(3Vja_ZaB_Q(0`kiWqW=|xI1 zsg)>Z6_L-yhQuGc?*6M35>0U>1)I3zUDSaYb+}uHyOokh<*{4U@%~wCEx+u0D_gcu z1gl7KP<=>Ko3w9TkF&~^EZ*9SEKIg_Ka{a-%u}(X@l;o`ahtJOR(^eoteo99Z`t`C zEG{fw_tK9v+4(L!B-xqY-LBq+?0lc6*(W>Sf%i7DsU)E3N25DsL}$WXYC?!B&V(_{ z(cX-1kfoh>H>B*L~=wWNC)*DrNW5Boe~>#bAy2!Ma?51)ez85Tc4)d3< z+Z_fhwd?i+!~v210h;O}BYhUa4W6u-=<}?Nv)1iW^=_ z7sn9yR4>AZUBOGhi=_^pgIVvPuB48%L0R0` zmm+SYbn1_sk)HhiMXcl8ZBc=Kq{$iY!b6fX_+6|zy$d;G!PD%MGv0>xHc}|z9W>Tx z^iCPdnQ5n*37plLDF!xL%;*LI!|5iYQJTFKbbCPsM=)$x!CJ!79?I2;7dFE+;)m-B z1s5a?XM#Pd`AwL>3zu{Y65XWvK?9fCQxRayo4%Vg$ClGK3lkrh<%PHEkXIKX*sV}J zej4>OUG$9eNk^xhTk{a;JH=VVrF2b=v$=A8!uo{ibI7VF$))JY`s5a;4-N*XWk(qv zw7)*n$!!)OhpMX!rHXRQ>VRf$^3%+%ZD>ZiJ)WQ$X@1uh(9AdFKr_*MFsPEBPG5=h zxrG+S4KXN>=9$`ZU58eHLZpBwweEGOr3Fb{P!4Btx0$j`bX+KcRwsi>YIX^>XA&{6q2$A<2Ir&j3lfA#qS96)*dcrriW$T!o z<7^D(SY2!evl>0K(JV(vzO10EE)DZ>Fl!t3s_@JEkrOV813#n00A`!NvoYJcv4I$? za;-aVD}rp7YtKF(n|_)D3?!d>H=}KqVz7eFy1`WKUA1;J^A*i*JvwjyHH#N=X0!Wx z^i&t-E18b!RGyb@*TRDubgvd~Qs%o}&e*}#$YF5q6H+~T$n%l&2@bJCp07pfAMJxf`7PLCh@xb$y*8L1AB3?_@6|+wx80#=HPZxX5^KnPQg!Mfw^8BG* zOjtHtvF(ZnXWf3PE8A7eXl%5)H^pd`e7ir^s`O+YKZ+%ryFL0b`jKX>`VbzHwTj=} zuHJ>U>c>6JK5Nwn@!m!f+do7Tjz&K$V>nanQd2;Ib*6}+jD9ks8_ZNrHyMpCoIZ?h zVy0rCb}Qr= z@H(7J? zTR#~tiK`)Pl#^6qp^iFT*(kWpj{<3aAPoibJc$Bn9vdVI{wOaL+$ShVSyu}SVj%oM zg2cHK>my74*_=M}^yj>Ou0%pw+RC&A(o0+nM1|9{cB&%nbp$=<5T@#|7l*<# zeuA?oJQJQnq)f5YKsA$^W>vwN5}A<^s{|Kd_8pG#6358U#Z!k{lZ{F5e;iwf{^hne z|3zMV^W~m1c$2)Ob|fmF)T&6_&ZRZUz`NPq$(HsQ9jy*GL*79oO3O6l9hNL;4$M~# z?@&_wcVTz?jS^Ry8idD6tEJw`4^Ahn5`Rm)#1SHTDmHLJ%7!suu~~vgXT`3&5;m>F zv0WmqgiXuqc^f8nzXk?^gV8AcNHa`aiif1H@Vnd9yD&^#?rHWJCN9ByC}HD#+J$H* z%{Us3$RN%fx2rjzS2=UUU`AJFbc1EW=_aF*dUFlBDGyx+YNt>i!?Mc{%anozHVJ1? zX}$r2dSQ|0m-@S1VPH`^bOR>z9@I2%aq&!F%%&^Yr>vVWl(<@ z*IKoX=r2^Ers!$}6+?7fLuNKAB}g}8od80`Z=i0Vj(weVEAv`T?w97KoTQS8?YN6;*W%e9dG2J{D)>Z|nqu9_6X zFtwinh(p(=T7vzgta*Tcv`F)qhG(X)q6*n{uF41z8p1xry*jil*1Uo`FjQ_7Dk0+c zAazRtK?0MZ!NPFnD?RW`uu@v4xtk)6`irMZT+`jDi&&hNT0s-ft01gN+^teA zrE2X^6QR8 zdO_#~?goHyLHB>W0;p3Pt5ip>qALCr=DNuU>4{_(ex?ZgH>R)5>sa{!8r) z&7mzO;YyGy7#kab!6Rc5I3idqtRSlP6`iGg`-jYwG$vI%Pw>-#$_L{-#92o3&7x?q za_pedR>LB87#%wl1Sw|(Y%9yYV?y(D`+(F3g`|lA%d5k(H^Ec!p+IBN*h>iZ-nUGJ zjKPg$B2@#fz79h)O4}OV-ar($s%Na1GF~n@-}p<~Rpw0;dF3-3+yIkD&5DY;SH)(* zcU7vD);hPx=-3Wxro!nf^CxUp&w=9Da8y8c-C%&$6SJ7Q&4`RgrMRV#WD1Fk@4jmA zOuZhiE?^c8tjGDnES;8DBc7%$6l+y*1nsYFdfr`Ll!R{gI_*7w3_^bFP zN%6&pz#a_UT1A3g;liQUlpcob95Pf(Zw`fjoYsVqq3}Nx{=?O2wzJas@$Ef{uFRpg;kO5jDjIG-| z4O_zX)Y2fXUq5l&m{{{5<=P} zXFWKW#d>Q#ixn+mT=AFt*;XOi&lonHZUU*yQMSSunA+r-U{2}Bg2xz?3qyW9_tiiB zKrRU-c%^$wCeeC8T~v5itm{a{gDyUQ%ig;RvDEyzm9&S$p~MAha@BLyW7;e zkP*J#)9jNG*74p(TZ(ywAQ+9lS_XCIyh+UoUh2#lgB^WiMmLBGPB$5i&hu|YHzg`C zkk=fqBoT5UV!%fHfZd}2gT&y>AkFib!3&r?hs5CPMo#<+FtrWe3m^x#5#CR;U6dPv z#fTHO7?DKQIJ2TBtJRlaz_Ke_PXu(>>c&R=I|T{|hdVdWW!}hjnWG=T@N#|su1kE^ z_sOMm_;>GT5#6CJ(b1r6zI5rP>)XK^y};>Tt7Jme_x$$tREt+_>%BJH4?+~)=!jxKFK6 z?qQQB8Ds0Qc#f(A%Et?~ zP99lZD#q8U+3Evr?tNgDm@ekwe1&PCr|^U+b)_eFwmb!$@|vlKG1nJvDjiZlI#x(m zXcR<+CGth_bLwEF0QVERkS`8%Hj@BxPGJzA4vok`~*oDj^U+evtKKOvBia_>Cr-+GH%;@7=ORKZ7d(f zg3j%X{w@7Tv$6a<9+HiP-`%F(g^lIkd76DTmY>CYau3t`jTfSi(A1;Rzmd_L$+oM> zpe{O-#qdTS%jgEZeLSD#i#~^OquLpqE3-EHb!oW)=AH2cot&*Qy~4k_us5gen@U&_$V z%r~i-!Ka*=W8kB|&FF@M+36;uy#dGIm(fif%na&HjvdTG&V`7<8}Wm8j{*;;v@?%1 zzZ3I#!IS4WrG4F~q^<%_ZPjht2fs~5Y0is&oA6n`D50)MA&@B|}!y%Gtnq6G-F) z-EIuxy2P0?VR4J?XJlMd2Vqb5CiWzfaX0tt6M?sj3ltUWDOVWk4|NTqKV7a^+FzyU z4wRroU#8SOR~+{J4Xu%E&sXy;%6u#{^~QKS@^Jow(O(gh%bDZb4Cm9hS!pjUyIh3+ z>hraVy)PYxliTfzJ)^@3Hh0NlHrz#Z&0>G7$C%#HZHqmIELcc)1Dm~cnUD9WbE0Km zz36q0FJG*?6dKZd_hNs8b1%YIHukkgd1tK^V^;eKg|)uelJ0C# zlAq|smc;c&EZAbh5l_JK(PLd1j=UqXmFWHyE0M29-X@`kuzWBHy^emQnS}P^A(@2u z-EHb!n1mkoH2X|K_v5_{AND6`($Q$2jN?qRTTKHk)tM%SG zDf?*4Gj$ZdEFOJGc~CNp zlYFr#!4uq{;Q48vl`Uo$IFYKt9mez0aVaDmkkp&)O=xCTZj(k`v1e|Xr`3Hmk(Nm; zLX!N2St4p`6jsBt)!Ivxz{N~UE?)8XYTu|5d%=>Ms`)l@JA)t|J8eyJ@~3#z~zM9LkLT;Y_bCk#HwmqYmt;Nt}UvG81>NU2xJxzMs} z66F4L78&rJ07WAK1${e6N0k^udKmV4)+@&o z*SO#EK-eYZAMW@a!fQ1sG#gcNPA48@b9|GSI>{!Q= z_4n{JjB`T_PeVGThNqz?!{YEX%=zke#-!{%tBm!X zdoEg~A87`T2oK4?!S8NY@4~=Q@ihAk93kG@XhSK>H2-L{B11YeUaDq<>gdcE10Ahp zbc3zK=_aF5fu;t!y`aj-GmO_M$_;CWD46dkgdhm+7b1pj#1GpZ1sg0L&Lq-&2$OhW zljpE__`2P0U{m|=4B#Bp9{4(%>!RBOY!Z3&OtrL#6tBcxTpW#q-Drhqc5xy&irkG; zN~@U;kQbBisLOu!is>8tn3m>e(l9O0lbDv~t;F=V<%sF%f5hP8L;F-OXhTtWT_4_$ z!Rs|0Jk7Bm z;q=D_gwq!toVrV%M5?e?9b)(ltdJAI45!BxoEltD!_Y-ob1-WT)|1F}T0Rpl9)^CM zy;mpvc$MZ;X?T_ANxVw)RxsbVLt|?`Jprn%JXXyqLDP;xrICP7YBsFeYW`WD3yS+7v068gP+^*>IusGKo#{$ zFNceEzwGUHz>h3xo=roRJik4GENOnr79#7D147mj3t6_%!gxzXMg|hE0ur4QHXCs> ze#A-hu{6ZV^N9rFq_tqQl~4aFdiLzWZ>=^+JKJmQqRWTlYZ<; zbLuH4&mT%)Pnt>V+$xFm&jy6Or+ZRNtH;ZiG?Q6l7U1z!T$ZE8*-{BN?Ubp9uKnqa?DSn?Ivbl7TPVtrm8qJNDucs?&9vFg zKniyT21DK5Im(DFj=H-#&1ARRxRy+{e677=JfoI+U*+q^p;f3$qbfvgemQNaRFl!( zM><_urbQ?eD^v<=1fG3|o$~o!N22<}%9IGd8VE zbuMm*$LPVFQ5>dl!jYGgY@sL1Q)je|x{v#6VvkY|AH*0H_Z=)QG!$eNQvrSsY`g`P zn^ziVO_!G@f)qI`VdlwNGe}uu2Ub0x@rlTSWQewyTSwC;PSPsWz_q{=K zbG<}FRjrV8$fQyjbz6nF?b=XQN{g8IJefUQ&t^~hlVWX;u%0qh68YV$iXPY7{2YBs z15y$1y0W)eZl&75X`E=d&K_3#mP7c8L-j&UX>$8kXKx8^tDH$dN#;N)Noey4&)IUh zdR7HRsIdYWi}b*%p^RYW`24WnXu%U*h1X;a z%%L?8rG(aGbj&-fW-r!s?r3yB{YVR|xepI1tcKs+uHHph%>$n1WLV8O^&7*B8yTc= zH%&eo-6P{U(_N~jgO9#5-8}~4XkSJ*#MC(5WVF3-gLnwtB&LSpgP%UT{IUj2q{~sQ z7a|63#1Gsa1qFg?oLQv#In3e(PM+W8@AhT`oZ4*<1JFTG{WQ&U(NH}H(wt-$H{;K7 z4DmGDHUAwiz&YQGGF7btH>d@+uJT2P{!4qIGREP?<x;TpD+X@*Dgpm*%&np9fXKHgM8=mZ#+^|Guu-&38Y(*8lQ$kJRAi7Dq>?p$|Ji)_ zZa*%inULb;!}1(47!LcEW~yMi6`OKt0JwZ)p^8ddDQi7G%Uh^{P{oBNT&ReRqIQP* zi?*Kl%H2tT4nQ1xL;eeLy1CQmBWDpHEr}3jt&M*iA1ZaH#vCo7PSX(}5p_{f_Pz!} zS~@pDI7gWzSZ4o*Rdd*>Ts`Dy#8VbD+FV~FNo%4qO3m=4n+kVQy#U=psUitZv=bgr zp3opWW9_a)mCXvWY+SPZI?)G<4*4aAhs#p_Q*Yucx)XNEwuZ#c6eT6f#iwP}$6ac=ya?LS{5r`sjiONj+g;;JNrn!p`y85z&g ztZkb(OXxD)Xoxpj>{es;FuqXE{+)gu>;ZN5Cl$n4rS+fv((Ss$*)Poxn6p1tU@tR# zOaR*D2k1e+Fe1&T(}WRues=;OX{Ia?wlLBh(AoR7`JcTT^KwO>rsoA_;e%J;5zu%9 zY^j9*o(~QNGqqY_eewv(daYZUA$#;2y4oGH$ZX8L!H+pMpmHx@_bf@FP!}SJJkfJReVNJ87nPnXTA%|7-xrThz$Q(C7kt{aaC3 z3C{)@z1?ki-Ln;a;+ZoGF;Hw@OJSvt`Ee@Et7$lu=X(=4mF9z6gwr1x08UF9r`oTL zO=hk>Hy!v8(TZG~wI)Vz5xZx;+9;HtLz+&dGGycQh##lY{8ecP*sDL`qbI+I@UjALrkhg=p0Xg2~_QT-%cb+OtkF9wxr zgYs0jCnC6xK>gyp)|C+74y6wLR^U%d#Eq3eDI2mRK`zE5&n9U3YCfzR1h`z;I=03^%F%~JG_ zMgdU1SvNvJ_dCDdFgp+Z#n{1)oLhs2)?;-i6ca?|Pb(POsGM zQ+RJ9l_GwVW*&_`BZE0}U8?57g{CuC3~uy$8QtLV>U5LQ?t_8!576xel|`PRyIE1F zgN3?yy)u9!egLmh0K)6lndutUOqt2N07^GplR4d_nXK{(K()>O5Wwb7@P9$GToeS) z{;uDvN^2g0MFb(#(2A!V-JuaDWZaq?mxd~di;dN|o?tpY|@so};Kb1y0^8CsK z=}0qqa}S<${yrDdiN1tk#dG#3`>nw254@)@_;@zLEq}e=7|53TqrBJU^u{GVUp;51 z=(9J|zN21(%AxFzx-1^{442#@O$4Rf>LqfCX}FfjR0BV2A<3}8c>5{Mjt8@*BRdxh z3$6OGJygr~9GkZHFwAAx#H~ZKaG|5(AU4TwKHqDNC;8L{Ri$KpS%^ zSlf-2*)lN4saLEe;OPEp6R9gGQxjvR?xa0K`Nu_GI@mXsVZN_JEnTbDxI`l*xj>V$ zWrBpNMP{&lC75&^Yd+!s+yrj>!(Kf3Q1TE>e=B#k@)E8MDb%;VMi%2(WSyKvp;0y? z*Kyaz8{AkK=r7GicyGb{r<_HZg($-}`_v_Np4So%ayoHkxiUx?M(aCfKeffOg=kaw)3^Y?& zJfX9Sv_aU2A7Q&xGgYASB22oW&W(dGX(q>XML@YD>~Q}O7CnZsM9uyKjA6BOl~G4dj0QqaSOpTD5xZ z5YmPe0H0oKn;Xe-53w+>dwe*Sm-oZF@Z zPcYbj@HRKqvHM6jqGHR;EGypQmlcyQYhjUtxxNUPHm-$=Ru5Mf%Ii;7t1qeddnyBc zc|yo8wlLqfZGN5id!UVlZ=R9`nUkAX(bPG3p{F`p=(I8P`a@XW*g=fo!bS^?ZtQpo zs?LSEOEz}a3YF!Mr0|WMC@NBG@UJ^iJ|Vm?mtG*cj+KY(+@K$668pRHkR*0~ce{EQ z5_{9ryuaDpxU{$e_rh9Ox$puj1!cUKLOK!k=z-yTO2(qBF~d#BF!hao=m=_19OPRQP>Q! zTXB|+>(@F&a^y@{Tkitnm-#U+%`c^4T%IQ}F3l7Jy~T{-hX#xB<;`GRZSPjhW#j!0 zdyltv&OQ%z`_V4VQ5xFic@pi?{QTCV{lkMr`_g96&KtcIabB!TMxK}G^Bga++)vo| z40J_L|AyC6U^6r&%WI2)6W)}^smjKMO{3ZVfVv06u^nSGQ+2^e`tw;GQLo3Okvr9{ z4VG#z+1~bQc`~81;;OmT9%7Tpkj}OCo+1x-Mttltw+SxMIhQtun*xYW8*ZMb-$^57 ztHd6@PHWx!0TO)WnR=J+plr_RLK3gK*+@U3+wf{h@5TC(n z!w&FU^drp*@o79Hob$We)w{4l{I;jrXNCARytmOxDxah&N2A}6QJhJ3s7auJIFrP1 zM!%EM4HgKen~X*Y5`Pcf!~(%!-QZ{&8V67-8M+ZabR!BnSRb5er1?0e@j@rh@AY@1 ziq;A`WqtU4Ksvx}@MkpLMY;{x;xOk*60=gjH?}z>%nJsW9`Qsa@nQnF-c~zIpKSc^ z^5b8cpGm{NJWt|ZnjhI({C_E5{6~L{@x`3*RL7X)!^$8f8)J|cefwC z()_M8^vd%jdZl@8Ytehn;L!W_UeN17k{7#T2l&;&o^^jPFkW~1TfF+errZpjXjA8# zM;p!R`bP$ob?S6q+&5u`=XOSKrXOiK^&9YzaLn&+Q}05jev7Bsr&B+O_rw=hlg8_4 zy3y!i8Nr!gyP5zJxHCZvWAsQyH|Wz&HyMq5aUVrDYE##s67BYGcV~Z~OVyn@bNLTGCxs=(&%6X)Y+?eg_2eV@DZ|@t~ zv9!_0Wq$vMw?PcTKegrWAryPh(>=2%B+HX#oPPrcyOp1dx^WG>HF2gc(Aqm^YF~s) z7t;7#<>~rhtn-ZDmCd@f|3J>y8diJmmZ(lY($3d4Jf!oL-`%F(#rfLsH2coim+&5J z*6s&hh*oLJ(WoM$IFsyDlYp~0lf-aFXEM6sjCH!nXk@c~8QsKY&0y^yuY7@Jmmikh z3Kkrz&Y;qK0|xcNBF|A^$k*)(1B=>YUk$hhNc7)A(_N%Q&qwSv94*2Bk-Yy>ErPLT zQo~auMmF~L_^~I=L=s-?$@9?!_N4j7t;OE^^Tl5DPcgon>9>g*r#CMxxK8hDW8|t+ zE0ouE7R4D#g>vcTHdwjNj}>ViOT&shPwpvczIki0^3Ml{l{>iXN^;44c-a$UL{hXc z+a2+>l;&?3*1Xp!cdwiYcvH8`}~OVVwSSn+Wcw1x2fdV_N8SixEmfi^fv z=W7PG5~uHn(@U#1pqYpxs=7%P$R&eXOcIX<&S#Ycp{UbDQf`kmkvmg!YqXvpvE{YR zlw|+ojMSaXlf@r9nz5kLn}a?UOO!7JsZ-CcAdxJxV%r}Y)S1Cj@^7kuqnIqRAL|91 ziql_GQ#ONW2UtwPl(alv?EuLp=;2Q8htjS82j*)!#y^Z2_p^pX; zEhx5vSIkRocCmJ0j6GW7p4nS@w;#{aOsR6bc$Vi$JWKOiw;0b?4-n5U_ROe#$nx%I z@pb!;13o4HufZ|I(;xAAyBQ*OY$!c1cvAB5EH*1mJx|b{Imb#_&y#e@9{TVpi4()O zUNDOn1}VDz#sG=(Px|B@HzecgOFf@*gCb)kbpCsi(Y&|+s=~o3m1Sa+wt!^5%6sX& za!ljz?1wFY{ZWzt#})yem9?N}H)Rn>pN8!Mk9KGmNF8P%)`2$y1;~Q=Ci;@uam)?xpt_zpglNq#o$HLA4Yc|pB@)M0TFQ*ZWJWmphG|yiY zMDwx{IkCF-zV$j0 ziLxf@6xW`+%0b8_4-Xp0rziU)=v#{(ONgB%XtBD!DhNX{fxC(Mc*W(LIKhK<65nj@ z$)vzsX<X*Rm0XY_#d0rL-p5L^{oHh{)%`;sH%_##7L~Q;VAOd3Zd+0}+*!C6@b9DRL8Hwey7HyMqp zaD6kniQvrexw+?PGdoy;=*(b__`w`eU_x|u=9A_c=JSFn&mZ%5qiYxirrN9D3XomV zc`$qCJ89lm&7NTay3$6FQYJVD%Nb1Dr39}`Mcaev$jN2rOu%w@HW}^mlaVx23PUd$ z$@2pVGLmLWVR$i+(FX@aM$z|UA`z(DB{Oso)ItG9%<6yuM5sQqMSJwUgJ0a!mwQeA z&XRU3MD=-Jb}DBZ{BD8-JhJv+*z+q}fcoh^%G+k~zp{u$o#|!bRkr*seB|Vpw^@PU zcg-Fv)VbEjY=!ohSRZk_Q)!$Giy{15b>{r;g4ym%1hajlg?;ss->?H{V~L!nWa*-- zl<=L-!NPb-O85@P@W|o2<7!VAI?M*29y9*GW6|gCjXq94(nRoI!b6fV_}y*lU5Mbn z;%R=ZCma07@ZLseRP?_Q7^Bg@myw-`Z&DNEbaf_-*LLpK#m z&XC@Cyy7MJ3lT#%;)m`Y1s#NNXBugK2d42tC(lu_*Vm1zJSphZhW#WUb%pTUcgXM3 zlo$C9VX6E1=L+R!$Zqs02pqS#mz=dhu~|deg2qHZ&vauW{+%LFghT!>gJ1kl<-hpR zA7Kt9u%7$DgW&s|6GRon`@yV3=Pi)q{`#4Dd^%R$5*T zYZ$MJ5Tjs?f=7VxK+jpAWd8wGHKyh|SGfgb97CYrSt*=B-LWjdW*bx{oI+5VR0S8M zi!l+ZO{_YT?JEPUGAfvbg-UZRXdou49@Lw~l>i@J3(;JsAQxRImm*B4#wnmTA7@3l zm@>r*a0WUw--UY3%V7oe(m8HMzC-}v1yIF#Q4Q6s{FWz#Ak^t{z2 z9z7;4Ubh(Y4MP#08B8JQV5%Mh&9!jp;F#eqWBaG6jIoL_p%0_aDAd<0#g$sMQf=0Q zDlpC8iLv!qyryQ1psyUtBmC!nEd1hNIn$SSbyyqAWjXZM;cy8BaS#kt5f)GrnH3Z% z^@`Q5a#+LWxD!JW2buAoW-IYuM8(rwBzcy&+bZ!UCQ1vaj#!2vHsK8t`c^ICWK#@| z`58|Y^RxtOV0NasYq&UR^UHX#>cq%U>6@7hGb|#0FfGHJcn)wGtT%-<(_@5jHY6nR zEI3*nHAKM-3&k4h#ak>^z~Rj=96=R+R@+}K6tf=n>pZqxwYCU0jg4+j1;zd>RxZqq zIX`Mb*AJ+w)a4Q#IEa-zIHro7kI4k3Mz}g{?fKcGrCK}9huFbBuz4yZ1R7hHLnE=k zwI&MA^Y97;{&k*@7g_fBn8A8k-_Y942C)6vtl&$YX$kP$Z+f|A}X%wWN5iP2-{#@i-5 z2Y@})6Q5>6;a4sGu3r`WvtVU z9!06@YHhuzSj)Q-cB%hHvX0|l`BV?r#Xj(2Lln=!YWAUSu7*HAwzq6&+X zj5rZUA!(GnF4UImx;`Ld^Xl2knd(cSsy)~NE^qeZQkv_T=2}tu@TY$^E zbHHU3U{JX_owpG5=rq#AB$hduC}tv1IGBZzK}w5fBJQeFVdI3PMd<)xUJaIYtQ)7nt{QX%JO0*|M?s6?7Z3275OgB z=@0GjrTHNpP#*>&vt%1jnOCtjL#LF{>38aDVX?GSB4Z=v0Xkc1tguq063{@+Li(L1 zNkzoRnq+ZsOnvp{D$J(qvDMTu_0f=G=cB=4&Q#MQxlSX@HqsH-9Gixju66#_j#`)` z4IhR#3=X@XWP?gr(<~OzH4on%+c;akTQM8T9g-x=6MORK2D~k}ixK8YjD_!pqa@8_id=_OVd{TMsmGO>r_`3EY{oF;!vX z&@c1)S{UjZ6VJjN_zs~>^AkxH<)Y8FZnvP`A$g6LRxH&+WxO^M(U&t)Qg)AiQ4OX4 zB7|e8?5=0%R!jBcUwxhW%5*)}HWUnYj$XIapaA5Nd&*|szR3J0xB`jFk zIEnqRfuGEAMcgHjnMoz4BL+;23A@a^p>_j!Dh>23%$Px)tyM6PE>Y$b><{K0boCLQ zqYDJ8IL)_6r7~|Ho^}=YC3I&}SSXcCjdg9wGGMk^uZCwxt*~nCJk5iKXNWN9cI-*L zHatUU;||Xdx>0JN_Bn1edllSqhA6wj=fUUw=DI7`3U!37%GKWd$DT^q>5h^F@7U=M z^=hZnaK#2X9-L3Csjdxl&S-3zyEnr!XTRMalU%y@*K=61x!LG>`jKXmo5w@4z45!- z)Vnaro%S^QOmfHZ-bNDJZ>0%Gqmwd*GsQkN1xx|X6fu<1+cUbs;N^6a(e8k<{VsG< zeqIdIs9NZdj?W7bLp0)t=t%_;OmNQ7()Ax%J>mS|mL1U|3b5LKLan@RJKfL}^!~H6jQ(ncOn9_5MGS!P zur@%vnb9*-Eqr&g1e7Ojf0^q=C>2FQoQuLry$Np@o{?N$!gIxNjW!_dxLWmWC0K0M z3=fFO63#zjoWX~Y6{N7t2EGOCcMy|-oJg%mUZU{K1c|BHidA^(7GZcHJ|~<)c`OpE zFntxzu(ZM0?}O;UZ0z8OqPlqu*WFR%F_838&ODXZ5!AfAH04(K3%3eUhFP@OF#1eT=Xhs@? zL9}QfVY+1_jqGJrA!Z+6HE1y}I!V3e%&-e7spI zH}*kZNIFlc!#Zqri(6=7^Fb(37BY5Ln_3L(#afBCx$Pqd@+iP0d_)vEzb#CzZE@nLi zJeR|Lst4wtAtujWpW_&4ufP(FKabJ|)w6Vvl-KuWfYyOqUQ8hRe1r5OhXNqLX+gv( zzSip#%EHOSCfr{6rZ?FGz0iR3^g6JYo))dzTxJXw}7x7mrM%#~%~&)*%6~TwN{| z18nrrbfQ<421h%l0qXyT)hf*K-)pyXr_k#MBVjuM) z(08~CMjxYIlvQQ%HQ-AJ8svE>BW{oJy*zIG!GMe2RDz26J_Y#H{uskk`wi}g+7j)B zp|+HWt%x_vP+J;mOBBvU2kB5-x|p>kW#2qZ)-bQ12SsuND3&)*3hv9Xb-`z z{{eJUHw_Htb#}O)rtk|9gEry^?H&aht{j{>r1@=_!wZ@`$CZPx8`X+bps6kSy#RBN zTjE1B-$lD6_^#qvBf~o}ni^^2`WF(JTP`n1#?_6D_;>5};(r+MihqC3D;|9q6UZIM zk6hxrE{= zaXlB=oves)-MqPwar?eWj|gL1m98}6yTHttansES8fRVqDGV*AAwwL$ZbFfebIxmM(eQg#IH| zaPEQVSLsKZP3RMNNH!sUcbj?_HlbhhH2Z8qzl`@bycFI)xQuiR3m<<_9&=e0CI-ERy7~Q@Ls5- z+i0SjG?UM%f=U^HehU!hOVxisGi)hUvsvdCaMMek7A^+H*=vZDZ+VRTKWhlZLD08( zVxqqvRTtzlh-M591{HWn_}@~O=k{x6tl7gQ_ESWd<&>JyguG5aDxOh|b+$n1Idr%= z6VSB^e2mTEoBU!n72V>eB59sXqat~pq#|i1U+Te9(dYY4MbUr7kP>Wuze60(>Pi5_ zqj5wsu_s2xD7n=v(q^7r%tpdJek9zln(s_Qf^IoS0sE$kYKH9C)*Q_ zVC)Jt3!mb1)`p~Zcn2bakDp-2KA3pQ_M*duMj`D5wUM1StdR6yqSeS%Aoy&a>wWs2 zBR*@bKAVj2lKppFKv*=>Z=2fcBC#-MssgPWskRwj7zr=s@I+p674GK9>j+3-FU1UEv;|ao6%bkvr87)*8=YQp{UT>Bf zg$00V!Igz45NUkcC(om-bzx3wHs|c&08adX1zUt9A$zOvvVem0-i`HoUwU0Kv#m0D z9URj=)c(XAxx#2QYNAl9QN zXLZupx;KHqsjzmYgdPY`fHQi%q&K?a7I8WO9-D)nTy7<7U$HA~<8BlC{|uPfQElxQ z9@uU&0Gp=_5A17#k|rAejwR4-Qc*ypGf&e-72ld);?SXT!3wxhG{{f)8Aus@a=_Ghjk z!Irlf{!T10Tr#{aUF7xvSKK@y}5s9;Z#ZFWf)7TfDmy|EdWOCBNNN=3OB;t0q- z73fi*y3UsND+6+zr|^Bkq*89iuxpO9htWs-P68uZXHVhls*@;W8f6 zM~)2qjzMvk4_qXEmF@UUzkMq0ji}3XZOWliZL5pKo05UiW~SJG(n=nX;Yw*QO-R+% zHd|xo5bZfftH^euR7=^N2POA$ycsjxC({5*9z5bZso-(X9A~PpFvrQ(0zRbj%Oj5UW7E|JGb^l&^N4)E-1{_-r|+i1b~^EBgVbXo>+=Gd#|fF|k85rY}Mn9&Ue7pI$yMuv?=bW;Ww2I`V0 zLZsScNJjjSJgy*tiNzUGns399UP$Em<^FDa3?$0LvIMB|quh7X=vzX$Y&E$_d3ijF zEH{mD@%VTtT(^Qy=X3r1mA-y{^a_R(1IL5j3L4H1&b<9R8Nvw^f-2oS6>WB?9Yt!C z7LffQpm4{TMy#w|DFN+55Oo(PmZC9qa$L3lm874^%_W=!wxmu(m9H^+Q zD}KaDo-hw*bebwolgBD@?I3rWs*Ot^Abm!q+JGlYv(jyzNO&tz-chV&v4~9e^feyv zC<7QmV5Q_E)lE24qQyt4k;>w}G77UAZ=L#t$>C=&_?bejMD8+3bO{TII|Us#T$Yql z@%u1`*D1ScjIP#ItgqMMvqCGub($s7C7%}TDn!0AR_Zv^WK|zdfm@BzYFvle1r5tV zW*aOIq!~8gAlqpTm9ELfjFKmsY;}$sQmaYFBt)WHAy#fxx+MK4k_62#1_)3;U1Mz| z@ssYPSp*VJ9m9qw!#$Gxat_II;b$x>OcEa%J0@?AA^nsd1%xynk8m&;doHXkRO{i` zUh~Q;<~P+TID)zc@O?r;EqaqOUM=$q1Gikqla|W#Id6W`Nuu=BR-!0s(%+M0c^+F# zKV_7+<;Lm`?e0gtV_YJl<~TX9kgu8AsI=NHsj_pMRpwmWU0SJM+X;+23X`KDS^g`w zA*60K*+9gFCF>%#28x_eF?QZ5G3P~wzG`!M1-uv^f}+AyE`@w(q{xPH1(Q5+@yrhS zYHv!Fm=O-DOT^`gt5B)#dbL>t`?B&Dw@HQ=1XHc)5D$6z88QZn0 zm!8+pJN%J2@hk(*?6Au*+%-{*bDTZ$3Tta-Riip`ZKsbs)rtKAoHV98%Fk3Qp{`U3 zsUH;q(uxRLX<4X3G?Ly~$v#s#5gCI(JnS?(!5QXO3tWE1OV5Qf$UM!=#_(b~AgTI_ zN`p%~!O5>CUbdRdV}i2GVeUHO3{{zfC6i`=LgRE2uN4|AbfC}_#FNWN?pF_KKq|jA z9!@S#P6T78lvnS8ImifmJ+pS07SYP&*P5Wuf%k|?tmsS6r_K=n0m4gdv)P#GcXMnI zf1rP6IQ)$=Iha#c%|#=vp?Os^_`+K0*;)t3mAK*656rBU31mol4kIgEBz{a$5W(3d+makl3kF9q$i8uWWpl& zEhG;+7QyKrErLw9@P>-QPi@;4@wjYJc~iHxKr;|q0q;z=0_qq0WB*Gpg8kiCqq%+2 z_t1|t```QVknDf_?soMq?0+BdH2ds--;Vb-EX;lf%{3Z*r*wBlze0@;6N@u?3}E!V z8Qoy{bGpfB6lVMb==Opte9iD&e!SUOYc`&*L3~C?KEt%j57UhbCfER-!KIl>S9@WS z=X?C!ZZ$BeJ@G-nmj|u>B#k>TT4jqLgs^k6uz|hG!7E7Lg+$cnFEojo7!6k+snx1A z`>kwT-08=KH1AErg*;EP^b7%vy5oQazlEU zYrWAe^XTc0S1hcNMg(I?Vm^dW)(gvc;H~!J7+s;}nYYCljG#BR#xDkxaiPXw!z_pj z)~c2;nR}Jf8)?yN&Dt6ahHZ?cY|27GD94(hc_Wz*bp2MIjn<3CPJ9=v@oF4iIBUDx zT+{4yekoq!mK8SGLJ0wUk-M~HmfIYve4`qKsfT9aU*%}BKQ$FcN0P@|_lR0l6;0SS zEp)j#93=*{?4QkwD%h^g;BJK-nl)h%wQfe@{e|RPxVun1K{ow;s32l91-_p_1r{X5 zi#H-JX0#m?00dm_1Ex^Av8XrK*xl3+wz;^#b`_gFUpI+8uGDU4>JV3FZ#sKq9B|v}Fk_$N;3#Z{`*-P9hRsol3ng;lOiMf9hMsx53 zRZJRKGN(hz4VN}U8b0Qp67(0H5Eg^g8l=LXzHo?%+*}VP2$IN5lair(bqmMFHZc;T z7qdtg-nG(NNVkVpJtmH>_myO-BP5rqNRV-lE;{)|o`OhA?*O5$ps~J&RkE%V>4Y#B zfYwEU+M3c0+s1aT#$6_@6n)}isa~Y|F)B#~1a)(FVJ=QuOPw52NB2++fZcp31|VIO zRnN|ljV-a+XQP$_hhl(baTtmLWOw-r7Xy@*_)R#r{npScW+|ZTh?KJH$s~GJ!X)~i zT2#`WYDL;`#XgceINO@Kt4ZE68XHH`YLX}4?vI5uy(ameW69?BME?){NVAas86J{N zi{IU*-i3wqFFegY3+W%>y^SQc|ClBmjs8T&aHiORA09V z1EtzNUjW3ek)@9m{hG_P^>nZl&34ppjN?tSu`vF02uFfN{I|dfx>kT0)ijHe))RpT zc_PtiB_^xTIng!K!fh>3oPxy#dBECJ!cIRWNb}dEQGz^AQi3$!KS)a0(@#o>MlqTg za9_^AvbDbLa7Kdy9|w5i8AKorYL>oxXIypUN=L8e~VcDSVXdO_pug2tI8 zs6aGG7b4YeKRTuP>(bCE&y(ns<_89e&O>>j^Lz_B{R`X)S`9{e!SAg}{94C&_Gvom z$F4M=Ps6S}PhwY^=~8@PoApFq*i~t1Ir&P)@^*sTO-M;M*;CtRb2eHp_oG#sUr9r& zJWrxkn(rMXT3^Tut!Mq4)?V9oIJMvHWxMKAmAQpEpR+M~g&(8R+)Tr$JWpa&ng@ES zMtNcM-F}Rkg>8pU^I|W!yw2XB`W(+j<&}O^N^><0mGV4^N@*qsmx1xzvw5NNB|j?l zy0*h)m-3M~&HU#)?Kxkf!TV*Qw6yrsU+~6)l6bBtvRaeNvz8_G7-y(kyT$c%>v+TP zEqVqZmb}sq48n1@2Wr;zHZyNGxBYHkzTL2%b~Bq7`!a1V`-vCXztV#gi`zi3C6vbB zZxc^DbldN4663Cr(Qe{?(V4+`C!D1#w(W6d>7)7mPxE5ex5C@;^B?_Kd(W0uUx*=3 zpE5_sG-4>J5Qqd}oAyA&Fm*`T+ov7H+wX32tEtJ&7HT)Md9g3k4taW~tfoKG!;q(E z-T-#X)0K_>b6~%I&xG5!tmVmYxrF%QTDa&W$?M5c;mU-g!Uicdj_>@*UShZC!&AVF z{T6sG)(Ymjisx!KIJ+^tAtlDEP3Qi2HKfOVeIM3$?uzL9=|`GZ!#~4Ay8Y#Mx2t#I z)$l)gntfgk@5g%^Z7AitY5vjZdt^vw#$9SgT$DO9#z03un9&VR4o){2Z67rAA4WHo z1&Tqu>UhOP#)XK%8u5d5xdIDb4bJ$|JdN?aV99eB41C?l_d zj{MmL;y^4?B#|`k;w*7$Tj`}P3~(ubG{>ckK8nG`Y2epeOnC=t zhS#%7$8OmBjaN4Le)f(kRwCZNecNlc(Z4~F{RakvtJ8D%toDiqFQ{2h`s-8)l?zoo zMx4NeqYrSVS@;N$F^Q{77Q+%8yX)-gZ52xU$3`lOLB5wZgExl!>RA@$!4OoCNVT_$ z+qWbHl8+O)I0DHNy$B>p*kUP!Ctx=GSXWYrcSIIF?oSatd_D4(H+~z-H+OUNS^AMC zZ+r$1N#5Xhx2ty{Z~Ts@*(Yy&67OyJu>UEVbTs<3jN?qROHBjD>P!V=1c_1-DKP_iZc!AvdORKjf+3*H!h+tU_?oP`9ANZM{+$f zqlOfEC@o*u(6ayvMtBTEf1NqWa+-w7RCSiS|u&q)tjz6@{J{^<78MAaH z3K~u&!Q_FFjw>Dx5nNAWihz@*ONKg15GaReF+Nnw~{@App19rYenP7_OGO?9) zXn7a|b|5GMQ!!Tctcp4mQu3u-qaZIPze2h6G9`#J!&#&P z%8O}k)>$r2BGiku6ONI}tSEnJeiwyDIlKVCV| zu_D-@zEXfqMwNJ_#a9Aiy}3{?)=F!%W#YKYVzX8w@sU4Kk&^Ra6y1t^c`pfyE@rOk zxr^wti1wR#a?>%~N%W#8=ulfuwyH&5#V8EfQc6iCecrA<9*T|-PnLOmCX~BY1!BnJ z!P^dwrS8fhi#O*$B08Q)%i$>0GGy@?#582_T42I8#G>hES0%Kkfg!F|Bjz?+mxXILh(O%o101(8gHxA zn`u~izs6GD^%Je6j}s95g`@lyJ*PxYe**wkevXsWbqeMc2{Xs#yOY{s$H^%K%Ka8d zv2}yTWu>rv&b+jNcwOwAc_}aIWx^V4?4Tp{LQDx8JCLGx@xt6C8#`--%5r#tUfPM2 zJGBP?x`WagaCebn|c?9j5|EdC?TkQoKE$vK z%3yFk-rI07dm~M^GrCDea35{-aP3}EOrTc{q9HVpYHhX9fZ9ez3L;@ei?00g>Mzh&)rOH7JV_C*C%T*@{I~bV3!JATyN8I2Almt}YbHqVrE4Qrh>V zY6Vr`7@v#>)tg)VtB^QT#GLEs1D(r={&2nV{x96=&*1(mxd~Wv3M@f^t|-;#i@7k_ zBfee4YtA9my7c|$g}YgwNy4-hTiJnRD{0YVZRrmU-kbvsei1a7=I=>lhqLdI-Mf?c z9a3qpvctthrRu2J4XV-#<2L%8gd0|&u5dE;^`t~q6G~KpNZ4V|k9DbQ?stHS)hHgB z#nQKQs!w``Vnyn%Rt2;5)jp_Fmuy^Cgh3htEmYLGZOx5Ka1%hfR`hNx(_AI0(T_A$ zs)~o^-AmNFP^IdgW}hk*;k}I{hRZbJ&S+J}aHiO)rhxe7Oc6sFH8Z+hk?1C)-2!oG z9o=3~$`k{&>#NQbP-O@?Y(7hi&HWa4e`2Pd7@cgIibq-z}hX#KjL5h%hd8iopGq)8r4ivuy^^T z+f|8f(oDX7iW>4>{tJCu{^;8=lwA9c#R45mK<c0N>*G%MIVxbtBa2Ko!w3GU`L1Sj2+1Sid; zKM#iBK9~o=ZG1umvm~{x>w2PO<3l~h1*(|!sGx@>_87H9P-RddSb{JIDkONkHnX@m zuDX9!aBy0&3k$W>P1{5knRYP1Q8tqBUm#R4ajOH(F-e2Ey=%axR zjm>R5R$7)YQjWL>{KWN^HpC^}?oJSwG*gnk!4TI+b0MzxZ8tUxN|szhWm#lwhUI%} zZL%JoCfW4Cm7WMu$`QNaX;lWnFrXT^B$_8;U2d=S`viGUu_@VNVur$NEtKGXBlR9yQs7T=(Vb(sXJI?exO{>&KkX!pc0v_Of$5Lv^%iHI)AC>KT=GYDWM%d(<;f z>-OA};KSLX-JE}muD02t((T&B7L{glKOfBL`bpvh$TmdeU}*@ zb5J{zx1{RCia9=s_i89{##9!AK*?Fs2KzxQ=s9ms&a9DJ>-gPcujo_M64K5e2y}UJ zqBmbpIs`pbmHMg;37yU6YL_M0Y9mvMO&!&YVga8xjZ^zt?4L)*!Sw$p5@?inR`G4HvRl9kK8t z3X9e65yn}3cUdByk&AKsd@kJR^yNkuP!~duX?|R;a<#a-7dM&Ky{5j+6h#&Ex>&8C z_BeWp=XIL3OszGnWl3A6d$&T~1eSRT7R{jnP7z$@I=u=_NAf*GlZP;r-423>YPyzn zhH5%W%k{3JP4FJmdp6?wGcmSH3Eh{q(Wbfmo{3`3rwULERXlJyT& zBG$WDd$N^+p-SZFBDVfQ7okIy2#mwkVUz-|2}vtK^fTrRxv4}R7rK7=2~~1Yh0a11 z@`fnF(Bk^g4K*bSvxN&p+R5i^)Q*h??&(QnYUzGGyDB(R%Rhok_T+Ji5caR=%i*D> zWXy)c3(dw_v%wdzwf2{f#9+F(haGB4DUJN2QaWL=i0Dsm#K#eP9UO=+kp)rXfy zxMjS1>{WbuWa9q63VMw{jAQpRaLyw=q{l$`YZEaXf7WtMb+FqQju@gifP;r+kN7us z9Kewnhod*tCDY^~T!HQv?Q6gLULQg?(xc%27OOLNP4sv4BQ12}OL$1$uKeyc^)5m; z{@&B<3*GoDytm8SQ2`QfwbJaT^Sg z$Gwu_8u7!mL&1dz0tc>3RWn5pc;S+6*C)D3^X&#M6+y5AFuGT&eWBGoH0*$AmE$%( zERNpKkyAC-dIM?qBiPf(|3{l9dx7mV;tPQ1KC!|r7u$>BQlVLH$Q_i5k!QMa-SV_U;G1wQu79;(9F1u3Gx~4gDt`S!1lm@h?X!ogvrt~QBO~;|{ zaJQOL3t+Lr#G~`xIM}hmtu3PSB4u_33FmB=w2k-KO4! z`t(*$vrm0`67OyJF#Z%xx-*)Sahz$kt7#ybIn%_DMyE2mU6<%4qfw;c^XT@1ihgIn zE<36dOpiBJ#?N9(sCq~|_ns3C&UVu`%Ni)U2D}dCFc^iPskAN3x^erJ^(y2}# z#z9~fJ2<$TZ2I)CH7X48ujVPeVcf!P=kncmtcIye zelS2b&%@QA0#|fOf4oqrRFH{y=EQ8>8JdQFG=PgWho+r>o)!X3}1MvB=7BG>mx&d2B_h24?#{k0TBpn(P?-gJeESR!t zDg->@C*aE!r9%IAcGMNB`A8Z8OSjt+-K3dHx(|+kYkei)sDj}{_4{_w7-)rYMe7K@ z@dA%GRuG>n>7giG5hgyZum?JL(2y5`xYa9@z>;#;!!Igok;k0SeI__s0!i^SE7Cdd z43ZCr3r#gfHj?-Fk$hDfBulp>lBIdDNPf?jAUR&({vnyi>=4PP;&!z2W>6S#bH18kie%{Cp)!&z~pOeenKZIK&cZl{qK>PFR{OSPZ*ZWa^ zgK8#W!YhMFw9g?lv z6(|z17i5-rmPC1YE=xFz;mH=x?(if0wW>LleM`3_!likz2>)MmL-=NPb*!3c1b2Yk z@SGK7oGpRVP3xgr37SEn+yVE#(~svd)%;}I#+GhLJWDervKgGF^{ctz`MWZXX=jc5 z$H4Wl9rEx?fo;~$vUl^{ek|Xkny1pREZuHQ=+n}SYJvmA^5=5H@_84_I_`{@wR6Ne zyV%^qPIjX_6Eay3%SPsXeq@fT=Eu^IDczFDl;*)A^N({w=GXa=$;;X~GRe}Gg3xXh z-~PTKA@V9rlD23CDAI)u@!j`M%%y64Xy9gt zDjU7~{OFxj&5x&{SGpz9E6sNflm)-$@_yRnZIk9V`Ozy2+ZWV!rvMWxW>GmCsSo;* z`jBc)WyR7hiBxGGEGxb;H>9SpVqVt1pfsuZRN%{+ru%e=(1-m9eZ6X)PTQr@Es0QR z9xOs{%?+U`Ot@o&cBI|LqEiyR>56TK$bF+9xo=Xo2Xf-{iY zs>x=EO@hoW6j^c&)!I-t7k-N$uLo3fs&PuXCGjfFln!oiI_w*A!|S*Bk5;|1ePP6U zuxy!0{1BfYAu%_{mv`hPf}Z~DZj;eUZeCTmHptX<50dOv#!F1zHd(CLn_30bTO9FG zeK|WFU#$)u54!e`(2fU=_t-^qQ{EOT)-Ks>w~39Z`hzaj{e4@FwJlVZTGVIQtdX;r zM_UL*y6-b|9q0^gA>)Iu&u}FrqZYxp&rn%xs$bUWCAPmsLmIa2zP&UCqVZR7l4nO}r(aAq1p+!aK%M>B4#L)>bSSiU z>Zb3kR4ntfbujRel@`Q?LVFPS?W04Xog;Vqib&;mx2bm#k@`+gb21`z zocf)@iyJX2pQX7*qvxc%Gx~NlIs(O<(O;{Y5i%RSE2G=hiEc95P3X3OZW4&f;CRyc zFkB;kxUNtDAe_&EOPaqv4K8_prN7$^1}?P^76D_w3A9RM=1!oT#pi1rL5k(F0p@g( zKut!jo0BICuQ&SfD$VE8@G8$QOW;+SFCPG2&-VeZ(K-f^kj#cYB)140L! zqSEn3P!7+8@U$X}nq47vA}CZAP2uO-`C5qzobl=f*tEYR?4@nb6%d!i92s;GGPFMm2NMQMReZU{WCM@sA zvJhYifdxJY5D2imlK@Ky`~&}A)v0^WJ*UsT-92+}kL>h(pVZywo=4rPI(4e*)TtBg z2H^3or|KvKHt0<(TXe*YVmjd$Q$6rkJ$zCtKR9%+T82My2X3QQDB(4V8ll|*qR!Yh z{krNh{OL_2BO9q1Ub7|$XJp0qsuHm^4j%TJ`Nl=u%{+&*{YV@@*8~!Q^K?(I@PSvG zqdRfYJ@6DXWMZ!D8m07aHy=MYU|dY1R~F;0#G;zSV@GEE!o>#NT23D9eXm zrCc5?`IN|N7naGgup0q}iC&=b9il6kqLcNOza;3!yc*u9ez}C?Bhz_Y^K8%i&Z{LQ z`3kL-U1EP7m^=chccE6FKLHtkaIu_ZyoecP8!y_ravLx5+%{gMSQ{_ONXTL>|E6@; z@`YE6N2+ZhKTvBmJrkum8y@Q`DQhV&ru$}R-?z4h{kpc-ALucDWuV9S%~riS&|?M) zxUwvwOJ}HYUuO#VK#$Q@BN;5$w;r=$gK1&VuhW6KM8>fwe$APD(<|hw-jq*S+m!l8 z&&Z?_L#&|;zIqQ@UFrgj$MUl ztxUHSejIq2_~PE-0V0eZll>q~@%MHvr1q}8Q3}B>q6MA(5 zliX~52#lHlzW~5eXUt!xPW!-^yq&OtQHk5<9~e`HnL;pc_%D`|5WLxqU@4A8aB{Q0 zAovf{Kydl@(2KbBH!!+@#0R5D+!%=oPDbSpH!7u=E+266YI3tJ{ovKVP8*dsMUV!B zJ`_dhS_!sDM&@oeGNqWX;zVY0vyJ^g=I7Ez=8b|dAoAfTB8NFfBN>f%y3r`bvC})b zSzo62noTLlPh)yBx`4z-qDWj9gmNU~@oqOBrTC^ec1&(Yd!K4i%y1pro;Dsg1sDS= zAC01N^@&>5Pe$XY8;w#-_;AkZ6mqhD>!dV!vt=&(bj2E65DL)EItQH`xEIMrusji%(RhD8-vQQCVxIfGrRu-u!? z&xg&io7F(tvrE{^nwzU2{Tc6%74yw}&a;~3k4Lmd zi!W#_(k^Umj?;gK5U4k;5OU>BaIGV@d`sBe4G>+@xqE52=~jjI5P=2cZD#A0wsB|j z7`Ix3wOhS#KXxEzy-RezlqSUiZM)JwuU3`1d)FrJsJX~Azu;G~-3S;ewabBjGeSZ= zV*9%>kljLPYardhIa9hYQ^CI`xWmg&RVnK++^}`8RrRl6qlb2NL5OOT?uu{HPHKev z=#|F2DY)&6D!sejXDQ?<)w|umzv35K!Nx9fug~eXx9}ZR0eXFt%QL=$wa}{93G@K< zdU$MW(eQJ4yCQa#;I+wPYp7Id)gvsR2qJt|supR|0Rch903*RD%*>_cJkAOr(>Ub*Nu3iT3ZF$QZ@>wckzS<8^G4w@U5CZ0P2XQcl3y|Z=o)kPY zKbrQ!^C>Jm6g|?Iqi`4Pv7sdPB*>oF5ct6c>ryoEXRt0su|b|!y#^1~rNO!sSsVuI zQV_&We*4?&ICd*m(GMi^PWNrx8}R#$MT(Bj1Eh4qCQ1ZzUutuIatwH9vh(TesFjsYDLZ!I6EkGQRh zBX}6rU9IY3tKw-#F?IzO))i(-l_K=gMcErTh>8n$n{S2Cq6*?FkKj7CW*sJ34VT+Y zBEsl(1jumtu=H&Vy+#cU@2)ZQt3v3@;|a|+S9?hb#w(%W9wcZWYW;HxE zGz_S2QpLmQ-U*d7+h{eDV!97iL8a!)NkEt~*S?9m%$RF=E91SgmuWHpZsKAqxZyYG zQoivb=notDsTO$0uY)g|{*|WJY%3Z?$kbH6;g3}P%Lt~jm}q1aVa>WnM|0Ml)dj~A z^2Y4Bo}p7xhN->AP3>)NYTw?0+S2T9i`r6rfA-X#Sw6MPMf9O|R?c3<{c1v1GRf*> z{Ba0!)KQMWa8OeV9Jg!|M*AsIK0il7XU&N_r0ye`K;rFqyK~T+N z=qDXq9=5p_d259u;`Ceuk?IY>xUyb8nZ8_jeY%`7b3@1}1)8jg#fYxy2l(aB9i4|A zNLLy44vN0T^Z(8!%?O~F|hSw|Y9=ef@|*`R2X$xsI&l&trf zRA&?5s)19m4Hk;~w0RD075}o#6={ZQj5P7YUbljj5zhY&go0YlRzN5OA>6#4ZEa)6 zWZmjcwSd{WmDUX1T8uQabt@@$=~g${Y%g%Fb+5O3-0Q6rQ_f$fb|ug6u-02C&ROg2 z<@BZKe@In|E<7dks!eDdYFpX7tKJ2_`2_8CG?jZB^7aWYs_blQ*R+zUu-8omDSmAn z738^11u1?Ydn$ZQx>R^nsL+l+$EqICA&U6nmnv+>vWB_N&GC0DT;p0{!=8|0G7Ov? z-?>@Tp2&dXzd2o8uVGZlxn>q=>jI@tcr^xp_bB}BvhXLxcf{eZbF+-`_uc8@Z+(ER zC<@nyifS?r_bD9O6IY7&#o@4Xvy5^0-_ph5h7es*B=+PT7#$X*N=BvUsTXUcDcAm`fxDMFdte^)=v+)c}9xqDhQ{}B+qT@MT#je zM#k&a@2AT%cLe&W^1_kdi*cP}6h_yuZrz=S-H1KjVKPdyyR79)is^dEj1l{n=_2;a z1hL4#+H4_wXj!h#h?6fAuC6JOAW(0N`c7qP#5k;DqQ}DCt zQZTr&+ooI;k!^lzWC|Ej6KK4_Q%E_Di~3^Ut04tRt8n?yi>^RhRbqFWIA43&~HXCTfik-W93G8`g@C>xBu{1K&5OxYmD zc|$_+g$gyJ)GGRSGVvJzT{&m+mtG$1?3^kI- zXTwJjZi$%gq&==TyBX}I4h$yEUS%VUY4%?)KO5?#g zv1#B$wc{~udbl<`wf>Xc2G4w|lJ#sINg)JNY{%FeAt`UTAWDEXPwYvWxM9*}V0P~{ zWkDUNRc)KmE?ryPuh&$JD5AG7;I1iO< zL`jky(cPKcH!!bXk><4!op(R2DK`@E(<|IaG*B?rm2xUOw3Nf|=CiMhA;9GOK#s_DawV26{QR3S}?C zK+`}k7qqmy?gn}}O+qi?3BAtsa&=zgVJOqV`6lyB)6J)F4yRJ_D^J&JtvMA?fb0p) z#rJF)f=3&F<eKoPV?WQ#d6yVT@k{!z1&N#P~()- zQ{A3&ih)lbcjCVJ;K&mlk2@uG#^;{yiJW^%sJz?*P^)4OK)o86!WA%&(MQ|?s7LUS zD8Y4Csk%4-^%_U9eE^D@?MJZZTpUiw4 zpZ1&2Aalc!S`k}QJRf2>@Mbp$-r9i!rJ2ovQhZk*Iq;1sa$xxdbSA0pUN5FzXlY|f z@giuA+pS`XfG+8&Yc~oBh9v0@P$4%P1 zJCIhI*`$@?ev-D45os?tNt+OAAavAhKye58h8ME}Xqw56aE@LiBh~JyY>;&J^Q*$e zkCOP*i*auooC+4UruhQi#R5osz5#}`(yV;A;|iA)CUGFB!yV{~2it0zN9qPkGHk41 z%UbOzrniz9w*GY@0ux|Lf9^WcF{NjYJ)F^;-GPI<$s0I>smzyIAQl@TTuv=`<+N*q zzXwyfJ>qYP%P^+0GE?uyv~zoS)?wM9#Cx5W25 zzX#34pT)p!d`WUCmVC@Z25Frer1c7`l(hIhfM<$<)LHsN zG{g$CH0S%-5kb8=BZiPkElB{zGn|CIV4=~JrwGw4%XL3hRD*F}ztj}}iW7$$-mlL(oxp31uhJ-Z*${biXV={y*#&ZFU7CwKknCTNnIC;uCV(}+(*zGpg%bF5ly|LXhDQJitKVF z+H7ULG-e)bchf?O?~9{_JipnRK2oez<-X~q+q0#`KA}YfuN>ngI1UIR+l@?vZKqq+ zlT~gYHY`%hCXr%?n-o&~nmAI(^P4PENbw4g!poKvj|eGvU%MU00V!hVMxsHv-o0Av za+BsZRZJlX&ecMiAzOs8$Vjo*e~EQ}wxszbAq_-TyVEAvbZN@^943{B7zXOFVlb(w zrhK+^_^;S3NX++7Vf0$s}2)s;$( z*dQq$t`X!(Dm9u16dVVmXY|{+%o_b1Mm&!`RA-vkHJ_;`IpRtFszV0I#mkI$^BF(z zwz=FqF=F!(HxoYAfeEFV&4f}+-l0B=&B;ueaG@@XE8i0ygXj^;R!rA)DNiT;viZ>I zECS(;M(wNMW^=^kh48g*iayzaqSDN!s1#EKXP+sW&z7PK@e~cjN<=rZ3E7*L!}08* z27%guywu$TW zjBT6B(G^2C0tI!G1OgtZwGi{Ktj-wed(=(9XF3p2n%M-D;uRp^)ocm)V=e+RdNl$0 z=a{GRBEZ0q-Rd##*p-4mNB6#s;j+6XjGTPq;sLT>4<3~J7n!s+?Tu+T!UX3bBIkE( z7c>|n;_7ebjGgE+2wrP*OviA@vu+M~z5|CyGn+%Cm`(@uS(<-kwjA=M7KgN>nQ|{7 zH5A>j2@Q>Q1Z;{seA}R?u1^u1jsV4WI^PC0?QqQgXR8AGS4%C)rHnpXg{D^&~ z_It9W_RmMDoq+6-I4Wp`tBna_H?CRvra)e#TnzO!Sf15qa2IREC;l4s4n-cRjn+5N zm8|OF0midy4mE#4s0ULY&MbNJ^g2s4`j!>*!~Lh~4`fT#Hw#st zBV(JFdx_=^TmXl#u*Z^s6Q;(_@#tRW23)~eZQ$4x9f{$sgP0|H%1yV~4zp33*|SlK zS70~u$1|nd*b&7 ztjId?ZMI`M?#y4rKcQHOvq`-br&P<|NI?t6;iA;z6u&>yxQMf_+Y}x(QVFI4waJK6 z4o?3_cE&KbBCi|br1c^j4w%J!IhVp$u!Ctfi(78uXQ0_DPeR;fOuj+f9$xY*#Rkn~ z?_#xfxk|Ribm>B?jy$)uD%TCbpazGMq+3vtA&kh=MEe&#Iz?X4nZw#alQ>bQ09Gf9 zgkcE~-YE<-^N{p0nL5I%?(O4fzbs@_Xhn42CTOT6ll0%y9yJdV9m&a4foHHO?-i&V zQJ3CzvyIyJO6N=HrBTG+WK#BV z14RQ6KXxz$idu28wa%z~a`^6vJt9&ms+dCdNBWg@I2J0_MA;3kotn$^N+*x?GI5~B zzC^nsp0$t94a&>a0p)(1jQu2fQ2w?b%FuyEYj!qYpI5i3QVI0jhKHmmUSOyP^GMr0 z4c&ad(O%|yCf)%Jyc_Poq-~g*oY$;*c@`34*mi)OWn|FTWNly`x5aWQSxTapQAuB} zJM*{`vxH1e%4EpkRm9bGV2>1xLC0zJ)Q!Mz&DIF~FpNM#R)d1iJbf+`$%oC!NxuT; z5}8^7x|O5do14M?+ur@&6s5{-c&#~A!8FCVM=fVW#te+lx@jyAjL*=x9T=a1aE>b9 z1LM=M6(V7)z)W1U>%jQzJuXr&zWgo9gHUiICf)HMTrcJ5Jqc5Iiq{po~GXCC4q zdQH<3-)DU0q1ZOrWghxlpl>2q{uF)0Wghx#JS0+b-BqeCG7o*)QS8b*^nXxqVW;!m z7R!G@0}q$~Qu;E6TC0Xak`!Yo4Q=`F5}G0NkkL$fqcgn!h-Q*`h=E&2z|p>@z_Zp3 z&w2$9(i|8aOEIN6aKa~ zABt_Bv@w%pqZ|EFOtH((Ng~gY1HqUiQmiL!-zLc&*`hz110nEcMsVz+!RA1VR$(#8 zv*1QI8Kn4792w;Ktri)ic%=Wc;J$3h@Py0)6Sbc8Q=(lOe)9?M8btu%tn?mCv$(excQ@)rB-`+(PwEH)-za zAXKFpV)qT9D#ds9fA+kTEor`2NE1YFMG-tQ9{uI{f_FQNih>EPWpa;N8RLS~&Dtzk z1EOM04aU)eRzmY4TIe?LLg1+7P%6IzJAAR59q#YI4${nK2Ps~GnOez~9lpe32Mfm| zVcaky-J6qSjIq&dvbg5j$u(lO4VOu|DC5tvH-7(_hDg_$6EUmKe)VcAmYpV3o98Qt zWltlxT1}IPtW7c}qOL!4K6a<`YL9zlz_!=B-qkYw79F+>lq%s(C_1Y}Qu(hhV z+@vyJs$Pid6x^j1Rzf=vf~KRTWvMA$1Kb3+c|{4RUmnQBxIHf08ca)|L|2sSZGF)| zyO{w(Oa(6nqRXpLCJ!7>I9C84O8J{F~MKXR~<-el4Mb72Yrp0zCT8ErwJNv@D8Lk=ctW_BqbSH8m|Ls zEy3y*B33|JEC2S#AySQ zy|JEsf5+=u%;vnGbhC~C-fui!?pEkf?6tyQhxebjv;1!Qh}#PN8a$+}P_8?q>S8PO zKRb$DTcKZtdJ9pqEzn>a%3m$*jqZn4_t>y8y4Mhv-;>bnMyr|hwiCXL_oA6>e=2|i zO8{v~7@%ElfHo+Au>WZQB*mN1vlF1s%@jb2^}h+grN@QeNxfylg}i~eA;jF6a#Juq zZ&b>XQaX}Ry2XuBDZVKVrJb8)htdx&3#H{BM044K+!V!A6oDI_^6B^o&HH5Z?Qo+{ ziZ{ohuXD5P(DyT`p>LzcQWSaXl~WB)@nqcXcH>TpV`p>cX4&EHf2D@I4Iz>Y)E%CN zUDuiI?r@_{iepjNxmk9o`@Pgqw_YQuC2Gk#sq@q{hxerg>e-Lz6g7UeHOq=I>q}zM zxeb1zKb_x-9w>@4@3s8b+H^v%4r`PwD~I365RIMsR)RnsbW(owAm4tiK*fj!NkU_~|(%Wh2QMCg3A0XkwzVx zBL3pm9YE~FtI9j+BhF{A4G)RLTz8eK3!lL*M=>&Z9l5sK_; zNaz7>Z6XhItL~2}Ev6Xu)$lIYT9u+V5;009k&{KjSd~{XcEtD(7aZ|Z?O9RJoZM5 z`DR|^>wGT2jgo02qe#GrLn`?qcPRmU%;z@+HG?jaS^X9_tKZ&%)px7sHmggqo`3yi z^~W+|_432$SiC_WJ9l!bQLFe(e`N0qNZ}Bmo7P0IfTGIY(eq3g(TH749+1c4^P}@n z(n|&EEvTV*J@{oax-tF;*+4-}9FufRoRQJoWR0fO$Y_u%dX<8-L{dNw5EtcQ;ynhkt5*L4 zSMCO~OY1ZlXg`o$N=scuN?u-l|EE~b*Y1dh_7o-W^6L^`w4~^U-IfdFxi%H-Xtyqq zSirR7gL`LN@X3yjkL2#y-LWs??ntceaB{3Zg00iVECYH$SPcj3!5B_MTz+dpGaL>#nn`bT zI=F~t;@@BZ*Sy5)L-I&2+lbzl_T^RXjy^EVABBl=X@z@HQDl*`$ie+vFsQG{Xr?qnQ+ww@I-` zKZx=rsS>4p72S!s{h!1PiWM(GHY<{nr}E7izHSY%&sG0KYj(=7+bhO#sRs%MP4row z=fY-qtosPhe~=VmTCWSbk@>dPP1-GP(n>Lx zHaDuJ_(&Y8<@vo9s->6`FZ7SMzcVvb9}-lXPV9&fQzw0KgY!X8tth#}jlkh;E-P!1 zqmjrV)L7$|G&|hXxLFm)E+WzlM+gl`BgHrOl^Q>s88s$^8obLO=p2a%h@z&f&(Sat860Z3s^W*inPUg9j)GN zKuJ!qwsnUqCX33pzLq-A+d4{vMIGL_G+FbFnX%>*y~HR5=SSIDONKbbfE5)lE7y9A zOKrgQK-4Re>y@eVEci3<!>AKk;9&PiFp}P4xb?`t!%}1j#@H? zYKvNmK8?6pRHV+1$kXsb>LvN98kV2xV{NP7#563c$FUtYQ=9eoV;^O9W`EJYw4Z%M z>i-=1d^iwBP#66k!l&I;JP2dyXga+z_Hq%gRRlk=utcyLMChdCy!vAxaiU)SBz?p= zuRei?WOj1hAypU7t3PoR+s-Qve)&CAT!`U=-=~3x%YPt!8AA=LpQS)Qxt4UjQlm= zH1)d-IQ+9T$aTQs?Asa@r6)2e!bxe|_$cuvOC{e%H~BVoAfGg|$tT4tLcZZ`8IZ61 zMd(%BUr#5IL=;$DM$*V%@JGGJv1#4#M}pt1TVCb=mr1ZKZh~#?Krm@$6HJO%gkamU zCfM7$Cs^c;OvDW#m^hqlHYv%cX*`c1?Ts{ZgYcilGK=@MZV|f6O;Ra-JWhnlbI%f? zQarX2BJ|FzN&0FbX~g0UaD2!J)(bpo4NkzQb_Q5Rt_^nxlSp!#nqc<&1ZKWiEOBPZ3SIu!^sh9% z{8X*gR1ntdwR%VBmOO{Z&qSsP%edRetGF+x#IEY#EkkaTwJ65a*rNoWZED=FieVVJ z)p==Vn;KF)8VWvb26Y2tjLC7ATR7jViepU_3AVDI=O%}gNDr45++LQ)5PoZ5P& zeA%;{v6gN>ilaX&+PKRl^dTjO>?QQ5Dvn)3rJ22iN-bD@kVSZ|78Tto|m=Z2e7&wRx#sAe|wMQR61uvi77Zj&*=YGkXn|;(IJL?(0b+ zWbFWXf5u{G;SWUC#xsMu^|=XVIa0|t8k6&LJ*slYLtTwdoGWfq8NNN`|J`@h=sic; z;NU z>ydpn8TFHOy*IfzMvCb~lvCG}=Lm2%bUi7i`x2uL*uKc0AIq9!f;$sQtgtgj&uG~U z>$9Tw4H>`j*{`t`Jz^~PI^31M7vKD4ExEPU^a_(H`o%h^gH4(e!Et=GQbsgE@_j_s z(@u(E!u&F|!c+CyoL_Iwk5|jcLDaog_*NzJY^_j747z2WG_$orDRydw9U+X-3a8vs z`9g5WUUqc@2q9iz1j;OkL|#!ga?i}MmhPI(SjoS(VO2dy3i8? zl7EkT_x4>4zAF8Yrv^Uz4W{`Pkboz}$|z~SlJN_-$0!9a-M%b#rKH6-A4pNp zQ}^w$V$?w=szzL7bHU0G)rv}i+R{lO5}Pw149VsQ93n-` z&s=%r@`j&5@2q;lq{(0GKnKY7DFUs zy>_|kU7qog&=q_f26%Z$tyoe~haO&JHebP6&{@Bj%+g7*D_yNSNgV_$PaopiG<{{p zrUq9p)&o(HdjfHx6$Ikv`>MWpBd$>uG8(D+FDnv|3iH6?f9pX1C z2`^lXDmX-{0H}zL(@DYTv0zHOiMdG>hA$Gc#in1Z18X zBH|Y!-_3Lp+Z~4zmXtirB%LpT`{mQ*k9EwK5Z4i> zNZ1oekq}dHxmgizh`r!+2e32Ymv_AQu-#cd_hl`+zKH4-*tjFBcnV9U3-nr&3iH(Sl5cn{p0x1*UPMPSg@ z&?+%rTr4v*Yu(UnR^8GyB{C|bLy9StniCp%4v)91*)1V7YO36Uu1)_*I=nhc{q~Jl zIlsYML`#rmU!gd-dU_lu*JkI)Gx7wqN51Ey7)>UGYeOiN|K$>H{otEIa0$dE$U~e7 zthW&Dh3yGG49Dcd^;iw`HBVwXnTA{3G?Ze>$m*n_Jhy2m#T3?{I4WBjK9&*<%MYU? z$$0RfNu&rOiBgfDA-N)W=L7ITYNKSt-{eNT6u&wS@$&pOYw}1j?K1TP@kcX2{6m8H zy8pITsSeJLOp^emfj75QEj6F;I;mtb?zg&eFU7G;FVAnWa4*Fa0@M%O zzdi%p2TUL0o>Fw07>!5$+VRHW#(cGqjB{LG1;8il#X^er$ML&7-)-SsiYZpUA2@$Y z1~|XZ=J%;ut>OtT?w-xo8$_x&;W z7Hr02d;`@$Zqx={6`iCH?Qo-9iYYmXb1jwU+btHC;(o2AS295Ph_RL)@-!mjvAuQ@ zstghcB%^w#8`V-At9r`woffL4nD+Vm!QEe;0jl>2stJ2%=JHkS%qTp@V|pWQ+4b|y zBQ>ax$=KfI#eI@*m#fVh#IN!*xyAuP3ZhQ?eh(bg$^dt9yb-F_~|$* z$n(9HtdU|OUO%YteHl>Uh)o5GcnFcndSg3|+lca>$A%D*h(Ge9unupB<0q}P``kns zQN?s6h;yx#=UXkJNHIm*^@AusngLO+ofAhHuKk-oTqqzZpI?05rzNh*BdM0!>JRDKM$V9mo3YP|OYDN()?^8HznhFw{JJ?T<0h`AcbDlJXuv)Z<6nK; zO%y49LmW}$`C}GQq?p#LeoT%}WI&YDHc`y9_v0F~*!7`s4BXRfqdcBETh-jsopd12 z>)hm#;uqt{BhPK}Nbxg$BG2DsK%O&8AWs|4cYXV8} zTlz$yf6jnHrC16b)miugG>=!OYh#{sQUz5alt`eP!)cx@_?~ssO^Tn4qnkXp?H(zn zOr-q~d~0{4v#}K2lz6R8H?eyhm~EqjWYoBk*vUA=l+Heymp+@G-LP?J=-g?w56}>` z_6RPi9og&H3|5!c%O04=8}@Y{n`5me#Wv-uMcjouEgQIWFM8PV3spSu>wdN17vp=M z&CjC)-jd+XDKjVb-12C*uZcYhWLcn_wy9Fk8I2MWtWc{Lo!JE+_pB?kC6*bRf7S!9 zgpEOe*00iFwJHZMNdJcYo8DHUV~7Z=#chN|TZKCb5eQ>;ah%OMZa_F&CAiR&>bqUQ z(H8105^+L7uwwCWf-N82SbjhzHN?GkBbLc%~A!)+x zk@Jq^tDK}YU#fc89WMAYHM%|)_dz3ixro5T`-`}0Nur!PUJM^X9-(lo4<-qIy1ibe zt<0bxVG4n*@=54mA9{(pKZhxf*HxETmkKg7FPEA#UJKJ&_Qtu_xqKbF;7z=z?!>wf zJ)Eqv^GNn?kN%8KFNoy0g*u>6Z%Pq!LKexFF;c5ShU70H$SFTn@tGvmTJ?Uur8{`R zQT+zTK{Df+6(3M-Ax?mVpZPAcEnw6gKA`)yu(P6$g(SQ}cT|~?b;e=l7*HDyh}ieB zsjXDduruqYX<=_jf+w*5reP}b;)CPdAUZ-i)VYBIDe0wPb@e=@m)glkjCFHq<+TyCDVGb%d4iLW|a_ z$on137iNsG`8j2tHNc^sUq$sgGd-q7&>COr`T0m67E{`9yL?Nqr`L|~SqO3j*z4nk z6(`5*=t*xZ8h**=(+!XqNJ{QOp9;m6;>m)Kh$IMI6qnQ*5^zV?d>T?NZ4)Hv^+cOd z>A8AcE-R&rI9K?GmffE5W1;-h?!|+2c!aPSUd75dzEMh};Wjadev=!~QXCs@ zBhNj{^&!O+!Voo~vqE$(14Q39&R9#tHrFsw-d%9hOKxmSG2P$nWNUf8-omyN-_$2; zKal~pce*UGXuRG!gfY#)i0%-@RCFU&is>eDCt~HfjaVt(+9$+5lL2CP31SuUg0({D z)5^-tb4&W~a`v3gng#3EuTR4yb@>}Z$H;!~KzK$s(1OELc12cA5r>H5y46~%QJK#n zBtt3IOI9;GO6Mdc!vrl)F_LcB_|Xy-;U2_V609%Iz-S`Z0R@>WRMuK`&;vgiyjXqC zIn%ovN@e)=8Z)(4rATIJgGGXuFVt(Wlvv3Q^vrnG$~_|-i5Jpwcy7(W;rYv(dq}T< zI3wl#0HGo$1oW|Vc2J6YrV*SD2wW^No>6sX`31ULh`d3BdURiE6l#~?B8?t1prh`v zuaV+G4Pjh+495w%n3ORHUuD}-=+OH*aO)1-x)hueEMXGD;Pj2UL`)a;2X5VgTNkd= z&{1u=LMNS}fHpg7Z(Ez@F$oXuz^%Kqc(Ek?AoRoz+`0p|F3w#PPhxB2xl*Hfz~TMs z7~qq{Y2;xE{FR~FLwXdp4+d`Cfm=6Ix2`Lp1-$MQwk8%>ponW$^rq{zS?^N5UV?!e zaxQM%CXO8o)78CE#4gzx5}K&;yk&g40r!S-Da~8 zFmwhB?u)Ym+}AOKMYJ(zt=JjKS`m4;+)Nd#V>4CE;>{;+E?4OzE>p!tJS5C=-PNit zGF8+Z#df9&YBr5}3z}RrG}LgpB(06k*Q?I4)ns(8;VZu_q1i60ne;}-A6sa4ev!AD z7@RGKakgQ03Q9pOPw^{@Wd>`V8?22AtS7AgrT8TJcY>AN?AZ`3#p;&X? zd5|+u?6fe4^iSu`KcNyBFlslFRTNInB(&bB(E1t+tx`;3%uci>H#?FcTEBJ~Xe}?G zu_TDt8bMJT{CWXdB78<3PV*H(GOm6o24AJ<$l+bufJEq#OxrI>uOs#gY zD^zY#s61eyQi@N-p)$GIM24vRo|I6z(?U}l9@V*%t`T{YLgbScBBl6r93qpO(HSBo z$kUgYA4&<4yZEq31W#?4+#U$fNTuZEXRAWy>nvnS@!2?JCO12iAu@kHC1mb)psEd@ zd?5D>&MIQBplg(FQz$)Rp;U_Le1=nICO3OyhA92@lu&v*FFkG8YQyR+R1cv=ym>R< zHD0$XydJagD#cTAcuj70K100zK}vYNBMx6}nBDetr8bqXj3fV0DPJkQy`%QIQ{fb+ zy$q#TiciGhG`ZP$hB*DJlyG`WJEq#Oxg|J9)YbaFOQF(U-=#QqeNS$d<@)|lDWP(w zg{Ar1z*JgR0xS~9d_!FPuM6>)B#=rYY9EI>9NQXr?%x;T5}Xd zL;CF*L@m1&nEH3nWhC^w<4arWjrh)&*JnTq-HRrVE?Ww;&c#ls6|)BRj9v2iYU;oQTXqsN|l z;pq+M&dfIulbt(Ko1LpwAq1Ys*}qEeSh0je22bHKh6bG$80o6k8JwBJ{b4?$Sa2%u zF27nVO>Y=TChg@JNGA4y^)vwolF7YHcP*Ke3*a22ihF-x14m*X!&yXRCR@T5!69pl zVAD=pMS8T`EdmXR-X-Af*h8D^xJzKQ=Z%6}A{zzf^X2Xptcu+$cok4E@nrc9`iR>r zxD5}<>Cbgnsk+!JxYJSW+AG+FdJDVs3muqb3LdUsXdGND-$Ek~mv>8N##pP>Sa7i# zV`*^9dlH)AqEVxn^ma3>q?;Zd_V(0ZbI*%_rR!8)9jPln(fZL<-zkg zh7v>ZkQz3st?s7N->#t=bb{RT`73WAz`Xt5L$WKvT(jBiKAC-XxYg8>R)Ej@m#HN zQLw$vJy~}tZ11tqCdHIS+c{a2n^CHe46*%udf47&pbD4-=E4I^jLfw!Re;1$=Eb1# zW`)LEEi_6orHpiql$;)a45}i)Y4dP zr1-WFhrIvY^&)ng8g-r3>z%52TO2Ub47rF6V5FGtW{48hCkhyzr)4c-bLkQEtaG^{ ziEpkQ#uieb#q`GuF6;)E+l6?pDR?6?zD&@ z#b2B)F|MUYjCTq#@^k{q;}w?NA-o<4{zgwGLp?Fn>8; zYT}9~PIEXC^q`wX$Vhjwz7?@V<&@R03#lRN>|6CU?JBo|7C$4Alnzl8jcJ@74Ddi9 zfH<&EJWF?&j`MPQ+AsJ>@KU#Qx2)!hR`0GG2H-cBbEqs!H_%P=dH9vQ`(zI9cF*B` zYO>l^!2wkqE8V5pL)ILY;)ks{oHAR!D?PTnRiD)qH?!N$^E5t3LY>`R^^oU}dEKxy z<=2|Z7cPeVDM_HE09g(}CGSZnK}dcRCoT9kS5lL_6Q~tt`3bLk9oZZ9grkqt)85gD z1kpTAYLz!)=wEST`re^KteRot0wR#-V$?W>#umPt+$v0Kks86ziE0-w9Fm7ot|NOJii|kVm?xo{&8!u)3wQri1LA%h z4-8Bi8G|!b%T{89zq=75q9F`cMyG1Tq%f~E9|(Gqj3R~&296cQuXI6Ar|PX;#bud% zx27lH&q2V`?V*i1N+Y2??C>%Ur~QBNkoIZ0?y#zhecB&!6ub6mzYp~mG`YT?h8iyafV4I` z-=I3j=8n<1hOhjggl0I?Wi*rC=uFp-p_y#VGB|5aQATYr4@0xo4b6=T8u(z0Znvmn z^1(Qvk!Ckr&7@dEqd5F00GVmRE}iv$k@`xV^>{<}p}BgkiOWckn@9Nakf(6SqFg&i zLKnBVy@dKIyfPWzJKXr*t%_-T$BA!ghRq~{Oj1nE6!p``_irr&-{p^?vD(BuyFoi) zWib>Sdq))BkOH02OzT7#RT;>KpiaIKkS45q=ujBDO2LucwTOfpb=Tl2A4kW1Y8Hku zcGpmaCt7u7&x849$4j`Hajw-o)2t)!(^IVyB@h=TTIZg$w<&Hx?oNXnq?j^MI+>_* zv#gltlj$(g!cG^iqR8C+l3%aa>L+`}=5LF>QQ1xwCV#tZ@1HlyJGl#8MQ2H!6;Nv0g$_#^e>^PK7>u zMfOzjSH_`Fp4<9?6jMImtkAb%*V0$y$O^IWo#!~N=yC6GrBb_0TM1*{^ZEHHpT3@t zT2qtIi4`inC|>Cj4HXSVdjq;s?u?{~#Ni_4##gddbur?SDWTKJkjf*Y@bRmo-7LDd z9@E068`AD|llCrE{O&l?%5$5vQcM@rXGPkZQzGpTE`_vh$XzOZ)lK8 zh?}(csp42YTACr;(pbr*m?9jrBJJHNk@k4F!67=%h+b0i@YY76GI<%enPnIs`a-Kr7al zYNa9)^g6LO63~H8g`7Ax8S2kcUy#gOc-Sq2K1a^KPo z9JC1>=kd4O1cSA87TIsr;in;}N$(|xR>;(da^5X*ZIW5 zg0ol}#p%dPBGgSF)KQ1SAV#duxJh-f1F59hZfizKG5Hy?66^JpNL3Y58MxwmYNE)C zrJ3QA35^+}vk|&{K=h=jrn44a%sC{SPo6__Zo;%W5JsBW>#Y>i8M3Sh^Cc+}<^>@P zYcqnXkPNm0ZR@Lta$yTv{`hz_i9_IDLZ!c#98N|^-_rL(ekvX3)!BFBf>?R$P?=Lv zeWJ!u$g_NxLu0Sa2n8QqARFux zd_it6n9+l3p_QG5L!N6rR*P*AHfT49TO7<*hTy?4hIkUYa4CME{=4`zXD$Wa$Z{)A z$|d?G4f|}9t)5*HoOuj*mkt>r_(tR|Vl z#0q8$mxfMuzG~+d?66+t1|$jyLN+5ly3Ds?vbgU~%rgW7LztMfZBBG=2y0R2rd7BI zW7A$4{59TNjTHynjk5e22kAZ!t0Atwg76VT@4)_`W^|&ehy5}zyT$;EW3SiOkGAUR z-6P9LsCp8y=`XOX<5r07t+uY;URHC=SlR*Zj{Jvlxm>uQaQLv=Kc+<`SbB199x#-N z>`bC0F(q2O=%76arBMB6Ok7#yMDOE(mLFeO9bGcXilg2GJ^LcbyxtC47* zB1fU9@q9aoiYbq|M1zz$IvqHKL+B{t-=sB_b5V26Ylh*}ig>EUFC zMOzK*kbxZn8EDV@Bs)YMEO4w;2P2U03OnBx0N*{5@nm&MsbgYT% z-k|E@Skrepie1N=-iLY%PSSoWjXGTZHtEP1XPp`cCqImFG^pk8N@%vjY9_tii*3X2 zL$mXX^gayO_9Mt|(DaYv0za7C>Sl(;GDEh;4cR6I8Dgsq$nI3d6s75eOqwB)pwUc< z9}FQ=ljQpWWd6$d|9ns4D#h z!ox#(rQxRPHk3K4c><^4H3ZITc;~rFe!jhC!mCh6PUz{u)et@Oi=a5_H}j#eUfTHMNmP!-Qq+Bh>TN#K_~6c{N48Ih!f+gXv6>^3S0kIkxtjZIeJbqX?bmawq%XZuM2o7V>;Y8mg;DLqvN; z+?~rvQPIF?gUtKOgf1f0ONCtbUnMe}6W za)Fcs3RH|vmSESR;hcNcyff$AVBQl;(cfSJez`8dVa|zn(+Vexv3Za1){|3ZoPpP| zA~>$NgzEwxwyq2KHIfX59e1ExJFX2NZN_o0tP?-l(TsC@-=#r^%fBc67{d&!VW0*X!)Qp$ zpG;^58_sAZz1;&#>HnaaWT{}lcDz&yZhlkhKhoIZ7zo3*&JEjI1sg7SH3pI5a~Q-4 zTXHkH|53rFRMfu!oar;{KTxlIVOY*+@hTT`l>vl}19cXMsW8k5F_Y20PN5xn;SID) zF(r6+qCL48nf2MDebvorpuPOBpq}L9-^>Vep>orBLkrKMpmdF!lQ$@o!XIIvbf+pN ze}ogI(hQOBMl&hy4@$SBjncEbamXnQ{6o|b1@TVRY8B5wsHC+%=uj3r1<{6FxhD8O!kw+WM<-C&du+{ zt1uWzGn}emo(pLQ*Jc~NnABH8f>TCcWXz_IIKf0haS2jMcSrI^k4V4hFYqluaA{Vg z2NAJJKgs)AYSZvAP3%`g%58J%!L=B^C-vlf3GCr3&Tb#WZZ8nGSJd#UW90gv&TnU; z1pZYjN?=4AIr~9e0_pNroV0DZ@UV_MuQXg}xDgUg_KYwwO&i5PuYr-JJ?Fby922!_8Hw#XX52UWb z0I8$&_i|Kj!##jsC2y8<4`4%>4F;ZAcK(0FbcJ?(3MJZ+kDwB=GXF(BKabCept zyYZo+=GZb9hSZy#_}8KBW}~=4R}c0#&w5OU2K}X z$x(b~tF^GMFoVRq$XBZ@nA7)e1g%osEIksABRuJK>XNHhfa7;Zyr3Q-HM}d_PO$TsM5r zyDrnAK^rGoM(9Bh&DGT3>0UuPBR2wH(er+zk-y+`u$5FDjrtVDCCrSlLDyd_Gi$DK zlYX6>^cy>nUYa5OxWO?}e0Rv2{U!a?j7VR;jE-fW=gTc`hCZ7d&?k{4joi+T$V%6}7$ zIb8l`>Bbmkl^O+Wp)raEwEP_j&7de6&7?QF9Ok>wOcdEfxYoPjTCL!M0&5JgMir9+ z>x4_1*>Fj*hD&KN-vb!4vwkC2EsGncP=P5I(fO@n6+y_D%{ z=%vhQYuprF=cee!4iuGU&`S+QkYdtH6{q!wqCb~1Maw^h4n+@rPiH-}jba@&P@-*- zgHiI+xR(MNsq}&Dtj&Do`BJ4)YWM|g3O25JvyoqIdg(W0JXyXkJJg=t*QSR83(@7V zv;Ju{SkCO}R^1dz>G_#GwH@kbx=Z}~GNkfzOH(&3$_`k8+3Z@VWxk6uegZB6~GdWD};%$oR2pYu2xGP*cQfcTk-Up2?T0P9+x}ha>b5O3`zr zMw9ZaM%G$!!!oBB>Mrx{8aHFCb2G-q4vZnqpza#{B*moeD&FloV{E)7GsY;dMc<+X zf2yMrOawX*L)!?^Xzw<3$SRg;oUBsHXkMot_pT}jU+&pjsXDUPJLv5l(_E4}<5v(7 zH*$q8q`G_W)hoH@{pL)qi2w6+hWAkJNG0EB9LkZGh7z}3Q3aFpbG|Oz`$F|%wRX9> z_gW4;uwRRuI(tV)ueGVypXlEl|A*}6c!ZQ^f5=w46DDp)r7NLrMw7lvE&Y|njt>1l zv!&)w`@@F6y(Ft3f!_wadVPq_&_MYuFp}Fqx!rN6@A6#YH>lW;e}{$mi+*EhsO-_Q zXt=~rFTp}d0#lnPJQnL_6TO%y9Xn?m_Vm0 zC|%+k+(YUvY2QFvs5c07wY6;H+@yvUs7YU!-GmH0!+~Pg4W!AF& zEkG+|`%ClzTsvj^oAHojJJ%gjbs^i|>L_-}_7_oaA&EQQNP`cT-z5DR!wG1ZDaLRb z;__5NGYEE9Gdj9Gjb?#he*?bvg}2Hy&~?OHEYII&$n#ikOc3UNAl8%QxUSSL!ZVu6 z=dwa~xrv@dcz=EG!n-dxR`U8e0@Nw5cc>+VeJH7j>PvyBeg~o55Y^8vK~%fI(^8tp z;F)x!7bzXvDGTWP-2ytUQP#3~0eFOL{%ZOFa-FjItMHIyGuItbbs?MI)^}!rRkl)54}nbzn!3U%HiFIDJX;-(`R5N z!Kh9}7+(#9@%Iq!4Pm^L#Wog3Es=Sk-gTSgo|E+E#Fkmh=Kl_~LN@;xeE`=^+5BNV zB-zY$hg4n2<{x(yyJYhZquxRicl-zqK3x89(w{M$fQA`j45uM3|71cl2xwO`(wl!4 z%>n`aL-^ho-ueX^=sMypwHs>4>sW5=kI>F&Qhz8b#Fsyco<)3rTkqn#&)8Nn{JRKb zrwre&mJ<@s8kHnMbb-f5+XV+yGzhCSYzs?p}3*TM9BgEg$^br@~xC0MK_;TGLRTskd7Dus5 z_-;YH1s5A^r9p?w+oT_3m{n>R%m8B;4Qct-gk})EMl zEy)|vEU-Do@x32>b)Lq#Zup89pvMe}Op2+CMr{uI_D#`jX5xvAFjl^Rj%87LbMJz- z2Rtc>d5DH{O3cly{VvZBbCYEa)Cg;aoIJV&Yrq6dOGoaVx%kOmEC5G$EED&+)&KVD zSxdq%0oEqAl>a?_#OeOm@Q@@S*Bw%IAql_KQS6e0S5R-EjpA>o5r@lHr4wU}RcZ|I zsxgKJv-}?unnC^<&7`;6ApgDs&CaW|Q3+73cSE&WK?MuI=zfhVrZY@VsHE9OtCPT^asq=wUsZ;(I zbSKjODL3Mk0d~lfK+f>YSMWP>PDl=S^-h-?-E`U9fiBX_ri&E!mo7h$8C_<(qDv$w z_mCqhm(!%h#p0SI^p%jgOfQt#Qu&{~B&{hL4^RNengA8|VN$MBGJY_2<`>O#lxZ-iewpWA4J73CjZ zOPYp^ZD+MW$cFZ3$e0dG)l}enI6s>9 zx$cmv3z>V!QS6eruSUHEHy6Byh8-@yR(di95}+^xjDa+)<--ZhAaq^LC`$4engv4l zQG7RrZt6TVPD89P53$@eqa+>t)*r!}I)WchAHn4_=u<@R5~3vghFc|j?;~KHy6!H9 zOv0BI*MI#xQKcSu^cf?BM+A^NN2`a0vBe4F_s3m zTuW#MQS54V7Z|C5W`QU!;CuG`beTrEF8GOM@|AX7xQ+e#BbKw6yfc{~yZoi-R)q8W zmZ%r^3CT)6zmec|%I7`gSf^-1zZhOM%lC^ePgJi~aV(U{h+Px!Bsv(P`o$%P>W;8# zsm%lOEIZYU)b4Hs7T}M&1$b9IWG&0z3v^H1Q2s{x01ce7{J-EK$#Skcr0PPJf0Luw zCClH9dJElf&msXaTz-%AYYe+e4U4&C467k8zb~N~#JbT;ddq?7-j8O1SpPbF?9 zR~qm-<~^4CUuMYtj$A8CKp0k$wA;(u^O0@q9(*DhONFn`nlj}dzzDK3e0T3F!%C4s ztrA~Busc_Y+gOVy=#G{eh1w;*o{lPiEm$8uM1(Qchoz(*O@LCb3_KLi&YqIJcj}wh zgh$+KLWj0luLl1U$c1MAi}V4EJ6D7MfrqpjaNQwQ7puW9If`AY!B3;!LNb^9EDb+g z{yFK<7*K%2%rOSkFqeNhp&8ZzS2N0_{%dF!tOGxV?|tI2-=LwcGah59f6b8k34GZf zl|Qpd{`1)pp#1yjTSWW^dKdA1$GMX2KSDq|W&6$QL~WZrvK$x9d?45Vl;~i{_2-wM z_s2k}WjYVT^X+&q+I~{MEYBZs%kzYGS%T8JT_jpLMoa+v$x{&3c zbric~`QM`6LOfS|nuZ=Oe@1#U1{1(AJ&eILyyed&G=m&>HKQ<@&!br&$NvW3`@mCQ zbXy?9SDvR>cF!BKJBA1QBeye|#D7P0O@9)XH-eBNufL^tdEHk$D_Q+XAi^!HZ&lEc zBA#Z_u6G3DdOPvFA+Ap?SzNn-)DoLVVq%Z?F0o^~W}*FXlF*K8nzh`%3z&u6zMDRP zZl~PdgNG!yx$cmv3%Pxdqu3?4Z%4g_L=L%wMjtNUDIFT)32c}t#&{a!^1g&-5Z$h3 z`@mTDp;;ihZ^QTg@YjAC>AK=Cmf`Pk$Z!`+_D76oHMzaakY9c+x)x#n{-p}@{vlk+ z^Q{DPRQHw>E9-EHgub>J*Avao!4FSYvmV7YLr?q2RG)9w>cPE3OH#-hrGWG+q&wH9u`eTP(`{CXg9Vq5t%eZWuP&+>^Jh_Sp$nFHj{3!kd+F8~b)6a&^Tild173b1 zq1k4une;~9^*5r~62M&V26KY~6G8F@m|Imb9YJ-1Da~-0&S)mZl)FZOspjB0fSfts zPtzdR0pHV7bM}}%SJr8^7-z@m^0fW?y)%9jDQn)=D%Ej^@Lat%=hvGhzu`4&UO@?} z`{_DiuaTejy`n#zZ&jKN_WV-^Bx0XxfusF8Ze45oSDMIxQ}r)99vm(d5W!!okGLP> zKE5Z6Zbk7OFQUh%Tcu*|*z8<$9=G?MX;K!M5vw|f{f$>KyQ>ACfM``JxPFkrIfFqz{Z zMg|M>iL9CH`Bg(hRorvfn9F0f=>_|V4IB1Ds2pgtW@q#D`GfrHuqjEV>m@9(m3a@_ zOO%h=t4+K4&TG!(n`m2Y;@ZxJSF2X$xxZ3%x>ld%=mjr-2{8?H6{v@*jasV?a4sl~ zin=Dzl~W+?4`CABd@w6SWUsvF#jH@v_aTyBB8E-1d2_HM=@)6yS(1{x!%~vpLDR%g zl3&}cl59ewRbuXvRfC5*s>F^ySOLCW&!_$Eb+S`;7l4k5?d7kgk2rPrtMHK2U9OAk z7^p7P-FG>PZFP5q+I=}HF0|3|E2tY>1tGl{gRE79U|BN;xiN&Z{IvjwsnW$(4VR&(Gs?Vn~@BkQe{vEXGBVC||g*qp=VjiLHd45i23`Ffb2T+x{%| zz4Hv4#n0D@ekD>-z4(VYFLJkFZwTH-!u|i8CY&*cyLM)1NcKD7((a5f6z}Tz5#-h4J;zj$+rw z@n=vkmK*+_1|BZ|gY;z#wMq>ICN_rB(3bzdgk~_ojAqgs**inG2OA6w+m>hYjl)g2 zcc)rSpO<2WYK*(pEVwL~69`Wa1!NgD)pzuBr+UEz-Vjk%xbgbL1dGR+x$GU8q zjs|c;tOoEfFgtN$`4Rev(*PdCLn1ZTy+PH52Jon(*rfrCq259whvaDV;qrdz&=_x6 zjR(n&`iY{Fo5fiAi0?+01VF>H#}<|EJ>4|5a`^|d1%6=LcUU&SKIr3 zQE3H@k=RGH>^E|!IAv`_Of^Q&dr$^gvlzF+RS}@W1~Zvu~GRnx|ZmIxi+p~YH7hw3v#cc11ASqkcgMKba++tLqKTu?(4GfOmX*8$lc{BI4^4Hk#7qTq z%VcY=;%gc$Nvqs#Ig;K&9A`L^j`i+>+iyXpRY~rim)3(lINF^3vHm#X^u4+2r=v8+ zyN#+q+{Df08hykmjTJm3rIG6nsk%@a=N!c@rSSslEwod;L_-dj%hHQ6$SO4m77Jq# z4QIKY&Yq&Xm(!h*)v!>Cu=9C%6_4FxL(iCADDb_%$s}&TR05d8aHsO z6>v}+jZxOBVp1EOz)7>)t!7e88Bi2(YW`dSpcyjsf28hLh@sg_6dY0$xm;r+96ARb z&P5QV){Q9gjCxIyATgezbNnzj-t=cdO#S1b^Px&byv)?!?HUXm@NfqXSnuY58#{1- zG_yHCiu=p~UzaWil)oDNiO=d?=9-&KTSm7*Un*H5jiUsA*g^1D#St81KGK2co83g; z+JWfO%qF@N_nGM5k{!{%y;q_$%G(G}rD+g9$_bA+IAKo`Cjf{?J8;8xH#h9+zzx#O z<_0P5GdFy1cHHpcrEmkI-N_O3Bz3NcvdE*FMI^drnvj#7M)~&4aDVm#h^=-zrY-%} zX;CLjYjLoovl1JZ26d$ffDaxvL7)@rD?zxWz%SPq+?Zd+cTU4p~L1)lcW@EC059_htv6Wb}fZti!x zZsHoHU zH(YBJT=3r*1ME`8n1?Pi9z;ax2a(ZO%TQSlZK7&k0Ve|D;qgKtGtQSj&@`)TuCPY}hJ?Y*5U%@?tG1~fEE@upXKB+qiiC3Zm(O$={AlyHU*5XjSq$zoe zdrIEcVM_%z)t{!PTex%iC)@H-mcB)>x zR6;@p%ErK7Y!NGy-KKd^J)Y|A@wG{ldc;le`#KO@n%M-GV%o&%_d2^NV}gHo9Kl19 zQkZKbW;QaP$5eoAsfzP4B}$%wsJ*r|H3&%=iDQ*f3BJwQJR$u$BtUPx@Q9lij(6Y% zX=d|+6t4s?+?p*foc)Z$c^Am|c6NxPXE^n{VvlBhKGb2ZhTlkWA{~U(3655RLWbn8 zr3+O`moQli9)wVhj(Ydr8;y1NYIh-!qk|<$)UR)^sZ3DNxVN4K=;c}jz-hYTnqau=EA78hHpG!-LzgCkFb_=cCqvA1fi2_3dl zD()TC7&Nhmq#4H%M#uUm<=)|RJF|XsrdITj?ZV5QI5z1WuR}w=T&rIU;p`GwXOO%n zJA_3Qi<=#!qS2F0y3=m)^2QG0MVj4V>5o$U=n5<~`!W_UN7};f!s&~>_ZZx(rDu7v z<}Qd5u;7`=!zYd&K7BM~K$)o+IRvEfhEm>|t&~=1B$&<0PJ>7aTNq;DE*~nZ-G9(F zQ4-{i@UlhP^cgX&r5zDL2nv?7*|q3^6W-_d<&A zUjd$dBx9ca@;08GjOW!*Q(7XsMuK}oMqrv>-H-(fM_06vXGtj2U-XPq`$K~@du91> zQP&Hq;(k6)WpwT2`n$TAu*o8O*3JIk-+}$5*_{^qOYu`H!2X9bX8#-34-L)LOP6q> zAvgmTa;BOG;m`0k zdIi&dC1FpMBaNZmfZ?Q~9@i_PDpZ~ZQV&wHt{GpepTyzeq#->vSOT1iDe0(js#Oel zu(cd-<6K~rKFec7y>Dukdmb%VtZGL=4DMO*a2kv6#LN!7aD=XbJB4(oP%iyC>-O+r z>R;J`X%5phtT?ycLVCAZ{>TnG=|2vvkQJ|n--!I8wv(fk)%1LI-m8I+>t5WPHJXd| z#5#(~Z)vD6QDDM$G-Rm)+Ids+k*P%Ug_y80=NC%TCBGOpps9|%IkfPLG%vyUF;gOJ zLa&y4ky3Vyupt#n3Kla@Dz~_y!Flg^hZk5FMmN;eAy{IekfSbaYs~0h)0o=Q-{W?B z4$$$GejQ=E7+t4f^=Udv7>f2fn`3W5~FJpFno|LeDxqb z=|~7W4Ic%PI-x%jcwr@Pk4k5%;Zl`c5YUsbVIz0ASk(Q97bs{jI@72%-;oGP>l0U$-JqxB_Y($g zE+enAPdh$RS!hNsm1r3ahKZx1v?AUBH+oG(VK^B2GqJuKIRn8^eV7fVGS|lr+Kj>CC|EPn)`9tct?IV!l zmGBXq$XMZg$J(Kxb7$roh@j6ME#)s%YYpsZHsGNu`iHScIo~KXaxYX1HCP4|8IrG% zj|<6*8sf_u*?aipBsMwsjz9O%1CKrQ_+-9LQ;k@6UqkkxykZT`Eplu%kS3xrJrAE9 z=lbKs%4qy7ltQdS5F(U^^+|7U$h2yDvSW->Ce<%N{li*D>R-K8rIf9EN6+)*O6xTq ze&Epu9zO#A8WKm#3qXui0Y1qk?{cX*TeIS~Bn& z#OT(t&sfMr_=S_38kp;OWSI?C1W4Ud6YP=?cJ7(%ltG+QztO9Y5clLMzpqMF07A%i zH&@jn*;ot-7^n~8WTjv1Wach)6a6M6d_+2#DZwMs3ox^J58Xvhg6cHhS1bK)Kpyn`U39Q~) zUCvFnYd=K2Q5Z;G2)SNU^)h4l15LsTY>~H8b2$W7YXM7x4kx?~k~ZSO4e?;GE1{P7 zE)Kh$Skus2DeY7dj7JJcc!ab(Kgwpk$90q;kYlY+p!g@9xVl^mJz3l|$?UFWN@ z9vW{3D-xcE5|%C~Amuc4tteFnyT6nZ7Z(u}W+3Qlf!#_Mkc{SdIbbOC#RCBt2bvIu zyhgEnd~)yP-h-1EfQo4_JuGL8vC#diB)VQ}MAX{hEy0TghOJ28 zWF|ZuDD~l9Q)F>bu3po34qYbGsGNRr?8}5FqZ}=Mo4p6&j0A7iIW)r0*Wt$_R+Yzm z;qBbik-59#uBfw7&jXSmq`#3Q7zFj$ZsZUvgP@*eM?s06>t08p%fSZZ zZ9lzSG(7geCakPuSXy!O4>@51OFvv}=zbq7$|+f1Ma4w04#X{d-iQ|QV_vW|H|Cv+ z?tG1TezTApZ5JWYkRpqrdLsE~SeNy==dT5HP4H^;!#_agu|T z(rk&+wUR^0#-c<-fMk{zNZH0TLUX2GyWH?jIHTRjE7eY|C~XY*Ok*LGj`0y6gXknX zIw?sXh?#k$GzR)mx!6lCi$M$tT@yvD6Cad83qAb}Vn~9>=OChD5JPf3$B;Pk z>!qK6=vOn29r-Va9U*pW%;gKX`|}0F{UHdo?srb`KZq_dLS+V7in`j^A4HdMkjo&t z#B#=+N;jd7vX0^+UP7IA5M45_cPy_Tp3G)5H>>!mc5WI(mne;XkTM2V^2;}6%o6sv z`?{eW6%&K#l0kIID<}8O5@y~Yx`Z=0T#xZ$gXj{KIng`1LX|`u_3T@SUz1 z`|QVth8DIx?>F;B$lYb$8~3Hwy>SIfer8hd$~0(rc1sv z?miv6vR~t4zq?5~H^vPutjB@&IucCy^~H&y*1`=)U%p7>X#j&0Us7(;N8F8ZZ^Of| z?vSdB8{=AzV%Lpv71VQcK$S)vF4v?ZW1LlL99(r|jH5v~Om*|POl z(g-Wc)_hUiSF|T{KSUnAC_RF!Zs_ugV2&W`9{uEtGjJouByzfjP1x(BU18(Lsz_s1 zr&~&NHr${eR)f>%|b>z9rwFw z+uT#)RUM{;G}~iM2`SF?eM)?N>QkcpZgi=xYCC(WjnkuyIeF0FdcygD?VGK7ByCdf zY%fuMDpl+fME#v^zW(A4d@apvQ7^^)7xmwsDPLFH_77+RXyf?A6EFQ|VoQ-(g@#?V~}>H&B2aZlu`3l$gEog!*T zyFA`>)W=k-BZCj=DvRYL#rrjG=9S_%KwWSu-tzorOUsbryZf$X{6v<_yKvgd`~j?b z296W83ZxJgO_#ZuT^LX34fXp3PGck!?Qu8Jr1)eU(d0QUdNhnI zDZZ=kMEgjlM4K>)CJ9b8io2v4Q6oaFg^fo`jk!vGzB82$xTz$?r{bt2&uuD6asQ{* zZ)ZxS=bTiE;CP8-+8t&eR}|Oz$CIblK{wH)xDrP+d2Y)?DSn{uQ|nJMCEAQhG)^2F zi|;N87|9iX1S!*+-a+qy=)Bts>zOu3v<00^$ir?zKBtOfJxbCnXURw@KGb(YekMyo zp1qc+m5m$tW?R}QX(W-B^_79YNE9^-m6S}*b`SN+;3wP+ezpUHOEa6nrMUkL{;!!b zcrgtIPclL>U~}m1bjyp{*}2Zl=`Q&A9&&Rw=Bovg6=!O#dckMePM1t{E4<(2=54pX)d{!dZY?c&k@wwC?XB8wmt;G!V_QqwTI^0smLs)e5m|9c zRj<3NR9)4sMN(T9Fbp#=LlYRjW*Y*8EhMZ1Awa$i1PC+CgkhU7eEdEJ1_=9>u!ayq z=6}vTZ@Kr~_o}M1AFK5$(I6Col$NR{AnzhIs1Znxx<2yZsvlK;{Gp~n=)N6@9F1)8EhJU zaK|dw#qHQg`xQ{2ZjfeJW!;Y7~*cf6bijT z2L21(vR>Ez3lb2gJucPN&CP%^z6(sxo+YyQZMctH2ubROJT8#6JI|$jZq1(G2L$N$ zrqasRDO{=9#$D5`Pr`t!yr8g+n4R@p&4vKPsTv$qXOZ9SL3tgmC_5$I?w&8S@Juj0 z1TIh91}=Z{tR`M;Qi-hfEjhdk7-k{zx*AxDS111sRQj5rjdfN*f+R6Duw}AMz9XhP zn|avna9~+W&E2*a3qqgCH&{@svh#GJk~%&FR|vl0XJCC`F-?+cZ7%Hb7!LLvxUUzo zwK^{jgf%iWN2`6333``S@ z)ReL6FC!W}9}`NnYJN{rQ3kdlj^#>X>w#&)t+|bIQ4|Juwu~I{c*QiyF~A9&o~@33 zikAnb2_*e7qhuD?2|Uk>Hnh_wH|t9*&A>EK$a~KchbZF<@AP)sRbzT!nm_=Bw|4ro zC_1A&I8QOFB$!b#_E5AR7-_t{0 zCX~wO!^KBcF*12nF8lb=~rB)lxI*$q~f+Csx3059JUnOGNtTCyX81;I7kzZR1V2l z+Ek-zDkK}wrV5~~Je$xB$x^g#GTJzp=oq?5vJ?jH3S5{ScN=HRMM^EPQemJr+JU-C z0fkg4+UVD)VhU`r0wvw9H@ZnN&?Z2sRW$B4iuJdCWWQ=zV%q|uVhW(g*Xa_kiA;^hK3MhQE1U_pDdLQ zEa94=TqHi|D8uiw({z6an&wpf?Z&E=;s@4)reBdUO;5aWWN7H*G56(mx#2bi$NTFg zq-A}+={B7sg)=I=$g@v5v-O5kQnYYdAO^0<=E_*?1+rO9{59#cqKnsCBx#*Ea% zl$%+b01t52+SRI_ok9o71FS6mVR-0m(QUMr09<$|+8Mp7+?a>Yu?gq+QnTeQQ)K@#TJKh2V6piokVDkV0OeUE72(Y&ms%Ab@YD1 zNTCiEc-vOE4C$JFEpOeNohwF2Y5Ey|4oO`-GhgCdBgs!=6$u0R1D9FP4#wd7(7J0{g z=^6XJbfm++G^Og1{Xo+urTC8Z*q2ta-j^Om@J!bG(%E{sL_3nuF6*rb_l~YpsFjGr z=G>O^pg4x|+9a+k))yA5F72Z}v%Lg400=`{VNQ-Z+KP8LjKDX_1;%Qkj5O^*y2EMC`IwT2-*27^Z~K z5Nb11f~8cruQIvNbraGRPuP{S2g0_8jS*Cnck zciK`!Ci8}3k;P69wuyReX@S*#UDHzggGC|8T2R0K^in*wV0t=daHIEh*81pUqeDZa zT{RaG>?M|*{q=^M5AHt^lc8&%^w;q+6#MdQ*)2J^(r{}{sQ7+}7-{|?g;sSBv^HJ) zRBB$Rc`)-p|3$dnK>vl!0*8W-@;cCen{1nO2Kw(n{~hSR(C~sIuc-tN%+QRHKU`hOK&@MqL){s}q3-<=bMTQ>I@DPp3|#7X z8umCk)T>Kf+_>yiw=3SME~Z~PZgm@C-ReFBgico~|1bTDbF2FaRFYdAx80!H!maMZ zmSUS*-H)Q(ay(c37)?D=`JjxZO}0r*2G1OAvH;%7PbGANW1ZGbMkD`+pG7xutYh$Q zJv!?XfUdxI&-j1B&5l9bXa{kd0ugR@+FVzwVsf*yf+*b{GP+6en|%>E`Jv-a|g??!4;C-GzLv?oO(7)hk;uv?>97B8Pxp|kKIP=*d;jOc%GxH17 zIfvJ85$4n?_-R4uem58~xbvb##_V{F_il$jZ3iyA-p++Lci=+lcE7=eQcUUS)k5hj z7yj>TxUlk@7+0PHyDTxIVL+O_PLvS6vQj@e$;%+7I4&1_$askREd1uEP}0@Pz&q^R zH`amsq}x3P_et^N>%)D2nmP9^|CKJ){51~G8_sdKuOm5n<-wH1nGtZ@yIi{w79G!J ztNShXK0A9o(1E?A+Z_gbNiq2@uY+*=hwRzw$947!gaE$`XG6bYrwAVguXCoe9|rqh zA-w;|rL=OBRod88(+8$EZETmFRo>8nRiqmnlQbnxis{+fbzqgt@61FS3+;o;AJADv zQq0BTzVCdZ=}A#O*>b4fm?@ACQnHTzxScC@ci;-?X6oot{KWcj#nst!#jojH(LrnW zY0%@Q1P|h{p+M0QS~8I{#-pX+E9iMcvsS$iR^0^`PXg`PYJo78P@{FQE&pacZUJFb?ikev^tElN|0OFR=a8ZuA0ZI#; z^e}U~NN@-C}G+QoK$Fvimbv&v#Ye#f0? z0-ixF{J-R$H#vk|-aSc@w+xQA$dz}#^XjW=2xl+6*b}?t54*Lw*1VdF>;@P7b07UB zrU7#KR}4mlflc1D99W?`$zOxy5!^SVE>S2TadN3U)_mU1nlE->P3dN`rWD`5KD*&# z*|VmT#F`q~yI@KYUyBmkViRCGdukJCjJYFVNWD=Wp+evY6^jy{X~L# z*T$?oMwA(^RkLd#CGWHaJ3p2?@S}7yb#^IUCw@GTJwHAd;YU{6EofgIKTbF&pRKo^ zg`|Rxh2%{QaLOs>98V-G?qM+$NI5QqL#8g`x?$!HY&ct}Hr=j-rp9v!SL?70XbJfI zE6->A2p!M0aDz+??f)fnE5M0OSH_1N_y@e;cCHJjt7=u(*gbQV?}OWP>WD*h{M_N> z#Kc@;aXsuwU3`rj_Pr!#@$no$tuM_}MrUCDd0iW`JK~sv7iP;1gkxyO&Il7*co_R; zgXJ0r(IGBx77x#=IJ%CU?JqTNqSu*mw=29yc^f`#tCJJ~J73z?%p|<*pLdIAnjEwp z!;JGfdIJ1)FH&C4-<#Oq9aQ8V}+wJ?oGIwqx^>BHSRFPxZrdSpXs3!U2=O{S;wKScrcp+U70BN?M1vb^V~vCuoNdde+bxwK z%D3^(52f{ zN8YB5Hp<(Bll91036clfbu;Q&~o zIY%n445Q7mNzHW`VYK2AW$L!rGHMoLBMTa#3SDM`T#WY@K+{odDdvq@ZgT4-9mO}R^m8?;T zl>C$l=$%;Dl|ss2-d^LESH2PhNHY7=@`)$+0-e^(>}J4D&!%XG7SAsA_*z}6DI#PgkXM@!t+FJCL{V9JEEod z(Ktj){S5}9r8t){qTib$q8}DSi&lK{l)|%)!&rP@8!&X22*1{ja4CK)4&hR7B3z0o zlrFpzq|MnMND<+W*b%N6+ecz7#z%bve+SOK&W>m)J{*T=slV0WY$?7cV?_T0+w1uMZ0blR*HLV?LSU$X)M1< zc(rgEt|x_J%L!jn8mobyo@AtEd4Tzy6u-_p!1!OMEr0qHeTDn&y2XOF3a$*9E%+6T zq=j&oeIeY_VIfF2b0J7^un@92T>fKcW7OIRjd zj>xn$Wzv;2-Wm)pVY9=d!WqGSyL+-o4}yRp_GWXIe9(?_DULl$O1-%nrPw@6rj7Gk zQ^a|{&ysmN!lgL&EGhLS!ll?eOQwzRT#5+q*I9C>9nn%8dzO@X^DHUF=2{7dY$d3EHs+iLIStYr2Gqp=8Hnq#NasO0$xIgh`eKg7?w_6314>>2vDAzPwdEOf`dCh zkLQDZQC%Pt^nTe=*{zm5A2fwqxn|Dnm_L#tw_SO;AGONrVOVtx>4UmXNlK=qX$+~A zgqGE5A&gAv+Jj*>p_|DgngKoBFC7Cwc*Mb?ZCMtUNsvo*(Q1dI?V)qjGj0{Hqb8q= z4yaAaG}Jt;ien8m(hb>jHOq(;2YQ2VsM+d?x!}YcW2-r2-%X|Xp}5^t>P?8GIJgv7 zC+4@3JWA14^J04PZTUeFEAo=Vj1xj#Zk+C#OYUp|8zP=T-I3i5^YIiv>7@Qi5wWc} zRX5Uf_xT$0Uo#cr{^Rv_qv%}#Y_;1358Ju_Xb0|>ZsrAm6bIMJKKEa{zh14n#a0Ns z4i?L2?W;hF55}zmslU@$ms0$&VI4S=@+vr+BFjup9diq%qqXW1?{^{0?R6~J%t=Tc z-tnfZ=&4eMz84EAex~=#JVG$1RxwvkPH9UL&;W?vyv9Ba#w`fH38BE>fuE9Bp#yh6S>aRCgT8e`Orc|G_QT=@>qWU5KFednN ze9T3VO-ZCk{qZ?^8?Ast5NgjATJy<>{vtb~r8xFJQ0h&dmg1}t{Szr7+Pe=7$qo;5 z5k$vHkSht_hv9kqY+I#D<@=Wy_tLl9F)qdQ+=kUgCiPbttS!a2XDqFMK1Gb*C#+35 z7<9zx2oEuIm*&S8?WldHDvmWjN;lK|D8;7vF>R^wYbm1k8wIs%H)ANBNPE<}DG%2p zIYg-q^{h}^a#~<~F-kVsjzV@MWmP*3>*blOt!ZD89`a87ePFv)$1|18>|$o}xA(LJ=CRxyJYhVfG4O*#v> zX<9&L)AJcPQHyzc*81M;F_-+0k!+c=h4IQXFAic7Gl&(!yJa}Wmkd@LgyA65$?1O- zk+qyX#*eC{zx+YM*BPbIO-5V-3C&vKkD|b(g_-mL!QFcNg}TP3rzHSeDnApxVCseVB`}pm;_cO9V__SMd8|9+5 zEyeJ(KVt+kx&Z0uWn-Hi$*+sZSKw;XJM_piC(I zf*6Td=Vo3o;Z?Kty<~95N*Y_}S{2Ce*Bz^UcTg7akQ@pbJpB}9aXW;V$|K8bEoOC_ zD46n%l=O~!SW-GowzkIs*dObr4P=W(kNsCP29{lkvTC3VO9WSv>i&9AhLvsX1t_sz z#HJpYJ@QPweg=0opFuF^{Ks^~`N3`@s$~opW02MAv-10M_&q(O0=IDy`*~||Te)4{ z+cD}|CgEV~t3$!os@#jQW@9^toZoS{&}1L_soG?-i8oWKOZ%&ZW^=MsSj3&gs-n>M zc^}iRT!#4e%BSeSs$I7p?FnZ)lVJ?P(|IEHPkp94M0GPVqw--Bm0k4okPTul4^vKz zm1W_hE+g76kA0JOXa~Z|_f#&UU$~`TzOw1k1tWB^V_t-On5YoBWs({ z?UahRX8?!Q4FbtTcb>&Ws+^!JmPW<4ep`nwr$<$kF*xI@ZWiLuJKN+xt4N=>^OYh+xXtvE>z3-j1n>Mj?lEh;Q(`< zJQcvBINhnOfzgA(o+~sk4mMpp;^Um8P*=aiL-}qGRNBt*p)L1(Yp;*i0Kp!Td&QMy z`0>u@q1j?lM3sW3G34qZh{u9&rdj|go0noG&yTe;;Sm0(_$((B=+wn7YsPovF_Mq$ zW^VlCt`LzgPH^0@U+)uxOgHdXz(ZjIg#InoFk1Ng@x}&Ta&&eD z>~zd+A$Jy4qFmPh+vp{$nL_hSXh8?ScKO=~swz~MD5>IXf%D2I})F@H%T-4E+ z*p_Bfd879@W5JYolUSUyn#SxNc%5)%bn^uX%lQy*)7Lzw-hHEN>H1cqo&vlW){91t zHcE6vOHzp*wyQ)^48`BB{YpJ<-Zhm-ije_JH1R%bzq@v1r2U3eqU9Szn1@di8UA5+D2GjBb3NVlsE)JyS=>xKF~{XqRWK|Sa67bNFA zp%Kz~9ML2uoc#r8g4HV9@@DF1+?rD~OH>}fK)Oi!<WZMudTQAgTTKi1TGME9e*>0qZcnIMtbT5FPtlsTh3~Z zp*f$=LfTX0Nx*-E38XKF|80FB(TN?neitgKD~0IsOl&~8P8(k*oT~@EMJeUmd-?Y` zE-R-LPZUm9U0V6}qmNqE0^8d4_hKckm59Dd1Rmt57gnoMN#M$$-5}hw9bJ#Ob4Qj z48c%`m974-psjiiq<=vFCKo1lv%LK&7f#bI88G~a9nvn%@-_ex;ev z|4O633`=3z=g>_(CB(oQmtzduMmuc7YHqk)YOrll#dP~=1xdQyVRVz?`+bnqf?EQ3 z`Z+Wkp8s;1=aS)hcHG+@MDF?#K{5AfmSyDKxrp6)E%&IjRMk~Yy^)uDJj;yKET_aB zxp__aSGbz`qB2}PRWB{=fZxSgT<8W@a4{FV4t|0wIeBntu1}0{AtT19ybA-1i)JgJ zbi*yy8zmINeRwh0Uv^tM2nX!dV-^Rj)#+8k1srG?|R=`4^{P0J} z{GdFXg00pxat&CF-tX&+wDR@FQ?%Gca_M^Gjgzx*J_}zyrl>LgN8&s!F6WuvG{zX< z0$q`3;C*wlOIWAM4?-JlR^-DI?Tpnd%)x+#T_p)(Xh z25F-mq+taT6hdw6EvlFlLMuqp4GN*wO^Qh&R3IsZ@W%jNwk-V-nqgg8n$^GIKq=_7 zXNRRn#(H05DfUm}`_9ZM|Kq7szVhEOq-c3>4+tt-a0Hq0`kjTuJt}sV5qu4O4NjJ} z!$IV`GG`KtE|>OB_q~}i$16SSZxJL9m}iw|N?%L+CR(gkE$wRaz_lua-Y&zS_rHjx zH1%wQVu-4TV%)^^RB*l?_+?hk>d>7A87qF-^E*e6g) zni#hoR&Ak){jsIk)WkSe{&&!D`C9YCIA`wf(!3*;-;<%VnYO5zAmg=}uJD1a{Aofr zJQJ*SlhMdS{4de%l!}99(1yumvQlAKHrZj>swRd0r41^@2QjD>7O8*O-i;FNDp-{M z^+~{$5zqb;4c%v+<>=-~asN2ft`&FBSWIOTfg?L!t|Cf!spQJFa_|5$6UtDSnP403 z1lwjOm=vFkBbd}fVb2Z zE|`N|#4Ze_n<<#3*d~~@+yzPE`8xY*mtsmvY!%N^f0wb^rT9T(wckifG8>g*ESuHt zr7CW?FSpALx8x{27XOXpAdozRQJE`ALXxn5gB|-fs^YJT!@krbNr)zErI?b0gk^1p z*x#8A_TS%i0E`iP6Uqj0_t*svekMolJoy-1%wJGMqCTqhSKhB*%06* z;d~#BCr=5_`z46V*VaK$;Yp?fwJ6~7y4j*YRkF~_z^g$nCAI>z_eQj9yrmZmkW9DR?R1mkRvg`= z-lUrp)BCr5qT6CNbX&C0Es9z@=_E&CJ|IDFG#m{&Ce!XtJMDI;;zMz?b5uPZ=+-tV zDW(Uy`$W5o+0gFWy4DE8S+9Mh@703RLP^7XFQAk8yt$c8IQhJ>uBj->GN;0O;!SY+ z_vhU`*GhT1ElGpFOb~;M& zTjJ;__17EgSBm?nWPW2dbUftI5jZ@)Sg7G)0EJBww>m*pxlgIRx$%8@X&hc>+roEz z$u!B?X(GjY;%FlErc9OMeE-(gcV|PB$Au=ojbkc|Qb+qE*2v){gG#b;+;7Lf6w~Hp zwJ}NkO~#s#VtR(DPqOVtvcZ4O#D5Si5sU84hy16;k}y7D$G8;Ji=0-BOFdEqX1;5bH!&{eBM+(Z_a~#_C&!X7pSNRPis>O?E9Rx%mRTGVm6rfo)`9I z4e@$_(+J|TzZ1DRlMg*{_lTdy$iFFyxfan~pnc3JH5C8tU}^3#HhR4+rQs`?Zf$(w zKAzg$$vmaSpZQuu$|e;JuvV*4K8>_|n8P?O*w2z)`(_tM$he6-Z1^8&T8PBtu&Q%w zkDRqGCoYZ5!6~c1rvn89p4pl?df@23Fs(>oU4x#>Lxsolr9;;`TKo`kYKDeVf5PM~ zGI^F*0Z(_R#zSzaIT`(aCYRkOu0h7~#6X6-%CpXn0|%da{^`+^$CsKdcL51<78dI@ zB-cGsFS*tH!BV+ZZ#>ngpKDTjxm;JR=rSD_ST4c?#!rpj< zzjiO)M@KI~BoDT6bwgy`?D(oKEXcf#Yp{)zzTjbFu#H#o)Zkzn$M#?xg_1W|l_y%a z7W8);SC_6I$DV8VQ642Tk~-3?$~*Zw!#nwR>DZ>Z5vgZ ze@mx5PPE&TysL+oOxHx)W+&QJ9f&5~Orl9~Ux@Z#+C*E363vuXPSZ$9VG=CTVNaw> zlvuaXJJjVOlKa;e-9~|wwtyu>(%o!dbKC9Ylj4`-)|}MeZLB#drmM)zCEXKQkx!9` z-}a8fX_t$UPM}CjnTsws?;@YKr!|o88aw%<_)Hx6q~0W-6!(REPp3`3Iaz((kT0^z zRHtCkjC-VuRN%^A?t=a#3$5y(Y0$N5{-OQ*#M?Lc_diAQoefC_-B4uWBtf+b+fSl9 zOrl<(9R>q@ce$W=;@}0F=-hZLD!SN2V8%^tet1OSu3koKQz}-fVT@%HDd-7OVK^`6{qA{Xk`be#Kd= zDySsW6So~!ZDFyhS&D5ID;MpSt<;{QSw|}KGLSaU7Bvsf?33SsR@ zYyW=S@MY0$@hVc7$sGz(OQQA_c4|v81*uu7E%gXe)0jkx$$z+S)c%?@sa^Rhj3%Zr zFGA3}H1luINMmAu7ovslpD)hBjC?H|Itl$(+R-n?6b@}gztkffT0_4SlYO{v=zn)s z=wD+wfF`|7V|Bq)y{{F;?GSQ-OqDeHn&Q3EarZ`b6&7|I>nG{o; zXy0h|(X43J$5>G&oHbT7iFVi9X(z=LD{7^k)SI-EVu}^*8|{8IE84A7yeQLAix*9z z-;H+q-K>f!Uerpzn^Zkwn>2YT#T1g$H~Rf{R`h#K#Edev6Jkc0_8aXd!&~jNmtu+; zwbEYd&9y7V6y?)5+W%Qrw7)dsMwz%l+-TA|zTHksDWwHFv#EDDq%w=sF3{x(6GFKiChh83X}Kq;l7h$GuVg3q256G=tY< z?61GZGf;0dpOe9UoZfzHaR^J%=cJs~K78U545c0@1l{Mj=3Sw;tzn=L_*zIzrjAQL zD~P{Ebgc#s6aw-e;#7C9xnv+dwFe3Tp@M$mUkScc4(Lz_lt16wv3J|uU$5gQy4V~L zoO)Lknr*%W|7No0Xhwm9y*a?zAPZbzd3g3B+}ouKZ0vaK1e=RE!N#>;vm0!D;P!LC z8J_ceEB%UdgMAj2eDpuNae5$rOmWK%>?f|ZKeR& z%1lBxIKpb(WHj*nbg$-s$~LUqobVCe>HnTFj&{W>W6^Y8B6r*K0F)#l5Ct ziAZ>R4{Wb^V)2=5>HK24bgtAfp1j%lY+&7%V~dVMW!SSkxwPA)sb|mp!e$A}F*?qvI2P+Q##ojxB7SjEj1>$R499=CX1NDp7Z+DpsP`YPv5>fXmQ&8MtnT_9f4l&q=V zl&m=D0!53b;2r9zE)}iBF&ww@Ie`oQEzLbr`3f0Mn{9)d4U%4)EdaRkH3{9IbZOmWG;*c=f6z@ST@0R~ zbTLR9?H~;+kf3yFV{cK#q;y$9l5SACv~E&NN|ypjDP3O=@G@rW_s|sU%+{oUofrwW z?@l^cScqh-hDFz7|5UMmojvuxF@5S+z7J!HO7>zvQ&GvH_>A9cEoAOdGqa4)+dHIe z&J9BS8*Z!JsA+Ei~k;>1>fZBW; z)O^?%wD|&%D<4bf1_e&*CZpw`E&VdODFu!JG!!@nX`>yaVFeNtIBo1Ls+bfwD@f7} z3Y^wWib;V}ASngzR{>t;?EPCb$tA$vtj28&w){?NTu7>9ti{Ax4Tai0Ds#~RveM<&gab=$d5rTZDezIWNj zhmb#+_)F90p6*Sbv%?nXay$WVc5m)dmrEFt^|<>ZdR%;uHS2JfFK;Q%7aD~kA$)qM zy?i;Iu2>2Uvq?#r>%|7X-ffBT%w zq0Kd-=E7c}%@u%K84(z4-H^Ci>n5X7Oyw4IJEam=Gjx&)gJIcZhh>w31&W(Cs1&~y zgIZycdZfazb)!@m3KpffZ3SGJ^6?Ec!8-CWUwR&q8!p2SjUIHV&*rMSm^gSAPqrL$ zi*6Z@uH=u_j8)<#6J;`LnPrlQxy4S*U8;Cv95F{#{VfJDrTFfC6Z7u0iCJ+lq9|Tp z3ct{h99VKI7B!_vk1oAx*@qz(cnOc}J+SYdpE`_d*v zy^guFZo|ceGqPZ6f9Ll%Ts+zX<*x`knw#rtY(H<&Tib}?!3UI{1#|8Q%^CI}bWWZM zfT4zfVRg(L4D%eM^#b5+z(dhFN%2H}iHBy(1u|iSegfMe{iWffOZ@nklA<+_cSZ?K z6^jJ63RV%n2V)O~WdY3YD24ZG6-(s=<%wKl5g_9`@)*O%ZZkK2 za#x6+7blo){dyn!q{{e53i<&0Sv%rG!={PzRsij51n(glJnh!pM!86QyuaSYW0iZH zT>VO!);G>9{ z^iN9U>(FO z7Yn>&j0ID|q7A7#i}I#1y9Zt(qKrPi*kCapVrlx6=NgoVyNbJ6;KQz{2nA(V7}1;LW^JXysNQHl z4ZOjQ>c>LO^C&iTKuCLUb&XSrxC)6xZDg?*h5Iw?jhJbc|Dy*wvCxPl zkR2RHlaH>if#ax_I>IKxZ9Xp%@nuq>d+Ei@eURP&DmuptGiIQuW>bJ_*&* z?)G=B?`Rn~>aNP?&&+W0PBOA;K7R*#^ZBy?7C8Lz=&UR6>C)jZZaDV#yDw0Pcd|mf zGp6~PUH#(In=Arh2-kR-e#N=^)lf-3ecX0PwS}u+!%}Q>^(&*@vYp~*XxfoVRYuY# z+Mp(a>yb850Bfa{&<$}KS~nSO2ku|aqnnD;V91OsAqHuq9i(9e65Rc?vA3vVy5O^d zB;63Fp>>mDiqlXaDR;kD0A6-1{BLOVbzx!l^7}_Q@O2Z9Ay(ZqZUbp`soTbS!;6yC z)>{7}Fy=EQ@2jbjxAHX@PF(+S070+ zV2)lBm%M`(oi$qGHeY5PC^w5FLze>drlLQ63$c)^BMpqtXM7(_$IVvsi4K^j&dLC4a@-lB?0 z$FhPX-JoM>-K01GN$FT01bBU5^Piz6!DV)|>(5n`t>)^}p*>#u>W!N?Gsw4dOFR@9QzYq7AY@-{awVBkVRa zaO`-j=S4FE$FU#iZ9Mkd$8cDS($D8-JFDUne$Z^Vw%E9m|Qn;QFVl{Z6(d{+o13 zTp797*Ub(@bTb`?$s6eERk4hfcl{$WX9SDpmFiaYiR>7l)U&3g<95IxJtYACbx_i- zM_sS*>PIOk#HM0E+m7|F??8uoGoV>P3p6PnpSPfWU0TlK2V_-hJYq77?U11^wF78_ zE;UBK;&iDyQAxTKw;fV#p-bImDYofSx1il}9OZALiAO58%UIe}8`M-#rnIR7Xe;+5 zbb~Ubb(7I3;mA0;DP@XbGn6R?X`>yaVFePDDQ)a6s+g21D@f7}%9Pekib zrZ-kj(XTj->+Pr{jf>k3skYF#-eD=WX6zHt(s@gd-)Ta&xg-Sfc2+3FmkVk3|&& zd$%)>yFn$Ry*zJB%i-tR&G}?Hj@aoa#i!%wDD@^CrTB_I)A37Ereoy-22`rl@;jJ7 zgvhlMXTmwut`&FFh=^6fKZ#nBY+)v2UZ2kpN1u>01N_ESN+8E7zDJd-Tk0IoDNV8^ z)7sTPD@KAX^^3A2&xy;sSN~qu6jYnaTWD=tHL|OwltXOcbk!x{x+?3}7DE?XiLC24 z_h$VvfC^ZKN9Nt@@h+)??@Qqz{)!Q=<-$!u|A-y^QcS9}75!3wt$}_izP)eg|Ao}hU->A8 z676VAX`T3QB%`eb*IshIBs6cdqgje65wsP}Qoq?ivlNp;s#aXqT>k5sp!u30BF}Yh}%A4_xCcv?$a@8+Gct)UIx1Sy9rFq{*smu z{ZE-7;FqHMyRHfCF4vqHFJqZapt1_ySr%}!C@*tyN<^?|>S-bWJ2FB3Uw-n#AL%9` zNJuq*EfYrx;I9KJ?MnEq%Cb)mec8Ne_79Q8dAK))JORK!IpGE~|(-Uq#Tw6ckQ#VPH>s3fJG+YYI=P}(NGNLx& z1~nm+6>Y)*=E`V7H|%y=HyLdlyWN%Ormm?OLSqAFkT%*u8de}diPy&7qKfI7+6t0% z!!@%xby5LkVAw^Uv94rVV3!2CGN1l zes~D@z>ngHf9Z?RyCxHksN92L&Nsx?4fSew9q&%2Brx)(6}Cj>uGXcahFYN1tc;I)IZ<1`S)n;xqireASt?G!4Bt+?%wY74dYh@}|sLM(4C&X=ntykD}Sl*R*S zhu3;3MSKkD57F!+m8WGuZN3pTAGSnoz5wLP(S&Yz?M>?@qfr+AHr`l*>)|b;s-NM$z@RKtJ&w zu4_a9O*opQgo3Xw9K6Lb&WcO$R#LE-@Wzrq3SQT9TJw$iIZh5g*_dlD;87{cF?;ZQ z(OslR)x77?{66FIE(R$?J`-V3Z{{Ax^tyOM$~_dX^G(RiPM;{Ne50N3uC?>sjt+b$ z-SP(CN%0%|%XeRy9p8Ofz;^|HfQ7t5c26CwfzA!O*56$}UBTmd`%a$PyVntn=Sc#zUUJD}<<6uE8g~+$zXPJd8g-GM;0$!Jds3r^PG5vTRR`Y3A^AM70NqZynf!4nN&TvPa&I@RqTd?POCRahw(P+X*g$zO zHXKcKG#G2W+2VOa$YdO@&Cb60gZTLA+bTaqzvAqh-;YYNZ*toq)fV>6AGQ?R?3?dJ zyX6qc-bZtdR^Bh&wb3`I(P5|2Mh^h2{76E#ZALd4jUMCuAi9Y)li?Yro4b_?!*YWi zmQ4y4Samd5q@6pQVMlZ6PFuk#_}^djW;GN=*`Yx7yJs z#T1TdMPKJ`nW68~X`$~*4NX9x*sQ*XCeUnFYY@*LN(tH%U$()wN4YR&I-aU9dcg_o zGyXx#GXha7r&V_v?V5AiCDY{2!Yo4c9GCKBt8*Rfk}cSTnz%xB_+%E07o6N^K*E=L zG%RS5IAgt5be%=arVe}>0EKFmr*D#7l;%&ITFF(Ow%57w@Uy#c8s@j;>Ahyb@cPI5 zQi>Z8I)awnA)y8IITF|F)bY{bzngB$X)o?tGNK#Cs`tzb$B-2#JOO zo*gm8Dr0&uLUcM`l1y0a9&1<{-8g7Yf`_r!H`}C8QUR;+ps{`&M*sw2yPgP}G&fLV_)a?OR1131- z@`!xUc&OtkH#!6#b#DzFbt6r(JMZ2GTug7O+)lrMpyex@a5F2?Rqrv+Kd5pGD(Sq- zZHH7_oOkcA6x+_b*Q4FCNyZy#!jZ~NGKMyVfP;gBHbnqs#YyM}$8=k_TS5K1(e0F2 zQ?A3mbxmfiOpv1yGi3rkcRnJ9VsXpVc*RS?fR!@A?`89UD33xR-EX~l&EHyi7(>X> z@K3w8x*u~FaUlz@gr-w)&bUi_rPgE#!A88iX;qKh_5n4@h>YIBe$1}>QMy-B;D_WUL~0YBe1NyB_!+27HbuC!?CW5Zvi5v|8r%Ue#M#go9yp%2Ld5ZMMU;Rl#+$F@Y3QjE@zr&fOGTY7xu;##9;eB^oe8#$@rk-NdAL z%rTlb`3sk^yU~u_D-?ENNY$u*gDNKXI4gFqQT4YO-K3cEgJz1|g|%Y0QpN}(@&D}P z5w|s8FHJ2hR=t29{PQR~nKkp1b8`^$&GK1yss@kba&2z(E;#NydvJyiV|2pweqQw+ zIk$GF0T;@zAR$z}HhPy^E0t$?gmLZFbof6bW0Vub*a{hQldK6ja8g2l(-BIQhVP5S z->2lx7T_M``}>eU>480Nva^TNfjw@wvxgLC&K|F%$sWJ|+F%dPSLJif-WWa+uF%;< zoEv*!i!nP}Jk)_L?z6Ln6lcyBUy&kPoS26L<7J1d|B7!gt5|#W}=_4 zcXkZAd&aGd6RyR>HY3qN! zR;=ToNlaC!9&ay_#j<$>|3@bC+}KQ`ys&@+?bw7fHg)*nU5`EX#7v>y9{0s3hu9$+%U-& z3b=+xJj@x+eXO{r+*)$Z&AT-RQ}Kc>(-fdssn zkv2$tjBSl#Yt9zR)xv3f1wITm^@c(Tg&8(IYH>IYtTDo{tK_|hAALfWg-HmX4$s#b z?yQTr^P*eQh;g3>ms3)U4M#LuX-*yA&^T9yN<_$rB^F|Yc!@iO#lV=Oe22f)&<0H1kF{&C$GK|Ori2z!CH>?N zl^e}gZh;;}UC8?zv3xcGJ{CSB(?=Y$tb}3O09! zZ;B5{IXVMPI470HJ;6sJ_1{zDJ3?o8tFjXSY&mCNYfec-*P|PVaxsZs{Te} z%avlvmzC*h`-jrpa=&Aw_bvC0PrP_vYrfosRLgp+O?5w#3rDaxnX6CN>s80XGM-rQ z6>Bi-vvrQ+egS()j!t>wr}*SRD+V#&v~DaS18T#hoLwZamX0637#OF2simA7!#|}h zgd8c~`GX6KttI+bGrVd^QxA`82H^%miMRjcEs+Zc!KgSmB|f#py~!Zb6czh_uEffyDiF)@kKUjg+)d_f}x6(P2O`C&(B z*8DStCW9JCdh4{SWWZL@3y~*C1#Bn-DxrfHGQU?d{nEBpulb)C#}wYWI~p{_!aGU3 ze|=W&t;SDxEjJ#SnePu3>2Q*`htCyO&6 zLJ;%*6p8*coe|!a=3cVv2H%fZWUO+|<-@)h0gV85X-9HypJVD!!tSq)D+@*am^-ZC zj)GPh{RoluyH0h#@Y?v^wOro4=Dw3wXx#lITi8%fqUMskih2!UdvK-VUy=CRfxe@P z+!$P`C^4%3tD`7Rym~!C`V18fu2cqBDuXK(TwId!D`pj17olacu2(9ueGRS!yc>_f zwE$9I4XyC4Yk}2m8Uw@jz_9K45ve<=umx~n*hVtW>RMb|L8SfDzGu}rd&gf5dn;9<#tRP7qkIlKrp6r+;FKIB&mv>Jn zUtU7vwWiLCfA#m{z|{0Zm0zb{ajElu4V9GXirWsUwn&}#zbwVJ)Or5{?Uv)o{mV4< zNaa^#G;OjGH5qb?X_E!;R{p<)Zg}!n>n5Y!jVQR^LO02xr@)Kwp^D^KsW5n(?BIGATP(Aa(FWzM$uLK(5c4a68bF{qC% zzd%7>Pda`yE&Xv3ce*h4Al^nj+rdN~5rL9K!mI2gl;StVkx=T9+CZbc6p!_hg#VBt z2`hht!6c908|20>LLG;(iUczjDuj?fIz`zx3RT2Z%OcunUqsj2DUegelrzz~h@{&! z1_h+}wmwqe^6~T*QHTO3egO&I{Y7%NUM@KSN^?=N6wRH~4E&6AQ6dg2C#EL9A4v;Z z?%{Inj9X%=s~)-NRBGR+%Ou4e@ndp*C|VHV0?j&NPZbQv;rkpV)o>m_)HkvLmnekI z9Y^4JOwa*&zU+vDA6E_`q)?Uyydw}!u0{asdNP%SJB2=5Kn!Q6q1N={fe%~;v2m(O z^H!#!m(Ymr9rFj=YGEligQ)rAi-lVL5Z)L(?&4a$)XY7!YkZv3(v)j$_XXHta_AMH zfQGSvEtq@(4`&k5kdow39nVY8BF2^;y=Wjg3G^%^vY>*eH02;XCoAr4~tl4c_65aJmeh5z9`_-wyG+ z#tl2L z*iM|fKcv0#wvcp4OE+a5N<3tmGq1ZA_VCf0j&S z)(3uu=_NC{zWA7Kv7PAl_CXEN%M)lr!PN&Fa_{MQDWT@z>xZjC*AHCmT{Ps#-v4Pl zQM7#J@gkB`m8NRQhl8t{Rb9{A8NkTTwC$wBv6d@nZ!ZYise=?;&G5L4g~z(Wf^8ti z%MJrCmWCdtfT-nRio{r1Rt&H_e5PD0txR9OJc9g~bM6YY7yJvA{vBX`O-Vpnm z(LP{j`u573=~vv9%pOz{iMZ_s)fQJWla}I}@%GzhWPYudkPvg_6v0q=6WT>7`vlE6 zQh8Da(dO8s=74ornatsEDwBb1- zSsB+`?EHR{9oM(1V!9=<^1F1~YT#OmAsS@;WsB>22DtuX!L_~@co{OwvRzH!1g~gO zRKLwj5q}|25_+}8AwMn-YmNFjx>0nzys^*1ihl5X(dBonawPDPjnC^c9qPH~F?n z==t8rRMmHLex=bbE^Janh&7073$KKsUhV3HqS??LsQ8>19 zuX;T^7A-tw*m~-Xt&FB7c6aaOw(6QG(pUIWb=8oiTUWn8mZin4m5vU(JA>s|z1$uw zoF|Zw*fCaCA#OBmK!Kmz$Wm+uM9r(1ms{6I8# zf?#*#h4O)Dc#ZDZ5DiM5dJs$5GZoxL|E8lCAF8jLQl<^Mk;FR<>ZyWN9jzyfqxF}Q z_|UY313ewBZGZ&_Y#yBtE_=E=V8;%}$L#yeV|HBgwH~(P{U29=uj%_MUr)c{4%=Uc zN+KP%9a3#^*!~7fv3c0$bM057;c^VgzlJ8>TKQTTOPgv$O@-5iHq|yC+R8U2bi?^d z>n5Y!2c7@j=%x$-4B9ravvD%yl?sEj(GJp9H8+mk+SpQj6UMfJB=uYD-LCgRQtRg1 z0A6-H{C*mJU3i!e;@6Syj}yi?J1vSuaXHgZe^08PUikoqlauc!{4JgTFiu{#$HmhExCE*@CFLc=w`Rd(E{@V!lQmxDs^8o@sU8_X!hQGAuLt^~^yv%eKT@YG1NPlF&p1Aw)avnqSo{|HlGJc6PV>64#=GdAO-$u!qd773O{j z6jH$5?2d*1Au~bpO>k7VrE2WX`s(pLy}IcyGCCpQol3FbD@$w1IgLjQVAKkJPtSF8+X)-41A%gIY%8Zg+RP0^Y_(Ups zr`6p%{cd|leF_Y=l*pFgX_gA9Aw+r=y6lhiA8aXjlFw7X23tx;9o4tge;I_o-BQ0D z7sN-Qx*aI<16qZ~(yGk#`;?g;7Ul|jzzyARnm8wWGSf$(3T*T|G}||y=*~uOABzq2 zcbf)!YumM2=P!?Sg}WMPn%-O4PQT);^H-vh40GJ}a@7{r`D-l2rgfgWZ9%)`J0st< zdj_GXc<+?okc4q>D}gXl*(RfElWta%!WODc8o*t-E}JC#&Wcj3(x#v^W*J;*Uj|bAL>x+`9vL3A)g#3_`iIgt zXM@s5<;*sUR`B+0sPH{P1+~jl_&4J+M|;0>hW3AcN>)<^oY{7*Xqv~XB%X34q*M)A z!}e@ZBRx?Zn3A!LR~9-BLnvA)kaTR`&e)EFQP1M@(=-BMHR2>BF8Iibsizr)T3 z`3`I#-OPnA#eH1(txVY9#CKoj=Z@%k?N2yFB4(h)hI_VLZ#Sz;$b=GPmI+pVXSqPJ z_NGvX;fV(PEZembv*CCkXQHx(N+O^^dy1x}p_U?RFVm8Ca5$Q)YMD@w`KCd zC;o$(N~nW5$T>F;mtBW(@`O{Xw#Hm~+^O>0cTuXW}9W^d`Ue|q%f@g*D=7Lej` z0X{CUFCVFw+-m+{sobhJo*6)X@l&IBA!lZJc2oqpx?>*f zW`Tusu$#3glKF*sx0a*xp!cdW<7Hiq8*u`|H<5WNXslIku$!s9Y_OYoc<^iwYd%-T zF=zL?nX-}pORS^8RWr!AOYyiz+!h|(!O8VANWU}xla*eQ0X=F&1AbTJD7LRBHvi!T-Ia2vy8AY39L`{O*Pi>L_&dN_DbVIa|)=fquhk_5In>Z9G zu%52gPZz3FlKBEm$6#%;gEgwafCq@#Nfd@mFw;?nZ{WnfFo9@Et>QYY>xXw-iDSks71*G1jfD}^- zrM^($6IoDTSBL^JIE^L3HPdcy_`lhXe<|J>hkvOz@h`>X<JsXy$@4kEz~K6)X;9YDY|S|2~~+zF#u937v^g9CSARkYY0SMP$^?r zR54=)(Ul~*)~bng+H7cq;EXt zw%UyvAounjKYx!Out^wLP*&1dmSD=L-H9>*DZ1h9H*ZwLgF@A=c{zc+;fzE;Ld?N- zn6w>Qu4+@-2LDqQ+u$E`xTe)N8~W?HM*S?5p{B=l2)&LI3r^uQd57{Eg#dFn6Q=MQ z_DXW$aU+q%gH4%p;qJByQnH*5Hf6lL(3J!qY|1LHvYnS!Z5~M4uviTpY|4X8*(Rmd z?TqS&wtolqP*BwK@{DrrJ4GTN=;#yMx)I6qF7i8UOF)%o3rDY$XwfqS{WvyEiG zakjKv>y2~#>n>A3(Dc2Px6rS+8|SA{NjJ{ic7tk*8|P_DvF*nBDYRR@-uNmN+__RY zKogHt4$4^CRGZaQxI)vW3ZShVN$3V^rq)eHqYK`*qMO`1GjLm9@^vB@yBVa-c92FD zNN+R7mf|wTwt}SUzy5)3uxa6EI;MZYhfQ5^9tWJ6aPK>4;68G%N;Mn8vSH~~RAARC z^~kqSVWXW2*D5OD=3k@mjjEWerB*6Pw_A*EQcO|2iZL=qel;!RSLQL2x?etVYhW!^ zE6sDFP+_DBtA2@&)rf!S=Mif2paFvree_jKSe>4tb!jWMN|LUH=SVM`fs*zzBV^&u3TVCN?~aq9Hh z=O^Ja`O32pkvxDOXb@{9oDk--*f>O=UB;bz?;RyR3jO$%lp_*6$)2S-#ZCmN2SLCo z5;rtSNX$ZYcs>K_ocJxo3>gP^MT7m`s+DvKUBn9cAw8BQj1wI$O}bm!d&6SFm-rnI zFEHvOHySJxu)2jF`%rJ-;0|cfEtY4?u$@8PuF$)>e0@z1_7w=3#K)Avi8ANh z7BMpuj!57W_7dl63zLP{lJ^`KNYtT=)B(D>PNdC!IPf z8t2MQ=nWjo9mATh^F3+JCT(LY2#&Fbve=9MxM!30q|>e`neK1bbVs7{#nO5aX@)&P zjMyHtG}R+ep$DMQJYv#jBRWa(F!NFXhc4BL3uz{rkv5l{o1e>zu1w(YJ+6W!xa?;@ zz3Ws}ISw}UXN$?PIoOwXI=jQ<80^c$euI5kc<+O67GXc_cZWz)XHuxY=G_H6B7x~HcoDh;AQ72sjnCirM~F;vlU*q-f} z5mb?OYqe&_$4`A5P&0j7<=g33oHhI1s3dDPw;fV#Va+?;@gWui87ap z%P-Sm`xNDNr=0Hm`ff*3Tx%zV6qEP0l@wBsN9;5TO7V^TA;r(8LyF2zVH}B+y7_Fq zTtc=_1Bd)99j#l&@ij2!g&%zBh~!)CNS5OJ zW@k4YoA*-QK?9ZaDiiWSj0Z`SzJWkUf6w{8)W7V+2gC2=utgMW6tDlW1}Se#b>&#B z%y7C563)eZM)XaPq^2gD9{qEmL&-Syj2TZf1cpR15ru7te#e*>u=`|3^bXpl<)yPo zOwz&q<*j_TL&tYMPN#`vSX9fNFp-C%ahBIl=yYEYD|V8;BYc)nF9Nxm(K<_pk@=!u z!q$%P(V7;svUJeDLho6kFSiS^nAI{zy~rvjQ`QhZmI#G|!sanfzuo%*eTC(;PQsF=i{K3sw$(EwBBtCb(7J^a`0Jn6UzYucEwAj zP+ZeWg@M{^2WnIS^{g?v6c;hN6{zHHCw-vQO8FcB)Q=mfG4AFG&v?*3#$_YI4H}Yt zcL?Q~#AFzGi4t@tqkpSH|7`~PrFc9J{mI>S^bh?vq=){>H5f~b23IobY)HL2K>HH= zg(c&6o5C+VxU|J1#dpWyH@RD|<}zpRyRyOW^(Gd9>Rn>=V&1*}m^()~=Np0SW}6I) zl8tsza=pSeY>*nRbE=r!IIW^Yx|t-BVtN%>$+ygLy(<%3pIF%7zXrf(QY&V2a(KY; z4TeVCQ9H%?a<$aUBic}ybE>JlgA0qTB@7WB5gAU~ z2;jn3>hK~>QLla+0CWgbnrhq zxXhLtJZA_w-_e}x%2y&eOR1)A!3A_g$(7!c!LP5(?&&&9Z17$pO z+;pRH%ahHeT2W+Y%zEBwU(Zt=*0XfOE9aURkYdVJ)u;8mC!6&=42z_=&_$m(k3qD) zydz$-k(C?pgw7AjniJ4Jv>*>dT<@Mz^rrN_KA-R17jPw39c`+bYc4xm%@;}sJl0i> zt1LQByDeeM=^yWqC>D3XFktLusHi zk{+jvC8-2PWDf~g-6y8F$^ZESnH|+WPeZ3;V+frUPLxL@uJQrm#Qfsl5IN5`T?f8; zNQDmf>_YVgw{T{L#3jFZ&iWbU>W2scx2) zjHixpI?)str#WA5S4+-m6syBa$+A4XYt2cg1(gLW5K_A-Qk#~ar@J_HC{QY;l06D$ zpu%fRHc;V18*;E3^_BR#QQ?!M1N2Wb5uaN2REmvszJMS(i_}P#3f{V%A$5SwC~&FJ zq>4mGoeswsDeG%DWtzxWp3I?3z^(H=ejjf!_)?` z*dP%b61a_$OSy65T^&@|%>i$rc~_(Z9UZ&8P7d1k2ReGKG|!&Z@~?keS~2Y0i|Wf;Hm5?v5z0T#Qv z4eE;k6nN?JsBA%hW5<|2`!MXFcV{T1&)Ur9o43E-a95Ux&y;JWmFdfuM;e9NoVx-% zE{`DZY@@~h9IhhO-^z4+L|+|vnZB~JNWbEI^A=D^^x?Kcsx5r;UbYlp*KRLwW+N}$ zCRR=n43&Abvy!z!la5r*$T-?GBWfD>A8FGBkXD)r-L5pc$!K?i8_uEIsg;}$*p{O; z+0$1l4A3S!K${dmaHi1!lHw;ZvK1hyzuVr8o?%e{DQB7`0GB?OemRZW7cON-yvM|# z&i9(Ugm;IS8n@p*#`Rq7%2SWIf&96xTR#;Y_`)zil2(3jntd8kz#U;$euP| zmkMnv@4_(Rs<*c@`gPpKQeoTC+Efkqa)oO76*rjzTkI5&;=OSckb08>QoO4#6!`Yk zDey#R3IuqK#r{^c2Jqf9WO<@!8nq)|iuc4JU+PWdOEEpE?2_vhVq@_yGUpg_?ky#A{uOrYOYvLdurKv*GSnd{ z-rpDOe>`>UABkc=N31T#mZ%kBh$ zWoPN3H@2Kr0nRhqR(H(YYv51IrCS1yhHc>s?7wyQR{U+LF6^w;t7!eUkB$ZLU$ zoX-;`2#0;onyN$aVu>*0fZe|!*j*jYPk})_`_*R6W_7K4)b98^f<;OP3atV%AFj%3 zwb8Iz{Yhj8*xRku$^uegx8iZxBJfy8yH(skY`NMIvRuV9%+7Z8kH8M>N1vfzaki^} zKqc9Fxb2W?3)|H{S&D78tG`COWjlHQmZlx4{GE)XO|(Hxgd@2&Q2=Y@pA)*ldZl%f z(a4>8=s~hx(FZYPTaF>YaD9Q%>3Qux33WikhsP(Y{u<7bb zI?Q?njoUY7WfRt|K3?Ij`*gcp%0KI#qu-n*si401Qy^g$-#eVr_f~GiKw=d7CVj)Q zEY;i$Qtj}w1>?>WjwZ@-J~r~f%djeK>$tAi!SGBEC;EQagfhqP9mS35D5&!`9k%nUd!^$ulQZ+gnO>_^?a)_v z-y!!(4@QLEp`KB;GXh$$Q}g)D$oslSP0WCduW=i`>>WHLf|$$0#QC^x>gCocJ|n~) zU=8^k_tLMpo%=~t5*u;b4XQ16?tPYG+s^$c+AVL7V0NYQCYp4l^0ffz;Hd z2_UUZ+PaOXZdVxHq?oeU9Yi;^Z!=t1!7?ygo@+N;#gYQmMmtoS)bPW`@T01j;<&9) zNjIc2&^|_rAMl}4GU91KsIUEW8TlBEziy1oyZU*!Mz#=x2it)E#4AUA7}UrqqQLox z#D((h3LK7ADZ=?$lkk&mQ65Sh`CD#I|1%HPlgJ^wATBDy8#6}oRLV%Myodosh4}wZ z9&ax$)*C?I(c{k{3W>rXb7SXl|6D)U92-A1D!ZU^CylH;XcY(CQn?6Jl@x+KLG0-e z>qH%k5|S?KKan9-{yIh@c^wl=$*Tv5Gi6!rpnua|!8`qpF>JP){r<@KWyXd-PsG%W zvWI)$@M9nhwtb$3rRBjMw*91GdGp_C-TV`}tyKlMe0fU|RuN?J#e4De;o;9pI%ToMdUs=ae*U+z|slRY5w35~M94ui8xZI9R6jiM{@$@}nPUnt=T_hUUo zMI$?E>&)fGkwt)Q`xKK9Xead7!Sh9Tkp|x96bp+jXqhaNCTn% zcJPg@;=Gd!KG6-_@x3;7SZvsFpVTlBol*y&)8x^KyO>m;Vz!L9_-ZEt?XS9p+VhK6 z>QE42blOm=j2*yro^wr1HH9x-QG7iN((mZUP$~6=Htgd+I#ow91|NJe%>1TaE(&=- zAx{@49~te-RrU<;t5gT5;k1{q(B09I4U;ADLv~3#-$4>fx9x@`mg0xkMG}8YCX%@F zjTly)98MhGM8dUv7Mj1x0^Je$F+vqK$0WhY5`$N7z^Gxt6qFL%l4PaS66JauJkS2d z5RS)@g=xM~ua#fnAZ4k@?{7CK4_Lr?-UuxKbi6q4mfBSc2SSwIIrEr9F#Ao2OR2B- zLr|2wV^IKxWf(hTISqjD;-MMreQ34XYml8rPG|y(Ibax_G=Yv%D&Y+aUkqH(hvyGL zoa4dUJYS2$ik?%OslI-)9Q$OR@^3T?5cr}T>i?gI*i#^I4ZBuG= zV&tE%oof{AA{pOAo1L?uHohhvXhV)~d>}rOuvb*tf!mA#uQ;YqBF}Ch8P|>OOnJf0 zKi?`oTR)daa=NYprE@GB^*OEjL0AyI&AEk#?HAe-d8luV6=of@qU)R1l_HKdp_==OiX{9NYLn24c< ze=-fJ=3!FYX4oHTulF@Op-+sJ?yQ|YAMHRN>2`}D(4_cLpFVth%;!bQa;@E62wa=( zhPv|#0LPd>il4>=RzqEKHwuRd^UW_2MKiZV|7PZVLn%r%+|tp3O|uYujxjFp0Ok7)mTDO2FM;Gnq;;k=ja$ynY4FOeqr*9jyo><-nobl zVp|R@66f6e8Zchf*be0HisFbe0l!Klz%5l_PjQf?t*DHant=#|&ybA_|0_1yMTG8h z(nw|erwqE(2{s2dZc5^~bDZ9>4%1WPTp7t9-6opr$*sv)V%w4_|B<mX+7d9Cbysg^(pEl09-7Vub^T9Z2b-eB}Qen6@X4Jawm=_`#TP7S@E zz(C-Y(C=ue#nz+DLiDm|NHW+(ipd^R9+%bXcn>p<(-^gQq?EES!<;IdT5@0vbsO4{ zgiE%gB`yK_vMBm^p^#9sgHD~iANgWQg71}vj}hBp#PW^}B^neitx3j^_t=Hxdpih8 z>Gq(p&q^^xy7ym5-ki0NT>gM%!<;%;YcC*~E3z!_CVcOu6zMtzYwkGl4aSQ) z7Hr3I0?7~S)`IKlUbmJOZtl+U72H(qEV5RVj(W+4Lq>TEaIjM&hbFx#16fz3Cm%}A zY@?2sTq$$0cQ}=8I6r2{bVEMN1q(fLp>HMn3ZOMXe7KL5%#gP;R%56!5Jo4r6+ftvJVh6$*awBvX$Fq z;5BBVZZ>$p6*F^kEDrXLP8RFym?_$fItX&@PE8OSYHSvBq4zS2}`~Q zgpc)q>^~0zBz$>50!iRMTP^qYt*V}0s#|i+_t~SlRrlUg_ndp~+3q=<#t#{VL9|Jg zKbM2T@6Z!ERsOtH@;8s1XC{rtdmH}Y%c;?=hLbi`{&>j(OJmr=y{?@E_|MWz5iZS= zbJ-xArjoNkM#Zxum7MJbkhD4^IoHu=<3b(D0723F-eax~#e$1D=0*hZ5LfT7vLLSA zeK={!4U*8y57JNf^-43Q31fRr)4twMGhn*aT$)3jUGd$5cBDs9cJH{a_hiR4gzI#b zKImWELZ_%F6bn6sICek7%l@#YVM+6`FvTpsTk^~PnvO5~R&`~Ai@x!>ix8AaQhD@( z|2i-DNo~QU`MIzKkM8zrZ~yV-qh#oOuHy@SgTJbtZWQq8HS9_M4PJEJlP=An%q6;; z?nzH((Q64T`WxK%1k<9g>J-{wHV6F{<3snd|28*=dfBBL)Jav$LDH;yR+GWUTRM)9 z&x$#yq0>L3y@e8CK zwcoR6A%R7kwH7~i_4}Ujwp9Wu4@q{h-6M3VAU*Z4Pu4JAXkMhur+3pGDC2w-1|2P6|v zajerTJ@pNn8Vsli!2sm4HKuf+&FSy{y2yx-5Q{_JrmpJ|X~0m;3=yL|jV7#-)f_Dl zy5SuHEEETWBJ03>GCp*J9g^Djn3u8V%{JkFte3EbA!bohW!T&0W*Gt4bgB&F(s(~U zC-s`-AE`2&q%vH$vr|RQvQ~4Nriz-v`*0JdiW(+U^m0qJOHr%asy(Mn5G4c^N<&@N zD7A8@sE>Nk&VAAz7PNEH?YLc2E8X_)BsBT8PAfYr9}thJmrfLnW?0$FFN8~VyZk@# z>LOOD!fT!In+-qySuD+%&FC~_;f0GW#U~33l=KNRR*AK=Tp`nu@^>Q` z##L-l@w+qN;3!;xYm+|eK(7An((wP6)Rn=@Zxj8)1dGW zvymzyo8PP(nJg!%KA_HV{IeDJ4F04EPu)DLLuta(nwGcp)#MY^h?MDuugiLrtaU_J zc$)CkU8xrRhZxe=U|fMaV?zNN>H&&f8w$**=ONg&v49M9O7*YCPViN;$nGaRWghPf z&Q0dyj2tE?dD4->Sn^JD_cp6Kx0`goz6Ut!>LBcR0pob|HyKq^E{tA+uZxLXr7FK;lBy;+k9HQluQBe#RbJybE$AUp7nQcPc*n zP+3Q3uU&d)Jbg%78T9hJJ=>z@Tk zCiTR_!ula)8){bo(u)@E4x``N>bTF`iw@~Ui&@BM-BTAW!X*>4#G3qN0NQ@81(O8@ z&&AloktK$L?478wz0~oDlJ`PHNl1P6G|+^vDx~#{l`|6Ae!UM#J#F!w`V*IX)>nJh zVm|OS)vl)g6*qbP#Pty$X`qR}rk$*3%mw2UTasZ>{J`FUHRWfTq5wUn_ph++pc^YWq`EnY#vRrZF zb36|f$wR(>8QnQ)w)wQwSY35Cm#3R0r0DRY=)U;0&Yhf=8sm@zNntT8nfZFZ)L6jW zSI=zHK$A4kL`vf}YOJZ_3@_z6O@Ym&IkeM26Fy{IGmj?}k!X`9iox~J>Vzv6RW)!2 z)Oys>ytp3UWEAkf8DlCaYa|9%yrfdmhVRQX&?L>8%ACn8IO`YZ_}wti1wKs!P0~P< zG|(jDCv(dt8GM`un)GZ&&+tRoY+_9VO(@ApdXc*W3q||ju3fw4%M13d8vK8L*Q|YE*W@#h=ac^rY@uTB za^a}%(g4fmq3}5Z#iO5xf2|yDakzOLoET1^2$1d8Gb!q zfN};CYghU!xze0XZ}dZY(@KqBE<&!`%M)u>Hst3aT}>WtP+p$sTUuEQVmH3v{5`DK z#3tt-@E0uN%9g5Kv?;sC8FxJA@8F^L?izk~Vp|OP2{?=da;C z1G4`Hr|ftBkBp*BvW_R|(=0A~ zW~c@jD#*R0eELRi#?(tjsH7WIE>^lp^Mf8#yhr{8AnY6g_w9nwyF$PY68w7&mqJPH zfm{(mJV^a=v1qdW#}|q@Rj;d}%4P*UG|&8GymY?oYoY4P&x}XB4hfiqQT_4 zy=_QvHUdtU99rLhRf6C&HkOgUaeaboH3T<;w3|9EE38Yfr22w-18auh#&+`jzwH#Z zrmlr^vXNlMmku781^yANxVsZIk>MC8Ompe8DUo5DD@lmRa1-*xRz(I4FkfV#(O13M zO~XZq42IWR6&dMVAh#~{M+sE&M$dEBKn?!~?;k}iu+E-n6 z?!qbiot-j@GRYdA1UR8Gi4UjqKtwkX8I*1^8j1{A=r(mk02(#H!t>&@`2 zV|X6a2A1YSFt8Dx=x+NwczCDm2G}}Bx`%M|u8=MrX4kn3&2i0;f}QIB4>-K6=}M3FJxR%AHGVK@;Q?sXj@+J2Mz3M_X?&Qe9!`TO)?>i7+ti5l7- z?yGe{QyoBPdjwwX>wSsk?v5ey-UbC;4YZdae))L65insEgkKhtFSjXy_^2ijKVQcu znz$?$0-#T3Gz&==$5&xXiyD>$WV1ytqFbwia=2~n1z5+4BhH)fSD2u@3=dIIrgzuy zyC5jPXlOPG$~AazC7c*8;MD!jMHx+*Y#mPqQh+j<53lp)h;BD&-DEU8n!gFUiNH+Y zY2pIGG+>5lfMEhTO@T?8Pr%?tnB+N#3#M*9OuVb!4)CeRU?<4?+i{kjAa4?;AN6I8 zoaETHR(CXs^i3$eLxht@ZKz6VV}|Zyg=!v+L(7ks%TOUQ3d!ruNZ!oND2yACEZw$i zNS0>QjF|9}MDlw(f@J6WU|12(KP7@s9j-!_K6BCr7so98KR27J<*a!?2REVFZ`d+) zlRUj{#`|F}*k@Hjry{Ph1S&-fMRg#;xvh?H&O)hLkXGZ#W{a6@u8ScX>86v7H1FvO z*?gemWb-reWD{8UIHJJ~F0bpvVs(H>ZdQooNEHef&lDSAEH{`bt3!&~w=%J5!Hf-JTxWPv;@o+@rPQ-u{n71B+o3Tb|zD^&5j9jA&Pj;0EC#p8$q z-%ElXZWnquavq`{aMD%Cs5{Mcac>M=NH?7>qw=;F^hP8UBLMi=IlZ-hQPR3$+u zx9Wrv5RIZ$nfuLT@<0rkNH?8Kq=|h^kW6$`vj?>3aM$$)c(c_3C_-+ym#FadV-+3}mG->QHlg9oS(vWUC zX-IQ-B#(jJoiKF;tsw7@Bn@xHTxY86 znZ#D_KUJB9z-qR751L&YuQa1onr{L87_Hv&e5+>lmS%7Xb;17dP{+}Flb{u^D%09p zhexg5;DNB&x?e?MM2TeRgbU}JJ1z1|9bE54Hh5l{JleCu>Y;)wd>pMB%uUJ_sgLUZ z>Bc*F=@h(C>-+~4yb~5zBIVV>HkZMPfI!9ZT0=K|cedU4AaNObs#f8~K14mHdNcxd zP|A&4`ry0znzzk_-w4p22o?vi_hMJU?Flg=dR=?j$kHI>SJdXC^$zZ*I7$w_+a+RF z71KC?yS?>1if-gk>8Jo7O~0L&F_rl>VaN~#*a;!%Qpbg$r$Gpcz6Rq-F{x~XX&u_- za#yIUPC!g$qf52nMAzEmyS>h!ebVT04(**Jo7HR++|!)Ol4zH;9N=y2)twgNgPv&`l!Z39zk?70WZZVu0ERto3HFHZfTH zweh8S0>(Fj72WNq2NrLX*8+&`r`0(eH4$2+Aom^Gx@s3kY3;X=l-1zUZ|0@nt1Z1W zKOVO9(cNB|$kH#hW$B$az%UYu{xWstOpAM+YwKumeXr&9eOOyxX+9OUzR}$tOJsfD z+V=ImrEc*|OT2l)UT$!8x0o4+G>1}ebhl)v_uJaOy4!>6W?I-A9!@{psg&2nQY=9P7mXI}Sr=7+N|i5RwUASlqj1Z& zW@iG^)My48)Xxqi%7Z#&)*YMQllv=ldfcRbkh^1}>Es?Won&I@M7rs8BF(!Jp_3nN zJDvPx19ajpYsUSDm6J;#ZJ-u+Opl2w1mjQC7J9i3=!Jz6m!_ggWw)7B_Q#Nlbkj*i znlUPjMbJ*ldOz28Qu)I$Qc+h_7)lEaL=zhofq-pd6u4 z3Ju>1QHX8g30$YPn+;yq?$w|A-y8b+z$ax_O1YvX$9|rISL*Bu5|;wS@gV8u`GO6V zhh0lc)mo||a%%IoRkANyg$1~&d;#9bRUnUK4TK2D&PXOdHxGxN#^Wr>10FjcVQi0D z+OGCwzEur23EO{ElQ5ba$vt;QE%#p@$juGterJ#%{gLP^A?v9%Qe9eD$W@j{y%so= zs#dOK6(o@rCCSG1uP)koK@Z|F>-8AfRX51UBIFZYu+VXLc&8_3?Hrwiaqv%zNdfmm zc4Qa5>_eb-hF7E?{L3nzw?ufXl_6IPY+d_;9X$dHbvy$83(c9Bc{ooZAQ6`Pr3Oe? z0<03;f!Ew-CKe@s%+(~?vT3|&GI6D)#wo?^!RT`TGT=oaud9JVj)(|*g$lLtlw!@1 zRnuoHu#;7;Ld>9XrgFt%{YsZl<8d8%cz__(I72|1XpQ^BbUXmg+w%tnoYq%{JZgw9 zYKQykRNLjy+Q!iMA@yLxzs}fD6SZoWPy+IWP?msDYN4bl7Yns{Ul6q`m2$->*Tc3RiuKqR=SM~}muIvx%48(_56IZ4}fdWM zv@E>wwG)Ifyk^f<6ePYsP1zv3b22o6?MEF=A7mZ_}_T z&DSS`%^mH>=8$0Xv8BSSH9l*-U;&yASues0V^j7i`y&4K3VP5YZ#YE}LyzX>qSyKc z^IA*uSlC+2^ZT{6mS#-3mB7xqxBY82EYIy)+*PTY7nZySDVwe0MTSzqkEMzekoHxs`}_yo#3m3eY`xwpDW9 zg4Yd>)WEwrvjpza=!L(@yztU|IBenNxuq??O*i+vg)*m zZi06Zj4)Iqu%_Y5f1RHQzM=KM*S!AHj3vyBR4>nO)z)8{F}^v0^*`VK^?yXxpI6aG zK;5c_W8mg9_8c%Ry8@wp-yP@v(kRXA_uF60Wu+)UAq$0$bq#z-fP!;z=Z)`Bm*sL)umOB7^WEiYB_ zHfX$Xij^LYpVrwTJ;7XKYCfhd%6MYC)Si9yRTsm!<3vx+16 zJXEtO!|m}XOYnX^wRKCdZ?!gyRniSA)hZ@KX~t{De3*LxHfD)@*eqH|^JtimC(rND zppoW#J!sef{8p3!l#uqe7=Zs<`$da`!bt0p>mCEHbXRq4T6uQufH_5~$9L#Je_Q*% z_8s!I%-ia}*(GSoq^cgx?zuYT9{3z1T|Y+by5X*}J3t-(U;721pC0Jz`{GAG5t6Mc zGTMyf6Q&f3HY4$bEFoL&GvWn&M zV%3^iwm{#c;9a_pVAsF`!=bv~wI<}ko~)T6lL*M`TceHJ<;bz zvN-=~Y+hn_{)4gcC&8I0=wy2!=p^vajWnUajW5HTD?3iZy|rS|EyAQMSormPp)`AWV(m(Q1$X6Te4`((Z&qsb&vmdR?aLG41(ZJqt2yyX=i~Sb zmUv}L)h@z?P;eZaamRCh0Un~tL+`HPcOjbR7Y)sNG!J(B5WKgN30v@yN#)7tW#{J+ zmVW2MGQ2YTKAs&EJ7sqN1DsEqy6xv~H)`Fa8SUl20^O!B6Acr*ZoL5lX3z}G%Xw6Y zFj0V!W~?`01V)}iy#Z4&M+IFgh=Y(sY zwjqdw5H?^&*da5*#<&@6{6>UHx9u9jq!|@)rk-RG_GcYJnDZwvumlagSI$>IbFIGM zq_+C&FNRHDb47E!Z_*cWB74@ZDZAdTWbk6T$_g?=0h7LDk(ss6=az~!-M;^`32l(^KqhPga=Zcso zfUK?>KD<$N{tV?Y==}0tkop)t4UpsKjGea&P^_FR-xudW#?-KjWj2&KhcP!n#&%^VK*IRB#Is}CS zvr;TA%-9voOHe~o4YcJz&w%_1l_k6eYb}aENlHqNolovPo?#|n2*#?2Bco1BptlMc_;zYVqeR7~+w4nr9s-k)SBh7y2$y;Z)?FU34Aw}+hWrxGSLHAK3>V%4=u&Qs6S3V&xyVq= z+H)09r(j}t`3ltq{~9Jw4}xCSdiA_rvT}=yMNAul3ZS;a1QfA}z$$}pre+mU!mnEM z<%`xruCy%ZJ6|a;@Cs7aFAtMdSe0TeSF+1XRsUQ4uc1qM?uXe5*ffy^AIs}Jiy9|V zPAFcoL|%v;NOrPlS8B^dUeJY?*jr)HHYLS|MiJ1}%T{4c&coakyox|9Re7N#|3%J% z`sumFd63BIvw6M15=pr5@ypBVFT5bzxBy4X3k#5B!y`d*bX5VOd~s>kKFD2*5a~el zdU)pyWKFVbLdGMYb}fvKfTEqR6c$mMA05e$9^=FFbWl4R*_9u)9|A!(0-zOW_Yt`CdX8U3r0yGv0Ad%ek?b4Fky5vZj$g{*J_n@2Q7a3ZFVEWiB3emc zX8^UqzJOgKDJJkwrb*Crne6GK&$%xgv=qqg%6%ZVm@shPT_^`-wQ^SK#b+_{)L z0z+g5i3c~&YM4uD+UL)rm`qMCqx?(~0}b>7{U3!kfCC>P#ldVq^DHJ@EWqa?R~96= ztPar->`SnnsvxKUf-{Uy_>w)`nZXB=^N4{{AGp-yG38WTqf_f8BCfHT_hYCf zi8u0n_-|B7$^5k*X&7T<#oVQt`VKW=t@1}~#pbtvHFhk2N-|pAVK!QMZ@CsK-wJr$ zQ{_{ON~myC=D$JLo+;+P|3EQT5tmQ5u%Nr@fb`LEec!(rU@Af(LE*Jr~8JbN-z(II##Y7StaMFHfql}|W zvxcVuYlJdQKQ{xU&h-)9z`&+-lhN=(-%ZeM8V#fl!PS4HQprJ9NP=b149hy66pVe! zpwfIg3>JBQx4B!!gN2#O4uC5e;=UVa>M7zTli!oBX`)7}+fL^w zqhZ}H&J0<2`9}EjKw`^!OUIVgc?gCUv)ntp+jcCJ)qOr1R}|K(MvzE)NA;D}uC5_@ zQKvZZrbJftec@pzJ+j`+B)%4qJieqz9@ihK%q@|`m4XD%{Wa=E>tZvQ;p z%9&darGMzsRK%B_XzI`n8JkYs{V}Jmxo_u=-Emmfi5r|J@K@Ne`xrdLbBf;W<9FfM zoiH?;j@?J$y%i%_9K%`ro#Qf)GS3>G2iT1=j}NMI($sA&cLOh*(oLH018RC2x=pi} zjUXE!t1Mj2BWMQA(Dd`LaPlg{O7lH1tPvV{zTMpIRu3B9RA&J)_2lgsiN6k~>M;_h z!`G6-7cNtP3wR6;1V)c{-g0Pe3{7n?V{y=o#cR14eQ!oAO1DiK7Nz<2?qRXmIV?K! zFt!}^|5I>M&zr!)p*q(fa6cmmJA4>y&&49Yp}vKG)#fW;utkrXJM2^N_VG)3n{0&{ zj4*(N>^#`eu(k6kuzk5li**s5Iha8j0(oY427Gic5g*IGE_1XP9=-z@~FBu)z3|ju@$?jQ;$nI^4J<1v(6z6P3ykaBlt;*0^TuB`Aj0K zH}#c9Jg)3KHMv#EdTM$AhI4W}3|mKv#q!0I;QJ_`q4}@{=`8IKKdieWtDXpl9#^p_ zd2OmZAIh+m_}luCdzOX7!QC#RHs~-NBjyvy5cAeGp{ZJ9&D1H4(+P%0B>r^vm`sqy zS;Tz=2+*~NsCwfLmo-31-o;{W8Lm!4@&Jh3Y)X4vuUTy0S$AN(x*gi14y&(2(u5>n zpKeKqG|oVph7ym@&AE?~N_AxWb|$lb)uiNw`t^!A(4E6opwp;w+mZVd&!(u`IN zrnfGk_m?`2UgzU5gJ_?7bu@808Y_TrUw!uc3hIAMOVf}2a+QmPPk`^g-nD!Vi;6{A=d_Y}US zB(V*eB=-AtTk^H7NMexy`{EeQN(a(2O^IXi(~wLy79*3z4%4b&7JkX*Z(!Xg2A%(d zzZOF-+59y;M8S;SUBmB!VD`6$W|Ls{XYk(2y^-HIGD(&SxMA}b2uQ#4mom08^*Wv! zP5@@ zL>$D=*%jZM#9S|u6zF6bId^OsEWHK1xVg+}2<+LDHb!DsGog*Mp2pw+)hgjSue!89!EO?^L*8yfzri#fOr>@(9t z8#l%pj#4V@JQXtM{5?dNQGU1wHW_ZtS)}B%lp^Ud&X81Y@doboni#QepU%DWt%wng z!0k&DG&wQx*ES_hG&~y#6({_Cu*;Lhs=Hi!JOt{+uQ|frs%#M+yLTfXV`7`L9e;%x zeXfUxC|l6Gef%!S7B?B1O|r$c@ZQSZ&y?`WL=1IpMKJoEZ8EYl@fw~O_>D5L54*F& z)NL(y1N)ECO`0)9>21(W>^}tR4MO+C(|IRAhyj5%Ur)PJRV$8?qKvz}t*vis62Ur#g=xhuc+<{|&O#jhujzv?HDq zY-|(?6Eo)vQa}dzqQ?0+Q(L$h10IYtCEZSH zG$qY;FVWN^Nz#b8M$shR^e(AC9xR;fE&JOd{+>^1yLcm8kgCJ(c^MQ@)0pK7cO z%xZ@z4uI7O!%gi*0|Y##$EsZeCow25M8ple>Y64KXR+b{_2y0YamV-ZMuTlQK_TS2 zZf)Sdgbf^SHcq#8yQQaeYvZA6SqUD|xV2f&Sc8I+(L}(-A$Rr>yw4UkC>o!<~=GtsxSvKCU} z)19=}!h%k`;7sGMFqQr_@DNpcdbgk71(p7FhGvsW{|vmhVjzcC@S6)huN(rvTWO`31> z;Nnen9$-|J_YM*H8*ri?B63o|?{iCx>l;CdAeG2(!r^sdcR6iW&O*X&DnvuXwcd=x zYZ+UQY1okF*M}i7y4zH@koe|KA<=mOMwZ}=Tk4kBE9Jl!H3$)FAG4uQA}#%ZdFi*B z_m4D}!j@j1!_8J@+etIV$?(2Tc>k;BeSzm5k+1cww^;>p0Z)NhA2Yi%i!H{NbCa9H{(z}uABEjHp;dd9*t18nxbdpl$=vfc)2HzFN6(XVG6J^S*9ckjbgWT(p@9AOh)Nem>dXXefIpO9bU z9av_zboQy+3Y_(Jm@`G(DArMM+|+F3`DSMfJ4A3Q$e@qE@F#Ls(10*pK(wHk`7@J4 zZfpU_0<|2Zl&qkL_*k(#lPkKhN|_pP6u6)}33qeZ@xx#T+s)t)-PP0wko?dj=q}J8 zwbC$|8mvY@AW8IFfbrS0t$zp%lObYH6nLPdBa(iw^-pj|Qqkch76w_TJv658?FwKY z^JF%@x4msvf2N&Us+~GdiR%5+%^*v~>%hm&hgL4;(2{P~YloIJZ|~Nj^~od-tsn6# zRdVPBo?MxbL!$={G}49Oe^Dpc7>ZX-9btSB#2f_;96$j^9;R9}#lagtf*L)43`b8G z!~u0~6{lt+hmH~0Moyg0Lf^ASF?TU1?kv2GpDb}uH*~DD{4q_R1RFg0E?Tk9 zo6m!}nDbzkpKsUB18K&bLtU|nem05o-~qg@z+&`4>#1@LQ_4)!+3h+H#9BJ(3fVny zD2%oe2`}okkX8)FuOvKf1CtC=Fo~; zaVm!7~1;Zna1 zTf7dKXaOO{63N-4xkZSHv>TpnC_9M>u`&TM1qTm^D)=XzIYHTr-od)6uZP=O&Lonw zk`}2$4&wPF_RjOy_w{K>FG(CjDit4=7dOZ|OnA7PFTS2P80ffzvAW{LLf z$dSM|ZVGAO6B@FHw84?nH6y#iR#P)@V+lX{3Zi${@w<>I=o;vwH=8mA zeFeI&NNoyEap>hib~CGAcK#jV=y$#G1*t*;VrM z%lh-PH9Tgem=uxBMhrcrYR4|Y444UK6B7*Nm{O>53pZnqDI>v1w>z|M(wylk!R+iP z!8muo@RF$LEs{&c%h1b#B3NMBUw^NTR6z#7IgsO6Cr5dW=4A^2JO=Ab`9;){9sqnzAGuTPrWDX{)Heuh(?LY zUhv9!z%5M*+8Fb&s?!4|+u-*x=pR^$dtsRaM)1}=&!Esqki!6VC;>ac(e(QVJ{_W- z zZrhmBElktC$k+0nDITza>{j0KFFpJUKyGR^f1mlqe>_NCe<*PSp!s|;SFLJyR`iP~ zLFS;yBHa~O6#rWH4$%mkMat3T&`CLZH#xc?yLl&7uCL*_(J_@PAVE(JK!T`{NTQU% zBV$h)Jc>N<(~6dqGWb+vF9n7Bo)g)<9QXeStk-PK9-^$cAUvWAI;L7#6UpzlvV|Mc zvOCv&4uVyWp){{t`<`#b!rd_NzSWx`pi?NUu9@ES;tSpdn+0G-UdqTTy{<&Ed9=D8D5!v4bKi% zGi7%F1Dq*Sx3%02>f&+KTiZUP-P-%eg{lsgioHo z(%cPGv@?8cG=Cky+THzBKnSkr{X_=$xB3Oryz)`W)z(#j8kAwO2lWGfxG z+&l{$=MJi7*#c*H&}8{L!hHj$E$D>qL&dNY|>^;MCsn`P+8b??;5J#n)WUW|Bs@4 zVys+u3mqapAN3geb9s#`@=|Uwt=0aeVE6{tX5t@vF2V=Q z9Ac{(;kR%zT271{Lb~nKID|Bx=sv=KD^Y|`l__w|Rr|bvi$HYJ$cd#=ek8+($k6C0 z#4*zC^MHm@ZN)UAm@25kONdPaqr?hO5^xW&9PO;DVg#JIicJ>vVkt-ig$cc}(d>ag z*t5R6-Q=Fp%K`64JN`EFj+bUM{u_6^Jcr_riYOt?d%C~l z|0vNNzj9Dmd~l2VIKb^4LaO2uE>aryTBi7w347a&$B)>=!f+GMO{ zQ_!$=q*yFpJPFaVg+-{k2Eo;pC3|Rkqbmy8xgwO^%v0!%cJ6qp`3Nz^mIFrN@-E=D zm71t~ILmSmK(cp~*5n`+SLIaZo*CF*H_=VOR?R%dm;bzXXqb!hHWbpD+yjPgzv`+q z?)4g9pmzmvK2u9tbqPX|h$QVsGo^BzUNAb9elwEltSeH-aXmxsdg_UuV}VaBe2R=NycqC!4bEJmbtY5mMiPr8|6Aulz@ zJ8UybPrB4%L2Pa{wilAe@RY-!E9RtQ?e<&Y_*t!=aDP*N!XeF1_|=5e$Nj#akf!W} zdxYm`%}+>Ubk0w>=>RzA?sqohuP{I126%{mLV9-%zYBiCYYojNKjAufZzU6|!?G?0 zzQTR*-+u5H4j?T3&Y%ph%)X9i2giXjyZ-^sR#Ufr?gkDQrJFRPzwid=CjLT#*Yg(= zG=pYnw(+pwFI0w=X7m>tp^@j{FEn*Se<4G|TX8!;mV`Yeupum*vd1?>Px%XpWW-+> zMKITy2}YXHUuYy4d9IVMG^4+;%LJ3{Ji#~*z#QH47ZQfe{z5|dfSE(wU`F^(ZbpBh z5#iG9kj5dT`Kj(B{7|9@pSl+-p;sEVGr5OJ>Nl+An)9}?(8~Y6vi*jpFWHxb2Xx