From 5fa037ef007cc3663e8c583170b2618d38e3e66a Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 15 Jun 2026 20:19:23 +0100 Subject: [PATCH 01/18] chore(deps): update tunit to 1.56.0 (#6259) Co-authored-by: Renovate Bot --- Directory.Packages.props | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7ab47f8090..b3403f4c86 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -101,14 +101,14 @@ - + - - - - - + + + + + From b34a556c984ef5c1c6fe26c66469813bc2d660c2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 15 Jun 2026 20:20:27 +0100 Subject: [PATCH 02/18] chore(deps): update dependency streamjsonrpc to 2.25.29 (#6258) 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 b3403f4c86..e52fe4aaab 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -91,7 +91,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + From 65470637e22e3a087986109931edf927984f9ffa Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 16 Jun 2026 04:29:35 +0100 Subject: [PATCH 03/18] chore: update mock benchmark results (#6261) --- docs/docs/benchmarks/mocks/Callback.md | 36 +- .../docs/benchmarks/mocks/CombinedWorkflow.md | 20 +- docs/docs/benchmarks/mocks/Invocation.md | 52 +- docs/docs/benchmarks/mocks/MockCreation.md | 36 +- docs/docs/benchmarks/mocks/Setup.md | 36 +- docs/docs/benchmarks/mocks/Verification.md | 52 +- docs/docs/benchmarks/mocks/index.md | 4 +- docs/static/benchmarks/mocks/Callback.json | 92 +-- .../benchmarks/mocks/CombinedWorkflow.json | 40 +- docs/static/benchmarks/mocks/Invocation.json | 118 ++-- .../static/benchmarks/mocks/MockCreation.json | 80 +-- docs/static/benchmarks/mocks/Setup.json | 124 ++-- .../static/benchmarks/mocks/Verification.json | 118 ++-- docs/static/benchmarks/mocks/latest.json | 564 +++++++++--------- docs/static/benchmarks/mocks/summary.json | 2 +- 15 files changed, 687 insertions(+), 687 deletions(-) diff --git a/docs/docs/benchmarks/mocks/Callback.md b/docs/docs/benchmarks/mocks/Callback.md index a6f053a452..a04f07078f 100644 --- a/docs/docs/benchmarks/mocks/Callback.md +++ b/docs/docs/benchmarks/mocks/Callback.md @@ -9,7 +9,7 @@ sidebar_position: 2 > Callback registration and execution — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-14** from the latest CI run. +This benchmark was automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Callback registration and execution: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 657.6 ns | 1.95 ns | 1.73 ns | 3.11 KB | -| Imposter | 451.4 ns | 5.24 ns | 4.91 ns | 2.66 KB | -| Mockolate | 358.0 ns | 2.09 ns | 1.85 ns | 1.91 KB | -| Moq | 190,276.0 ns | 1,148.44 ns | 1,018.06 ns | 13.14 KB | -| NSubstitute | 4,480.4 ns | 55.45 ns | 51.87 ns | 7.93 KB | -| FakeItEasy | 5,147.3 ns | 65.15 ns | 60.94 ns | 7.44 KB | +| **TUnit.Mocks** | 694.7 ns | 9.40 ns | 8.79 ns | 3.11 KB | +| Imposter | 475.1 ns | 4.83 ns | 4.29 ns | 2.66 KB | +| Mockolate | 361.1 ns | 5.03 ns | 4.71 ns | 1.91 KB | +| Moq | 136,205.6 ns | 1,348.19 ns | 1,195.14 ns | 13.14 KB | +| NSubstitute | 4,178.8 ns | 55.15 ns | 48.89 ns | 7.93 KB | +| FakeItEasy | 4,566.5 ns | 72.49 ns | 64.26 ns | 7.44 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Callback registration and execution: xychart-beta title "Callback Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 228332 - bar [657.6, 451.4, 358, 190276, 4480.4, 5147.3] + y-axis "Time (ns)" 0 --> 163447 + bar [694.7, 475.1, 361.1, 136205.6, 4178.8, 4566.5] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 785.6 ns | 15.17 ns | 14.90 ns | 3.2 KB | -| Imposter | 509.7 ns | 3.72 ns | 3.11 ns | 2.82 KB | -| Mockolate | 410.7 ns | 5.74 ns | 4.79 ns | 1.95 KB | -| Moq | 192,666.0 ns | 323.87 ns | 270.45 ns | 13.73 KB | -| NSubstitute | 5,183.3 ns | 32.47 ns | 28.78 ns | 8.53 KB | -| FakeItEasy | 6,167.2 ns | 70.13 ns | 58.56 ns | 9.4 KB | +| **TUnit.Mocks** | 770.4 ns | 6.81 ns | 5.69 ns | 3.2 KB | +| Imposter | 540.8 ns | 5.69 ns | 5.32 ns | 2.82 KB | +| Mockolate | 402.6 ns | 3.78 ns | 3.35 ns | 1.95 KB | +| Moq | 145,009.6 ns | 1,001.89 ns | 888.15 ns | 13.73 KB | +| NSubstitute | 4,693.5 ns | 44.49 ns | 39.44 ns | 8.53 KB | +| FakeItEasy | 5,793.0 ns | 102.11 ns | 109.26 ns | 9.26 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Callback (with args) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 231200 - bar [785.6, 509.7, 410.7, 192666, 5183.3, 6167.2] + y-axis "Time (ns)" 0 --> 174012 + bar [770.4, 540.8, 402.6, 145009.6, 4693.5, 5793] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/docs/benchmarks/mocks/CombinedWorkflow.md b/docs/docs/benchmarks/mocks/CombinedWorkflow.md index fa43a0bb7c..f205bee447 100644 --- a/docs/docs/benchmarks/mocks/CombinedWorkflow.md +++ b/docs/docs/benchmarks/mocks/CombinedWorkflow.md @@ -9,7 +9,7 @@ sidebar_position: 3 > Full workflow: create → setup → invoke → verify — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-14** from the latest CI run. +This benchmark was automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Full workflow: create → setup → invoke → verify: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1.838 μs | 0.0078 μs | 0.0073 μs | 6.23 KB | -| Imposter | 2.579 μs | 0.0178 μs | 0.0167 μs | 15.71 KB | -| Mockolate | 1.723 μs | 0.0107 μs | 0.0089 μs | 7.63 KB | -| Moq | 406.460 μs | 1.5731 μs | 1.3136 μs | 36.52 KB | -| NSubstitute | 17.813 μs | 0.0832 μs | 0.0695 μs | 26.85 KB | -| FakeItEasy | 18.355 μs | 0.1626 μs | 0.1521 μs | 25.52 KB | +| **TUnit.Mocks** | 1.841 μs | 0.0229 μs | 0.0214 μs | 6.23 KB | +| Imposter | 2.713 μs | 0.0181 μs | 0.0161 μs | 15.71 KB | +| Mockolate | 1.676 μs | 0.0086 μs | 0.0080 μs | 7.63 KB | +| Moq | 408.071 μs | 3.1355 μs | 2.7796 μs | 36.57 KB | +| NSubstitute | 17.270 μs | 0.0363 μs | 0.0322 μs | 26.85 KB | +| FakeItEasy | 18.329 μs | 0.1318 μs | 0.1169 μs | 25.52 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Full workflow: create → setup → invoke → verify: xychart-beta title "CombinedWorkflow Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (μs)" 0 --> 488 - bar [1.838, 2.579, 1.723, 406.46, 17.813, 18.355] + y-axis "Time (μs)" 0 --> 490 + bar [1.841, 2.713, 1.676, 408.071, 17.27, 18.329] ``` ## 🎯 Key Insights @@ -65,4 +65,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/docs/benchmarks/mocks/Invocation.md b/docs/docs/benchmarks/mocks/Invocation.md index 46554466d6..8afb86b1b6 100644 --- a/docs/docs/benchmarks/mocks/Invocation.md +++ b/docs/docs/benchmarks/mocks/Invocation.md @@ -9,7 +9,7 @@ sidebar_position: 4 > Calling methods on mock objects — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-14** from the latest CI run. +This benchmark was automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Calling methods on mock objects: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 286.1 ns | 47.63 ns | 2.61 ns | 128 B | -| Imposter | 312.8 ns | 125.21 ns | 6.86 ns | 168 B | -| Mockolate | 146.2 ns | 65.02 ns | 3.56 ns | 84 B | -| Moq | 890.3 ns | 85.09 ns | 4.66 ns | 376 B | -| NSubstitute | 790.1 ns | 201.16 ns | 11.03 ns | 304 B | -| FakeItEasy | 2,023.3 ns | 751.50 ns | 41.19 ns | 944 B | +| **TUnit.Mocks** | 280.3 ns | 97.63 ns | 5.35 ns | 128 B | +| Imposter | 299.7 ns | 107.32 ns | 5.88 ns | 168 B | +| Mockolate | 116.1 ns | 131.15 ns | 7.19 ns | 84 B | +| Moq | 857.5 ns | 212.29 ns | 11.64 ns | 376 B | +| NSubstitute | 764.2 ns | 210.56 ns | 11.54 ns | 304 B | +| FakeItEasy | 1,847.3 ns | 814.39 ns | 44.64 ns | 944 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Calling methods on mock objects: xychart-beta title "Invocation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2428 - bar [286.1, 312.8, 146.2, 890.3, 790.1, 2023.3] + y-axis "Time (ns)" 0 --> 2217 + bar [280.3, 299.7, 116.1, 857.5, 764.2, 1847.3] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 176.0 ns | 70.16 ns | 3.85 ns | 96 B | -| Imposter | 317.1 ns | 105.63 ns | 5.79 ns | 168 B | -| Mockolate | 127.2 ns | 195.31 ns | 10.71 ns | 60 B | -| Moq | 624.4 ns | 205.35 ns | 11.26 ns | 296 B | -| NSubstitute | 696.9 ns | 221.12 ns | 12.12 ns | 272 B | -| FakeItEasy | 1,844.7 ns | 253.25 ns | 13.88 ns | 776 B | +| **TUnit.Mocks** | 166.8 ns | 63.40 ns | 3.48 ns | 96 B | +| Imposter | 296.0 ns | 116.11 ns | 6.36 ns | 168 B | +| Mockolate | 106.9 ns | 36.94 ns | 2.02 ns | 60 B | +| Moq | 577.3 ns | 201.13 ns | 11.02 ns | 296 B | +| NSubstitute | 679.0 ns | 246.35 ns | 13.50 ns | 328 B | +| FakeItEasy | 1,588.5 ns | 1,442.94 ns | 79.09 ns | 776 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Invocation (String) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2214 - bar [176, 317.1, 127.2, 624.4, 696.9, 1844.7] + y-axis "Time (ns)" 0 --> 1907 + bar [166.8, 296, 106.9, 577.3, 679, 1588.5] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 28,340.7 ns | 15,973.75 ns | 875.58 ns | 12736 B | -| Imposter | 31,171.9 ns | 10,812.47 ns | 592.67 ns | 16800 B | -| Mockolate | 15,026.1 ns | 10,837.89 ns | 594.06 ns | 8400 B | -| Moq | 91,382.4 ns | 21,024.77 ns | 1,152.44 ns | 37600 B | -| NSubstitute | 80,641.2 ns | 32,824.22 ns | 1,799.21 ns | 30848 B | -| FakeItEasy | 206,796.1 ns | 87,347.42 ns | 4,787.81 ns | 94400 B | +| **TUnit.Mocks** | 27,273.6 ns | 12,452.58 ns | 682.57 ns | 12736 B | +| Imposter | 29,790.0 ns | 11,067.30 ns | 606.64 ns | 16800 B | +| Mockolate | 10,952.4 ns | 10,231.39 ns | 560.82 ns | 8400 B | +| Moq | 91,387.3 ns | 22,230.25 ns | 1,218.51 ns | 37600 B | +| NSubstitute | 76,035.4 ns | 10,932.13 ns | 599.23 ns | 30848 B | +| FakeItEasy | 189,643.3 ns | 112,559.24 ns | 6,169.75 ns | 94400 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Invocation (100 calls) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 248156 - bar [28340.7, 31171.9, 15026.1, 91382.4, 80641.2, 206796.1] + y-axis "Time (ns)" 0 --> 227572 + bar [27273.6, 29790, 10952.4, 91387.3, 76035.4, 189643.3] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/docs/benchmarks/mocks/MockCreation.md b/docs/docs/benchmarks/mocks/MockCreation.md index 62ab872a56..7a333aa2d2 100644 --- a/docs/docs/benchmarks/mocks/MockCreation.md +++ b/docs/docs/benchmarks/mocks/MockCreation.md @@ -9,7 +9,7 @@ sidebar_position: 5 > Mock instance creation performance — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-14** from the latest CI run. +This benchmark was automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock instance creation performance: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 23.13 ns | 0.155 ns | 0.137 ns | 200 B | -| Imposter | 77.65 ns | 0.378 ns | 0.335 ns | 440 B | -| Mockolate | 48.86 ns | 0.142 ns | 0.126 ns | 424 B | -| Moq | 985.35 ns | 12.672 ns | 11.234 ns | 2048 B | -| NSubstitute | 1,324.67 ns | 5.141 ns | 4.557 ns | 5000 B | -| FakeItEasy | 1,325.42 ns | 10.214 ns | 9.554 ns | 2715 B | +| **TUnit.Mocks** | 28.56 ns | 0.522 ns | 0.489 ns | 200 B | +| Imposter | 99.99 ns | 0.202 ns | 0.179 ns | 440 B | +| Mockolate | 71.95 ns | 0.479 ns | 0.425 ns | 424 B | +| Moq | 1,277.80 ns | 23.311 ns | 21.805 ns | 2048 B | +| NSubstitute | 1,716.98 ns | 10.866 ns | 10.164 ns | 5000 B | +| FakeItEasy | 1,668.96 ns | 8.804 ns | 8.236 ns | 2715 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock instance creation performance: xychart-beta title "MockCreation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 1591 - bar [23.13, 77.65, 48.86, 985.35, 1324.67, 1325.42] + y-axis "Time (ns)" 0 --> 2061 + bar [28.56, 99.99, 71.95, 1277.8, 1716.98, 1668.96] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 25.41 ns | 0.159 ns | 0.148 ns | 200 B | -| Imposter | 121.40 ns | 0.364 ns | 0.323 ns | 696 B | -| Mockolate | 51.50 ns | 0.746 ns | 0.697 ns | 456 B | -| Moq | 949.04 ns | 5.664 ns | 5.021 ns | 1912 B | -| NSubstitute | 1,330.80 ns | 6.107 ns | 5.712 ns | 5000 B | -| FakeItEasy | 1,308.82 ns | 15.546 ns | 13.781 ns | 2715 B | +| **TUnit.Mocks** | 31.71 ns | 0.541 ns | 0.506 ns | 200 B | +| Imposter | 156.40 ns | 0.222 ns | 0.197 ns | 696 B | +| Mockolate | 65.35 ns | 0.135 ns | 0.126 ns | 456 B | +| Moq | 1,245.66 ns | 2.345 ns | 2.078 ns | 1912 B | +| NSubstitute | 1,677.65 ns | 5.402 ns | 5.053 ns | 5000 B | +| FakeItEasy | 1,667.61 ns | 3.818 ns | 3.384 ns | 2715 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "MockCreation (Repository) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 1597 - bar [25.41, 121.4, 51.5, 949.04, 1330.8, 1308.82] + y-axis "Time (ns)" 0 --> 2014 + bar [31.71, 156.4, 65.35, 1245.66, 1677.65, 1667.61] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/docs/benchmarks/mocks/Setup.md b/docs/docs/benchmarks/mocks/Setup.md index 6447c486f1..47ef8097bd 100644 --- a/docs/docs/benchmarks/mocks/Setup.md +++ b/docs/docs/benchmarks/mocks/Setup.md @@ -9,7 +9,7 @@ sidebar_position: 6 > Mock behavior configuration (returns, matchers) — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-14** from the latest CI run. +This benchmark was automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock behavior configuration (returns, matchers): | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 483.2 ns | 6.00 ns | 5.61 ns | 2.34 KB | -| Imposter | 741.2 ns | 8.40 ns | 7.86 ns | 6.12 KB | -| Mockolate | 314.3 ns | 4.28 ns | 4.01 ns | 1.65 KB | -| Moq | 414,002.2 ns | 6,040.56 ns | 5,650.34 ns | 28.74 KB | -| NSubstitute | 5,239.1 ns | 56.36 ns | 49.96 ns | 9.06 KB | -| FakeItEasy | 8,339.0 ns | 110.81 ns | 103.65 ns | 10.56 KB | +| **TUnit.Mocks** | 588.4 ns | 7.52 ns | 7.03 ns | 2.34 KB | +| Imposter | 828.5 ns | 15.21 ns | 13.48 ns | 6.12 KB | +| Mockolate | 371.1 ns | 7.10 ns | 8.18 ns | 1.65 KB | +| Moq | 320,511.4 ns | 4,119.21 ns | 3,853.11 ns | 28.7 KB | +| NSubstitute | 5,389.5 ns | 27.53 ns | 25.75 ns | 9.01 KB | +| FakeItEasy | 7,696.3 ns | 64.86 ns | 57.50 ns | 10.46 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock behavior configuration (returns, matchers): xychart-beta title "Setup Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 496803 - bar [483.2, 741.2, 314.3, 414002.2, 5239.1, 8339] + y-axis "Time (ns)" 0 --> 384614 + bar [588.4, 828.5, 371.1, 320511.4, 5389.5, 7696.3] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 704.9 ns | 8.65 ns | 8.09 ns | 3.15 KB | -| Imposter | 1,270.2 ns | 18.19 ns | 16.12 ns | 10.59 KB | -| Mockolate | 537.9 ns | 8.39 ns | 7.85 ns | 2.6 KB | -| Moq | 111,180.3 ns | 2,211.64 ns | 2,366.43 ns | 16.53 KB | -| NSubstitute | 11,958.1 ns | 235.47 ns | 280.32 ns | 20.47 KB | -| FakeItEasy | 7,848.8 ns | 105.95 ns | 99.11 ns | 11.71 KB | +| **TUnit.Mocks** | 879.3 ns | 14.32 ns | 11.96 ns | 3.15 KB | +| Imposter | 1,447.5 ns | 26.62 ns | 34.61 ns | 10.59 KB | +| Mockolate | 607.8 ns | 11.99 ns | 18.31 ns | 2.6 KB | +| Moq | 84,047.0 ns | 1,156.28 ns | 1,081.58 ns | 16.53 KB | +| NSubstitute | 11,746.2 ns | 113.94 ns | 106.58 ns | 20.31 KB | +| FakeItEasy | 7,231.9 ns | 76.62 ns | 71.67 ns | 11.72 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Setup (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 133417 - bar [704.9, 1270.2, 537.9, 111180.3, 11958.1, 7848.8] + y-axis "Time (ns)" 0 --> 100857 + bar [879.3, 1447.5, 607.8, 84047, 11746.2, 7231.9] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/docs/benchmarks/mocks/Verification.md b/docs/docs/benchmarks/mocks/Verification.md index befb81d20d..577389d4fd 100644 --- a/docs/docs/benchmarks/mocks/Verification.md +++ b/docs/docs/benchmarks/mocks/Verification.md @@ -9,7 +9,7 @@ sidebar_position: 7 > Verifying mock method calls — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-14** from the latest CI run. +This benchmark was automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Verifying mock method calls: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 726.43 ns | 14.392 ns | 15.997 ns | 3008 B | -| Imposter | 709.66 ns | 12.601 ns | 11.170 ns | 4688 B | -| Mockolate | 437.19 ns | 8.769 ns | 9.747 ns | 2240 B | -| Moq | 345,643.09 ns | 2,485.066 ns | 2,075.142 ns | 24325 B | -| NSubstitute | 6,337.24 ns | 61.927 ns | 54.897 ns | 10064 B | -| FakeItEasy | 7,729.30 ns | 67.974 ns | 63.583 ns | 10722 B | +| **TUnit.Mocks** | 635.78 ns | 4.345 ns | 3.852 ns | 3008 B | +| Imposter | 626.37 ns | 4.965 ns | 4.146 ns | 4688 B | +| Mockolate | 368.76 ns | 1.256 ns | 1.175 ns | 2240 B | +| Moq | 317,960.35 ns | 3,562.982 ns | 3,332.816 ns | 24325 B | +| NSubstitute | 5,713.78 ns | 54.002 ns | 50.514 ns | 10064 B | +| FakeItEasy | 6,844.92 ns | 42.896 ns | 38.026 ns | 10722 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Verifying mock method calls: xychart-beta title "Verification Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 414772 - bar [726.43, 709.66, 437.19, 345643.09, 6337.24, 7729.3] + y-axis "Time (ns)" 0 --> 381553 + bar [635.78, 626.37, 368.76, 317960.35, 5713.78, 6844.92] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 52.79 ns | 0.426 ns | 0.356 ns | 320 B | -| Imposter | 335.46 ns | 3.877 ns | 3.627 ns | 2400 B | -| Mockolate | 249.80 ns | 3.227 ns | 3.019 ns | 1240 B | -| Moq | 88,476.37 ns | 668.638 ns | 625.445 ns | 6918 B | -| NSubstitute | 3,638.22 ns | 33.695 ns | 29.870 ns | 7088 B | -| FakeItEasy | 3,580.28 ns | 61.219 ns | 57.264 ns | 5209 B | +| **TUnit.Mocks** | 46.28 ns | 0.182 ns | 0.152 ns | 320 B | +| Imposter | 285.68 ns | 1.770 ns | 1.655 ns | 2400 B | +| Mockolate | 223.94 ns | 0.521 ns | 0.435 ns | 1240 B | +| Moq | 80,958.08 ns | 520.424 ns | 486.805 ns | 6918 B | +| NSubstitute | 3,226.29 ns | 6.706 ns | 5.236 ns | 7088 B | +| FakeItEasy | 3,436.39 ns | 32.473 ns | 27.117 ns | 5210 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Verification (Never) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 106172 - bar [52.79, 335.46, 249.8, 88476.37, 3638.22, 3580.28] + y-axis "Time (ns)" 0 --> 97150 + bar [46.28, 285.68, 223.94, 80958.08, 3226.29, 3436.39] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1,316.24 ns | 15.467 ns | 14.468 ns | 4472 B | -| Imposter | 1,867.10 ns | 31.574 ns | 27.990 ns | 11192 B | -| Mockolate | 1,242.72 ns | 24.213 ns | 22.649 ns | 5376 B | -| Moq | 484,355.68 ns | 2,098.368 ns | 1,860.149 ns | 34779 B | -| NSubstitute | 11,469.88 ns | 68.947 ns | 61.120 ns | 16762 B | -| FakeItEasy | 14,146.45 ns | 233.737 ns | 207.202 ns | 19345 B | +| **TUnit.Mocks** | 1,123.15 ns | 4.289 ns | 3.581 ns | 4472 B | +| Imposter | 1,568.51 ns | 7.513 ns | 6.660 ns | 11192 B | +| Mockolate | 1,048.82 ns | 6.147 ns | 5.750 ns | 5376 B | +| Moq | 433,476.81 ns | 3,003.389 ns | 2,662.426 ns | 34842 B | +| NSubstitute | 10,403.50 ns | 69.813 ns | 65.303 ns | 16762 B | +| FakeItEasy | 12,452.53 ns | 155.500 ns | 121.404 ns | 19233 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Verification (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 581227 - bar [1316.24, 1867.1, 1242.72, 484355.68, 11469.88, 14146.45] + y-axis "Time (ns)" 0 --> 520173 + bar [1123.15, 1568.51, 1048.82, 433476.81, 10403.5, 12452.53] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/docs/benchmarks/mocks/index.md b/docs/docs/benchmarks/mocks/index.md index 947eb127d2..8af7efd12f 100644 --- a/docs/docs/benchmarks/mocks/index.md +++ b/docs/docs/benchmarks/mocks/index.md @@ -7,7 +7,7 @@ sidebar_position: 4 # Mock Library Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2026-06-14** from the latest CI run. +These benchmarks were automatically generated on **2026-06-16** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -76,4 +76,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: 2026-06-14T03:35:08.044Z* +*Last generated: 2026-06-16T03:29:20.737Z* diff --git a/docs/static/benchmarks/mocks/Callback.json b/docs/static/benchmarks/mocks/Callback.json index 78144fe1b8..0d1ead55e6 100644 --- a/docs/static/benchmarks/mocks/Callback.json +++ b/docs/static/benchmarks/mocks/Callback.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "category": "Callback", "description": "Callback registration and execution", "environment": { @@ -10,111 +10,111 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "657.6 ns", - "Error": "1.95 ns", - "StdDev": "1.73 ns", + "Mean": "694.7 ns", + "Error": "9.40 ns", + "StdDev": "8.79 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "451.4 ns", - "Error": "5.24 ns", - "StdDev": "4.91 ns", - "Gen0": "0.1626", - "Gen1": "0.0014", + "Mean": "475.1 ns", + "Error": "4.83 ns", + "StdDev": "4.29 ns", + "Gen0": "0.1621", + "Gen1": "0.0010", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "358.0 ns", - "Error": "2.09 ns", - "StdDev": "1.85 ns", + "Mean": "361.1 ns", + "Error": "5.03 ns", + "StdDev": "4.71 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "190,276.0 ns", - "Error": "1,148.44 ns", - "StdDev": "1,018.06 ns", + "Mean": "136,205.6 ns", + "Error": "1,348.19 ns", + "StdDev": "1,195.14 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,480.4 ns", - "Error": "55.45 ns", - "StdDev": "51.87 ns", - "Gen0": "0.4807", - "Gen1": "0.0076", + "Mean": "4,178.8 ns", + "Error": "55.15 ns", + "StdDev": "48.89 ns", + "Gen0": "0.4578", + "Gen1": "-", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "5,147.3 ns", - "Error": "65.15 ns", - "StdDev": "60.94 ns", - "Gen0": "0.4501", - "Gen1": "0.0153", + "Mean": "4,566.5 ns", + "Error": "72.49 ns", + "StdDev": "64.26 ns", + "Gen0": "0.4272", + "Gen1": "0.0305", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "785.6 ns", - "Error": "15.17 ns", - "StdDev": "14.90 ns", + "Mean": "770.4 ns", + "Error": "6.81 ns", + "StdDev": "5.69 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "509.7 ns", - "Error": "3.72 ns", - "StdDev": "3.11 ns", + "Mean": "540.8 ns", + "Error": "5.69 ns", + "StdDev": "5.32 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "410.7 ns", - "Error": "5.74 ns", - "StdDev": "4.79 ns", + "Mean": "402.6 ns", + "Error": "3.78 ns", + "StdDev": "3.35 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "192,666.0 ns", - "Error": "323.87 ns", - "StdDev": "270.45 ns", + "Mean": "145,009.6 ns", + "Error": "1,001.89 ns", + "StdDev": "888.15 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "5,183.3 ns", - "Error": "32.47 ns", - "StdDev": "28.78 ns", + "Mean": "4,693.5 ns", + "Error": "44.49 ns", + "StdDev": "39.44 ns", "Gen0": "0.5188", "Gen1": "0.0076", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "6,167.2 ns", - "Error": "70.13 ns", - "StdDev": "58.56 ns", - "Gen0": "0.5493", - "Gen1": "0.0610", - "Allocated": "9.4 KB" + "Mean": "5,793.0 ns", + "Error": "102.11 ns", + "StdDev": "109.26 ns", + "Gen0": "0.5646", + "Gen1": "0.0153", + "Allocated": "9.26 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/CombinedWorkflow.json b/docs/static/benchmarks/mocks/CombinedWorkflow.json index 6e78e1980f..064e32eb1a 100644 --- a/docs/static/benchmarks/mocks/CombinedWorkflow.json +++ b/docs/static/benchmarks/mocks/CombinedWorkflow.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "category": "CombinedWorkflow", "description": "Full workflow: create → setup → invoke → verify", "environment": { @@ -10,54 +10,54 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "1.838 μs", - "Error": "0.0078 μs", - "StdDev": "0.0073 μs", + "Mean": "1.841 μs", + "Error": "0.0229 μs", + "StdDev": "0.0214 μs", "Gen0": "0.3796", "Gen1": "0.0057", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.579 μs", - "Error": "0.0178 μs", - "StdDev": "0.0167 μs", + "Mean": "2.713 μs", + "Error": "0.0181 μs", + "StdDev": "0.0161 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.723 μs", - "Error": "0.0107 μs", - "StdDev": "0.0089 μs", + "Mean": "1.676 μs", + "Error": "0.0086 μs", + "StdDev": "0.0080 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "406.460 μs", - "Error": "1.5731 μs", - "StdDev": "1.3136 μs", + "Mean": "408.071 μs", + "Error": "3.1355 μs", + "StdDev": "2.7796 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.52 KB" + "Allocated": "36.57 KB" }, { "Method": "NSubstitute", - "Mean": "17.813 μs", - "Error": "0.0832 μs", - "StdDev": "0.0695 μs", + "Mean": "17.270 μs", + "Error": "0.0363 μs", + "StdDev": "0.0322 μs", "Gen0": "1.6174", "Gen1": "0.0305", "Allocated": "26.85 KB" }, { "Method": "FakeItEasy", - "Mean": "18.355 μs", - "Error": "0.1626 μs", - "StdDev": "0.1521 μs", + "Mean": "18.329 μs", + "Error": "0.1318 μs", + "StdDev": "0.1169 μs", "Gen0": "1.4648", "Gen1": "0.1221", "Allocated": "25.52 KB" diff --git a/docs/static/benchmarks/mocks/Invocation.json b/docs/static/benchmarks/mocks/Invocation.json index fa90d8f102..5864b691f3 100644 --- a/docs/static/benchmarks/mocks/Invocation.json +++ b/docs/static/benchmarks/mocks/Invocation.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "category": "Invocation", "description": "Calling methods on mock objects", "environment": { @@ -10,162 +10,162 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "286.1 ns", - "Error": "47.63 ns", - "StdDev": "2.61 ns", + "Mean": "280.3 ns", + "Error": "97.63 ns", + "StdDev": "5.35 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "312.8 ns", - "Error": "125.21 ns", - "StdDev": "6.86 ns", + "Mean": "299.7 ns", + "Error": "107.32 ns", + "StdDev": "5.88 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "146.2 ns", - "Error": "65.02 ns", - "StdDev": "3.56 ns", + "Mean": "116.1 ns", + "Error": "131.15 ns", + "StdDev": "7.19 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "890.3 ns", - "Error": "85.09 ns", - "StdDev": "4.66 ns", + "Mean": "857.5 ns", + "Error": "212.29 ns", + "StdDev": "11.64 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "790.1 ns", - "Error": "201.16 ns", - "StdDev": "11.03 ns", + "Mean": "764.2 ns", + "Error": "210.56 ns", + "StdDev": "11.54 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "2,023.3 ns", - "Error": "751.50 ns", - "StdDev": "41.19 ns", + "Mean": "1,847.3 ns", + "Error": "814.39 ns", + "StdDev": "44.64 ns", "Gen0": "0.0534", "Gen1": "0.0496", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "176.0 ns", - "Error": "70.16 ns", - "StdDev": "3.85 ns", + "Mean": "166.8 ns", + "Error": "63.40 ns", + "StdDev": "3.48 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "317.1 ns", - "Error": "105.63 ns", - "StdDev": "5.79 ns", + "Mean": "296.0 ns", + "Error": "116.11 ns", + "StdDev": "6.36 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "127.2 ns", - "Error": "195.31 ns", - "StdDev": "10.71 ns", + "Mean": "106.9 ns", + "Error": "36.94 ns", + "StdDev": "2.02 ns", "Gen0": "0.0036", - "Gen1": "0.0033", + "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "624.4 ns", - "Error": "205.35 ns", - "StdDev": "11.26 ns", + "Mean": "577.3 ns", + "Error": "201.13 ns", + "StdDev": "11.02 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "696.9 ns", - "Error": "221.12 ns", - "StdDev": "12.12 ns", - "Gen0": "0.0153", - "Gen1": "0.0143", - "Allocated": "272 B" + "Mean": "679.0 ns", + "Error": "246.35 ns", + "StdDev": "13.50 ns", + "Gen0": "0.0181", + "Gen1": "0.0172", + "Allocated": "328 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,844.7 ns", - "Error": "253.25 ns", - "StdDev": "13.88 ns", + "Mean": "1,588.5 ns", + "Error": "1,442.94 ns", + "StdDev": "79.09 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "28,340.7 ns", - "Error": "15,973.75 ns", - "StdDev": "875.58 ns", + "Mean": "27,273.6 ns", + "Error": "12,452.58 ns", + "StdDev": "682.57 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "31,171.9 ns", - "Error": "10,812.47 ns", - "StdDev": "592.67 ns", + "Mean": "29,790.0 ns", + "Error": "11,067.30 ns", + "StdDev": "606.64 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "15,026.1 ns", - "Error": "10,837.89 ns", - "StdDev": "594.06 ns", + "Mean": "10,952.4 ns", + "Error": "10,231.39 ns", + "StdDev": "560.82 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "91,382.4 ns", - "Error": "21,024.77 ns", - "StdDev": "1,152.44 ns", + "Mean": "91,387.3 ns", + "Error": "22,230.25 ns", + "StdDev": "1,218.51 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "80,641.2 ns", - "Error": "32,824.22 ns", - "StdDev": "1,799.21 ns", + "Mean": "76,035.4 ns", + "Error": "10,932.13 ns", + "StdDev": "599.23 ns", "Gen0": "1.7090", "Gen1": "1.5869", "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "206,796.1 ns", - "Error": "87,347.42 ns", - "StdDev": "4,787.81 ns", + "Mean": "189,643.3 ns", + "Error": "112,559.24 ns", + "StdDev": "6,169.75 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" diff --git a/docs/static/benchmarks/mocks/MockCreation.json b/docs/static/benchmarks/mocks/MockCreation.json index ef654d181d..cfe4e55c79 100644 --- a/docs/static/benchmarks/mocks/MockCreation.json +++ b/docs/static/benchmarks/mocks/MockCreation.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "category": "MockCreation", "description": "Mock instance creation performance", "environment": { @@ -10,19 +10,19 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "23.13 ns", - "Error": "0.155 ns", - "StdDev": "0.137 ns", - "Gen0": "0.0120", + "Mean": "28.56 ns", + "Error": "0.522 ns", + "StdDev": "0.489 ns", + "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", "Allocated": "200 B" }, { "Method": "Imposter", - "Mean": "77.65 ns", - "Error": "0.378 ns", - "StdDev": "0.335 ns", + "Mean": "99.99 ns", + "Error": "0.202 ns", + "StdDev": "0.179 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -30,9 +30,9 @@ }, { "Method": "Mockolate", - "Mean": "48.86 ns", - "Error": "0.142 ns", - "StdDev": "0.126 ns", + "Mean": "71.95 ns", + "Error": "0.479 ns", + "StdDev": "0.425 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -40,9 +40,9 @@ }, { "Method": "Moq", - "Mean": "985.35 ns", - "Error": "12.672 ns", - "StdDev": "11.234 ns", + "Mean": "1,277.80 ns", + "Error": "23.311 ns", + "StdDev": "21.805 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -50,9 +50,9 @@ }, { "Method": "NSubstitute", - "Mean": "1,324.67 ns", - "Error": "5.141 ns", - "StdDev": "4.557 ns", + "Mean": "1,716.98 ns", + "Error": "10.866 ns", + "StdDev": "10.164 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -60,9 +60,9 @@ }, { "Method": "FakeItEasy", - "Mean": "1,325.42 ns", - "Error": "10.214 ns", - "StdDev": "9.554 ns", + "Mean": "1,668.96 ns", + "Error": "8.804 ns", + "StdDev": "8.236 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -70,19 +70,19 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "25.41 ns", - "Error": "0.159 ns", - "StdDev": "0.148 ns", - "Gen0": "0.0120", + "Mean": "31.71 ns", + "Error": "0.541 ns", + "StdDev": "0.506 ns", + "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", "Allocated": "200 B" }, { "Method": "'Imposter (Repository)'", - "Mean": "121.40 ns", - "Error": "0.364 ns", - "StdDev": "0.323 ns", + "Mean": "156.40 ns", + "Error": "0.222 ns", + "StdDev": "0.197 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -90,9 +90,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "51.50 ns", - "Error": "0.746 ns", - "StdDev": "0.697 ns", + "Mean": "65.35 ns", + "Error": "0.135 ns", + "StdDev": "0.126 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -100,19 +100,19 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "949.04 ns", - "Error": "5.664 ns", - "StdDev": "5.021 ns", - "Gen0": "0.1135", + "Mean": "1,245.66 ns", + "Error": "2.345 ns", + "StdDev": "2.078 ns", + "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", "Allocated": "1912 B" }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,330.80 ns", - "Error": "6.107 ns", - "StdDev": "5.712 ns", + "Mean": "1,677.65 ns", + "Error": "5.402 ns", + "StdDev": "5.053 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -120,9 +120,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,308.82 ns", - "Error": "15.546 ns", - "StdDev": "13.781 ns", + "Mean": "1,667.61 ns", + "Error": "3.818 ns", + "StdDev": "3.384 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", diff --git a/docs/static/benchmarks/mocks/Setup.json b/docs/static/benchmarks/mocks/Setup.json index 6ac12c5851..3ade37a092 100644 --- a/docs/static/benchmarks/mocks/Setup.json +++ b/docs/static/benchmarks/mocks/Setup.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "category": "Setup", "description": "Mock behavior configuration (returns, matchers)", "environment": { @@ -10,111 +10,111 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "483.2 ns", - "Error": "6.00 ns", - "StdDev": "5.61 ns", - "Gen0": "0.1431", - "Gen1": "0.0010", + "Mean": "588.4 ns", + "Error": "7.52 ns", + "StdDev": "7.03 ns", + "Gen0": "0.0954", + "Gen1": "-", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "741.2 ns", - "Error": "8.40 ns", - "StdDev": "7.86 ns", - "Gen0": "0.3738", - "Gen1": "0.0076", + "Mean": "828.5 ns", + "Error": "15.21 ns", + "StdDev": "13.48 ns", + "Gen0": "0.2489", + "Gen1": "0.0048", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "314.3 ns", - "Error": "4.28 ns", - "StdDev": "4.01 ns", - "Gen0": "0.1006", - "Gen1": "0.0005", + "Mean": "371.1 ns", + "Error": "7.10 ns", + "StdDev": "8.18 ns", + "Gen0": "0.0672", + "Gen1": "-", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "414,002.2 ns", - "Error": "6,040.56 ns", - "StdDev": "5,650.34 ns", + "Mean": "320,511.4 ns", + "Error": "4,119.21 ns", + "StdDev": "3,853.11 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.74 KB" + "Allocated": "28.7 KB" }, { "Method": "NSubstitute", - "Mean": "5,239.1 ns", - "Error": "56.36 ns", - "StdDev": "49.96 ns", - "Gen0": "0.5493", - "Gen1": "0.0076", - "Allocated": "9.06 KB" + "Mean": "5,389.5 ns", + "Error": "27.53 ns", + "StdDev": "25.75 ns", + "Gen0": "0.3662", + "Gen1": "-", + "Allocated": "9.01 KB" }, { "Method": "FakeItEasy", - "Mean": "8,339.0 ns", - "Error": "110.81 ns", - "StdDev": "103.65 ns", - "Gen0": "0.6409", + "Mean": "7,696.3 ns", + "Error": "64.86 ns", + "StdDev": "57.50 ns", + "Gen0": "0.4120", "Gen1": "0.0153", - "Allocated": "10.56 KB" + "Allocated": "10.46 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "704.9 ns", - "Error": "8.65 ns", - "StdDev": "8.09 ns", - "Gen0": "0.1926", - "Gen1": "0.0019", + "Mean": "879.3 ns", + "Error": "14.32 ns", + "StdDev": "11.96 ns", + "Gen0": "0.1278", + "Gen1": "0.0010", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,270.2 ns", - "Error": "18.19 ns", - "StdDev": "16.12 ns", - "Gen0": "0.6485", - "Gen1": "0.0248", + "Mean": "1,447.5 ns", + "Error": "26.62 ns", + "StdDev": "34.61 ns", + "Gen0": "0.4311", + "Gen1": "0.0153", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "537.9 ns", - "Error": "8.39 ns", - "StdDev": "7.85 ns", - "Gen0": "0.1583", - "Gen1": "0.0010", + "Mean": "607.8 ns", + "Error": "11.99 ns", + "StdDev": "18.31 ns", + "Gen0": "0.1059", + "Gen1": "-", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "111,180.3 ns", - "Error": "2,211.64 ns", - "StdDev": "2,366.43 ns", - "Gen0": "0.9766", - "Gen1": "0.7324", + "Mean": "84,047.0 ns", + "Error": "1,156.28 ns", + "StdDev": "1,081.58 ns", + "Gen0": "0.4883", + "Gen1": "0.2441", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,958.1 ns", - "Error": "235.47 ns", - "StdDev": "280.32 ns", - "Gen0": "1.2207", - "Gen1": "-", - "Allocated": "20.47 KB" + "Mean": "11,746.2 ns", + "Error": "113.94 ns", + "StdDev": "106.58 ns", + "Gen0": "0.8240", + "Gen1": "0.0153", + "Allocated": "20.31 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,848.8 ns", - "Error": "105.95 ns", - "StdDev": "99.11 ns", - "Gen0": "0.7019", + "Mean": "7,231.9 ns", + "Error": "76.62 ns", + "StdDev": "71.67 ns", + "Gen0": "0.4730", "Gen1": "0.0153", - "Allocated": "11.71 KB" + "Allocated": "11.72 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Verification.json b/docs/static/benchmarks/mocks/Verification.json index 568096e10c..0cbb238e5e 100644 --- a/docs/static/benchmarks/mocks/Verification.json +++ b/docs/static/benchmarks/mocks/Verification.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "category": "Verification", "description": "Verifying mock method calls", "environment": { @@ -10,165 +10,165 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "726.43 ns", - "Error": "14.392 ns", - "StdDev": "15.997 ns", + "Mean": "635.78 ns", + "Error": "4.345 ns", + "StdDev": "3.852 ns", "Gen0": "0.1793", "Gen1": "0.0010", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "709.66 ns", - "Error": "12.601 ns", - "StdDev": "11.170 ns", + "Mean": "626.37 ns", + "Error": "4.965 ns", + "StdDev": "4.146 ns", "Gen0": "0.2794", "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "437.19 ns", - "Error": "8.769 ns", - "StdDev": "9.747 ns", + "Mean": "368.76 ns", + "Error": "1.256 ns", + "StdDev": "1.175 ns", "Gen0": "0.1335", "Gen1": "0.0005", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "345,643.09 ns", - "Error": "2,485.066 ns", - "StdDev": "2,075.142 ns", + "Mean": "317,960.35 ns", + "Error": "3,562.982 ns", + "StdDev": "3,332.816 ns", "Gen0": "0.9766", "Gen1": "-", "Allocated": "24325 B" }, { "Method": "NSubstitute", - "Mean": "6,337.24 ns", - "Error": "61.927 ns", - "StdDev": "54.897 ns", + "Mean": "5,713.78 ns", + "Error": "54.002 ns", + "StdDev": "50.514 ns", "Gen0": "0.5951", "Gen1": "0.0076", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "7,729.30 ns", - "Error": "67.974 ns", - "StdDev": "63.583 ns", + "Mean": "6,844.92 ns", + "Error": "42.896 ns", + "StdDev": "38.026 ns", "Gen0": "0.6409", "Gen1": "0.0153", "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "52.79 ns", - "Error": "0.426 ns", - "StdDev": "0.356 ns", + "Mean": "46.28 ns", + "Error": "0.182 ns", + "StdDev": "0.152 ns", "Gen0": "0.0191", "Gen1": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "335.46 ns", - "Error": "3.877 ns", - "StdDev": "3.627 ns", + "Mean": "285.68 ns", + "Error": "1.770 ns", + "StdDev": "1.655 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "249.80 ns", - "Error": "3.227 ns", - "StdDev": "3.019 ns", + "Mean": "223.94 ns", + "Error": "0.521 ns", + "StdDev": "0.435 ns", "Gen0": "0.0739", "Gen1": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "88,476.37 ns", - "Error": "668.638 ns", - "StdDev": "625.445 ns", + "Mean": "80,958.08 ns", + "Error": "520.424 ns", + "StdDev": "486.805 ns", "Gen0": "0.2441", "Gen1": "-", "Allocated": "6918 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,638.22 ns", - "Error": "33.695 ns", - "StdDev": "29.870 ns", + "Mean": "3,226.29 ns", + "Error": "6.706 ns", + "StdDev": "5.236 ns", "Gen0": "0.4234", "Gen1": "0.0038", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,580.28 ns", - "Error": "61.219 ns", - "StdDev": "57.264 ns", + "Mean": "3,436.39 ns", + "Error": "32.473 ns", + "StdDev": "27.117 ns", "Gen0": "0.3052", - "Gen1": "0.0305", - "Allocated": "5209 B" + "Gen1": "0.0153", + "Allocated": "5210 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,316.24 ns", - "Error": "15.467 ns", - "StdDev": "14.468 ns", + "Mean": "1,123.15 ns", + "Error": "4.289 ns", + "StdDev": "3.581 ns", "Gen0": "0.2670", "Gen1": "0.0019", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,867.10 ns", - "Error": "31.574 ns", - "StdDev": "27.990 ns", + "Mean": "1,568.51 ns", + "Error": "7.513 ns", + "StdDev": "6.660 ns", "Gen0": "0.6676", "Gen1": "0.0210", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,242.72 ns", - "Error": "24.213 ns", - "StdDev": "22.649 ns", + "Mean": "1,048.82 ns", + "Error": "6.147 ns", + "StdDev": "5.750 ns", "Gen0": "0.3204", "Gen1": "0.0038", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "484,355.68 ns", - "Error": "2,098.368 ns", - "StdDev": "1,860.149 ns", + "Mean": "433,476.81 ns", + "Error": "3,003.389 ns", + "StdDev": "2,662.426 ns", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "34779 B" + "Allocated": "34842 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,469.88 ns", - "Error": "68.947 ns", - "StdDev": "61.120 ns", + "Mean": "10,403.50 ns", + "Error": "69.813 ns", + "StdDev": "65.303 ns", "Gen0": "0.9918", "Gen1": "0.0153", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "14,146.45 ns", - "Error": "233.737 ns", - "StdDev": "207.202 ns", + "Mean": "12,452.53 ns", + "Error": "155.500 ns", + "StdDev": "121.404 ns", "Gen0": "1.0986", "Gen1": "-", - "Allocated": "19345 B" + "Allocated": "19233 B" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/latest.json b/docs/static/benchmarks/mocks/latest.json index 35a33085a4..c2d982a65a 100644 --- a/docs/static/benchmarks/mocks/latest.json +++ b/docs/static/benchmarks/mocks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-14T03:35:08.044Z", + "timestamp": "2026-06-16T03:29:20.737Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", @@ -9,164 +9,164 @@ "Callback": [ { "Method": "TUnit.Mocks", - "Mean": "657.6 ns", - "Error": "1.95 ns", - "StdDev": "1.73 ns", + "Mean": "694.7 ns", + "Error": "9.40 ns", + "StdDev": "8.79 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "451.4 ns", - "Error": "5.24 ns", - "StdDev": "4.91 ns", - "Gen0": "0.1626", - "Gen1": "0.0014", + "Mean": "475.1 ns", + "Error": "4.83 ns", + "StdDev": "4.29 ns", + "Gen0": "0.1621", + "Gen1": "0.0010", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "358.0 ns", - "Error": "2.09 ns", - "StdDev": "1.85 ns", + "Mean": "361.1 ns", + "Error": "5.03 ns", + "StdDev": "4.71 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "190,276.0 ns", - "Error": "1,148.44 ns", - "StdDev": "1,018.06 ns", + "Mean": "136,205.6 ns", + "Error": "1,348.19 ns", + "StdDev": "1,195.14 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,480.4 ns", - "Error": "55.45 ns", - "StdDev": "51.87 ns", - "Gen0": "0.4807", - "Gen1": "0.0076", + "Mean": "4,178.8 ns", + "Error": "55.15 ns", + "StdDev": "48.89 ns", + "Gen0": "0.4578", + "Gen1": "-", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "5,147.3 ns", - "Error": "65.15 ns", - "StdDev": "60.94 ns", - "Gen0": "0.4501", - "Gen1": "0.0153", + "Mean": "4,566.5 ns", + "Error": "72.49 ns", + "StdDev": "64.26 ns", + "Gen0": "0.4272", + "Gen1": "0.0305", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "785.6 ns", - "Error": "15.17 ns", - "StdDev": "14.90 ns", + "Mean": "770.4 ns", + "Error": "6.81 ns", + "StdDev": "5.69 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "509.7 ns", - "Error": "3.72 ns", - "StdDev": "3.11 ns", + "Mean": "540.8 ns", + "Error": "5.69 ns", + "StdDev": "5.32 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "410.7 ns", - "Error": "5.74 ns", - "StdDev": "4.79 ns", + "Mean": "402.6 ns", + "Error": "3.78 ns", + "StdDev": "3.35 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "192,666.0 ns", - "Error": "323.87 ns", - "StdDev": "270.45 ns", + "Mean": "145,009.6 ns", + "Error": "1,001.89 ns", + "StdDev": "888.15 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "5,183.3 ns", - "Error": "32.47 ns", - "StdDev": "28.78 ns", + "Mean": "4,693.5 ns", + "Error": "44.49 ns", + "StdDev": "39.44 ns", "Gen0": "0.5188", "Gen1": "0.0076", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "6,167.2 ns", - "Error": "70.13 ns", - "StdDev": "58.56 ns", - "Gen0": "0.5493", - "Gen1": "0.0610", - "Allocated": "9.4 KB" + "Mean": "5,793.0 ns", + "Error": "102.11 ns", + "StdDev": "109.26 ns", + "Gen0": "0.5646", + "Gen1": "0.0153", + "Allocated": "9.26 KB" } ], "CombinedWorkflow": [ { "Method": "TUnit.Mocks", - "Mean": "1.838 μs", - "Error": "0.0078 μs", - "StdDev": "0.0073 μs", + "Mean": "1.841 μs", + "Error": "0.0229 μs", + "StdDev": "0.0214 μs", "Gen0": "0.3796", "Gen1": "0.0057", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.579 μs", - "Error": "0.0178 μs", - "StdDev": "0.0167 μs", + "Mean": "2.713 μs", + "Error": "0.0181 μs", + "StdDev": "0.0161 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.723 μs", - "Error": "0.0107 μs", - "StdDev": "0.0089 μs", + "Mean": "1.676 μs", + "Error": "0.0086 μs", + "StdDev": "0.0080 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "406.460 μs", - "Error": "1.5731 μs", - "StdDev": "1.3136 μs", + "Mean": "408.071 μs", + "Error": "3.1355 μs", + "StdDev": "2.7796 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.52 KB" + "Allocated": "36.57 KB" }, { "Method": "NSubstitute", - "Mean": "17.813 μs", - "Error": "0.0832 μs", - "StdDev": "0.0695 μs", + "Mean": "17.270 μs", + "Error": "0.0363 μs", + "StdDev": "0.0322 μs", "Gen0": "1.6174", "Gen1": "0.0305", "Allocated": "26.85 KB" }, { "Method": "FakeItEasy", - "Mean": "18.355 μs", - "Error": "0.1626 μs", - "StdDev": "0.1521 μs", + "Mean": "18.329 μs", + "Error": "0.1318 μs", + "StdDev": "0.1169 μs", "Gen0": "1.4648", "Gen1": "0.1221", "Allocated": "25.52 KB" @@ -175,162 +175,162 @@ "Invocation": [ { "Method": "TUnit.Mocks", - "Mean": "286.1 ns", - "Error": "47.63 ns", - "StdDev": "2.61 ns", + "Mean": "280.3 ns", + "Error": "97.63 ns", + "StdDev": "5.35 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "312.8 ns", - "Error": "125.21 ns", - "StdDev": "6.86 ns", + "Mean": "299.7 ns", + "Error": "107.32 ns", + "StdDev": "5.88 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "146.2 ns", - "Error": "65.02 ns", - "StdDev": "3.56 ns", + "Mean": "116.1 ns", + "Error": "131.15 ns", + "StdDev": "7.19 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "890.3 ns", - "Error": "85.09 ns", - "StdDev": "4.66 ns", + "Mean": "857.5 ns", + "Error": "212.29 ns", + "StdDev": "11.64 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "790.1 ns", - "Error": "201.16 ns", - "StdDev": "11.03 ns", + "Mean": "764.2 ns", + "Error": "210.56 ns", + "StdDev": "11.54 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "2,023.3 ns", - "Error": "751.50 ns", - "StdDev": "41.19 ns", + "Mean": "1,847.3 ns", + "Error": "814.39 ns", + "StdDev": "44.64 ns", "Gen0": "0.0534", "Gen1": "0.0496", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "176.0 ns", - "Error": "70.16 ns", - "StdDev": "3.85 ns", + "Mean": "166.8 ns", + "Error": "63.40 ns", + "StdDev": "3.48 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "317.1 ns", - "Error": "105.63 ns", - "StdDev": "5.79 ns", + "Mean": "296.0 ns", + "Error": "116.11 ns", + "StdDev": "6.36 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "127.2 ns", - "Error": "195.31 ns", - "StdDev": "10.71 ns", + "Mean": "106.9 ns", + "Error": "36.94 ns", + "StdDev": "2.02 ns", "Gen0": "0.0036", - "Gen1": "0.0033", + "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "624.4 ns", - "Error": "205.35 ns", - "StdDev": "11.26 ns", + "Mean": "577.3 ns", + "Error": "201.13 ns", + "StdDev": "11.02 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "696.9 ns", - "Error": "221.12 ns", - "StdDev": "12.12 ns", - "Gen0": "0.0153", - "Gen1": "0.0143", - "Allocated": "272 B" + "Mean": "679.0 ns", + "Error": "246.35 ns", + "StdDev": "13.50 ns", + "Gen0": "0.0181", + "Gen1": "0.0172", + "Allocated": "328 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,844.7 ns", - "Error": "253.25 ns", - "StdDev": "13.88 ns", + "Mean": "1,588.5 ns", + "Error": "1,442.94 ns", + "StdDev": "79.09 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "28,340.7 ns", - "Error": "15,973.75 ns", - "StdDev": "875.58 ns", + "Mean": "27,273.6 ns", + "Error": "12,452.58 ns", + "StdDev": "682.57 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "31,171.9 ns", - "Error": "10,812.47 ns", - "StdDev": "592.67 ns", + "Mean": "29,790.0 ns", + "Error": "11,067.30 ns", + "StdDev": "606.64 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "15,026.1 ns", - "Error": "10,837.89 ns", - "StdDev": "594.06 ns", + "Mean": "10,952.4 ns", + "Error": "10,231.39 ns", + "StdDev": "560.82 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "91,382.4 ns", - "Error": "21,024.77 ns", - "StdDev": "1,152.44 ns", + "Mean": "91,387.3 ns", + "Error": "22,230.25 ns", + "StdDev": "1,218.51 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "80,641.2 ns", - "Error": "32,824.22 ns", - "StdDev": "1,799.21 ns", + "Mean": "76,035.4 ns", + "Error": "10,932.13 ns", + "StdDev": "599.23 ns", "Gen0": "1.7090", "Gen1": "1.5869", "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "206,796.1 ns", - "Error": "87,347.42 ns", - "StdDev": "4,787.81 ns", + "Mean": "189,643.3 ns", + "Error": "112,559.24 ns", + "StdDev": "6,169.75 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" @@ -339,19 +339,19 @@ "MockCreation": [ { "Method": "TUnit.Mocks", - "Mean": "23.13 ns", - "Error": "0.155 ns", - "StdDev": "0.137 ns", - "Gen0": "0.0120", + "Mean": "28.56 ns", + "Error": "0.522 ns", + "StdDev": "0.489 ns", + "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", "Allocated": "200 B" }, { "Method": "Imposter", - "Mean": "77.65 ns", - "Error": "0.378 ns", - "StdDev": "0.335 ns", + "Mean": "99.99 ns", + "Error": "0.202 ns", + "StdDev": "0.179 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -359,9 +359,9 @@ }, { "Method": "Mockolate", - "Mean": "48.86 ns", - "Error": "0.142 ns", - "StdDev": "0.126 ns", + "Mean": "71.95 ns", + "Error": "0.479 ns", + "StdDev": "0.425 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -369,9 +369,9 @@ }, { "Method": "Moq", - "Mean": "985.35 ns", - "Error": "12.672 ns", - "StdDev": "11.234 ns", + "Mean": "1,277.80 ns", + "Error": "23.311 ns", + "StdDev": "21.805 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -379,9 +379,9 @@ }, { "Method": "NSubstitute", - "Mean": "1,324.67 ns", - "Error": "5.141 ns", - "StdDev": "4.557 ns", + "Mean": "1,716.98 ns", + "Error": "10.866 ns", + "StdDev": "10.164 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -389,9 +389,9 @@ }, { "Method": "FakeItEasy", - "Mean": "1,325.42 ns", - "Error": "10.214 ns", - "StdDev": "9.554 ns", + "Mean": "1,668.96 ns", + "Error": "8.804 ns", + "StdDev": "8.236 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -399,19 +399,19 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "25.41 ns", - "Error": "0.159 ns", - "StdDev": "0.148 ns", - "Gen0": "0.0120", + "Mean": "31.71 ns", + "Error": "0.541 ns", + "StdDev": "0.506 ns", + "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", "Allocated": "200 B" }, { "Method": "'Imposter (Repository)'", - "Mean": "121.40 ns", - "Error": "0.364 ns", - "StdDev": "0.323 ns", + "Mean": "156.40 ns", + "Error": "0.222 ns", + "StdDev": "0.197 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -419,9 +419,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "51.50 ns", - "Error": "0.746 ns", - "StdDev": "0.697 ns", + "Mean": "65.35 ns", + "Error": "0.135 ns", + "StdDev": "0.126 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -429,19 +429,19 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "949.04 ns", - "Error": "5.664 ns", - "StdDev": "5.021 ns", - "Gen0": "0.1135", + "Mean": "1,245.66 ns", + "Error": "2.345 ns", + "StdDev": "2.078 ns", + "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", "Allocated": "1912 B" }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,330.80 ns", - "Error": "6.107 ns", - "StdDev": "5.712 ns", + "Mean": "1,677.65 ns", + "Error": "5.402 ns", + "StdDev": "5.053 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -449,9 +449,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,308.82 ns", - "Error": "15.546 ns", - "StdDev": "13.781 ns", + "Mean": "1,667.61 ns", + "Error": "3.818 ns", + "StdDev": "3.384 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -461,281 +461,281 @@ "Setup": [ { "Method": "TUnit.Mocks", - "Mean": "483.2 ns", - "Error": "6.00 ns", - "StdDev": "5.61 ns", - "Gen0": "0.1431", - "Gen1": "0.0010", + "Mean": "588.4 ns", + "Error": "7.52 ns", + "StdDev": "7.03 ns", + "Gen0": "0.0954", + "Gen1": "-", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "741.2 ns", - "Error": "8.40 ns", - "StdDev": "7.86 ns", - "Gen0": "0.3738", - "Gen1": "0.0076", + "Mean": "828.5 ns", + "Error": "15.21 ns", + "StdDev": "13.48 ns", + "Gen0": "0.2489", + "Gen1": "0.0048", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "314.3 ns", - "Error": "4.28 ns", - "StdDev": "4.01 ns", - "Gen0": "0.1006", - "Gen1": "0.0005", + "Mean": "371.1 ns", + "Error": "7.10 ns", + "StdDev": "8.18 ns", + "Gen0": "0.0672", + "Gen1": "-", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "414,002.2 ns", - "Error": "6,040.56 ns", - "StdDev": "5,650.34 ns", + "Mean": "320,511.4 ns", + "Error": "4,119.21 ns", + "StdDev": "3,853.11 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.74 KB" + "Allocated": "28.7 KB" }, { "Method": "NSubstitute", - "Mean": "5,239.1 ns", - "Error": "56.36 ns", - "StdDev": "49.96 ns", - "Gen0": "0.5493", - "Gen1": "0.0076", - "Allocated": "9.06 KB" + "Mean": "5,389.5 ns", + "Error": "27.53 ns", + "StdDev": "25.75 ns", + "Gen0": "0.3662", + "Gen1": "-", + "Allocated": "9.01 KB" }, { "Method": "FakeItEasy", - "Mean": "8,339.0 ns", - "Error": "110.81 ns", - "StdDev": "103.65 ns", - "Gen0": "0.6409", + "Mean": "7,696.3 ns", + "Error": "64.86 ns", + "StdDev": "57.50 ns", + "Gen0": "0.4120", "Gen1": "0.0153", - "Allocated": "10.56 KB" + "Allocated": "10.46 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "704.9 ns", - "Error": "8.65 ns", - "StdDev": "8.09 ns", - "Gen0": "0.1926", - "Gen1": "0.0019", + "Mean": "879.3 ns", + "Error": "14.32 ns", + "StdDev": "11.96 ns", + "Gen0": "0.1278", + "Gen1": "0.0010", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,270.2 ns", - "Error": "18.19 ns", - "StdDev": "16.12 ns", - "Gen0": "0.6485", - "Gen1": "0.0248", + "Mean": "1,447.5 ns", + "Error": "26.62 ns", + "StdDev": "34.61 ns", + "Gen0": "0.4311", + "Gen1": "0.0153", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "537.9 ns", - "Error": "8.39 ns", - "StdDev": "7.85 ns", - "Gen0": "0.1583", - "Gen1": "0.0010", + "Mean": "607.8 ns", + "Error": "11.99 ns", + "StdDev": "18.31 ns", + "Gen0": "0.1059", + "Gen1": "-", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "111,180.3 ns", - "Error": "2,211.64 ns", - "StdDev": "2,366.43 ns", - "Gen0": "0.9766", - "Gen1": "0.7324", + "Mean": "84,047.0 ns", + "Error": "1,156.28 ns", + "StdDev": "1,081.58 ns", + "Gen0": "0.4883", + "Gen1": "0.2441", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,958.1 ns", - "Error": "235.47 ns", - "StdDev": "280.32 ns", - "Gen0": "1.2207", - "Gen1": "-", - "Allocated": "20.47 KB" + "Mean": "11,746.2 ns", + "Error": "113.94 ns", + "StdDev": "106.58 ns", + "Gen0": "0.8240", + "Gen1": "0.0153", + "Allocated": "20.31 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,848.8 ns", - "Error": "105.95 ns", - "StdDev": "99.11 ns", - "Gen0": "0.7019", + "Mean": "7,231.9 ns", + "Error": "76.62 ns", + "StdDev": "71.67 ns", + "Gen0": "0.4730", "Gen1": "0.0153", - "Allocated": "11.71 KB" + "Allocated": "11.72 KB" } ], "Verification": [ { "Method": "TUnit.Mocks", - "Mean": "726.43 ns", - "Error": "14.392 ns", - "StdDev": "15.997 ns", + "Mean": "635.78 ns", + "Error": "4.345 ns", + "StdDev": "3.852 ns", "Gen0": "0.1793", "Gen1": "0.0010", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "709.66 ns", - "Error": "12.601 ns", - "StdDev": "11.170 ns", + "Mean": "626.37 ns", + "Error": "4.965 ns", + "StdDev": "4.146 ns", "Gen0": "0.2794", "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "437.19 ns", - "Error": "8.769 ns", - "StdDev": "9.747 ns", + "Mean": "368.76 ns", + "Error": "1.256 ns", + "StdDev": "1.175 ns", "Gen0": "0.1335", "Gen1": "0.0005", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "345,643.09 ns", - "Error": "2,485.066 ns", - "StdDev": "2,075.142 ns", + "Mean": "317,960.35 ns", + "Error": "3,562.982 ns", + "StdDev": "3,332.816 ns", "Gen0": "0.9766", "Gen1": "-", "Allocated": "24325 B" }, { "Method": "NSubstitute", - "Mean": "6,337.24 ns", - "Error": "61.927 ns", - "StdDev": "54.897 ns", + "Mean": "5,713.78 ns", + "Error": "54.002 ns", + "StdDev": "50.514 ns", "Gen0": "0.5951", "Gen1": "0.0076", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "7,729.30 ns", - "Error": "67.974 ns", - "StdDev": "63.583 ns", + "Mean": "6,844.92 ns", + "Error": "42.896 ns", + "StdDev": "38.026 ns", "Gen0": "0.6409", "Gen1": "0.0153", "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "52.79 ns", - "Error": "0.426 ns", - "StdDev": "0.356 ns", + "Mean": "46.28 ns", + "Error": "0.182 ns", + "StdDev": "0.152 ns", "Gen0": "0.0191", "Gen1": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "335.46 ns", - "Error": "3.877 ns", - "StdDev": "3.627 ns", + "Mean": "285.68 ns", + "Error": "1.770 ns", + "StdDev": "1.655 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "249.80 ns", - "Error": "3.227 ns", - "StdDev": "3.019 ns", + "Mean": "223.94 ns", + "Error": "0.521 ns", + "StdDev": "0.435 ns", "Gen0": "0.0739", "Gen1": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "88,476.37 ns", - "Error": "668.638 ns", - "StdDev": "625.445 ns", + "Mean": "80,958.08 ns", + "Error": "520.424 ns", + "StdDev": "486.805 ns", "Gen0": "0.2441", "Gen1": "-", "Allocated": "6918 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,638.22 ns", - "Error": "33.695 ns", - "StdDev": "29.870 ns", + "Mean": "3,226.29 ns", + "Error": "6.706 ns", + "StdDev": "5.236 ns", "Gen0": "0.4234", "Gen1": "0.0038", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,580.28 ns", - "Error": "61.219 ns", - "StdDev": "57.264 ns", + "Mean": "3,436.39 ns", + "Error": "32.473 ns", + "StdDev": "27.117 ns", "Gen0": "0.3052", - "Gen1": "0.0305", - "Allocated": "5209 B" + "Gen1": "0.0153", + "Allocated": "5210 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,316.24 ns", - "Error": "15.467 ns", - "StdDev": "14.468 ns", + "Mean": "1,123.15 ns", + "Error": "4.289 ns", + "StdDev": "3.581 ns", "Gen0": "0.2670", "Gen1": "0.0019", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,867.10 ns", - "Error": "31.574 ns", - "StdDev": "27.990 ns", + "Mean": "1,568.51 ns", + "Error": "7.513 ns", + "StdDev": "6.660 ns", "Gen0": "0.6676", "Gen1": "0.0210", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,242.72 ns", - "Error": "24.213 ns", - "StdDev": "22.649 ns", + "Mean": "1,048.82 ns", + "Error": "6.147 ns", + "StdDev": "5.750 ns", "Gen0": "0.3204", "Gen1": "0.0038", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "484,355.68 ns", - "Error": "2,098.368 ns", - "StdDev": "1,860.149 ns", + "Mean": "433,476.81 ns", + "Error": "3,003.389 ns", + "StdDev": "2,662.426 ns", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "34779 B" + "Allocated": "34842 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,469.88 ns", - "Error": "68.947 ns", - "StdDev": "61.120 ns", + "Mean": "10,403.50 ns", + "Error": "69.813 ns", + "StdDev": "65.303 ns", "Gen0": "0.9918", "Gen1": "0.0153", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "14,146.45 ns", - "Error": "233.737 ns", - "StdDev": "207.202 ns", + "Mean": "12,452.53 ns", + "Error": "155.500 ns", + "StdDev": "121.404 ns", "Gen0": "1.0986", "Gen1": "-", - "Allocated": "19345 B" + "Allocated": "19233 B" } ] }, "stats": { "categoryCount": 6, "totalBenchmarks": 78, - "lastUpdated": "2026-06-14T03:35:08.044Z" + "lastUpdated": "2026-06-16T03:29:20.737Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/summary.json b/docs/static/benchmarks/mocks/summary.json index f017cb313e..72841a55cd 100644 --- a/docs/static/benchmarks/mocks/summary.json +++ b/docs/static/benchmarks/mocks/summary.json @@ -7,7 +7,7 @@ "Setup", "Verification" ], - "timestamp": "2026-06-14", + "timestamp": "2026-06-16", "environment": "Ubuntu Latest • .NET SDK 10.0.301", "libraries": [ "TUnit.Mocks", From 8b2d5e436dd6922bf4dfd36b0e73e52ac8a2270b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 17 Jun 2026 04:29:12 +0100 Subject: [PATCH 04/18] chore: update mock benchmark results (#6265) --- docs/docs/benchmarks/mocks/Callback.md | 36 +- .../docs/benchmarks/mocks/CombinedWorkflow.md | 20 +- docs/docs/benchmarks/mocks/Invocation.md | 52 +- docs/docs/benchmarks/mocks/MockCreation.md | 36 +- docs/docs/benchmarks/mocks/Setup.md | 36 +- docs/docs/benchmarks/mocks/Verification.md | 52 +- docs/docs/benchmarks/mocks/index.md | 6 +- docs/static/benchmarks/mocks/Callback.json | 92 +-- .../benchmarks/mocks/CombinedWorkflow.json | 46 +- docs/static/benchmarks/mocks/Invocation.json | 134 ++-- .../static/benchmarks/mocks/MockCreation.json | 78 +-- docs/static/benchmarks/mocks/Setup.json | 128 ++-- .../static/benchmarks/mocks/Verification.json | 196 +++--- docs/static/benchmarks/mocks/latest.json | 656 +++++++++--------- docs/static/benchmarks/mocks/summary.json | 2 +- 15 files changed, 803 insertions(+), 767 deletions(-) diff --git a/docs/docs/benchmarks/mocks/Callback.md b/docs/docs/benchmarks/mocks/Callback.md index a04f07078f..d85e920b78 100644 --- a/docs/docs/benchmarks/mocks/Callback.md +++ b/docs/docs/benchmarks/mocks/Callback.md @@ -9,7 +9,7 @@ sidebar_position: 2 > Callback registration and execution — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-16** from the latest CI run. +This benchmark was automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Callback registration and execution: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 694.7 ns | 9.40 ns | 8.79 ns | 3.11 KB | -| Imposter | 475.1 ns | 4.83 ns | 4.29 ns | 2.66 KB | -| Mockolate | 361.1 ns | 5.03 ns | 4.71 ns | 1.91 KB | -| Moq | 136,205.6 ns | 1,348.19 ns | 1,195.14 ns | 13.14 KB | -| NSubstitute | 4,178.8 ns | 55.15 ns | 48.89 ns | 7.93 KB | -| FakeItEasy | 4,566.5 ns | 72.49 ns | 64.26 ns | 7.44 KB | +| **TUnit.Mocks** | 643.2 ns | 3.73 ns | 3.12 ns | 3.11 KB | +| Imposter | 459.2 ns | 1.46 ns | 1.36 ns | 2.66 KB | +| Mockolate | 355.3 ns | 1.04 ns | 0.87 ns | 1.91 KB | +| Moq | 136,059.1 ns | 1,655.45 ns | 1,467.51 ns | 13.14 KB | +| NSubstitute | 4,093.4 ns | 18.71 ns | 16.59 ns | 7.93 KB | +| FakeItEasy | 4,571.5 ns | 34.49 ns | 32.26 ns | 7.44 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Callback registration and execution: xychart-beta title "Callback Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 163447 - bar [694.7, 475.1, 361.1, 136205.6, 4178.8, 4566.5] + y-axis "Time (ns)" 0 --> 163271 + bar [643.2, 459.2, 355.3, 136059.1, 4093.4, 4571.5] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 770.4 ns | 6.81 ns | 5.69 ns | 3.2 KB | -| Imposter | 540.8 ns | 5.69 ns | 5.32 ns | 2.82 KB | -| Mockolate | 402.6 ns | 3.78 ns | 3.35 ns | 1.95 KB | -| Moq | 145,009.6 ns | 1,001.89 ns | 888.15 ns | 13.73 KB | -| NSubstitute | 4,693.5 ns | 44.49 ns | 39.44 ns | 8.53 KB | -| FakeItEasy | 5,793.0 ns | 102.11 ns | 109.26 ns | 9.26 KB | +| **TUnit.Mocks** | 790.1 ns | 4.79 ns | 4.24 ns | 3.2 KB | +| Imposter | 541.9 ns | 1.77 ns | 1.66 ns | 2.82 KB | +| Mockolate | 399.1 ns | 2.00 ns | 1.77 ns | 1.95 KB | +| Moq | 145,945.6 ns | 887.92 ns | 830.56 ns | 13.84 KB | +| NSubstitute | 4,590.9 ns | 22.92 ns | 20.32 ns | 8.53 KB | +| FakeItEasy | 5,495.5 ns | 28.70 ns | 23.97 ns | 9.4 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Callback (with args) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 174012 - bar [770.4, 540.8, 402.6, 145009.6, 4693.5, 5793] + y-axis "Time (ns)" 0 --> 175135 + bar [790.1, 541.9, 399.1, 145945.6, 4590.9, 5495.5] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/docs/benchmarks/mocks/CombinedWorkflow.md b/docs/docs/benchmarks/mocks/CombinedWorkflow.md index f205bee447..f47c3740c8 100644 --- a/docs/docs/benchmarks/mocks/CombinedWorkflow.md +++ b/docs/docs/benchmarks/mocks/CombinedWorkflow.md @@ -9,7 +9,7 @@ sidebar_position: 3 > Full workflow: create → setup → invoke → verify — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-16** from the latest CI run. +This benchmark was automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Full workflow: create → setup → invoke → verify: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1.841 μs | 0.0229 μs | 0.0214 μs | 6.23 KB | -| Imposter | 2.713 μs | 0.0181 μs | 0.0161 μs | 15.71 KB | -| Mockolate | 1.676 μs | 0.0086 μs | 0.0080 μs | 7.63 KB | -| Moq | 408.071 μs | 3.1355 μs | 2.7796 μs | 36.57 KB | -| NSubstitute | 17.270 μs | 0.0363 μs | 0.0322 μs | 26.85 KB | -| FakeItEasy | 18.329 μs | 0.1318 μs | 0.1169 μs | 25.52 KB | +| **TUnit.Mocks** | 1.884 μs | 0.0190 μs | 0.0178 μs | 6.23 KB | +| Imposter | 2.699 μs | 0.0418 μs | 0.0498 μs | 15.71 KB | +| Mockolate | 1.817 μs | 0.0249 μs | 0.0208 μs | 7.63 KB | +| Moq | 406.475 μs | 2.9235 μs | 2.7346 μs | 36.16 KB | +| NSubstitute | 17.508 μs | 0.0878 μs | 0.0779 μs | 26.72 KB | +| FakeItEasy | 19.214 μs | 0.1703 μs | 0.1510 μs | 25.67 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Full workflow: create → setup → invoke → verify: xychart-beta title "CombinedWorkflow Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (μs)" 0 --> 490 - bar [1.841, 2.713, 1.676, 408.071, 17.27, 18.329] + y-axis "Time (μs)" 0 --> 488 + bar [1.884, 2.699, 1.817, 406.475, 17.508, 19.214] ``` ## 🎯 Key Insights @@ -65,4 +65,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/docs/benchmarks/mocks/Invocation.md b/docs/docs/benchmarks/mocks/Invocation.md index 8afb86b1b6..0d157fe522 100644 --- a/docs/docs/benchmarks/mocks/Invocation.md +++ b/docs/docs/benchmarks/mocks/Invocation.md @@ -9,7 +9,7 @@ sidebar_position: 4 > Calling methods on mock objects — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-16** from the latest CI run. +This benchmark was automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Calling methods on mock objects: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 280.3 ns | 97.63 ns | 5.35 ns | 128 B | -| Imposter | 299.7 ns | 107.32 ns | 5.88 ns | 168 B | -| Mockolate | 116.1 ns | 131.15 ns | 7.19 ns | 84 B | -| Moq | 857.5 ns | 212.29 ns | 11.64 ns | 376 B | -| NSubstitute | 764.2 ns | 210.56 ns | 11.54 ns | 304 B | -| FakeItEasy | 1,847.3 ns | 814.39 ns | 44.64 ns | 944 B | +| **TUnit.Mocks** | 269.95 ns | 93.227 ns | 5.110 ns | 128 B | +| Imposter | 299.20 ns | 182.182 ns | 9.986 ns | 168 B | +| Mockolate | 106.83 ns | 9.094 ns | 0.498 ns | 84 B | +| Moq | 808.65 ns | 37.365 ns | 2.048 ns | 376 B | +| NSubstitute | 777.82 ns | 117.337 ns | 6.432 ns | 360 B | +| FakeItEasy | 1,749.31 ns | 226.142 ns | 12.396 ns | 944 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Calling methods on mock objects: xychart-beta title "Invocation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2217 - bar [280.3, 299.7, 116.1, 857.5, 764.2, 1847.3] + y-axis "Time (ns)" 0 --> 2100 + bar [269.95, 299.2, 106.83, 808.65, 777.82, 1749.31] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 166.8 ns | 63.40 ns | 3.48 ns | 96 B | -| Imposter | 296.0 ns | 116.11 ns | 6.36 ns | 168 B | -| Mockolate | 106.9 ns | 36.94 ns | 2.02 ns | 60 B | -| Moq | 577.3 ns | 201.13 ns | 11.02 ns | 296 B | -| NSubstitute | 679.0 ns | 246.35 ns | 13.50 ns | 328 B | -| FakeItEasy | 1,588.5 ns | 1,442.94 ns | 79.09 ns | 776 B | +| **TUnit.Mocks** | 166.10 ns | 79.083 ns | 4.335 ns | 96 B | +| Imposter | 290.95 ns | 55.317 ns | 3.032 ns | 168 B | +| Mockolate | 96.79 ns | 31.480 ns | 1.726 ns | 60 B | +| Moq | 537.42 ns | 139.463 ns | 7.644 ns | 296 B | +| NSubstitute | 585.36 ns | 220.250 ns | 12.073 ns | 272 B | +| FakeItEasy | 1,463.68 ns | 360.436 ns | 19.757 ns | 776 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Invocation (String) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 1907 - bar [166.8, 296, 106.9, 577.3, 679, 1588.5] + y-axis "Time (ns)" 0 --> 1757 + bar [166.1, 290.95, 96.79, 537.42, 585.36, 1463.68] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 27,273.6 ns | 12,452.58 ns | 682.57 ns | 12736 B | -| Imposter | 29,790.0 ns | 11,067.30 ns | 606.64 ns | 16800 B | -| Mockolate | 10,952.4 ns | 10,231.39 ns | 560.82 ns | 8400 B | -| Moq | 91,387.3 ns | 22,230.25 ns | 1,218.51 ns | 37600 B | -| NSubstitute | 76,035.4 ns | 10,932.13 ns | 599.23 ns | 30848 B | -| FakeItEasy | 189,643.3 ns | 112,559.24 ns | 6,169.75 ns | 94400 B | +| **TUnit.Mocks** | 26,487.88 ns | 8,778.198 ns | 481.163 ns | 12736 B | +| Imposter | 28,046.98 ns | 5,604.410 ns | 307.197 ns | 16800 B | +| Mockolate | 10,844.64 ns | 10,898.301 ns | 597.373 ns | 8400 B | +| Moq | 77,618.64 ns | 6,181.350 ns | 338.821 ns | 37600 B | +| NSubstitute | 72,996.64 ns | 10,873.652 ns | 596.022 ns | 36448 B | +| FakeItEasy | 167,309.91 ns | 39,335.875 ns | 2,156.132 ns | 94400 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Invocation (100 calls) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 227572 - bar [27273.6, 29790, 10952.4, 91387.3, 76035.4, 189643.3] + y-axis "Time (ns)" 0 --> 200772 + bar [26487.88, 28046.98, 10844.64, 77618.64, 72996.64, 167309.91] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/docs/benchmarks/mocks/MockCreation.md b/docs/docs/benchmarks/mocks/MockCreation.md index 7a333aa2d2..8c24b953a3 100644 --- a/docs/docs/benchmarks/mocks/MockCreation.md +++ b/docs/docs/benchmarks/mocks/MockCreation.md @@ -9,7 +9,7 @@ sidebar_position: 5 > Mock instance creation performance — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-16** from the latest CI run. +This benchmark was automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock instance creation performance: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 28.56 ns | 0.522 ns | 0.489 ns | 200 B | -| Imposter | 99.99 ns | 0.202 ns | 0.179 ns | 440 B | -| Mockolate | 71.95 ns | 0.479 ns | 0.425 ns | 424 B | -| Moq | 1,277.80 ns | 23.311 ns | 21.805 ns | 2048 B | -| NSubstitute | 1,716.98 ns | 10.866 ns | 10.164 ns | 5000 B | -| FakeItEasy | 1,668.96 ns | 8.804 ns | 8.236 ns | 2715 B | +| **TUnit.Mocks** | 28.24 ns | 0.322 ns | 0.286 ns | 200 B | +| Imposter | 91.37 ns | 0.893 ns | 0.697 ns | 440 B | +| Mockolate | 62.19 ns | 0.892 ns | 0.835 ns | 424 B | +| Moq | 1,324.88 ns | 23.947 ns | 22.400 ns | 2048 B | +| NSubstitute | 1,962.28 ns | 12.287 ns | 10.260 ns | 5000 B | +| FakeItEasy | 1,799.32 ns | 20.335 ns | 19.022 ns | 2715 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock instance creation performance: xychart-beta title "MockCreation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2061 - bar [28.56, 99.99, 71.95, 1277.8, 1716.98, 1668.96] + y-axis "Time (ns)" 0 --> 2355 + bar [28.24, 91.37, 62.19, 1324.88, 1962.28, 1799.32] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 31.71 ns | 0.541 ns | 0.506 ns | 200 B | -| Imposter | 156.40 ns | 0.222 ns | 0.197 ns | 696 B | -| Mockolate | 65.35 ns | 0.135 ns | 0.126 ns | 456 B | -| Moq | 1,245.66 ns | 2.345 ns | 2.078 ns | 1912 B | -| NSubstitute | 1,677.65 ns | 5.402 ns | 5.053 ns | 5000 B | -| FakeItEasy | 1,667.61 ns | 3.818 ns | 3.384 ns | 2715 B | +| **TUnit.Mocks** | 28.57 ns | 0.405 ns | 0.359 ns | 200 B | +| Imposter | 150.53 ns | 1.690 ns | 1.581 ns | 696 B | +| Mockolate | 63.10 ns | 0.753 ns | 0.704 ns | 456 B | +| Moq | 1,485.43 ns | 10.296 ns | 9.630 ns | 1912 B | +| NSubstitute | 1,903.83 ns | 20.283 ns | 17.980 ns | 5000 B | +| FakeItEasy | 1,854.52 ns | 28.344 ns | 25.126 ns | 2715 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "MockCreation (Repository) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2014 - bar [31.71, 156.4, 65.35, 1245.66, 1677.65, 1667.61] + y-axis "Time (ns)" 0 --> 2285 + bar [28.57, 150.53, 63.1, 1485.43, 1903.83, 1854.52] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/docs/benchmarks/mocks/Setup.md b/docs/docs/benchmarks/mocks/Setup.md index 47ef8097bd..069698946a 100644 --- a/docs/docs/benchmarks/mocks/Setup.md +++ b/docs/docs/benchmarks/mocks/Setup.md @@ -9,7 +9,7 @@ sidebar_position: 6 > Mock behavior configuration (returns, matchers) — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-16** from the latest CI run. +This benchmark was automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock behavior configuration (returns, matchers): | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 588.4 ns | 7.52 ns | 7.03 ns | 2.34 KB | -| Imposter | 828.5 ns | 15.21 ns | 13.48 ns | 6.12 KB | -| Mockolate | 371.1 ns | 7.10 ns | 8.18 ns | 1.65 KB | -| Moq | 320,511.4 ns | 4,119.21 ns | 3,853.11 ns | 28.7 KB | -| NSubstitute | 5,389.5 ns | 27.53 ns | 25.75 ns | 9.01 KB | -| FakeItEasy | 7,696.3 ns | 64.86 ns | 57.50 ns | 10.46 KB | +| **TUnit.Mocks** | 588.8 ns | 10.47 ns | 9.79 ns | 2.34 KB | +| Imposter | 895.6 ns | 17.80 ns | 36.75 ns | 6.12 KB | +| Mockolate | 377.4 ns | 6.19 ns | 5.79 ns | 1.65 KB | +| Moq | 436,678.0 ns | 944.47 ns | 788.68 ns | 28.52 KB | +| NSubstitute | 5,855.0 ns | 62.03 ns | 54.98 ns | 9.06 KB | +| FakeItEasy | 8,695.7 ns | 69.24 ns | 57.82 ns | 10.45 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock behavior configuration (returns, matchers): xychart-beta title "Setup Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 384614 - bar [588.4, 828.5, 371.1, 320511.4, 5389.5, 7696.3] + y-axis "Time (ns)" 0 --> 524014 + bar [588.8, 895.6, 377.4, 436678, 5855, 8695.7] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 879.3 ns | 14.32 ns | 11.96 ns | 3.15 KB | -| Imposter | 1,447.5 ns | 26.62 ns | 34.61 ns | 10.59 KB | -| Mockolate | 607.8 ns | 11.99 ns | 18.31 ns | 2.6 KB | -| Moq | 84,047.0 ns | 1,156.28 ns | 1,081.58 ns | 16.53 KB | -| NSubstitute | 11,746.2 ns | 113.94 ns | 106.58 ns | 20.31 KB | -| FakeItEasy | 7,231.9 ns | 76.62 ns | 71.67 ns | 11.72 KB | +| **TUnit.Mocks** | 862.0 ns | 12.94 ns | 12.11 ns | 3.15 KB | +| Imposter | 1,597.8 ns | 18.62 ns | 17.42 ns | 10.59 KB | +| Mockolate | 637.6 ns | 3.87 ns | 3.62 ns | 2.6 KB | +| Moq | 118,662.7 ns | 939.60 ns | 878.91 ns | 16.53 KB | +| NSubstitute | 13,209.8 ns | 158.82 ns | 140.79 ns | 20.66 KB | +| FakeItEasy | 8,549.2 ns | 70.27 ns | 65.73 ns | 11.71 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Setup (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 100857 - bar [879.3, 1447.5, 607.8, 84047, 11746.2, 7231.9] + y-axis "Time (ns)" 0 --> 142396 + bar [862, 1597.8, 637.6, 118662.7, 13209.8, 8549.2] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/docs/benchmarks/mocks/Verification.md b/docs/docs/benchmarks/mocks/Verification.md index 577389d4fd..7f4cd604ca 100644 --- a/docs/docs/benchmarks/mocks/Verification.md +++ b/docs/docs/benchmarks/mocks/Verification.md @@ -9,7 +9,7 @@ sidebar_position: 7 > Verifying mock method calls — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-16** from the latest CI run. +This benchmark was automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Verifying mock method calls: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 635.78 ns | 4.345 ns | 3.852 ns | 3008 B | -| Imposter | 626.37 ns | 4.965 ns | 4.146 ns | 4688 B | -| Mockolate | 368.76 ns | 1.256 ns | 1.175 ns | 2240 B | -| Moq | 317,960.35 ns | 3,562.982 ns | 3,332.816 ns | 24325 B | -| NSubstitute | 5,713.78 ns | 54.002 ns | 50.514 ns | 10064 B | -| FakeItEasy | 6,844.92 ns | 42.896 ns | 38.026 ns | 10722 B | +| **TUnit.Mocks** | 810.19 ns | 8.457 ns | 7.911 ns | 3008 B | +| Imposter | 717.06 ns | 8.929 ns | 8.352 ns | 4688 B | +| Mockolate | 453.84 ns | 3.908 ns | 3.464 ns | 2240 B | +| Moq | 251,775.55 ns | 1,166.818 ns | 974.346 ns | 24306 B | +| NSubstitute | 6,194.00 ns | 33.137 ns | 30.996 ns | 10064 B | +| FakeItEasy | 7,176.65 ns | 57.675 ns | 51.127 ns | 10731 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Verifying mock method calls: xychart-beta title "Verification Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 381553 - bar [635.78, 626.37, 368.76, 317960.35, 5713.78, 6844.92] + y-axis "Time (ns)" 0 --> 302131 + bar [810.19, 717.06, 453.84, 251775.55, 6194, 7176.65] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 46.28 ns | 0.182 ns | 0.152 ns | 320 B | -| Imposter | 285.68 ns | 1.770 ns | 1.655 ns | 2400 B | -| Mockolate | 223.94 ns | 0.521 ns | 0.435 ns | 1240 B | -| Moq | 80,958.08 ns | 520.424 ns | 486.805 ns | 6918 B | -| NSubstitute | 3,226.29 ns | 6.706 ns | 5.236 ns | 7088 B | -| FakeItEasy | 3,436.39 ns | 32.473 ns | 27.117 ns | 5210 B | +| **TUnit.Mocks** | 52.49 ns | 0.534 ns | 0.500 ns | 320 B | +| Imposter | 325.05 ns | 2.492 ns | 2.209 ns | 2400 B | +| Mockolate | 253.72 ns | 3.304 ns | 3.091 ns | 1240 B | +| Moq | 65,773.42 ns | 662.859 ns | 620.039 ns | 7037 B | +| NSubstitute | 3,339.29 ns | 20.893 ns | 18.521 ns | 7088 B | +| FakeItEasy | 3,223.40 ns | 30.028 ns | 28.088 ns | 5217 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Verification (Never) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 97150 - bar [46.28, 285.68, 223.94, 80958.08, 3226.29, 3436.39] + y-axis "Time (ns)" 0 --> 78929 + bar [52.49, 325.05, 253.72, 65773.42, 3339.29, 3223.4] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1,123.15 ns | 4.289 ns | 3.581 ns | 4472 B | -| Imposter | 1,568.51 ns | 7.513 ns | 6.660 ns | 11192 B | -| Mockolate | 1,048.82 ns | 6.147 ns | 5.750 ns | 5376 B | -| Moq | 433,476.81 ns | 3,003.389 ns | 2,662.426 ns | 34842 B | -| NSubstitute | 10,403.50 ns | 69.813 ns | 65.303 ns | 16762 B | -| FakeItEasy | 12,452.53 ns | 155.500 ns | 121.404 ns | 19233 B | +| **TUnit.Mocks** | 1,381.22 ns | 6.626 ns | 6.198 ns | 4472 B | +| Imposter | 1,744.80 ns | 28.617 ns | 26.769 ns | 11192 B | +| Mockolate | 1,188.13 ns | 13.426 ns | 11.901 ns | 5376 B | +| Moq | 350,594.98 ns | 3,040.700 ns | 2,844.273 ns | 35181 B | +| NSubstitute | 10,660.99 ns | 93.903 ns | 87.837 ns | 16762 B | +| FakeItEasy | 12,630.28 ns | 46.944 ns | 43.911 ns | 19239 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Verification (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 520173 - bar [1123.15, 1568.51, 1048.82, 433476.81, 10403.5, 12452.53] + y-axis "Time (ns)" 0 --> 420714 + bar [1381.22, 1744.8, 1188.13, 350594.98, 10660.99, 12630.28] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/docs/benchmarks/mocks/index.md b/docs/docs/benchmarks/mocks/index.md index 8af7efd12f..0832de18b7 100644 --- a/docs/docs/benchmarks/mocks/index.md +++ b/docs/docs/benchmarks/mocks/index.md @@ -7,7 +7,7 @@ sidebar_position: 4 # Mock Library Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2026-06-16** from the latest CI run. +These benchmarks were automatically generated on **2026-06-17** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -51,7 +51,7 @@ Each benchmark category tests a specific aspect of mocking library usage: - **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3 +- **Runtime**: .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4 - **Statistical Rigor**: Multiple iterations with warm-up and outlier detection - **Memory**: Allocation tracking enabled via `[MemoryDiagnoser]` @@ -76,4 +76,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: 2026-06-16T03:29:20.737Z* +*Last generated: 2026-06-17T03:28:53.706Z* diff --git a/docs/static/benchmarks/mocks/Callback.json b/docs/static/benchmarks/mocks/Callback.json index 0d1ead55e6..de93766a06 100644 --- a/docs/static/benchmarks/mocks/Callback.json +++ b/docs/static/benchmarks/mocks/Callback.json @@ -1,120 +1,120 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "category": "Callback", "description": "Callback registration and execution", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "694.7 ns", - "Error": "9.40 ns", - "StdDev": "8.79 ns", + "Mean": "643.2 ns", + "Error": "3.73 ns", + "StdDev": "3.12 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "475.1 ns", - "Error": "4.83 ns", - "StdDev": "4.29 ns", - "Gen0": "0.1621", - "Gen1": "0.0010", + "Mean": "459.2 ns", + "Error": "1.46 ns", + "StdDev": "1.36 ns", + "Gen0": "0.1626", + "Gen1": "0.0014", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "361.1 ns", - "Error": "5.03 ns", - "StdDev": "4.71 ns", + "Mean": "355.3 ns", + "Error": "1.04 ns", + "StdDev": "0.87 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "136,205.6 ns", - "Error": "1,348.19 ns", - "StdDev": "1,195.14 ns", + "Mean": "136,059.1 ns", + "Error": "1,655.45 ns", + "StdDev": "1,467.51 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,178.8 ns", - "Error": "55.15 ns", - "StdDev": "48.89 ns", - "Gen0": "0.4578", - "Gen1": "-", + "Mean": "4,093.4 ns", + "Error": "18.71 ns", + "StdDev": "16.59 ns", + "Gen0": "0.4807", + "Gen1": "0.0076", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "4,566.5 ns", - "Error": "72.49 ns", - "StdDev": "64.26 ns", + "Mean": "4,571.5 ns", + "Error": "34.49 ns", + "StdDev": "32.26 ns", "Gen0": "0.4272", "Gen1": "0.0305", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "770.4 ns", - "Error": "6.81 ns", - "StdDev": "5.69 ns", + "Mean": "790.1 ns", + "Error": "4.79 ns", + "StdDev": "4.24 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "540.8 ns", - "Error": "5.69 ns", - "StdDev": "5.32 ns", + "Mean": "541.9 ns", + "Error": "1.77 ns", + "StdDev": "1.66 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "402.6 ns", - "Error": "3.78 ns", - "StdDev": "3.35 ns", + "Mean": "399.1 ns", + "Error": "2.00 ns", + "StdDev": "1.77 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "145,009.6 ns", - "Error": "1,001.89 ns", - "StdDev": "888.15 ns", + "Mean": "145,945.6 ns", + "Error": "887.92 ns", + "StdDev": "830.56 ns", "Gen0": "0.4883", "Gen1": "-", - "Allocated": "13.73 KB" + "Allocated": "13.84 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "4,693.5 ns", - "Error": "44.49 ns", - "StdDev": "39.44 ns", + "Mean": "4,590.9 ns", + "Error": "22.92 ns", + "StdDev": "20.32 ns", "Gen0": "0.5188", "Gen1": "0.0076", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "5,793.0 ns", - "Error": "102.11 ns", - "StdDev": "109.26 ns", - "Gen0": "0.5646", - "Gen1": "0.0153", - "Allocated": "9.26 KB" + "Mean": "5,495.5 ns", + "Error": "28.70 ns", + "StdDev": "23.97 ns", + "Gen0": "0.5493", + "Gen1": "0.0305", + "Allocated": "9.4 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/CombinedWorkflow.json b/docs/static/benchmarks/mocks/CombinedWorkflow.json index 064e32eb1a..c2a9cff735 100644 --- a/docs/static/benchmarks/mocks/CombinedWorkflow.json +++ b/docs/static/benchmarks/mocks/CombinedWorkflow.json @@ -1,66 +1,66 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "category": "CombinedWorkflow", "description": "Full workflow: create → setup → invoke → verify", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "1.841 μs", - "Error": "0.0229 μs", - "StdDev": "0.0214 μs", + "Mean": "1.884 μs", + "Error": "0.0190 μs", + "StdDev": "0.0178 μs", "Gen0": "0.3796", "Gen1": "0.0057", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.713 μs", - "Error": "0.0181 μs", - "StdDev": "0.0161 μs", + "Mean": "2.699 μs", + "Error": "0.0418 μs", + "StdDev": "0.0498 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.676 μs", - "Error": "0.0086 μs", - "StdDev": "0.0080 μs", + "Mean": "1.817 μs", + "Error": "0.0249 μs", + "StdDev": "0.0208 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "408.071 μs", - "Error": "3.1355 μs", - "StdDev": "2.7796 μs", + "Mean": "406.475 μs", + "Error": "2.9235 μs", + "StdDev": "2.7346 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.57 KB" + "Allocated": "36.16 KB" }, { "Method": "NSubstitute", - "Mean": "17.270 μs", - "Error": "0.0363 μs", - "StdDev": "0.0322 μs", + "Mean": "17.508 μs", + "Error": "0.0878 μs", + "StdDev": "0.0779 μs", "Gen0": "1.6174", "Gen1": "0.0305", - "Allocated": "26.85 KB" + "Allocated": "26.72 KB" }, { "Method": "FakeItEasy", - "Mean": "18.329 μs", - "Error": "0.1318 μs", - "StdDev": "0.1169 μs", + "Mean": "19.214 μs", + "Error": "0.1703 μs", + "StdDev": "0.1510 μs", "Gen0": "1.4648", "Gen1": "0.1221", - "Allocated": "25.52 KB" + "Allocated": "25.67 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Invocation.json b/docs/static/benchmarks/mocks/Invocation.json index 5864b691f3..25b15c69c0 100644 --- a/docs/static/benchmarks/mocks/Invocation.json +++ b/docs/static/benchmarks/mocks/Invocation.json @@ -1,171 +1,171 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "category": "Invocation", "description": "Calling methods on mock objects", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "280.3 ns", - "Error": "97.63 ns", - "StdDev": "5.35 ns", + "Mean": "269.95 ns", + "Error": "93.227 ns", + "StdDev": "5.110 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "299.7 ns", - "Error": "107.32 ns", - "StdDev": "5.88 ns", + "Mean": "299.20 ns", + "Error": "182.182 ns", + "StdDev": "9.986 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "116.1 ns", - "Error": "131.15 ns", - "StdDev": "7.19 ns", + "Mean": "106.83 ns", + "Error": "9.094 ns", + "StdDev": "0.498 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "857.5 ns", - "Error": "212.29 ns", - "StdDev": "11.64 ns", + "Mean": "808.65 ns", + "Error": "37.365 ns", + "StdDev": "2.048 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "764.2 ns", - "Error": "210.56 ns", - "StdDev": "11.54 ns", - "Gen0": "0.0172", - "Gen1": "0.0162", - "Allocated": "304 B" + "Mean": "777.82 ns", + "Error": "117.337 ns", + "StdDev": "6.432 ns", + "Gen0": "0.0200", + "Gen1": "0.0191", + "Allocated": "360 B" }, { "Method": "FakeItEasy", - "Mean": "1,847.3 ns", - "Error": "814.39 ns", - "StdDev": "44.64 ns", - "Gen0": "0.0534", - "Gen1": "0.0496", + "Mean": "1,749.31 ns", + "Error": "226.142 ns", + "StdDev": "12.396 ns", + "Gen0": "0.0553", + "Gen1": "0.0534", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "166.8 ns", - "Error": "63.40 ns", - "StdDev": "3.48 ns", + "Mean": "166.10 ns", + "Error": "79.083 ns", + "StdDev": "4.335 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "296.0 ns", - "Error": "116.11 ns", - "StdDev": "6.36 ns", + "Mean": "290.95 ns", + "Error": "55.317 ns", + "StdDev": "3.032 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "106.9 ns", - "Error": "36.94 ns", - "StdDev": "2.02 ns", + "Mean": "96.79 ns", + "Error": "31.480 ns", + "StdDev": "1.726 ns", "Gen0": "0.0036", "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "577.3 ns", - "Error": "201.13 ns", - "StdDev": "11.02 ns", + "Mean": "537.42 ns", + "Error": "139.463 ns", + "StdDev": "7.644 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "679.0 ns", - "Error": "246.35 ns", - "StdDev": "13.50 ns", - "Gen0": "0.0181", - "Gen1": "0.0172", - "Allocated": "328 B" + "Mean": "585.36 ns", + "Error": "220.250 ns", + "StdDev": "12.073 ns", + "Gen0": "0.0153", + "Gen1": "0.0143", + "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,588.5 ns", - "Error": "1,442.94 ns", - "StdDev": "79.09 ns", + "Mean": "1,463.68 ns", + "Error": "360.436 ns", + "StdDev": "19.757 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "27,273.6 ns", - "Error": "12,452.58 ns", - "StdDev": "682.57 ns", + "Mean": "26,487.88 ns", + "Error": "8,778.198 ns", + "StdDev": "481.163 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "29,790.0 ns", - "Error": "11,067.30 ns", - "StdDev": "606.64 ns", + "Mean": "28,046.98 ns", + "Error": "5,604.410 ns", + "StdDev": "307.197 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "10,952.4 ns", - "Error": "10,231.39 ns", - "StdDev": "560.82 ns", + "Mean": "10,844.64 ns", + "Error": "10,898.301 ns", + "StdDev": "597.373 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "91,387.3 ns", - "Error": "22,230.25 ns", - "StdDev": "1,218.51 ns", + "Mean": "77,618.64 ns", + "Error": "6,181.350 ns", + "StdDev": "338.821 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "76,035.4 ns", - "Error": "10,932.13 ns", - "StdDev": "599.23 ns", - "Gen0": "1.7090", - "Gen1": "1.5869", - "Allocated": "30848 B" + "Mean": "72,996.64 ns", + "Error": "10,873.652 ns", + "StdDev": "596.022 ns", + "Gen0": "1.9531", + "Gen1": "1.8311", + "Allocated": "36448 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "189,643.3 ns", - "Error": "112,559.24 ns", - "StdDev": "6,169.75 ns", + "Mean": "167,309.91 ns", + "Error": "39,335.875 ns", + "StdDev": "2,156.132 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" diff --git a/docs/static/benchmarks/mocks/MockCreation.json b/docs/static/benchmarks/mocks/MockCreation.json index cfe4e55c79..15d92b4ca3 100644 --- a/docs/static/benchmarks/mocks/MockCreation.json +++ b/docs/static/benchmarks/mocks/MockCreation.json @@ -1,18 +1,18 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "category": "MockCreation", "description": "Mock instance creation performance", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "28.56 ns", - "Error": "0.522 ns", - "StdDev": "0.489 ns", + "Mean": "28.24 ns", + "Error": "0.322 ns", + "StdDev": "0.286 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -20,9 +20,9 @@ }, { "Method": "Imposter", - "Mean": "99.99 ns", - "Error": "0.202 ns", - "StdDev": "0.179 ns", + "Mean": "91.37 ns", + "Error": "0.893 ns", + "StdDev": "0.697 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -30,9 +30,9 @@ }, { "Method": "Mockolate", - "Mean": "71.95 ns", - "Error": "0.479 ns", - "StdDev": "0.425 ns", + "Mean": "62.19 ns", + "Error": "0.892 ns", + "StdDev": "0.835 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -40,9 +40,9 @@ }, { "Method": "Moq", - "Mean": "1,277.80 ns", - "Error": "23.311 ns", - "StdDev": "21.805 ns", + "Mean": "1,324.88 ns", + "Error": "23.947 ns", + "StdDev": "22.400 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -50,19 +50,19 @@ }, { "Method": "NSubstitute", - "Mean": "1,716.98 ns", - "Error": "10.866 ns", - "StdDev": "10.164 ns", + "Mean": "1,962.28 ns", + "Error": "12.287 ns", + "StdDev": "10.260 ns", "Gen0": "0.2975", - "Gen1": "0.0019", + "Gen1": "-", "Gen2": "-", "Allocated": "5000 B" }, { "Method": "FakeItEasy", - "Mean": "1,668.96 ns", - "Error": "8.804 ns", - "StdDev": "8.236 ns", + "Mean": "1,799.32 ns", + "Error": "20.335 ns", + "StdDev": "19.022 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -70,9 +70,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "31.71 ns", - "Error": "0.541 ns", - "StdDev": "0.506 ns", + "Mean": "28.57 ns", + "Error": "0.405 ns", + "StdDev": "0.359 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -80,9 +80,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "156.40 ns", - "Error": "0.222 ns", - "StdDev": "0.197 ns", + "Mean": "150.53 ns", + "Error": "1.690 ns", + "StdDev": "1.581 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -90,9 +90,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "65.35 ns", - "Error": "0.135 ns", - "StdDev": "0.126 ns", + "Mean": "63.10 ns", + "Error": "0.753 ns", + "StdDev": "0.704 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -100,9 +100,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,245.66 ns", - "Error": "2.345 ns", - "StdDev": "2.078 ns", + "Mean": "1,485.43 ns", + "Error": "10.296 ns", + "StdDev": "9.630 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -110,9 +110,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,677.65 ns", - "Error": "5.402 ns", - "StdDev": "5.053 ns", + "Mean": "1,903.83 ns", + "Error": "20.283 ns", + "StdDev": "17.980 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -120,9 +120,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,667.61 ns", - "Error": "3.818 ns", - "StdDev": "3.384 ns", + "Mean": "1,854.52 ns", + "Error": "28.344 ns", + "StdDev": "25.126 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", diff --git a/docs/static/benchmarks/mocks/Setup.json b/docs/static/benchmarks/mocks/Setup.json index 3ade37a092..d9a5085f94 100644 --- a/docs/static/benchmarks/mocks/Setup.json +++ b/docs/static/benchmarks/mocks/Setup.json @@ -1,120 +1,120 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "category": "Setup", "description": "Mock behavior configuration (returns, matchers)", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "588.4 ns", - "Error": "7.52 ns", - "StdDev": "7.03 ns", - "Gen0": "0.0954", - "Gen1": "-", + "Mean": "588.8 ns", + "Error": "10.47 ns", + "StdDev": "9.79 ns", + "Gen0": "0.1431", + "Gen1": "0.0010", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "828.5 ns", - "Error": "15.21 ns", - "StdDev": "13.48 ns", - "Gen0": "0.2489", - "Gen1": "0.0048", + "Mean": "895.6 ns", + "Error": "17.80 ns", + "StdDev": "36.75 ns", + "Gen0": "0.3738", + "Gen1": "0.0076", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "371.1 ns", - "Error": "7.10 ns", - "StdDev": "8.18 ns", - "Gen0": "0.0672", - "Gen1": "-", + "Mean": "377.4 ns", + "Error": "6.19 ns", + "StdDev": "5.79 ns", + "Gen0": "0.1006", + "Gen1": "0.0005", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "320,511.4 ns", - "Error": "4,119.21 ns", - "StdDev": "3,853.11 ns", + "Mean": "436,678.0 ns", + "Error": "944.47 ns", + "StdDev": "788.68 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.7 KB" + "Allocated": "28.52 KB" }, { "Method": "NSubstitute", - "Mean": "5,389.5 ns", - "Error": "27.53 ns", - "StdDev": "25.75 ns", - "Gen0": "0.3662", + "Mean": "5,855.0 ns", + "Error": "62.03 ns", + "StdDev": "54.98 ns", + "Gen0": "0.5493", "Gen1": "-", - "Allocated": "9.01 KB" + "Allocated": "9.06 KB" }, { "Method": "FakeItEasy", - "Mean": "7,696.3 ns", - "Error": "64.86 ns", - "StdDev": "57.50 ns", - "Gen0": "0.4120", - "Gen1": "0.0153", - "Allocated": "10.46 KB" + "Mean": "8,695.7 ns", + "Error": "69.24 ns", + "StdDev": "57.82 ns", + "Gen0": "0.6104", + "Gen1": "0.0305", + "Allocated": "10.45 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "879.3 ns", - "Error": "14.32 ns", - "StdDev": "11.96 ns", - "Gen0": "0.1278", - "Gen1": "0.0010", + "Mean": "862.0 ns", + "Error": "12.94 ns", + "StdDev": "12.11 ns", + "Gen0": "0.1926", + "Gen1": "0.0019", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,447.5 ns", - "Error": "26.62 ns", - "StdDev": "34.61 ns", - "Gen0": "0.4311", - "Gen1": "0.0153", + "Mean": "1,597.8 ns", + "Error": "18.62 ns", + "StdDev": "17.42 ns", + "Gen0": "0.6485", + "Gen1": "0.0248", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "607.8 ns", - "Error": "11.99 ns", - "StdDev": "18.31 ns", - "Gen0": "0.1059", - "Gen1": "-", + "Mean": "637.6 ns", + "Error": "3.87 ns", + "StdDev": "3.62 ns", + "Gen0": "0.1583", + "Gen1": "0.0010", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "84,047.0 ns", - "Error": "1,156.28 ns", - "StdDev": "1,081.58 ns", - "Gen0": "0.4883", - "Gen1": "0.2441", + "Mean": "118,662.7 ns", + "Error": "939.60 ns", + "StdDev": "878.91 ns", + "Gen0": "0.9766", + "Gen1": "0.7324", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,746.2 ns", - "Error": "113.94 ns", - "StdDev": "106.58 ns", - "Gen0": "0.8240", - "Gen1": "0.0153", - "Allocated": "20.31 KB" + "Mean": "13,209.8 ns", + "Error": "158.82 ns", + "StdDev": "140.79 ns", + "Gen0": "1.2207", + "Gen1": "-", + "Allocated": "20.66 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,231.9 ns", - "Error": "76.62 ns", - "StdDev": "71.67 ns", - "Gen0": "0.4730", - "Gen1": "0.0153", - "Allocated": "11.72 KB" + "Mean": "8,549.2 ns", + "Error": "70.27 ns", + "StdDev": "65.73 ns", + "Gen0": "0.6714", + "Gen1": "0.0610", + "Allocated": "11.71 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Verification.json b/docs/static/benchmarks/mocks/Verification.json index 0cbb238e5e..4946b8c47b 100644 --- a/docs/static/benchmarks/mocks/Verification.json +++ b/docs/static/benchmarks/mocks/Verification.json @@ -1,174 +1,192 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "category": "Verification", "description": "Verifying mock method calls", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "635.78 ns", - "Error": "4.345 ns", - "StdDev": "3.852 ns", - "Gen0": "0.1793", + "Mean": "810.19 ns", + "Error": "8.457 ns", + "StdDev": "7.911 ns", + "Gen0": "0.1192", "Gen1": "0.0010", + "Gen2": "-", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "626.37 ns", - "Error": "4.965 ns", - "StdDev": "4.146 ns", - "Gen0": "0.2794", - "Gen1": "0.0038", + "Mean": "717.06 ns", + "Error": "8.929 ns", + "StdDev": "8.352 ns", + "Gen0": "0.1860", + "Gen1": "0.0029", + "Gen2": "-", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "368.76 ns", - "Error": "1.256 ns", - "StdDev": "1.175 ns", - "Gen0": "0.1335", + "Mean": "453.84 ns", + "Error": "3.908 ns", + "StdDev": "3.464 ns", + "Gen0": "0.0892", "Gen1": "0.0005", + "Gen2": "-", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "317,960.35 ns", - "Error": "3,562.982 ns", - "StdDev": "3,332.816 ns", - "Gen0": "0.9766", + "Mean": "251,775.55 ns", + "Error": "1,166.818 ns", + "StdDev": "974.346 ns", + "Gen0": "0.4883", "Gen1": "-", - "Allocated": "24325 B" + "Gen2": "-", + "Allocated": "24306 B" }, { "Method": "NSubstitute", - "Mean": "5,713.78 ns", - "Error": "54.002 ns", - "StdDev": "50.514 ns", - "Gen0": "0.5951", - "Gen1": "0.0076", + "Mean": "6,194.00 ns", + "Error": "33.137 ns", + "StdDev": "30.996 ns", + "Gen0": "0.3967", + "Gen1": "-", + "Gen2": "-", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "6,844.92 ns", - "Error": "42.896 ns", - "StdDev": "38.026 ns", - "Gen0": "0.6409", + "Mean": "7,176.65 ns", + "Error": "57.675 ns", + "StdDev": "51.127 ns", + "Gen0": "0.4272", "Gen1": "0.0153", - "Allocated": "10722 B" + "Gen2": "0.0076", + "Allocated": "10731 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "46.28 ns", - "Error": "0.182 ns", - "StdDev": "0.152 ns", - "Gen0": "0.0191", + "Mean": "52.49 ns", + "Error": "0.534 ns", + "StdDev": "0.500 ns", + "Gen0": "0.0127", "Gen1": "-", + "Gen2": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "285.68 ns", - "Error": "1.770 ns", - "StdDev": "1.655 ns", - "Gen0": "0.1431", - "Gen1": "0.0010", + "Mean": "325.05 ns", + "Error": "2.492 ns", + "StdDev": "2.209 ns", + "Gen0": "0.0954", + "Gen1": "0.0005", + "Gen2": "-", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "223.94 ns", - "Error": "0.521 ns", - "StdDev": "0.435 ns", - "Gen0": "0.0739", + "Mean": "253.72 ns", + "Error": "3.304 ns", + "StdDev": "3.091 ns", + "Gen0": "0.0491", "Gen1": "-", + "Gen2": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "80,958.08 ns", - "Error": "520.424 ns", - "StdDev": "486.805 ns", + "Mean": "65,773.42 ns", + "Error": "662.859 ns", + "StdDev": "620.039 ns", "Gen0": "0.2441", - "Gen1": "-", - "Allocated": "6918 B" + "Gen1": "0.1221", + "Gen2": "-", + "Allocated": "7037 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,226.29 ns", - "Error": "6.706 ns", - "StdDev": "5.236 ns", - "Gen0": "0.4234", - "Gen1": "0.0038", + "Mean": "3,339.29 ns", + "Error": "20.893 ns", + "StdDev": "18.521 ns", + "Gen0": "0.2823", + "Gen1": "-", + "Gen2": "-", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,436.39 ns", - "Error": "32.473 ns", - "StdDev": "27.117 ns", - "Gen0": "0.3052", + "Mean": "3,223.40 ns", + "Error": "30.028 ns", + "StdDev": "28.088 ns", + "Gen0": "0.1984", "Gen1": "0.0153", - "Allocated": "5210 B" + "Gen2": "-", + "Allocated": "5217 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,123.15 ns", - "Error": "4.289 ns", - "StdDev": "3.581 ns", - "Gen0": "0.2670", + "Mean": "1,381.22 ns", + "Error": "6.626 ns", + "StdDev": "6.198 ns", + "Gen0": "0.1774", "Gen1": "0.0019", + "Gen2": "-", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,568.51 ns", - "Error": "7.513 ns", - "StdDev": "6.660 ns", - "Gen0": "0.6676", - "Gen1": "0.0210", + "Mean": "1,744.80 ns", + "Error": "28.617 ns", + "StdDev": "26.769 ns", + "Gen0": "0.4444", + "Gen1": "0.0134", + "Gen2": "-", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,048.82 ns", - "Error": "6.147 ns", - "StdDev": "5.750 ns", - "Gen0": "0.3204", - "Gen1": "0.0038", + "Mean": "1,188.13 ns", + "Error": "13.426 ns", + "StdDev": "11.901 ns", + "Gen0": "0.2136", + "Gen1": "0.0019", + "Gen2": "-", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "433,476.81 ns", - "Error": "3,003.389 ns", - "StdDev": "2,662.426 ns", - "Gen0": "1.9531", - "Gen1": "0.9766", - "Allocated": "34842 B" + "Mean": "350,594.98 ns", + "Error": "3,040.700 ns", + "StdDev": "2,844.273 ns", + "Gen0": "0.9766", + "Gen1": "-", + "Gen2": "-", + "Allocated": "35181 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "10,403.50 ns", - "Error": "69.813 ns", - "StdDev": "65.303 ns", - "Gen0": "0.9918", - "Gen1": "0.0153", + "Mean": "10,660.99 ns", + "Error": "93.903 ns", + "StdDev": "87.837 ns", + "Gen0": "0.6561", + "Gen1": "-", + "Gen2": "-", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "12,452.53 ns", - "Error": "155.500 ns", - "StdDev": "121.404 ns", - "Gen0": "1.0986", - "Gen1": "-", - "Allocated": "19233 B" + "Mean": "12,630.28 ns", + "Error": "46.944 ns", + "StdDev": "43.911 ns", + "Gen0": "0.7629", + "Gen1": "0.0153", + "Gen2": "-", + "Allocated": "19239 B" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/latest.json b/docs/static/benchmarks/mocks/latest.json index c2d982a65a..e94579acd4 100644 --- a/docs/static/benchmarks/mocks/latest.json +++ b/docs/static/benchmarks/mocks/latest.json @@ -1,336 +1,336 @@ { - "timestamp": "2026-06-16T03:29:20.737Z", + "timestamp": "2026-06-17T03:28:53.706Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" }, "categories": { "Callback": [ { "Method": "TUnit.Mocks", - "Mean": "694.7 ns", - "Error": "9.40 ns", - "StdDev": "8.79 ns", + "Mean": "643.2 ns", + "Error": "3.73 ns", + "StdDev": "3.12 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "475.1 ns", - "Error": "4.83 ns", - "StdDev": "4.29 ns", - "Gen0": "0.1621", - "Gen1": "0.0010", + "Mean": "459.2 ns", + "Error": "1.46 ns", + "StdDev": "1.36 ns", + "Gen0": "0.1626", + "Gen1": "0.0014", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "361.1 ns", - "Error": "5.03 ns", - "StdDev": "4.71 ns", + "Mean": "355.3 ns", + "Error": "1.04 ns", + "StdDev": "0.87 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "136,205.6 ns", - "Error": "1,348.19 ns", - "StdDev": "1,195.14 ns", + "Mean": "136,059.1 ns", + "Error": "1,655.45 ns", + "StdDev": "1,467.51 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,178.8 ns", - "Error": "55.15 ns", - "StdDev": "48.89 ns", - "Gen0": "0.4578", - "Gen1": "-", + "Mean": "4,093.4 ns", + "Error": "18.71 ns", + "StdDev": "16.59 ns", + "Gen0": "0.4807", + "Gen1": "0.0076", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "4,566.5 ns", - "Error": "72.49 ns", - "StdDev": "64.26 ns", + "Mean": "4,571.5 ns", + "Error": "34.49 ns", + "StdDev": "32.26 ns", "Gen0": "0.4272", "Gen1": "0.0305", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "770.4 ns", - "Error": "6.81 ns", - "StdDev": "5.69 ns", + "Mean": "790.1 ns", + "Error": "4.79 ns", + "StdDev": "4.24 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "540.8 ns", - "Error": "5.69 ns", - "StdDev": "5.32 ns", + "Mean": "541.9 ns", + "Error": "1.77 ns", + "StdDev": "1.66 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "402.6 ns", - "Error": "3.78 ns", - "StdDev": "3.35 ns", + "Mean": "399.1 ns", + "Error": "2.00 ns", + "StdDev": "1.77 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "145,009.6 ns", - "Error": "1,001.89 ns", - "StdDev": "888.15 ns", + "Mean": "145,945.6 ns", + "Error": "887.92 ns", + "StdDev": "830.56 ns", "Gen0": "0.4883", "Gen1": "-", - "Allocated": "13.73 KB" + "Allocated": "13.84 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "4,693.5 ns", - "Error": "44.49 ns", - "StdDev": "39.44 ns", + "Mean": "4,590.9 ns", + "Error": "22.92 ns", + "StdDev": "20.32 ns", "Gen0": "0.5188", "Gen1": "0.0076", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "5,793.0 ns", - "Error": "102.11 ns", - "StdDev": "109.26 ns", - "Gen0": "0.5646", - "Gen1": "0.0153", - "Allocated": "9.26 KB" + "Mean": "5,495.5 ns", + "Error": "28.70 ns", + "StdDev": "23.97 ns", + "Gen0": "0.5493", + "Gen1": "0.0305", + "Allocated": "9.4 KB" } ], "CombinedWorkflow": [ { "Method": "TUnit.Mocks", - "Mean": "1.841 μs", - "Error": "0.0229 μs", - "StdDev": "0.0214 μs", + "Mean": "1.884 μs", + "Error": "0.0190 μs", + "StdDev": "0.0178 μs", "Gen0": "0.3796", "Gen1": "0.0057", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.713 μs", - "Error": "0.0181 μs", - "StdDev": "0.0161 μs", + "Mean": "2.699 μs", + "Error": "0.0418 μs", + "StdDev": "0.0498 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.676 μs", - "Error": "0.0086 μs", - "StdDev": "0.0080 μs", + "Mean": "1.817 μs", + "Error": "0.0249 μs", + "StdDev": "0.0208 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "408.071 μs", - "Error": "3.1355 μs", - "StdDev": "2.7796 μs", + "Mean": "406.475 μs", + "Error": "2.9235 μs", + "StdDev": "2.7346 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.57 KB" + "Allocated": "36.16 KB" }, { "Method": "NSubstitute", - "Mean": "17.270 μs", - "Error": "0.0363 μs", - "StdDev": "0.0322 μs", + "Mean": "17.508 μs", + "Error": "0.0878 μs", + "StdDev": "0.0779 μs", "Gen0": "1.6174", "Gen1": "0.0305", - "Allocated": "26.85 KB" + "Allocated": "26.72 KB" }, { "Method": "FakeItEasy", - "Mean": "18.329 μs", - "Error": "0.1318 μs", - "StdDev": "0.1169 μs", + "Mean": "19.214 μs", + "Error": "0.1703 μs", + "StdDev": "0.1510 μs", "Gen0": "1.4648", "Gen1": "0.1221", - "Allocated": "25.52 KB" + "Allocated": "25.67 KB" } ], "Invocation": [ { "Method": "TUnit.Mocks", - "Mean": "280.3 ns", - "Error": "97.63 ns", - "StdDev": "5.35 ns", + "Mean": "269.95 ns", + "Error": "93.227 ns", + "StdDev": "5.110 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "299.7 ns", - "Error": "107.32 ns", - "StdDev": "5.88 ns", + "Mean": "299.20 ns", + "Error": "182.182 ns", + "StdDev": "9.986 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "116.1 ns", - "Error": "131.15 ns", - "StdDev": "7.19 ns", + "Mean": "106.83 ns", + "Error": "9.094 ns", + "StdDev": "0.498 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "857.5 ns", - "Error": "212.29 ns", - "StdDev": "11.64 ns", + "Mean": "808.65 ns", + "Error": "37.365 ns", + "StdDev": "2.048 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "764.2 ns", - "Error": "210.56 ns", - "StdDev": "11.54 ns", - "Gen0": "0.0172", - "Gen1": "0.0162", - "Allocated": "304 B" + "Mean": "777.82 ns", + "Error": "117.337 ns", + "StdDev": "6.432 ns", + "Gen0": "0.0200", + "Gen1": "0.0191", + "Allocated": "360 B" }, { "Method": "FakeItEasy", - "Mean": "1,847.3 ns", - "Error": "814.39 ns", - "StdDev": "44.64 ns", - "Gen0": "0.0534", - "Gen1": "0.0496", + "Mean": "1,749.31 ns", + "Error": "226.142 ns", + "StdDev": "12.396 ns", + "Gen0": "0.0553", + "Gen1": "0.0534", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "166.8 ns", - "Error": "63.40 ns", - "StdDev": "3.48 ns", + "Mean": "166.10 ns", + "Error": "79.083 ns", + "StdDev": "4.335 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "296.0 ns", - "Error": "116.11 ns", - "StdDev": "6.36 ns", + "Mean": "290.95 ns", + "Error": "55.317 ns", + "StdDev": "3.032 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "106.9 ns", - "Error": "36.94 ns", - "StdDev": "2.02 ns", + "Mean": "96.79 ns", + "Error": "31.480 ns", + "StdDev": "1.726 ns", "Gen0": "0.0036", "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "577.3 ns", - "Error": "201.13 ns", - "StdDev": "11.02 ns", + "Mean": "537.42 ns", + "Error": "139.463 ns", + "StdDev": "7.644 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "679.0 ns", - "Error": "246.35 ns", - "StdDev": "13.50 ns", - "Gen0": "0.0181", - "Gen1": "0.0172", - "Allocated": "328 B" + "Mean": "585.36 ns", + "Error": "220.250 ns", + "StdDev": "12.073 ns", + "Gen0": "0.0153", + "Gen1": "0.0143", + "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,588.5 ns", - "Error": "1,442.94 ns", - "StdDev": "79.09 ns", + "Mean": "1,463.68 ns", + "Error": "360.436 ns", + "StdDev": "19.757 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "27,273.6 ns", - "Error": "12,452.58 ns", - "StdDev": "682.57 ns", + "Mean": "26,487.88 ns", + "Error": "8,778.198 ns", + "StdDev": "481.163 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "29,790.0 ns", - "Error": "11,067.30 ns", - "StdDev": "606.64 ns", + "Mean": "28,046.98 ns", + "Error": "5,604.410 ns", + "StdDev": "307.197 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "10,952.4 ns", - "Error": "10,231.39 ns", - "StdDev": "560.82 ns", + "Mean": "10,844.64 ns", + "Error": "10,898.301 ns", + "StdDev": "597.373 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "91,387.3 ns", - "Error": "22,230.25 ns", - "StdDev": "1,218.51 ns", + "Mean": "77,618.64 ns", + "Error": "6,181.350 ns", + "StdDev": "338.821 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "76,035.4 ns", - "Error": "10,932.13 ns", - "StdDev": "599.23 ns", - "Gen0": "1.7090", - "Gen1": "1.5869", - "Allocated": "30848 B" + "Mean": "72,996.64 ns", + "Error": "10,873.652 ns", + "StdDev": "596.022 ns", + "Gen0": "1.9531", + "Gen1": "1.8311", + "Allocated": "36448 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "189,643.3 ns", - "Error": "112,559.24 ns", - "StdDev": "6,169.75 ns", + "Mean": "167,309.91 ns", + "Error": "39,335.875 ns", + "StdDev": "2,156.132 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" @@ -339,9 +339,9 @@ "MockCreation": [ { "Method": "TUnit.Mocks", - "Mean": "28.56 ns", - "Error": "0.522 ns", - "StdDev": "0.489 ns", + "Mean": "28.24 ns", + "Error": "0.322 ns", + "StdDev": "0.286 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -349,9 +349,9 @@ }, { "Method": "Imposter", - "Mean": "99.99 ns", - "Error": "0.202 ns", - "StdDev": "0.179 ns", + "Mean": "91.37 ns", + "Error": "0.893 ns", + "StdDev": "0.697 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -359,9 +359,9 @@ }, { "Method": "Mockolate", - "Mean": "71.95 ns", - "Error": "0.479 ns", - "StdDev": "0.425 ns", + "Mean": "62.19 ns", + "Error": "0.892 ns", + "StdDev": "0.835 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -369,9 +369,9 @@ }, { "Method": "Moq", - "Mean": "1,277.80 ns", - "Error": "23.311 ns", - "StdDev": "21.805 ns", + "Mean": "1,324.88 ns", + "Error": "23.947 ns", + "StdDev": "22.400 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -379,19 +379,19 @@ }, { "Method": "NSubstitute", - "Mean": "1,716.98 ns", - "Error": "10.866 ns", - "StdDev": "10.164 ns", + "Mean": "1,962.28 ns", + "Error": "12.287 ns", + "StdDev": "10.260 ns", "Gen0": "0.2975", - "Gen1": "0.0019", + "Gen1": "-", "Gen2": "-", "Allocated": "5000 B" }, { "Method": "FakeItEasy", - "Mean": "1,668.96 ns", - "Error": "8.804 ns", - "StdDev": "8.236 ns", + "Mean": "1,799.32 ns", + "Error": "20.335 ns", + "StdDev": "19.022 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -399,9 +399,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "31.71 ns", - "Error": "0.541 ns", - "StdDev": "0.506 ns", + "Mean": "28.57 ns", + "Error": "0.405 ns", + "StdDev": "0.359 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -409,9 +409,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "156.40 ns", - "Error": "0.222 ns", - "StdDev": "0.197 ns", + "Mean": "150.53 ns", + "Error": "1.690 ns", + "StdDev": "1.581 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -419,9 +419,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "65.35 ns", - "Error": "0.135 ns", - "StdDev": "0.126 ns", + "Mean": "63.10 ns", + "Error": "0.753 ns", + "StdDev": "0.704 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -429,9 +429,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,245.66 ns", - "Error": "2.345 ns", - "StdDev": "2.078 ns", + "Mean": "1,485.43 ns", + "Error": "10.296 ns", + "StdDev": "9.630 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -439,9 +439,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,677.65 ns", - "Error": "5.402 ns", - "StdDev": "5.053 ns", + "Mean": "1,903.83 ns", + "Error": "20.283 ns", + "StdDev": "17.980 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -449,9 +449,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,667.61 ns", - "Error": "3.818 ns", - "StdDev": "3.384 ns", + "Mean": "1,854.52 ns", + "Error": "28.344 ns", + "StdDev": "25.126 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -461,281 +461,299 @@ "Setup": [ { "Method": "TUnit.Mocks", - "Mean": "588.4 ns", - "Error": "7.52 ns", - "StdDev": "7.03 ns", - "Gen0": "0.0954", - "Gen1": "-", + "Mean": "588.8 ns", + "Error": "10.47 ns", + "StdDev": "9.79 ns", + "Gen0": "0.1431", + "Gen1": "0.0010", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "828.5 ns", - "Error": "15.21 ns", - "StdDev": "13.48 ns", - "Gen0": "0.2489", - "Gen1": "0.0048", + "Mean": "895.6 ns", + "Error": "17.80 ns", + "StdDev": "36.75 ns", + "Gen0": "0.3738", + "Gen1": "0.0076", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "371.1 ns", - "Error": "7.10 ns", - "StdDev": "8.18 ns", - "Gen0": "0.0672", - "Gen1": "-", + "Mean": "377.4 ns", + "Error": "6.19 ns", + "StdDev": "5.79 ns", + "Gen0": "0.1006", + "Gen1": "0.0005", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "320,511.4 ns", - "Error": "4,119.21 ns", - "StdDev": "3,853.11 ns", + "Mean": "436,678.0 ns", + "Error": "944.47 ns", + "StdDev": "788.68 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.7 KB" + "Allocated": "28.52 KB" }, { "Method": "NSubstitute", - "Mean": "5,389.5 ns", - "Error": "27.53 ns", - "StdDev": "25.75 ns", - "Gen0": "0.3662", + "Mean": "5,855.0 ns", + "Error": "62.03 ns", + "StdDev": "54.98 ns", + "Gen0": "0.5493", "Gen1": "-", - "Allocated": "9.01 KB" + "Allocated": "9.06 KB" }, { "Method": "FakeItEasy", - "Mean": "7,696.3 ns", - "Error": "64.86 ns", - "StdDev": "57.50 ns", - "Gen0": "0.4120", - "Gen1": "0.0153", - "Allocated": "10.46 KB" + "Mean": "8,695.7 ns", + "Error": "69.24 ns", + "StdDev": "57.82 ns", + "Gen0": "0.6104", + "Gen1": "0.0305", + "Allocated": "10.45 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "879.3 ns", - "Error": "14.32 ns", - "StdDev": "11.96 ns", - "Gen0": "0.1278", - "Gen1": "0.0010", + "Mean": "862.0 ns", + "Error": "12.94 ns", + "StdDev": "12.11 ns", + "Gen0": "0.1926", + "Gen1": "0.0019", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,447.5 ns", - "Error": "26.62 ns", - "StdDev": "34.61 ns", - "Gen0": "0.4311", - "Gen1": "0.0153", + "Mean": "1,597.8 ns", + "Error": "18.62 ns", + "StdDev": "17.42 ns", + "Gen0": "0.6485", + "Gen1": "0.0248", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "607.8 ns", - "Error": "11.99 ns", - "StdDev": "18.31 ns", - "Gen0": "0.1059", - "Gen1": "-", + "Mean": "637.6 ns", + "Error": "3.87 ns", + "StdDev": "3.62 ns", + "Gen0": "0.1583", + "Gen1": "0.0010", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "84,047.0 ns", - "Error": "1,156.28 ns", - "StdDev": "1,081.58 ns", - "Gen0": "0.4883", - "Gen1": "0.2441", + "Mean": "118,662.7 ns", + "Error": "939.60 ns", + "StdDev": "878.91 ns", + "Gen0": "0.9766", + "Gen1": "0.7324", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,746.2 ns", - "Error": "113.94 ns", - "StdDev": "106.58 ns", - "Gen0": "0.8240", - "Gen1": "0.0153", - "Allocated": "20.31 KB" + "Mean": "13,209.8 ns", + "Error": "158.82 ns", + "StdDev": "140.79 ns", + "Gen0": "1.2207", + "Gen1": "-", + "Allocated": "20.66 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,231.9 ns", - "Error": "76.62 ns", - "StdDev": "71.67 ns", - "Gen0": "0.4730", - "Gen1": "0.0153", - "Allocated": "11.72 KB" + "Mean": "8,549.2 ns", + "Error": "70.27 ns", + "StdDev": "65.73 ns", + "Gen0": "0.6714", + "Gen1": "0.0610", + "Allocated": "11.71 KB" } ], "Verification": [ { "Method": "TUnit.Mocks", - "Mean": "635.78 ns", - "Error": "4.345 ns", - "StdDev": "3.852 ns", - "Gen0": "0.1793", + "Mean": "810.19 ns", + "Error": "8.457 ns", + "StdDev": "7.911 ns", + "Gen0": "0.1192", "Gen1": "0.0010", + "Gen2": "-", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "626.37 ns", - "Error": "4.965 ns", - "StdDev": "4.146 ns", - "Gen0": "0.2794", - "Gen1": "0.0038", + "Mean": "717.06 ns", + "Error": "8.929 ns", + "StdDev": "8.352 ns", + "Gen0": "0.1860", + "Gen1": "0.0029", + "Gen2": "-", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "368.76 ns", - "Error": "1.256 ns", - "StdDev": "1.175 ns", - "Gen0": "0.1335", + "Mean": "453.84 ns", + "Error": "3.908 ns", + "StdDev": "3.464 ns", + "Gen0": "0.0892", "Gen1": "0.0005", + "Gen2": "-", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "317,960.35 ns", - "Error": "3,562.982 ns", - "StdDev": "3,332.816 ns", - "Gen0": "0.9766", + "Mean": "251,775.55 ns", + "Error": "1,166.818 ns", + "StdDev": "974.346 ns", + "Gen0": "0.4883", "Gen1": "-", - "Allocated": "24325 B" + "Gen2": "-", + "Allocated": "24306 B" }, { "Method": "NSubstitute", - "Mean": "5,713.78 ns", - "Error": "54.002 ns", - "StdDev": "50.514 ns", - "Gen0": "0.5951", - "Gen1": "0.0076", + "Mean": "6,194.00 ns", + "Error": "33.137 ns", + "StdDev": "30.996 ns", + "Gen0": "0.3967", + "Gen1": "-", + "Gen2": "-", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "6,844.92 ns", - "Error": "42.896 ns", - "StdDev": "38.026 ns", - "Gen0": "0.6409", + "Mean": "7,176.65 ns", + "Error": "57.675 ns", + "StdDev": "51.127 ns", + "Gen0": "0.4272", "Gen1": "0.0153", - "Allocated": "10722 B" + "Gen2": "0.0076", + "Allocated": "10731 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "46.28 ns", - "Error": "0.182 ns", - "StdDev": "0.152 ns", - "Gen0": "0.0191", + "Mean": "52.49 ns", + "Error": "0.534 ns", + "StdDev": "0.500 ns", + "Gen0": "0.0127", "Gen1": "-", + "Gen2": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "285.68 ns", - "Error": "1.770 ns", - "StdDev": "1.655 ns", - "Gen0": "0.1431", - "Gen1": "0.0010", + "Mean": "325.05 ns", + "Error": "2.492 ns", + "StdDev": "2.209 ns", + "Gen0": "0.0954", + "Gen1": "0.0005", + "Gen2": "-", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "223.94 ns", - "Error": "0.521 ns", - "StdDev": "0.435 ns", - "Gen0": "0.0739", + "Mean": "253.72 ns", + "Error": "3.304 ns", + "StdDev": "3.091 ns", + "Gen0": "0.0491", "Gen1": "-", + "Gen2": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "80,958.08 ns", - "Error": "520.424 ns", - "StdDev": "486.805 ns", + "Mean": "65,773.42 ns", + "Error": "662.859 ns", + "StdDev": "620.039 ns", "Gen0": "0.2441", - "Gen1": "-", - "Allocated": "6918 B" + "Gen1": "0.1221", + "Gen2": "-", + "Allocated": "7037 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,226.29 ns", - "Error": "6.706 ns", - "StdDev": "5.236 ns", - "Gen0": "0.4234", - "Gen1": "0.0038", + "Mean": "3,339.29 ns", + "Error": "20.893 ns", + "StdDev": "18.521 ns", + "Gen0": "0.2823", + "Gen1": "-", + "Gen2": "-", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,436.39 ns", - "Error": "32.473 ns", - "StdDev": "27.117 ns", - "Gen0": "0.3052", + "Mean": "3,223.40 ns", + "Error": "30.028 ns", + "StdDev": "28.088 ns", + "Gen0": "0.1984", "Gen1": "0.0153", - "Allocated": "5210 B" + "Gen2": "-", + "Allocated": "5217 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,123.15 ns", - "Error": "4.289 ns", - "StdDev": "3.581 ns", - "Gen0": "0.2670", + "Mean": "1,381.22 ns", + "Error": "6.626 ns", + "StdDev": "6.198 ns", + "Gen0": "0.1774", "Gen1": "0.0019", + "Gen2": "-", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,568.51 ns", - "Error": "7.513 ns", - "StdDev": "6.660 ns", - "Gen0": "0.6676", - "Gen1": "0.0210", + "Mean": "1,744.80 ns", + "Error": "28.617 ns", + "StdDev": "26.769 ns", + "Gen0": "0.4444", + "Gen1": "0.0134", + "Gen2": "-", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,048.82 ns", - "Error": "6.147 ns", - "StdDev": "5.750 ns", - "Gen0": "0.3204", - "Gen1": "0.0038", + "Mean": "1,188.13 ns", + "Error": "13.426 ns", + "StdDev": "11.901 ns", + "Gen0": "0.2136", + "Gen1": "0.0019", + "Gen2": "-", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "433,476.81 ns", - "Error": "3,003.389 ns", - "StdDev": "2,662.426 ns", - "Gen0": "1.9531", - "Gen1": "0.9766", - "Allocated": "34842 B" + "Mean": "350,594.98 ns", + "Error": "3,040.700 ns", + "StdDev": "2,844.273 ns", + "Gen0": "0.9766", + "Gen1": "-", + "Gen2": "-", + "Allocated": "35181 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "10,403.50 ns", - "Error": "69.813 ns", - "StdDev": "65.303 ns", - "Gen0": "0.9918", - "Gen1": "0.0153", + "Mean": "10,660.99 ns", + "Error": "93.903 ns", + "StdDev": "87.837 ns", + "Gen0": "0.6561", + "Gen1": "-", + "Gen2": "-", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "12,452.53 ns", - "Error": "155.500 ns", - "StdDev": "121.404 ns", - "Gen0": "1.0986", - "Gen1": "-", - "Allocated": "19233 B" + "Mean": "12,630.28 ns", + "Error": "46.944 ns", + "StdDev": "43.911 ns", + "Gen0": "0.7629", + "Gen1": "0.0153", + "Gen2": "-", + "Allocated": "19239 B" } ] }, "stats": { "categoryCount": 6, "totalBenchmarks": 78, - "lastUpdated": "2026-06-16T03:29:20.737Z" + "lastUpdated": "2026-06-17T03:28:53.706Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/summary.json b/docs/static/benchmarks/mocks/summary.json index 72841a55cd..a0b4c76310 100644 --- a/docs/static/benchmarks/mocks/summary.json +++ b/docs/static/benchmarks/mocks/summary.json @@ -7,7 +7,7 @@ "Setup", "Verification" ], - "timestamp": "2026-06-16", + "timestamp": "2026-06-17", "environment": "Ubuntu Latest • .NET SDK 10.0.301", "libraries": [ "TUnit.Mocks", From 6b31503a2c1ea1ea964bd9ad3c7fae9697b40490 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 17 Jun 2026 07:09:50 +0100 Subject: [PATCH 05/18] chore(deps): update aspire to 13.4.5 (#6267) Co-authored-by: Renovate Bot --- Directory.Packages.props | 4 ++-- .../TUnit.Aspire.Tests.AppHost.csproj | 2 +- .../ExampleNamespace.AppHost.csproj | 6 +++--- .../ExampleNamespace.WebApp.csproj | 2 +- .../CloudShop.ApiService/CloudShop.ApiService.csproj | 4 ++-- .../CloudShop/CloudShop.AppHost/CloudShop.AppHost.csproj | 8 ++++---- .../CloudShop/CloudShop.Worker/CloudShop.Worker.csproj | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index e52fe4aaab..bf82cda07f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,8 +3,8 @@ true - - + + diff --git a/TUnit.Aspire.Tests.AppHost/TUnit.Aspire.Tests.AppHost.csproj b/TUnit.Aspire.Tests.AppHost/TUnit.Aspire.Tests.AppHost.csproj index 2fe0aa02d2..17875eaa4e 100644 --- a/TUnit.Aspire.Tests.AppHost/TUnit.Aspire.Tests.AppHost.csproj +++ b/TUnit.Aspire.Tests.AppHost/TUnit.Aspire.Tests.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe 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 3524134645..e38eb49ab3 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.WebApp/ExampleNamespace.WebApp.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.WebApp/ExampleNamespace.WebApp.csproj index 6df3199a47..0a6cc4244f 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/examples/CloudShop/CloudShop.ApiService/CloudShop.ApiService.csproj b/examples/CloudShop/CloudShop.ApiService/CloudShop.ApiService.csproj index 418defa3be..ecdefffff7 100644 --- a/examples/CloudShop/CloudShop.ApiService/CloudShop.ApiService.csproj +++ b/examples/CloudShop/CloudShop.ApiService/CloudShop.ApiService.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/examples/CloudShop/CloudShop.AppHost/CloudShop.AppHost.csproj b/examples/CloudShop/CloudShop.AppHost/CloudShop.AppHost.csproj index d9866bf9b5..6e5e4a9010 100644 --- a/examples/CloudShop/CloudShop.AppHost/CloudShop.AppHost.csproj +++ b/examples/CloudShop/CloudShop.AppHost/CloudShop.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe @@ -7,9 +7,9 @@ - - - + + + diff --git a/examples/CloudShop/CloudShop.Worker/CloudShop.Worker.csproj b/examples/CloudShop/CloudShop.Worker/CloudShop.Worker.csproj index 612cf3a2a1..6ff6d4edbe 100644 --- a/examples/CloudShop/CloudShop.Worker/CloudShop.Worker.csproj +++ b/examples/CloudShop/CloudShop.Worker/CloudShop.Worker.csproj @@ -10,7 +10,7 @@ - + From 09f3b9f96e1ba1d590fddd0a579cfc11137a05c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:52:24 +0100 Subject: [PATCH 06/18] chore(deps): bump launch-editor from 2.12.0 to 2.14.1 in /docs (#6268) Bumps [launch-editor](https://github.com/vitejs/launch-editor) from 2.12.0 to 2.14.1. - [Commits](https://github.com/vitejs/launch-editor/compare/v2.12.0...v2.14.1) --- updated-dependencies: - dependency-name: launch-editor dependency-version: 2.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index e15e965076..de97600127 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -6243,12 +6243,12 @@ latest-version@^7.0.0: package-json "^8.1.0" launch-editor@^2.6.1: - version "2.12.0" - resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz" - integrity sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.14.1.tgz#f7e0da3f58aaea03fea01074d840b5f739ed7ddc" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== dependencies: picocolors "^1.1.1" - shell-quote "^1.8.3" + shell-quote "^1.8.4" layout-base@^1.0.0: version "1.0.2" @@ -8903,7 +8903,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.8.3: +shell-quote@^1.8.4: version "1.8.4" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.4.tgz#2edd9a4dcefc96649e2e2cb12f637b1f1d92a190" integrity sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ== From fbaf7a99c03a98bcc5756c8d7fc63b7f2d3d6c86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 13:00:48 +0100 Subject: [PATCH 07/18] chore(deps): bump @babel/core from 7.28.5 to 7.29.7 in /docs (#6269) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.28.5 to 7.29.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.7/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-version: 7.29.7 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/yarn.lock | 152 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 131 insertions(+), 21 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index de97600127..4cfa7f8f2a 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -199,25 +199,39 @@ js-tokens "^4.0.0" picocolors "^1.1.1" +"@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@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/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + "@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== - 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" + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -247,6 +261,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3" + integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== + dependencies: + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@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" @@ -265,6 +290,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@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" @@ -303,6 +339,11 @@ resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + "@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" @@ -327,7 +368,15 @@ "@babel/traverse" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.27.1": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== @@ -345,6 +394,15 @@ "@babel/helper-validator-identifier" "^7.28.5" "@babel/traverse" "^7.28.6" +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@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" @@ -393,16 +451,31 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + "@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-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + "@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-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + "@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" @@ -412,13 +485,13 @@ "@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== +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": version "7.28.5" @@ -434,6 +507,13 @@ dependencies: "@babel/types" "^7.29.0" +"@babel/parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== + dependencies: + "@babel/types" "^7.29.7" + "@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" @@ -1112,6 +1192,15 @@ "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + "@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" @@ -1138,7 +1227,20 @@ "@babel/types" "^7.29.0" debug "^4.3.1" -"@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": +"@babel/traverse@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + debug "^4.3.1" + +"@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@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== @@ -1154,6 +1256,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" +"@babel/types@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@braintree/sanitize-url@^7.1.1": version "7.1.1" resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz" From 81082d1e5f2893fc2ba11ed931f07a379890380f Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Wed, 17 Jun 2026 13:05:00 +0100 Subject: [PATCH 08/18] chore(deps): update dependency dompurify to v3.4.11 (#6271) Co-authored-by: Renovate 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 6fe93aefdb..bacf839c63 100644 --- a/docs/package.json +++ b/docs/package.json @@ -54,7 +54,7 @@ "serialize-javascript": "7.0.5", "brace-expansion": "5.0.6", "qs": "6.15.2", - "dompurify": "3.4.10", + "dompurify": "3.4.11", "node-forge": "1.4.0", "picomatch": "4.0.4", "svgo": "4.0.1", diff --git a/docs/yarn.lock b/docs/yarn.lock index 4cfa7f8f2a..5a2574e711 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -4878,10 +4878,10 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@3.4.10, dompurify@^3.3.1: - version "3.4.10" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.10.tgz#96704295b4d8aeefcc8c7a90caa579b0ad69e46a" - integrity sha512-0xzNv0e7oYC6yyuOGZIABPM4qtg3QxLFniDNPP4ZP90wR8Yq3zgwpRbrNiT4N3IKqDbbYFEJLV+JWEs19aZ//w== +dompurify@3.4.11, dompurify@^3.3.1: + version "3.4.11" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680" + integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw== optionalDependencies: "@types/trusted-types" "^2.0.7" From 78cac2e43e8792d9ba408d413f940726d8be58c0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:26:47 +0100 Subject: [PATCH 09/18] chore(deps): update dependency serialize-javascript to v7.0.6 (#6272) Co-authored-by: Renovate 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 bacf839c63..4cd3541cc9 100644 --- a/docs/package.json +++ b/docs/package.json @@ -51,7 +51,7 @@ "lodash-es": "4.18.1", "minimatch": "10.2.5", "express/path-to-regexp": "8.4.2", - "serialize-javascript": "7.0.5", + "serialize-javascript": "7.0.6", "brace-expansion": "5.0.6", "qs": "6.15.2", "dompurify": "3.4.11", diff --git a/docs/yarn.lock b/docs/yarn.lock index 5a2574e711..c171e85a53 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -8926,10 +8926,10 @@ send@~0.19.0, send@~0.19.1: range-parser "~1.2.1" statuses "~2.0.2" -serialize-javascript@7.0.5, serialize-javascript@^6.0.0, serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: - version "7.0.5" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1" - integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== +serialize-javascript@7.0.6, serialize-javascript@^6.0.0, serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: + version "7.0.6" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.6.tgz#f2f20c8af0757e4d8fa329d0210636da0682ddef" + integrity sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg== serve-handler@^6.1.7: version "6.1.7" From 9347a8541ac0be2459809b4c61bb3defe2d322e9 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 18 Jun 2026 04:30:11 +0100 Subject: [PATCH 10/18] chore: update mock benchmark results (#6275) --- docs/docs/benchmarks/mocks/Callback.md | 36 +- .../docs/benchmarks/mocks/CombinedWorkflow.md | 20 +- docs/docs/benchmarks/mocks/Invocation.md | 52 +- docs/docs/benchmarks/mocks/MockCreation.md | 36 +- docs/docs/benchmarks/mocks/Setup.md | 36 +- docs/docs/benchmarks/mocks/Verification.md | 52 +- docs/docs/benchmarks/mocks/index.md | 6 +- docs/static/benchmarks/mocks/Callback.json | 92 +-- .../benchmarks/mocks/CombinedWorkflow.json | 48 +- docs/static/benchmarks/mocks/Invocation.json | 128 ++-- .../static/benchmarks/mocks/MockCreation.json | 78 +-- docs/static/benchmarks/mocks/Setup.json | 126 ++-- .../static/benchmarks/mocks/Verification.json | 200 +++--- docs/static/benchmarks/mocks/latest.json | 654 +++++++++--------- docs/static/benchmarks/mocks/summary.json | 2 +- 15 files changed, 765 insertions(+), 801 deletions(-) diff --git a/docs/docs/benchmarks/mocks/Callback.md b/docs/docs/benchmarks/mocks/Callback.md index d85e920b78..f5dcb79bf3 100644 --- a/docs/docs/benchmarks/mocks/Callback.md +++ b/docs/docs/benchmarks/mocks/Callback.md @@ -9,7 +9,7 @@ sidebar_position: 2 > Callback registration and execution — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-17** from the latest CI run. +This benchmark was automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Callback registration and execution: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 643.2 ns | 3.73 ns | 3.12 ns | 3.11 KB | -| Imposter | 459.2 ns | 1.46 ns | 1.36 ns | 2.66 KB | -| Mockolate | 355.3 ns | 1.04 ns | 0.87 ns | 1.91 KB | -| Moq | 136,059.1 ns | 1,655.45 ns | 1,467.51 ns | 13.14 KB | -| NSubstitute | 4,093.4 ns | 18.71 ns | 16.59 ns | 7.93 KB | -| FakeItEasy | 4,571.5 ns | 34.49 ns | 32.26 ns | 7.44 KB | +| **TUnit.Mocks** | 697.7 ns | 9.43 ns | 8.82 ns | 3.11 KB | +| Imposter | 469.3 ns | 4.98 ns | 4.66 ns | 2.66 KB | +| Mockolate | 376.3 ns | 3.17 ns | 2.81 ns | 1.91 KB | +| Moq | 183,861.5 ns | 781.51 ns | 731.03 ns | 13.14 KB | +| NSubstitute | 4,478.3 ns | 32.83 ns | 27.41 ns | 7.93 KB | +| FakeItEasy | 5,088.7 ns | 31.41 ns | 29.38 ns | 7.44 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Callback registration and execution: xychart-beta title "Callback Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 163271 - bar [643.2, 459.2, 355.3, 136059.1, 4093.4, 4571.5] + y-axis "Time (ns)" 0 --> 220634 + bar [697.7, 469.3, 376.3, 183861.5, 4478.3, 5088.7] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 790.1 ns | 4.79 ns | 4.24 ns | 3.2 KB | -| Imposter | 541.9 ns | 1.77 ns | 1.66 ns | 2.82 KB | -| Mockolate | 399.1 ns | 2.00 ns | 1.77 ns | 1.95 KB | -| Moq | 145,945.6 ns | 887.92 ns | 830.56 ns | 13.84 KB | -| NSubstitute | 4,590.9 ns | 22.92 ns | 20.32 ns | 8.53 KB | -| FakeItEasy | 5,495.5 ns | 28.70 ns | 23.97 ns | 9.4 KB | +| **TUnit.Mocks** | 847.6 ns | 9.73 ns | 9.10 ns | 3.2 KB | +| Imposter | 543.8 ns | 4.98 ns | 3.89 ns | 2.82 KB | +| Mockolate | 411.8 ns | 8.07 ns | 7.15 ns | 1.95 KB | +| Moq | 193,329.5 ns | 1,121.02 ns | 993.75 ns | 13.73 KB | +| NSubstitute | 5,305.6 ns | 56.04 ns | 49.68 ns | 8.53 KB | +| FakeItEasy | 6,500.5 ns | 113.72 ns | 121.68 ns | 9.4 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Callback (with args) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 175135 - bar [790.1, 541.9, 399.1, 145945.6, 4590.9, 5495.5] + y-axis "Time (ns)" 0 --> 231996 + bar [847.6, 543.8, 411.8, 193329.5, 5305.6, 6500.5] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/docs/benchmarks/mocks/CombinedWorkflow.md b/docs/docs/benchmarks/mocks/CombinedWorkflow.md index f47c3740c8..2a2f2f05c3 100644 --- a/docs/docs/benchmarks/mocks/CombinedWorkflow.md +++ b/docs/docs/benchmarks/mocks/CombinedWorkflow.md @@ -9,7 +9,7 @@ sidebar_position: 3 > Full workflow: create → setup → invoke → verify — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-17** from the latest CI run. +This benchmark was automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Full workflow: create → setup → invoke → verify: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1.884 μs | 0.0190 μs | 0.0178 μs | 6.23 KB | -| Imposter | 2.699 μs | 0.0418 μs | 0.0498 μs | 15.71 KB | -| Mockolate | 1.817 μs | 0.0249 μs | 0.0208 μs | 7.63 KB | -| Moq | 406.475 μs | 2.9235 μs | 2.7346 μs | 36.16 KB | -| NSubstitute | 17.508 μs | 0.0878 μs | 0.0779 μs | 26.72 KB | -| FakeItEasy | 19.214 μs | 0.1703 μs | 0.1510 μs | 25.67 KB | +| **TUnit.Mocks** | 1.931 μs | 0.0109 μs | 0.0091 μs | 6.23 KB | +| Imposter | 2.865 μs | 0.0373 μs | 0.0330 μs | 15.71 KB | +| Mockolate | 1.896 μs | 0.0182 μs | 0.0171 μs | 7.63 KB | +| Moq | 417.831 μs | 1.8875 μs | 1.7655 μs | 36.35 KB | +| NSubstitute | 17.856 μs | 0.2324 μs | 0.2173 μs | 26.72 KB | +| FakeItEasy | 18.856 μs | 0.3021 μs | 0.2522 μs | 25.52 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Full workflow: create → setup → invoke → verify: xychart-beta title "CombinedWorkflow Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (μs)" 0 --> 488 - bar [1.884, 2.699, 1.817, 406.475, 17.508, 19.214] + y-axis "Time (μs)" 0 --> 502 + bar [1.931, 2.865, 1.896, 417.831, 17.856, 18.856] ``` ## 🎯 Key Insights @@ -65,4 +65,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/docs/benchmarks/mocks/Invocation.md b/docs/docs/benchmarks/mocks/Invocation.md index 0d157fe522..8586a3997b 100644 --- a/docs/docs/benchmarks/mocks/Invocation.md +++ b/docs/docs/benchmarks/mocks/Invocation.md @@ -9,7 +9,7 @@ sidebar_position: 4 > Calling methods on mock objects — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-17** from the latest CI run. +This benchmark was automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Calling methods on mock objects: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 269.95 ns | 93.227 ns | 5.110 ns | 128 B | -| Imposter | 299.20 ns | 182.182 ns | 9.986 ns | 168 B | -| Mockolate | 106.83 ns | 9.094 ns | 0.498 ns | 84 B | -| Moq | 808.65 ns | 37.365 ns | 2.048 ns | 376 B | -| NSubstitute | 777.82 ns | 117.337 ns | 6.432 ns | 360 B | -| FakeItEasy | 1,749.31 ns | 226.142 ns | 12.396 ns | 944 B | +| **TUnit.Mocks** | 272.6 ns | 56.40 ns | 3.09 ns | 128 B | +| Imposter | 368.7 ns | 38.27 ns | 2.10 ns | 168 B | +| Mockolate | 121.8 ns | 61.95 ns | 3.40 ns | 84 B | +| Moq | 814.8 ns | 350.95 ns | 19.24 ns | 376 B | +| NSubstitute | 820.6 ns | 1,031.26 ns | 56.53 ns | 304 B | +| FakeItEasy | 1,852.5 ns | 1,311.34 ns | 71.88 ns | 944 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Calling methods on mock objects: xychart-beta title "Invocation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2100 - bar [269.95, 299.2, 106.83, 808.65, 777.82, 1749.31] + y-axis "Time (ns)" 0 --> 2223 + bar [272.6, 368.7, 121.8, 814.8, 820.6, 1852.5] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 166.10 ns | 79.083 ns | 4.335 ns | 96 B | -| Imposter | 290.95 ns | 55.317 ns | 3.032 ns | 168 B | -| Mockolate | 96.79 ns | 31.480 ns | 1.726 ns | 60 B | -| Moq | 537.42 ns | 139.463 ns | 7.644 ns | 296 B | -| NSubstitute | 585.36 ns | 220.250 ns | 12.073 ns | 272 B | -| FakeItEasy | 1,463.68 ns | 360.436 ns | 19.757 ns | 776 B | +| **TUnit.Mocks** | 174.2 ns | 56.08 ns | 3.07 ns | 96 B | +| Imposter | 302.7 ns | 87.58 ns | 4.80 ns | 168 B | +| Mockolate | 106.0 ns | 194.26 ns | 10.65 ns | 60 B | +| Moq | 550.0 ns | 101.00 ns | 5.54 ns | 296 B | +| NSubstitute | 641.9 ns | 53.00 ns | 2.90 ns | 272 B | +| FakeItEasy | 1,677.0 ns | 64.46 ns | 3.53 ns | 776 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Invocation (String) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 1757 - bar [166.1, 290.95, 96.79, 537.42, 585.36, 1463.68] + y-axis "Time (ns)" 0 --> 2013 + bar [174.2, 302.7, 106, 550, 641.9, 1677] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 26,487.88 ns | 8,778.198 ns | 481.163 ns | 12736 B | -| Imposter | 28,046.98 ns | 5,604.410 ns | 307.197 ns | 16800 B | -| Mockolate | 10,844.64 ns | 10,898.301 ns | 597.373 ns | 8400 B | -| Moq | 77,618.64 ns | 6,181.350 ns | 338.821 ns | 37600 B | -| NSubstitute | 72,996.64 ns | 10,873.652 ns | 596.022 ns | 36448 B | -| FakeItEasy | 167,309.91 ns | 39,335.875 ns | 2,156.132 ns | 94400 B | +| **TUnit.Mocks** | 27,979.5 ns | 6,941.53 ns | 380.49 ns | 12736 B | +| Imposter | 33,056.6 ns | 13,945.35 ns | 764.39 ns | 16800 B | +| Mockolate | 13,212.4 ns | 20,439.77 ns | 1,120.37 ns | 8400 B | +| Moq | 84,896.3 ns | 58,242.67 ns | 3,192.48 ns | 37600 B | +| NSubstitute | 87,247.2 ns | 62,681.56 ns | 3,435.79 ns | 30848 B | +| FakeItEasy | 206,938.9 ns | 213,933.73 ns | 11,726.43 ns | 94400 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Invocation (100 calls) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 200772 - bar [26487.88, 28046.98, 10844.64, 77618.64, 72996.64, 167309.91] + y-axis "Time (ns)" 0 --> 248327 + bar [27979.5, 33056.6, 13212.4, 84896.3, 87247.2, 206938.9] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/docs/benchmarks/mocks/MockCreation.md b/docs/docs/benchmarks/mocks/MockCreation.md index 8c24b953a3..08474023a7 100644 --- a/docs/docs/benchmarks/mocks/MockCreation.md +++ b/docs/docs/benchmarks/mocks/MockCreation.md @@ -9,7 +9,7 @@ sidebar_position: 5 > Mock instance creation performance — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-17** from the latest CI run. +This benchmark was automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock instance creation performance: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 28.24 ns | 0.322 ns | 0.286 ns | 200 B | -| Imposter | 91.37 ns | 0.893 ns | 0.697 ns | 440 B | -| Mockolate | 62.19 ns | 0.892 ns | 0.835 ns | 424 B | -| Moq | 1,324.88 ns | 23.947 ns | 22.400 ns | 2048 B | -| NSubstitute | 1,962.28 ns | 12.287 ns | 10.260 ns | 5000 B | -| FakeItEasy | 1,799.32 ns | 20.335 ns | 19.022 ns | 2715 B | +| **TUnit.Mocks** | 32.12 ns | 0.700 ns | 0.621 ns | 200 B | +| Imposter | 100.54 ns | 0.237 ns | 0.210 ns | 440 B | +| Mockolate | 78.19 ns | 0.726 ns | 0.644 ns | 424 B | +| Moq | 1,255.61 ns | 18.085 ns | 16.917 ns | 2048 B | +| NSubstitute | 1,724.95 ns | 11.601 ns | 10.851 ns | 5000 B | +| FakeItEasy | 1,717.67 ns | 33.764 ns | 33.161 ns | 2715 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock instance creation performance: xychart-beta title "MockCreation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2355 - bar [28.24, 91.37, 62.19, 1324.88, 1962.28, 1799.32] + y-axis "Time (ns)" 0 --> 2070 + bar [32.12, 100.54, 78.19, 1255.61, 1724.95, 1717.67] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 28.57 ns | 0.405 ns | 0.359 ns | 200 B | -| Imposter | 150.53 ns | 1.690 ns | 1.581 ns | 696 B | -| Mockolate | 63.10 ns | 0.753 ns | 0.704 ns | 456 B | -| Moq | 1,485.43 ns | 10.296 ns | 9.630 ns | 1912 B | -| NSubstitute | 1,903.83 ns | 20.283 ns | 17.980 ns | 5000 B | -| FakeItEasy | 1,854.52 ns | 28.344 ns | 25.126 ns | 2715 B | +| **TUnit.Mocks** | 32.79 ns | 0.076 ns | 0.072 ns | 200 B | +| Imposter | 156.24 ns | 0.382 ns | 0.319 ns | 696 B | +| Mockolate | 65.09 ns | 0.247 ns | 0.193 ns | 456 B | +| Moq | 1,273.92 ns | 15.538 ns | 14.535 ns | 1912 B | +| NSubstitute | 1,777.84 ns | 34.020 ns | 40.499 ns | 5000 B | +| FakeItEasy | 1,722.92 ns | 31.628 ns | 35.154 ns | 2715 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "MockCreation (Repository) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2285 - bar [28.57, 150.53, 63.1, 1485.43, 1903.83, 1854.52] + y-axis "Time (ns)" 0 --> 2134 + bar [32.79, 156.24, 65.09, 1273.92, 1777.84, 1722.92] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/docs/benchmarks/mocks/Setup.md b/docs/docs/benchmarks/mocks/Setup.md index 069698946a..f575781a0d 100644 --- a/docs/docs/benchmarks/mocks/Setup.md +++ b/docs/docs/benchmarks/mocks/Setup.md @@ -9,7 +9,7 @@ sidebar_position: 6 > Mock behavior configuration (returns, matchers) — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-17** from the latest CI run. +This benchmark was automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock behavior configuration (returns, matchers): | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 588.8 ns | 10.47 ns | 9.79 ns | 2.34 KB | -| Imposter | 895.6 ns | 17.80 ns | 36.75 ns | 6.12 KB | -| Mockolate | 377.4 ns | 6.19 ns | 5.79 ns | 1.65 KB | -| Moq | 436,678.0 ns | 944.47 ns | 788.68 ns | 28.52 KB | -| NSubstitute | 5,855.0 ns | 62.03 ns | 54.98 ns | 9.06 KB | -| FakeItEasy | 8,695.7 ns | 69.24 ns | 57.82 ns | 10.45 KB | +| **TUnit.Mocks** | 643.9 ns | 12.71 ns | 12.49 ns | 2.34 KB | +| Imposter | 1,010.5 ns | 13.67 ns | 12.12 ns | 6.12 KB | +| Mockolate | 404.9 ns | 4.96 ns | 4.64 ns | 1.65 KB | +| Moq | 320,796.8 ns | 2,492.44 ns | 2,081.30 ns | 28.67 KB | +| NSubstitute | 5,663.0 ns | 19.62 ns | 17.40 ns | 9.01 KB | +| FakeItEasy | 7,755.5 ns | 25.68 ns | 22.76 ns | 10.46 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock behavior configuration (returns, matchers): xychart-beta title "Setup Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 524014 - bar [588.8, 895.6, 377.4, 436678, 5855, 8695.7] + y-axis "Time (ns)" 0 --> 384957 + bar [643.9, 1010.5, 404.9, 320796.8, 5663, 7755.5] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 862.0 ns | 12.94 ns | 12.11 ns | 3.15 KB | -| Imposter | 1,597.8 ns | 18.62 ns | 17.42 ns | 10.59 KB | -| Mockolate | 637.6 ns | 3.87 ns | 3.62 ns | 2.6 KB | -| Moq | 118,662.7 ns | 939.60 ns | 878.91 ns | 16.53 KB | -| NSubstitute | 13,209.8 ns | 158.82 ns | 140.79 ns | 20.66 KB | -| FakeItEasy | 8,549.2 ns | 70.27 ns | 65.73 ns | 11.71 KB | +| **TUnit.Mocks** | 954.4 ns | 10.46 ns | 9.27 ns | 3.15 KB | +| Imposter | 1,705.0 ns | 33.68 ns | 71.78 ns | 10.59 KB | +| Mockolate | 675.3 ns | 7.09 ns | 6.63 ns | 2.6 KB | +| Moq | 85,539.5 ns | 342.14 ns | 285.70 ns | 16.53 KB | +| NSubstitute | 12,031.9 ns | 52.50 ns | 49.11 ns | 20.5 KB | +| FakeItEasy | 7,525.0 ns | 60.02 ns | 53.21 ns | 11.72 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Setup (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 142396 - bar [862, 1597.8, 637.6, 118662.7, 13209.8, 8549.2] + y-axis "Time (ns)" 0 --> 102648 + bar [954.4, 1705, 675.3, 85539.5, 12031.9, 7525] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/docs/benchmarks/mocks/Verification.md b/docs/docs/benchmarks/mocks/Verification.md index 7f4cd604ca..05cbab2091 100644 --- a/docs/docs/benchmarks/mocks/Verification.md +++ b/docs/docs/benchmarks/mocks/Verification.md @@ -9,7 +9,7 @@ sidebar_position: 7 > Verifying mock method calls — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-17** from the latest CI run. +This benchmark was automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Verifying mock method calls: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 810.19 ns | 8.457 ns | 7.911 ns | 3008 B | -| Imposter | 717.06 ns | 8.929 ns | 8.352 ns | 4688 B | -| Mockolate | 453.84 ns | 3.908 ns | 3.464 ns | 2240 B | -| Moq | 251,775.55 ns | 1,166.818 ns | 974.346 ns | 24306 B | -| NSubstitute | 6,194.00 ns | 33.137 ns | 30.996 ns | 10064 B | -| FakeItEasy | 7,176.65 ns | 57.675 ns | 51.127 ns | 10731 B | +| **TUnit.Mocks** | 788.12 ns | 3.045 ns | 2.543 ns | 3008 B | +| Imposter | 739.02 ns | 6.395 ns | 5.982 ns | 4688 B | +| Mockolate | 432.70 ns | 2.305 ns | 2.043 ns | 2240 B | +| Moq | 252,690.26 ns | 1,355.022 ns | 1,201.191 ns | 24324 B | +| NSubstitute | 6,171.27 ns | 42.226 ns | 37.432 ns | 10064 B | +| FakeItEasy | 6,787.33 ns | 59.435 ns | 52.687 ns | 10722 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Verifying mock method calls: xychart-beta title "Verification Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 302131 - bar [810.19, 717.06, 453.84, 251775.55, 6194, 7176.65] + y-axis "Time (ns)" 0 --> 303229 + bar [788.12, 739.02, 432.7, 252690.26, 6171.27, 6787.33] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 52.49 ns | 0.534 ns | 0.500 ns | 320 B | -| Imposter | 325.05 ns | 2.492 ns | 2.209 ns | 2400 B | -| Mockolate | 253.72 ns | 3.304 ns | 3.091 ns | 1240 B | -| Moq | 65,773.42 ns | 662.859 ns | 620.039 ns | 7037 B | -| NSubstitute | 3,339.29 ns | 20.893 ns | 18.521 ns | 7088 B | -| FakeItEasy | 3,223.40 ns | 30.028 ns | 28.088 ns | 5217 B | +| **TUnit.Mocks** | 56.55 ns | 0.167 ns | 0.139 ns | 320 B | +| Imposter | 339.76 ns | 5.309 ns | 4.966 ns | 2400 B | +| Mockolate | 257.21 ns | 2.277 ns | 2.130 ns | 1240 B | +| Moq | 64,156.37 ns | 377.022 ns | 314.830 ns | 7005 B | +| NSubstitute | 3,591.51 ns | 45.024 ns | 42.116 ns | 7088 B | +| FakeItEasy | 3,466.47 ns | 60.666 ns | 53.779 ns | 5210 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Verification (Never) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 78929 - bar [52.49, 325.05, 253.72, 65773.42, 3339.29, 3223.4] + y-axis "Time (ns)" 0 --> 76988 + bar [56.55, 339.76, 257.21, 64156.37, 3591.51, 3466.47] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1,381.22 ns | 6.626 ns | 6.198 ns | 4472 B | -| Imposter | 1,744.80 ns | 28.617 ns | 26.769 ns | 11192 B | -| Mockolate | 1,188.13 ns | 13.426 ns | 11.901 ns | 5376 B | -| Moq | 350,594.98 ns | 3,040.700 ns | 2,844.273 ns | 35181 B | -| NSubstitute | 10,660.99 ns | 93.903 ns | 87.837 ns | 16762 B | -| FakeItEasy | 12,630.28 ns | 46.944 ns | 43.911 ns | 19239 B | +| **TUnit.Mocks** | 1,342.57 ns | 23.123 ns | 21.629 ns | 4472 B | +| Imposter | 1,800.07 ns | 27.614 ns | 25.830 ns | 11192 B | +| Mockolate | 1,191.64 ns | 22.811 ns | 24.408 ns | 5376 B | +| Moq | 363,074.92 ns | 3,154.952 ns | 2,951.144 ns | 34922 B | +| NSubstitute | 10,887.68 ns | 83.524 ns | 78.128 ns | 16762 B | +| FakeItEasy | 12,157.60 ns | 144.392 ns | 135.065 ns | 19232 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Verification (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 420714 - bar [1381.22, 1744.8, 1188.13, 350594.98, 10660.99, 12630.28] + y-axis "Time (ns)" 0 --> 435690 + bar [1342.57, 1800.07, 1191.64, 363074.92, 10887.68, 12157.6] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/docs/benchmarks/mocks/index.md b/docs/docs/benchmarks/mocks/index.md index 0832de18b7..0301526dbb 100644 --- a/docs/docs/benchmarks/mocks/index.md +++ b/docs/docs/benchmarks/mocks/index.md @@ -7,7 +7,7 @@ sidebar_position: 4 # Mock Library Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2026-06-17** from the latest CI run. +These benchmarks were automatically generated on **2026-06-18** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -51,7 +51,7 @@ Each benchmark category tests a specific aspect of mocking library usage: - **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4 +- **Runtime**: .NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3 - **Statistical Rigor**: Multiple iterations with warm-up and outlier detection - **Memory**: Allocation tracking enabled via `[MemoryDiagnoser]` @@ -76,4 +76,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: 2026-06-17T03:28:53.706Z* +*Last generated: 2026-06-18T03:29:53.480Z* diff --git a/docs/static/benchmarks/mocks/Callback.json b/docs/static/benchmarks/mocks/Callback.json index de93766a06..4ff65a14e7 100644 --- a/docs/static/benchmarks/mocks/Callback.json +++ b/docs/static/benchmarks/mocks/Callback.json @@ -1,119 +1,119 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "category": "Callback", "description": "Callback registration and execution", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "643.2 ns", - "Error": "3.73 ns", - "StdDev": "3.12 ns", + "Mean": "697.7 ns", + "Error": "9.43 ns", + "StdDev": "8.82 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "459.2 ns", - "Error": "1.46 ns", - "StdDev": "1.36 ns", - "Gen0": "0.1626", - "Gen1": "0.0014", + "Mean": "469.3 ns", + "Error": "4.98 ns", + "StdDev": "4.66 ns", + "Gen0": "0.1621", + "Gen1": "0.0010", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "355.3 ns", - "Error": "1.04 ns", - "StdDev": "0.87 ns", + "Mean": "376.3 ns", + "Error": "3.17 ns", + "StdDev": "2.81 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "136,059.1 ns", - "Error": "1,655.45 ns", - "StdDev": "1,467.51 ns", + "Mean": "183,861.5 ns", + "Error": "781.51 ns", + "StdDev": "731.03 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,093.4 ns", - "Error": "18.71 ns", - "StdDev": "16.59 ns", + "Mean": "4,478.3 ns", + "Error": "32.83 ns", + "StdDev": "27.41 ns", "Gen0": "0.4807", "Gen1": "0.0076", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "4,571.5 ns", - "Error": "34.49 ns", - "StdDev": "32.26 ns", - "Gen0": "0.4272", - "Gen1": "0.0305", + "Mean": "5,088.7 ns", + "Error": "31.41 ns", + "StdDev": "29.38 ns", + "Gen0": "0.4501", + "Gen1": "0.0153", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "790.1 ns", - "Error": "4.79 ns", - "StdDev": "4.24 ns", + "Mean": "847.6 ns", + "Error": "9.73 ns", + "StdDev": "9.10 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "541.9 ns", - "Error": "1.77 ns", - "StdDev": "1.66 ns", + "Mean": "543.8 ns", + "Error": "4.98 ns", + "StdDev": "3.89 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "399.1 ns", - "Error": "2.00 ns", - "StdDev": "1.77 ns", + "Mean": "411.8 ns", + "Error": "8.07 ns", + "StdDev": "7.15 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "145,945.6 ns", - "Error": "887.92 ns", - "StdDev": "830.56 ns", + "Mean": "193,329.5 ns", + "Error": "1,121.02 ns", + "StdDev": "993.75 ns", "Gen0": "0.4883", "Gen1": "-", - "Allocated": "13.84 KB" + "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "4,590.9 ns", - "Error": "22.92 ns", - "StdDev": "20.32 ns", - "Gen0": "0.5188", - "Gen1": "0.0076", + "Mean": "5,305.6 ns", + "Error": "56.04 ns", + "StdDev": "49.68 ns", + "Gen0": "0.4883", + "Gen1": "-", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "5,495.5 ns", - "Error": "28.70 ns", - "StdDev": "23.97 ns", + "Mean": "6,500.5 ns", + "Error": "113.72 ns", + "StdDev": "121.68 ns", "Gen0": "0.5493", - "Gen1": "0.0305", + "Gen1": "0.0610", "Allocated": "9.4 KB" } ] diff --git a/docs/static/benchmarks/mocks/CombinedWorkflow.json b/docs/static/benchmarks/mocks/CombinedWorkflow.json index c2a9cff735..5f93f49685 100644 --- a/docs/static/benchmarks/mocks/CombinedWorkflow.json +++ b/docs/static/benchmarks/mocks/CombinedWorkflow.json @@ -1,66 +1,66 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "category": "CombinedWorkflow", "description": "Full workflow: create → setup → invoke → verify", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "1.884 μs", - "Error": "0.0190 μs", - "StdDev": "0.0178 μs", - "Gen0": "0.3796", - "Gen1": "0.0057", + "Mean": "1.931 μs", + "Error": "0.0109 μs", + "StdDev": "0.0091 μs", + "Gen0": "0.3777", + "Gen1": "0.0038", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.699 μs", - "Error": "0.0418 μs", - "StdDev": "0.0498 μs", + "Mean": "2.865 μs", + "Error": "0.0373 μs", + "StdDev": "0.0330 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.817 μs", - "Error": "0.0249 μs", - "StdDev": "0.0208 μs", + "Mean": "1.896 μs", + "Error": "0.0182 μs", + "StdDev": "0.0171 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "406.475 μs", - "Error": "2.9235 μs", - "StdDev": "2.7346 μs", + "Mean": "417.831 μs", + "Error": "1.8875 μs", + "StdDev": "1.7655 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.16 KB" + "Allocated": "36.35 KB" }, { "Method": "NSubstitute", - "Mean": "17.508 μs", - "Error": "0.0878 μs", - "StdDev": "0.0779 μs", + "Mean": "17.856 μs", + "Error": "0.2324 μs", + "StdDev": "0.2173 μs", "Gen0": "1.6174", "Gen1": "0.0305", "Allocated": "26.72 KB" }, { "Method": "FakeItEasy", - "Mean": "19.214 μs", - "Error": "0.1703 μs", - "StdDev": "0.1510 μs", + "Mean": "18.856 μs", + "Error": "0.3021 μs", + "StdDev": "0.2522 μs", "Gen0": "1.4648", "Gen1": "0.1221", - "Allocated": "25.67 KB" + "Allocated": "25.52 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Invocation.json b/docs/static/benchmarks/mocks/Invocation.json index 25b15c69c0..438b76e91b 100644 --- a/docs/static/benchmarks/mocks/Invocation.json +++ b/docs/static/benchmarks/mocks/Invocation.json @@ -1,171 +1,171 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "category": "Invocation", "description": "Calling methods on mock objects", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "269.95 ns", - "Error": "93.227 ns", - "StdDev": "5.110 ns", + "Mean": "272.6 ns", + "Error": "56.40 ns", + "StdDev": "3.09 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "299.20 ns", - "Error": "182.182 ns", - "StdDev": "9.986 ns", + "Mean": "368.7 ns", + "Error": "38.27 ns", + "StdDev": "2.10 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "106.83 ns", - "Error": "9.094 ns", - "StdDev": "0.498 ns", + "Mean": "121.8 ns", + "Error": "61.95 ns", + "StdDev": "3.40 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "808.65 ns", - "Error": "37.365 ns", - "StdDev": "2.048 ns", + "Mean": "814.8 ns", + "Error": "350.95 ns", + "StdDev": "19.24 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "777.82 ns", - "Error": "117.337 ns", - "StdDev": "6.432 ns", - "Gen0": "0.0200", - "Gen1": "0.0191", - "Allocated": "360 B" + "Mean": "820.6 ns", + "Error": "1,031.26 ns", + "StdDev": "56.53 ns", + "Gen0": "0.0172", + "Gen1": "0.0162", + "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "1,749.31 ns", - "Error": "226.142 ns", - "StdDev": "12.396 ns", - "Gen0": "0.0553", - "Gen1": "0.0534", + "Mean": "1,852.5 ns", + "Error": "1,311.34 ns", + "StdDev": "71.88 ns", + "Gen0": "0.0534", + "Gen1": "0.0496", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "166.10 ns", - "Error": "79.083 ns", - "StdDev": "4.335 ns", + "Mean": "174.2 ns", + "Error": "56.08 ns", + "StdDev": "3.07 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "290.95 ns", - "Error": "55.317 ns", - "StdDev": "3.032 ns", + "Mean": "302.7 ns", + "Error": "87.58 ns", + "StdDev": "4.80 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "96.79 ns", - "Error": "31.480 ns", - "StdDev": "1.726 ns", + "Mean": "106.0 ns", + "Error": "194.26 ns", + "StdDev": "10.65 ns", "Gen0": "0.0036", "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "537.42 ns", - "Error": "139.463 ns", - "StdDev": "7.644 ns", + "Mean": "550.0 ns", + "Error": "101.00 ns", + "StdDev": "5.54 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "585.36 ns", - "Error": "220.250 ns", - "StdDev": "12.073 ns", + "Mean": "641.9 ns", + "Error": "53.00 ns", + "StdDev": "2.90 ns", "Gen0": "0.0153", "Gen1": "0.0143", "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,463.68 ns", - "Error": "360.436 ns", - "StdDev": "19.757 ns", + "Mean": "1,677.0 ns", + "Error": "64.46 ns", + "StdDev": "3.53 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "26,487.88 ns", - "Error": "8,778.198 ns", - "StdDev": "481.163 ns", + "Mean": "27,979.5 ns", + "Error": "6,941.53 ns", + "StdDev": "380.49 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "28,046.98 ns", - "Error": "5,604.410 ns", - "StdDev": "307.197 ns", + "Mean": "33,056.6 ns", + "Error": "13,945.35 ns", + "StdDev": "764.39 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "10,844.64 ns", - "Error": "10,898.301 ns", - "StdDev": "597.373 ns", + "Mean": "13,212.4 ns", + "Error": "20,439.77 ns", + "StdDev": "1,120.37 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "77,618.64 ns", - "Error": "6,181.350 ns", - "StdDev": "338.821 ns", + "Mean": "84,896.3 ns", + "Error": "58,242.67 ns", + "StdDev": "3,192.48 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "72,996.64 ns", - "Error": "10,873.652 ns", - "StdDev": "596.022 ns", - "Gen0": "1.9531", - "Gen1": "1.8311", - "Allocated": "36448 B" + "Mean": "87,247.2 ns", + "Error": "62,681.56 ns", + "StdDev": "3,435.79 ns", + "Gen0": "1.7090", + "Gen1": "1.5869", + "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "167,309.91 ns", - "Error": "39,335.875 ns", - "StdDev": "2,156.132 ns", + "Mean": "206,938.9 ns", + "Error": "213,933.73 ns", + "StdDev": "11,726.43 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" diff --git a/docs/static/benchmarks/mocks/MockCreation.json b/docs/static/benchmarks/mocks/MockCreation.json index 15d92b4ca3..4e48f3b3e7 100644 --- a/docs/static/benchmarks/mocks/MockCreation.json +++ b/docs/static/benchmarks/mocks/MockCreation.json @@ -1,18 +1,18 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "category": "MockCreation", "description": "Mock instance creation performance", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "28.24 ns", - "Error": "0.322 ns", - "StdDev": "0.286 ns", + "Mean": "32.12 ns", + "Error": "0.700 ns", + "StdDev": "0.621 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -20,9 +20,9 @@ }, { "Method": "Imposter", - "Mean": "91.37 ns", - "Error": "0.893 ns", - "StdDev": "0.697 ns", + "Mean": "100.54 ns", + "Error": "0.237 ns", + "StdDev": "0.210 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -30,9 +30,9 @@ }, { "Method": "Mockolate", - "Mean": "62.19 ns", - "Error": "0.892 ns", - "StdDev": "0.835 ns", + "Mean": "78.19 ns", + "Error": "0.726 ns", + "StdDev": "0.644 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -40,9 +40,9 @@ }, { "Method": "Moq", - "Mean": "1,324.88 ns", - "Error": "23.947 ns", - "StdDev": "22.400 ns", + "Mean": "1,255.61 ns", + "Error": "18.085 ns", + "StdDev": "16.917 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -50,19 +50,19 @@ }, { "Method": "NSubstitute", - "Mean": "1,962.28 ns", - "Error": "12.287 ns", - "StdDev": "10.260 ns", + "Mean": "1,724.95 ns", + "Error": "11.601 ns", + "StdDev": "10.851 ns", "Gen0": "0.2975", - "Gen1": "-", + "Gen1": "0.0019", "Gen2": "-", "Allocated": "5000 B" }, { "Method": "FakeItEasy", - "Mean": "1,799.32 ns", - "Error": "20.335 ns", - "StdDev": "19.022 ns", + "Mean": "1,717.67 ns", + "Error": "33.764 ns", + "StdDev": "33.161 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -70,9 +70,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "28.57 ns", - "Error": "0.405 ns", - "StdDev": "0.359 ns", + "Mean": "32.79 ns", + "Error": "0.076 ns", + "StdDev": "0.072 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -80,9 +80,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "150.53 ns", - "Error": "1.690 ns", - "StdDev": "1.581 ns", + "Mean": "156.24 ns", + "Error": "0.382 ns", + "StdDev": "0.319 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -90,9 +90,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "63.10 ns", - "Error": "0.753 ns", - "StdDev": "0.704 ns", + "Mean": "65.09 ns", + "Error": "0.247 ns", + "StdDev": "0.193 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -100,9 +100,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,485.43 ns", - "Error": "10.296 ns", - "StdDev": "9.630 ns", + "Mean": "1,273.92 ns", + "Error": "15.538 ns", + "StdDev": "14.535 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -110,9 +110,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,903.83 ns", - "Error": "20.283 ns", - "StdDev": "17.980 ns", + "Mean": "1,777.84 ns", + "Error": "34.020 ns", + "StdDev": "40.499 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -120,9 +120,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,854.52 ns", - "Error": "28.344 ns", - "StdDev": "25.126 ns", + "Mean": "1,722.92 ns", + "Error": "31.628 ns", + "StdDev": "35.154 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", diff --git a/docs/static/benchmarks/mocks/Setup.json b/docs/static/benchmarks/mocks/Setup.json index d9a5085f94..1ebe983540 100644 --- a/docs/static/benchmarks/mocks/Setup.json +++ b/docs/static/benchmarks/mocks/Setup.json @@ -1,120 +1,120 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "category": "Setup", "description": "Mock behavior configuration (returns, matchers)", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "588.8 ns", - "Error": "10.47 ns", - "StdDev": "9.79 ns", - "Gen0": "0.1431", - "Gen1": "0.0010", + "Mean": "643.9 ns", + "Error": "12.71 ns", + "StdDev": "12.49 ns", + "Gen0": "0.0954", + "Gen1": "-", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "895.6 ns", - "Error": "17.80 ns", - "StdDev": "36.75 ns", - "Gen0": "0.3738", - "Gen1": "0.0076", + "Mean": "1,010.5 ns", + "Error": "13.67 ns", + "StdDev": "12.12 ns", + "Gen0": "0.2480", + "Gen1": "0.0038", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "377.4 ns", - "Error": "6.19 ns", - "StdDev": "5.79 ns", - "Gen0": "0.1006", - "Gen1": "0.0005", + "Mean": "404.9 ns", + "Error": "4.96 ns", + "StdDev": "4.64 ns", + "Gen0": "0.0672", + "Gen1": "-", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "436,678.0 ns", - "Error": "944.47 ns", - "StdDev": "788.68 ns", + "Mean": "320,796.8 ns", + "Error": "2,492.44 ns", + "StdDev": "2,081.30 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.52 KB" + "Allocated": "28.67 KB" }, { "Method": "NSubstitute", - "Mean": "5,855.0 ns", - "Error": "62.03 ns", - "StdDev": "54.98 ns", - "Gen0": "0.5493", + "Mean": "5,663.0 ns", + "Error": "19.62 ns", + "StdDev": "17.40 ns", + "Gen0": "0.3662", "Gen1": "-", - "Allocated": "9.06 KB" + "Allocated": "9.01 KB" }, { "Method": "FakeItEasy", - "Mean": "8,695.7 ns", - "Error": "69.24 ns", - "StdDev": "57.82 ns", - "Gen0": "0.6104", - "Gen1": "0.0305", - "Allocated": "10.45 KB" + "Mean": "7,755.5 ns", + "Error": "25.68 ns", + "StdDev": "22.76 ns", + "Gen0": "0.4120", + "Gen1": "0.0153", + "Allocated": "10.46 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "862.0 ns", - "Error": "12.94 ns", - "StdDev": "12.11 ns", - "Gen0": "0.1926", - "Gen1": "0.0019", + "Mean": "954.4 ns", + "Error": "10.46 ns", + "StdDev": "9.27 ns", + "Gen0": "0.1278", + "Gen1": "-", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,597.8 ns", - "Error": "18.62 ns", - "StdDev": "17.42 ns", - "Gen0": "0.6485", - "Gen1": "0.0248", + "Mean": "1,705.0 ns", + "Error": "33.68 ns", + "StdDev": "71.78 ns", + "Gen0": "0.4311", + "Gen1": "0.0153", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "637.6 ns", - "Error": "3.87 ns", - "StdDev": "3.62 ns", - "Gen0": "0.1583", - "Gen1": "0.0010", + "Mean": "675.3 ns", + "Error": "7.09 ns", + "StdDev": "6.63 ns", + "Gen0": "0.1059", + "Gen1": "-", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "118,662.7 ns", - "Error": "939.60 ns", - "StdDev": "878.91 ns", - "Gen0": "0.9766", - "Gen1": "0.7324", + "Mean": "85,539.5 ns", + "Error": "342.14 ns", + "StdDev": "285.70 ns", + "Gen0": "0.4883", + "Gen1": "0.2441", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "13,209.8 ns", - "Error": "158.82 ns", - "StdDev": "140.79 ns", - "Gen0": "1.2207", + "Mean": "12,031.9 ns", + "Error": "52.50 ns", + "StdDev": "49.11 ns", + "Gen0": "0.7324", "Gen1": "-", - "Allocated": "20.66 KB" + "Allocated": "20.5 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "8,549.2 ns", - "Error": "70.27 ns", - "StdDev": "65.73 ns", - "Gen0": "0.6714", - "Gen1": "0.0610", - "Allocated": "11.71 KB" + "Mean": "7,525.0 ns", + "Error": "60.02 ns", + "StdDev": "53.21 ns", + "Gen0": "0.4730", + "Gen1": "0.0153", + "Allocated": "11.72 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Verification.json b/docs/static/benchmarks/mocks/Verification.json index 4946b8c47b..f54537ae95 100644 --- a/docs/static/benchmarks/mocks/Verification.json +++ b/docs/static/benchmarks/mocks/Verification.json @@ -1,192 +1,174 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "category": "Verification", "description": "Verifying mock method calls", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "810.19 ns", - "Error": "8.457 ns", - "StdDev": "7.911 ns", - "Gen0": "0.1192", + "Mean": "788.12 ns", + "Error": "3.045 ns", + "StdDev": "2.543 ns", + "Gen0": "0.1793", "Gen1": "0.0010", - "Gen2": "-", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "717.06 ns", - "Error": "8.929 ns", - "StdDev": "8.352 ns", - "Gen0": "0.1860", - "Gen1": "0.0029", - "Gen2": "-", + "Mean": "739.02 ns", + "Error": "6.395 ns", + "StdDev": "5.982 ns", + "Gen0": "0.2794", + "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "453.84 ns", - "Error": "3.908 ns", - "StdDev": "3.464 ns", - "Gen0": "0.0892", + "Mean": "432.70 ns", + "Error": "2.305 ns", + "StdDev": "2.043 ns", + "Gen0": "0.1335", "Gen1": "0.0005", - "Gen2": "-", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "251,775.55 ns", - "Error": "1,166.818 ns", - "StdDev": "974.346 ns", - "Gen0": "0.4883", - "Gen1": "-", - "Gen2": "-", - "Allocated": "24306 B" + "Mean": "252,690.26 ns", + "Error": "1,355.022 ns", + "StdDev": "1,201.191 ns", + "Gen0": "0.9766", + "Gen1": "0.4883", + "Allocated": "24324 B" }, { "Method": "NSubstitute", - "Mean": "6,194.00 ns", - "Error": "33.137 ns", - "StdDev": "30.996 ns", - "Gen0": "0.3967", + "Mean": "6,171.27 ns", + "Error": "42.226 ns", + "StdDev": "37.432 ns", + "Gen0": "0.5798", "Gen1": "-", - "Gen2": "-", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "7,176.65 ns", - "Error": "57.675 ns", - "StdDev": "51.127 ns", - "Gen0": "0.4272", - "Gen1": "0.0153", - "Gen2": "0.0076", - "Allocated": "10731 B" + "Mean": "6,787.33 ns", + "Error": "59.435 ns", + "StdDev": "52.687 ns", + "Gen0": "0.6409", + "Gen1": "0.0305", + "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "52.49 ns", - "Error": "0.534 ns", - "StdDev": "0.500 ns", - "Gen0": "0.0127", + "Mean": "56.55 ns", + "Error": "0.167 ns", + "StdDev": "0.139 ns", + "Gen0": "0.0191", "Gen1": "-", - "Gen2": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "325.05 ns", - "Error": "2.492 ns", - "StdDev": "2.209 ns", - "Gen0": "0.0954", - "Gen1": "0.0005", - "Gen2": "-", + "Mean": "339.76 ns", + "Error": "5.309 ns", + "StdDev": "4.966 ns", + "Gen0": "0.1431", + "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "253.72 ns", - "Error": "3.304 ns", - "StdDev": "3.091 ns", - "Gen0": "0.0491", + "Mean": "257.21 ns", + "Error": "2.277 ns", + "StdDev": "2.130 ns", + "Gen0": "0.0739", "Gen1": "-", - "Gen2": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "65,773.42 ns", - "Error": "662.859 ns", - "StdDev": "620.039 ns", - "Gen0": "0.2441", - "Gen1": "0.1221", - "Gen2": "-", - "Allocated": "7037 B" + "Mean": "64,156.37 ns", + "Error": "377.022 ns", + "StdDev": "314.830 ns", + "Gen0": "0.3662", + "Gen1": "0.2441", + "Allocated": "7005 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,339.29 ns", - "Error": "20.893 ns", - "StdDev": "18.521 ns", - "Gen0": "0.2823", - "Gen1": "-", - "Gen2": "-", + "Mean": "3,591.51 ns", + "Error": "45.024 ns", + "StdDev": "42.116 ns", + "Gen0": "0.4234", + "Gen1": "0.0038", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,223.40 ns", - "Error": "30.028 ns", - "StdDev": "28.088 ns", - "Gen0": "0.1984", + "Mean": "3,466.47 ns", + "Error": "60.666 ns", + "StdDev": "53.779 ns", + "Gen0": "0.3052", "Gen1": "0.0153", - "Gen2": "-", - "Allocated": "5217 B" + "Allocated": "5210 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,381.22 ns", - "Error": "6.626 ns", - "StdDev": "6.198 ns", - "Gen0": "0.1774", + "Mean": "1,342.57 ns", + "Error": "23.123 ns", + "StdDev": "21.629 ns", + "Gen0": "0.2670", "Gen1": "0.0019", - "Gen2": "-", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,744.80 ns", - "Error": "28.617 ns", - "StdDev": "26.769 ns", - "Gen0": "0.4444", - "Gen1": "0.0134", - "Gen2": "-", + "Mean": "1,800.07 ns", + "Error": "27.614 ns", + "StdDev": "25.830 ns", + "Gen0": "0.6676", + "Gen1": "0.0210", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,188.13 ns", - "Error": "13.426 ns", - "StdDev": "11.901 ns", - "Gen0": "0.2136", - "Gen1": "0.0019", - "Gen2": "-", + "Mean": "1,191.64 ns", + "Error": "22.811 ns", + "StdDev": "24.408 ns", + "Gen0": "0.3204", + "Gen1": "0.0038", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "350,594.98 ns", - "Error": "3,040.700 ns", - "StdDev": "2,844.273 ns", - "Gen0": "0.9766", - "Gen1": "-", - "Gen2": "-", - "Allocated": "35181 B" + "Mean": "363,074.92 ns", + "Error": "3,154.952 ns", + "StdDev": "2,951.144 ns", + "Gen0": "1.9531", + "Gen1": "0.9766", + "Allocated": "34922 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "10,660.99 ns", - "Error": "93.903 ns", - "StdDev": "87.837 ns", - "Gen0": "0.6561", - "Gen1": "-", - "Gen2": "-", + "Mean": "10,887.68 ns", + "Error": "83.524 ns", + "StdDev": "78.128 ns", + "Gen0": "0.9918", + "Gen1": "0.0153", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "12,630.28 ns", - "Error": "46.944 ns", - "StdDev": "43.911 ns", - "Gen0": "0.7629", - "Gen1": "0.0153", - "Gen2": "-", - "Allocated": "19239 B" + "Mean": "12,157.60 ns", + "Error": "144.392 ns", + "StdDev": "135.065 ns", + "Gen0": "1.0986", + "Gen1": "0.0610", + "Allocated": "19232 B" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/latest.json b/docs/static/benchmarks/mocks/latest.json index e94579acd4..db34de408d 100644 --- a/docs/static/benchmarks/mocks/latest.json +++ b/docs/static/benchmarks/mocks/latest.json @@ -1,336 +1,336 @@ { - "timestamp": "2026-06-17T03:28:53.706Z", + "timestamp": "2026-06-18T03:29:53.480Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", - "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.9 (10.0.9, 10.0.926.27113), X64 RyuJIT x86-64-v3" }, "categories": { "Callback": [ { "Method": "TUnit.Mocks", - "Mean": "643.2 ns", - "Error": "3.73 ns", - "StdDev": "3.12 ns", + "Mean": "697.7 ns", + "Error": "9.43 ns", + "StdDev": "8.82 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "459.2 ns", - "Error": "1.46 ns", - "StdDev": "1.36 ns", - "Gen0": "0.1626", - "Gen1": "0.0014", + "Mean": "469.3 ns", + "Error": "4.98 ns", + "StdDev": "4.66 ns", + "Gen0": "0.1621", + "Gen1": "0.0010", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "355.3 ns", - "Error": "1.04 ns", - "StdDev": "0.87 ns", + "Mean": "376.3 ns", + "Error": "3.17 ns", + "StdDev": "2.81 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "136,059.1 ns", - "Error": "1,655.45 ns", - "StdDev": "1,467.51 ns", + "Mean": "183,861.5 ns", + "Error": "781.51 ns", + "StdDev": "731.03 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,093.4 ns", - "Error": "18.71 ns", - "StdDev": "16.59 ns", + "Mean": "4,478.3 ns", + "Error": "32.83 ns", + "StdDev": "27.41 ns", "Gen0": "0.4807", "Gen1": "0.0076", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "4,571.5 ns", - "Error": "34.49 ns", - "StdDev": "32.26 ns", - "Gen0": "0.4272", - "Gen1": "0.0305", + "Mean": "5,088.7 ns", + "Error": "31.41 ns", + "StdDev": "29.38 ns", + "Gen0": "0.4501", + "Gen1": "0.0153", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "790.1 ns", - "Error": "4.79 ns", - "StdDev": "4.24 ns", + "Mean": "847.6 ns", + "Error": "9.73 ns", + "StdDev": "9.10 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "541.9 ns", - "Error": "1.77 ns", - "StdDev": "1.66 ns", + "Mean": "543.8 ns", + "Error": "4.98 ns", + "StdDev": "3.89 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "399.1 ns", - "Error": "2.00 ns", - "StdDev": "1.77 ns", + "Mean": "411.8 ns", + "Error": "8.07 ns", + "StdDev": "7.15 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "145,945.6 ns", - "Error": "887.92 ns", - "StdDev": "830.56 ns", + "Mean": "193,329.5 ns", + "Error": "1,121.02 ns", + "StdDev": "993.75 ns", "Gen0": "0.4883", "Gen1": "-", - "Allocated": "13.84 KB" + "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "4,590.9 ns", - "Error": "22.92 ns", - "StdDev": "20.32 ns", - "Gen0": "0.5188", - "Gen1": "0.0076", + "Mean": "5,305.6 ns", + "Error": "56.04 ns", + "StdDev": "49.68 ns", + "Gen0": "0.4883", + "Gen1": "-", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "5,495.5 ns", - "Error": "28.70 ns", - "StdDev": "23.97 ns", + "Mean": "6,500.5 ns", + "Error": "113.72 ns", + "StdDev": "121.68 ns", "Gen0": "0.5493", - "Gen1": "0.0305", + "Gen1": "0.0610", "Allocated": "9.4 KB" } ], "CombinedWorkflow": [ { "Method": "TUnit.Mocks", - "Mean": "1.884 μs", - "Error": "0.0190 μs", - "StdDev": "0.0178 μs", - "Gen0": "0.3796", - "Gen1": "0.0057", + "Mean": "1.931 μs", + "Error": "0.0109 μs", + "StdDev": "0.0091 μs", + "Gen0": "0.3777", + "Gen1": "0.0038", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.699 μs", - "Error": "0.0418 μs", - "StdDev": "0.0498 μs", + "Mean": "2.865 μs", + "Error": "0.0373 μs", + "StdDev": "0.0330 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.817 μs", - "Error": "0.0249 μs", - "StdDev": "0.0208 μs", + "Mean": "1.896 μs", + "Error": "0.0182 μs", + "StdDev": "0.0171 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "406.475 μs", - "Error": "2.9235 μs", - "StdDev": "2.7346 μs", + "Mean": "417.831 μs", + "Error": "1.8875 μs", + "StdDev": "1.7655 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.16 KB" + "Allocated": "36.35 KB" }, { "Method": "NSubstitute", - "Mean": "17.508 μs", - "Error": "0.0878 μs", - "StdDev": "0.0779 μs", + "Mean": "17.856 μs", + "Error": "0.2324 μs", + "StdDev": "0.2173 μs", "Gen0": "1.6174", "Gen1": "0.0305", "Allocated": "26.72 KB" }, { "Method": "FakeItEasy", - "Mean": "19.214 μs", - "Error": "0.1703 μs", - "StdDev": "0.1510 μs", + "Mean": "18.856 μs", + "Error": "0.3021 μs", + "StdDev": "0.2522 μs", "Gen0": "1.4648", "Gen1": "0.1221", - "Allocated": "25.67 KB" + "Allocated": "25.52 KB" } ], "Invocation": [ { "Method": "TUnit.Mocks", - "Mean": "269.95 ns", - "Error": "93.227 ns", - "StdDev": "5.110 ns", + "Mean": "272.6 ns", + "Error": "56.40 ns", + "StdDev": "3.09 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "299.20 ns", - "Error": "182.182 ns", - "StdDev": "9.986 ns", + "Mean": "368.7 ns", + "Error": "38.27 ns", + "StdDev": "2.10 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "106.83 ns", - "Error": "9.094 ns", - "StdDev": "0.498 ns", + "Mean": "121.8 ns", + "Error": "61.95 ns", + "StdDev": "3.40 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "808.65 ns", - "Error": "37.365 ns", - "StdDev": "2.048 ns", + "Mean": "814.8 ns", + "Error": "350.95 ns", + "StdDev": "19.24 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "777.82 ns", - "Error": "117.337 ns", - "StdDev": "6.432 ns", - "Gen0": "0.0200", - "Gen1": "0.0191", - "Allocated": "360 B" + "Mean": "820.6 ns", + "Error": "1,031.26 ns", + "StdDev": "56.53 ns", + "Gen0": "0.0172", + "Gen1": "0.0162", + "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "1,749.31 ns", - "Error": "226.142 ns", - "StdDev": "12.396 ns", - "Gen0": "0.0553", - "Gen1": "0.0534", + "Mean": "1,852.5 ns", + "Error": "1,311.34 ns", + "StdDev": "71.88 ns", + "Gen0": "0.0534", + "Gen1": "0.0496", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "166.10 ns", - "Error": "79.083 ns", - "StdDev": "4.335 ns", + "Mean": "174.2 ns", + "Error": "56.08 ns", + "StdDev": "3.07 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "290.95 ns", - "Error": "55.317 ns", - "StdDev": "3.032 ns", + "Mean": "302.7 ns", + "Error": "87.58 ns", + "StdDev": "4.80 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "96.79 ns", - "Error": "31.480 ns", - "StdDev": "1.726 ns", + "Mean": "106.0 ns", + "Error": "194.26 ns", + "StdDev": "10.65 ns", "Gen0": "0.0036", "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "537.42 ns", - "Error": "139.463 ns", - "StdDev": "7.644 ns", + "Mean": "550.0 ns", + "Error": "101.00 ns", + "StdDev": "5.54 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "585.36 ns", - "Error": "220.250 ns", - "StdDev": "12.073 ns", + "Mean": "641.9 ns", + "Error": "53.00 ns", + "StdDev": "2.90 ns", "Gen0": "0.0153", "Gen1": "0.0143", "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,463.68 ns", - "Error": "360.436 ns", - "StdDev": "19.757 ns", + "Mean": "1,677.0 ns", + "Error": "64.46 ns", + "StdDev": "3.53 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "26,487.88 ns", - "Error": "8,778.198 ns", - "StdDev": "481.163 ns", + "Mean": "27,979.5 ns", + "Error": "6,941.53 ns", + "StdDev": "380.49 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "28,046.98 ns", - "Error": "5,604.410 ns", - "StdDev": "307.197 ns", + "Mean": "33,056.6 ns", + "Error": "13,945.35 ns", + "StdDev": "764.39 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "10,844.64 ns", - "Error": "10,898.301 ns", - "StdDev": "597.373 ns", + "Mean": "13,212.4 ns", + "Error": "20,439.77 ns", + "StdDev": "1,120.37 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "77,618.64 ns", - "Error": "6,181.350 ns", - "StdDev": "338.821 ns", + "Mean": "84,896.3 ns", + "Error": "58,242.67 ns", + "StdDev": "3,192.48 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "72,996.64 ns", - "Error": "10,873.652 ns", - "StdDev": "596.022 ns", - "Gen0": "1.9531", - "Gen1": "1.8311", - "Allocated": "36448 B" + "Mean": "87,247.2 ns", + "Error": "62,681.56 ns", + "StdDev": "3,435.79 ns", + "Gen0": "1.7090", + "Gen1": "1.5869", + "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "167,309.91 ns", - "Error": "39,335.875 ns", - "StdDev": "2,156.132 ns", + "Mean": "206,938.9 ns", + "Error": "213,933.73 ns", + "StdDev": "11,726.43 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" @@ -339,9 +339,9 @@ "MockCreation": [ { "Method": "TUnit.Mocks", - "Mean": "28.24 ns", - "Error": "0.322 ns", - "StdDev": "0.286 ns", + "Mean": "32.12 ns", + "Error": "0.700 ns", + "StdDev": "0.621 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -349,9 +349,9 @@ }, { "Method": "Imposter", - "Mean": "91.37 ns", - "Error": "0.893 ns", - "StdDev": "0.697 ns", + "Mean": "100.54 ns", + "Error": "0.237 ns", + "StdDev": "0.210 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -359,9 +359,9 @@ }, { "Method": "Mockolate", - "Mean": "62.19 ns", - "Error": "0.892 ns", - "StdDev": "0.835 ns", + "Mean": "78.19 ns", + "Error": "0.726 ns", + "StdDev": "0.644 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -369,9 +369,9 @@ }, { "Method": "Moq", - "Mean": "1,324.88 ns", - "Error": "23.947 ns", - "StdDev": "22.400 ns", + "Mean": "1,255.61 ns", + "Error": "18.085 ns", + "StdDev": "16.917 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -379,19 +379,19 @@ }, { "Method": "NSubstitute", - "Mean": "1,962.28 ns", - "Error": "12.287 ns", - "StdDev": "10.260 ns", + "Mean": "1,724.95 ns", + "Error": "11.601 ns", + "StdDev": "10.851 ns", "Gen0": "0.2975", - "Gen1": "-", + "Gen1": "0.0019", "Gen2": "-", "Allocated": "5000 B" }, { "Method": "FakeItEasy", - "Mean": "1,799.32 ns", - "Error": "20.335 ns", - "StdDev": "19.022 ns", + "Mean": "1,717.67 ns", + "Error": "33.764 ns", + "StdDev": "33.161 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -399,9 +399,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "28.57 ns", - "Error": "0.405 ns", - "StdDev": "0.359 ns", + "Mean": "32.79 ns", + "Error": "0.076 ns", + "StdDev": "0.072 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -409,9 +409,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "150.53 ns", - "Error": "1.690 ns", - "StdDev": "1.581 ns", + "Mean": "156.24 ns", + "Error": "0.382 ns", + "StdDev": "0.319 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -419,9 +419,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "63.10 ns", - "Error": "0.753 ns", - "StdDev": "0.704 ns", + "Mean": "65.09 ns", + "Error": "0.247 ns", + "StdDev": "0.193 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -429,9 +429,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,485.43 ns", - "Error": "10.296 ns", - "StdDev": "9.630 ns", + "Mean": "1,273.92 ns", + "Error": "15.538 ns", + "StdDev": "14.535 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -439,9 +439,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,903.83 ns", - "Error": "20.283 ns", - "StdDev": "17.980 ns", + "Mean": "1,777.84 ns", + "Error": "34.020 ns", + "StdDev": "40.499 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -449,9 +449,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,854.52 ns", - "Error": "28.344 ns", - "StdDev": "25.126 ns", + "Mean": "1,722.92 ns", + "Error": "31.628 ns", + "StdDev": "35.154 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -461,299 +461,281 @@ "Setup": [ { "Method": "TUnit.Mocks", - "Mean": "588.8 ns", - "Error": "10.47 ns", - "StdDev": "9.79 ns", - "Gen0": "0.1431", - "Gen1": "0.0010", + "Mean": "643.9 ns", + "Error": "12.71 ns", + "StdDev": "12.49 ns", + "Gen0": "0.0954", + "Gen1": "-", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "895.6 ns", - "Error": "17.80 ns", - "StdDev": "36.75 ns", - "Gen0": "0.3738", - "Gen1": "0.0076", + "Mean": "1,010.5 ns", + "Error": "13.67 ns", + "StdDev": "12.12 ns", + "Gen0": "0.2480", + "Gen1": "0.0038", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "377.4 ns", - "Error": "6.19 ns", - "StdDev": "5.79 ns", - "Gen0": "0.1006", - "Gen1": "0.0005", + "Mean": "404.9 ns", + "Error": "4.96 ns", + "StdDev": "4.64 ns", + "Gen0": "0.0672", + "Gen1": "-", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "436,678.0 ns", - "Error": "944.47 ns", - "StdDev": "788.68 ns", + "Mean": "320,796.8 ns", + "Error": "2,492.44 ns", + "StdDev": "2,081.30 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.52 KB" + "Allocated": "28.67 KB" }, { "Method": "NSubstitute", - "Mean": "5,855.0 ns", - "Error": "62.03 ns", - "StdDev": "54.98 ns", - "Gen0": "0.5493", + "Mean": "5,663.0 ns", + "Error": "19.62 ns", + "StdDev": "17.40 ns", + "Gen0": "0.3662", "Gen1": "-", - "Allocated": "9.06 KB" + "Allocated": "9.01 KB" }, { "Method": "FakeItEasy", - "Mean": "8,695.7 ns", - "Error": "69.24 ns", - "StdDev": "57.82 ns", - "Gen0": "0.6104", - "Gen1": "0.0305", - "Allocated": "10.45 KB" + "Mean": "7,755.5 ns", + "Error": "25.68 ns", + "StdDev": "22.76 ns", + "Gen0": "0.4120", + "Gen1": "0.0153", + "Allocated": "10.46 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "862.0 ns", - "Error": "12.94 ns", - "StdDev": "12.11 ns", - "Gen0": "0.1926", - "Gen1": "0.0019", + "Mean": "954.4 ns", + "Error": "10.46 ns", + "StdDev": "9.27 ns", + "Gen0": "0.1278", + "Gen1": "-", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,597.8 ns", - "Error": "18.62 ns", - "StdDev": "17.42 ns", - "Gen0": "0.6485", - "Gen1": "0.0248", + "Mean": "1,705.0 ns", + "Error": "33.68 ns", + "StdDev": "71.78 ns", + "Gen0": "0.4311", + "Gen1": "0.0153", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "637.6 ns", - "Error": "3.87 ns", - "StdDev": "3.62 ns", - "Gen0": "0.1583", - "Gen1": "0.0010", + "Mean": "675.3 ns", + "Error": "7.09 ns", + "StdDev": "6.63 ns", + "Gen0": "0.1059", + "Gen1": "-", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "118,662.7 ns", - "Error": "939.60 ns", - "StdDev": "878.91 ns", - "Gen0": "0.9766", - "Gen1": "0.7324", + "Mean": "85,539.5 ns", + "Error": "342.14 ns", + "StdDev": "285.70 ns", + "Gen0": "0.4883", + "Gen1": "0.2441", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "13,209.8 ns", - "Error": "158.82 ns", - "StdDev": "140.79 ns", - "Gen0": "1.2207", + "Mean": "12,031.9 ns", + "Error": "52.50 ns", + "StdDev": "49.11 ns", + "Gen0": "0.7324", "Gen1": "-", - "Allocated": "20.66 KB" + "Allocated": "20.5 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "8,549.2 ns", - "Error": "70.27 ns", - "StdDev": "65.73 ns", - "Gen0": "0.6714", - "Gen1": "0.0610", - "Allocated": "11.71 KB" + "Mean": "7,525.0 ns", + "Error": "60.02 ns", + "StdDev": "53.21 ns", + "Gen0": "0.4730", + "Gen1": "0.0153", + "Allocated": "11.72 KB" } ], "Verification": [ { "Method": "TUnit.Mocks", - "Mean": "810.19 ns", - "Error": "8.457 ns", - "StdDev": "7.911 ns", - "Gen0": "0.1192", + "Mean": "788.12 ns", + "Error": "3.045 ns", + "StdDev": "2.543 ns", + "Gen0": "0.1793", "Gen1": "0.0010", - "Gen2": "-", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "717.06 ns", - "Error": "8.929 ns", - "StdDev": "8.352 ns", - "Gen0": "0.1860", - "Gen1": "0.0029", - "Gen2": "-", + "Mean": "739.02 ns", + "Error": "6.395 ns", + "StdDev": "5.982 ns", + "Gen0": "0.2794", + "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "453.84 ns", - "Error": "3.908 ns", - "StdDev": "3.464 ns", - "Gen0": "0.0892", + "Mean": "432.70 ns", + "Error": "2.305 ns", + "StdDev": "2.043 ns", + "Gen0": "0.1335", "Gen1": "0.0005", - "Gen2": "-", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "251,775.55 ns", - "Error": "1,166.818 ns", - "StdDev": "974.346 ns", - "Gen0": "0.4883", - "Gen1": "-", - "Gen2": "-", - "Allocated": "24306 B" + "Mean": "252,690.26 ns", + "Error": "1,355.022 ns", + "StdDev": "1,201.191 ns", + "Gen0": "0.9766", + "Gen1": "0.4883", + "Allocated": "24324 B" }, { "Method": "NSubstitute", - "Mean": "6,194.00 ns", - "Error": "33.137 ns", - "StdDev": "30.996 ns", - "Gen0": "0.3967", + "Mean": "6,171.27 ns", + "Error": "42.226 ns", + "StdDev": "37.432 ns", + "Gen0": "0.5798", "Gen1": "-", - "Gen2": "-", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "7,176.65 ns", - "Error": "57.675 ns", - "StdDev": "51.127 ns", - "Gen0": "0.4272", - "Gen1": "0.0153", - "Gen2": "0.0076", - "Allocated": "10731 B" + "Mean": "6,787.33 ns", + "Error": "59.435 ns", + "StdDev": "52.687 ns", + "Gen0": "0.6409", + "Gen1": "0.0305", + "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "52.49 ns", - "Error": "0.534 ns", - "StdDev": "0.500 ns", - "Gen0": "0.0127", + "Mean": "56.55 ns", + "Error": "0.167 ns", + "StdDev": "0.139 ns", + "Gen0": "0.0191", "Gen1": "-", - "Gen2": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "325.05 ns", - "Error": "2.492 ns", - "StdDev": "2.209 ns", - "Gen0": "0.0954", - "Gen1": "0.0005", - "Gen2": "-", + "Mean": "339.76 ns", + "Error": "5.309 ns", + "StdDev": "4.966 ns", + "Gen0": "0.1431", + "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "253.72 ns", - "Error": "3.304 ns", - "StdDev": "3.091 ns", - "Gen0": "0.0491", + "Mean": "257.21 ns", + "Error": "2.277 ns", + "StdDev": "2.130 ns", + "Gen0": "0.0739", "Gen1": "-", - "Gen2": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "65,773.42 ns", - "Error": "662.859 ns", - "StdDev": "620.039 ns", - "Gen0": "0.2441", - "Gen1": "0.1221", - "Gen2": "-", - "Allocated": "7037 B" + "Mean": "64,156.37 ns", + "Error": "377.022 ns", + "StdDev": "314.830 ns", + "Gen0": "0.3662", + "Gen1": "0.2441", + "Allocated": "7005 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,339.29 ns", - "Error": "20.893 ns", - "StdDev": "18.521 ns", - "Gen0": "0.2823", - "Gen1": "-", - "Gen2": "-", + "Mean": "3,591.51 ns", + "Error": "45.024 ns", + "StdDev": "42.116 ns", + "Gen0": "0.4234", + "Gen1": "0.0038", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,223.40 ns", - "Error": "30.028 ns", - "StdDev": "28.088 ns", - "Gen0": "0.1984", + "Mean": "3,466.47 ns", + "Error": "60.666 ns", + "StdDev": "53.779 ns", + "Gen0": "0.3052", "Gen1": "0.0153", - "Gen2": "-", - "Allocated": "5217 B" + "Allocated": "5210 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,381.22 ns", - "Error": "6.626 ns", - "StdDev": "6.198 ns", - "Gen0": "0.1774", + "Mean": "1,342.57 ns", + "Error": "23.123 ns", + "StdDev": "21.629 ns", + "Gen0": "0.2670", "Gen1": "0.0019", - "Gen2": "-", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,744.80 ns", - "Error": "28.617 ns", - "StdDev": "26.769 ns", - "Gen0": "0.4444", - "Gen1": "0.0134", - "Gen2": "-", + "Mean": "1,800.07 ns", + "Error": "27.614 ns", + "StdDev": "25.830 ns", + "Gen0": "0.6676", + "Gen1": "0.0210", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,188.13 ns", - "Error": "13.426 ns", - "StdDev": "11.901 ns", - "Gen0": "0.2136", - "Gen1": "0.0019", - "Gen2": "-", + "Mean": "1,191.64 ns", + "Error": "22.811 ns", + "StdDev": "24.408 ns", + "Gen0": "0.3204", + "Gen1": "0.0038", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "350,594.98 ns", - "Error": "3,040.700 ns", - "StdDev": "2,844.273 ns", - "Gen0": "0.9766", - "Gen1": "-", - "Gen2": "-", - "Allocated": "35181 B" + "Mean": "363,074.92 ns", + "Error": "3,154.952 ns", + "StdDev": "2,951.144 ns", + "Gen0": "1.9531", + "Gen1": "0.9766", + "Allocated": "34922 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "10,660.99 ns", - "Error": "93.903 ns", - "StdDev": "87.837 ns", - "Gen0": "0.6561", - "Gen1": "-", - "Gen2": "-", + "Mean": "10,887.68 ns", + "Error": "83.524 ns", + "StdDev": "78.128 ns", + "Gen0": "0.9918", + "Gen1": "0.0153", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "12,630.28 ns", - "Error": "46.944 ns", - "StdDev": "43.911 ns", - "Gen0": "0.7629", - "Gen1": "0.0153", - "Gen2": "-", - "Allocated": "19239 B" + "Mean": "12,157.60 ns", + "Error": "144.392 ns", + "StdDev": "135.065 ns", + "Gen0": "1.0986", + "Gen1": "0.0610", + "Allocated": "19232 B" } ] }, "stats": { "categoryCount": 6, "totalBenchmarks": 78, - "lastUpdated": "2026-06-17T03:28:53.706Z" + "lastUpdated": "2026-06-18T03:29:53.480Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/summary.json b/docs/static/benchmarks/mocks/summary.json index a0b4c76310..58842de99d 100644 --- a/docs/static/benchmarks/mocks/summary.json +++ b/docs/static/benchmarks/mocks/summary.json @@ -7,7 +7,7 @@ "Setup", "Verification" ], - "timestamp": "2026-06-17", + "timestamp": "2026-06-18", "environment": "Ubuntu Latest • .NET SDK 10.0.301", "libraries": [ "TUnit.Mocks", From 844643dea64a1c836722328488d71440711087f0 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 18 Jun 2026 15:31:31 +0100 Subject: [PATCH 11/18] chore(deps): update actions/checkout action to v7 (#6277) Co-authored-by: Renovate Bot --- .github/workflows/claude-code-review.yml | 2 +- .github/workflows/claude.yml | 2 +- .github/workflows/cloudshop-example.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/link-check.yml | 2 +- .github/workflows/mock-benchmarks.yml | 4 ++-- .github/workflows/speed-comparison.yml | 8 ++++---- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index d5823c9063..f6c4aee7f3 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -39,7 +39,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7.0.0 with: fetch-depth: 1 diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 94dcce5581..c420a603ba 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@v6 + uses: actions/checkout@v7.0.0 with: fetch-depth: 1 diff --git a/.github/workflows/cloudshop-example.yml b/.github/workflows/cloudshop-example.yml index 2c53b75d03..8f75a054d3 100644 --- a/.github/workflows/cloudshop-example.yml +++ b/.github/workflows/cloudshop-example.yml @@ -19,7 +19,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1af9fb5010..7c7340c87c 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -59,7 +59,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@v6 + uses: actions/checkout@v7.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/deploy-pages-test.yml b/.github/workflows/deploy-pages-test.yml index 3350367bdc..3689e8820e 100644 --- a/.github/workflows/deploy-pages-test.yml +++ b/.github/workflows/deploy-pages-test.yml @@ -20,7 +20,7 @@ jobs: run: working-directory: docs steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 - uses: actions/setup-node@v6 diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 7d09c35602..f5f7617b8d 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -20,7 +20,7 @@ jobs: run: working-directory: docs steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 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 6e10919bee..cb4a5253a4 100644 --- a/.github/workflows/dotnet-build-different-locale.yml +++ b/.github/workflows/dotnet-build-different-locale.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 49bc76207f..b1955e77d6 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -40,7 +40,7 @@ jobs: docker-images: false swap-storage: false - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml index 14d41703ed..c5ed823b0e 100644 --- a/.github/workflows/link-check.yml +++ b/.github/workflows/link-check.yml @@ -33,7 +33,7 @@ jobs: name: Check links in Markdown sources runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 - name: Restore lychee cache uses: actions/cache@v5 diff --git a/.github/workflows/mock-benchmarks.yml b/.github/workflows/mock-benchmarks.yml index 00d4639378..f44b7c4ba6 100644 --- a/.github/workflows/mock-benchmarks.yml +++ b/.github/workflows/mock-benchmarks.yml @@ -19,7 +19,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 token: ${{ secrets.ADMIN_TOKEN }} diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index fd13e7bed0..b1e28d5e1c 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubicloud-standard-4 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: cancel-in-progress: true steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 @@ -97,7 +97,7 @@ jobs: cancel-in-progress: true steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 @@ -132,7 +132,7 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7.0.0 with: fetch-depth: 0 token: ${{ secrets.ADMIN_TOKEN }} From 456685dda665cebcae4d4a50167477671eacbba1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 19 Jun 2026 01:30:01 +0100 Subject: [PATCH 12/18] chore(deps): update verify to 31.20.0 (#6278) 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 bf82cda07f..6990ae833b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -102,14 +102,14 @@ - - + + - + From 846004ae4366c6dcbf6baf848ec223a32082308b Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 19 Jun 2026 04:29:57 +0100 Subject: [PATCH 13/18] chore: update mock benchmark results (#6279) --- docs/docs/benchmarks/mocks/Callback.md | 36 +- .../docs/benchmarks/mocks/CombinedWorkflow.md | 20 +- docs/docs/benchmarks/mocks/Invocation.md | 52 +- docs/docs/benchmarks/mocks/MockCreation.md | 36 +- docs/docs/benchmarks/mocks/Setup.md | 36 +- docs/docs/benchmarks/mocks/Verification.md | 52 +- docs/docs/benchmarks/mocks/index.md | 4 +- docs/static/benchmarks/mocks/Callback.json | 96 +-- .../benchmarks/mocks/CombinedWorkflow.json | 44 +- docs/static/benchmarks/mocks/Invocation.json | 116 ++-- .../static/benchmarks/mocks/MockCreation.json | 74 +-- docs/static/benchmarks/mocks/Setup.json | 128 ++-- .../static/benchmarks/mocks/Verification.json | 130 ++-- docs/static/benchmarks/mocks/latest.json | 580 +++++++++--------- docs/static/benchmarks/mocks/summary.json | 2 +- 15 files changed, 703 insertions(+), 703 deletions(-) diff --git a/docs/docs/benchmarks/mocks/Callback.md b/docs/docs/benchmarks/mocks/Callback.md index f5dcb79bf3..ab6b626250 100644 --- a/docs/docs/benchmarks/mocks/Callback.md +++ b/docs/docs/benchmarks/mocks/Callback.md @@ -9,7 +9,7 @@ sidebar_position: 2 > Callback registration and execution — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-18** from the latest CI run. +This benchmark was automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Callback registration and execution: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 697.7 ns | 9.43 ns | 8.82 ns | 3.11 KB | -| Imposter | 469.3 ns | 4.98 ns | 4.66 ns | 2.66 KB | -| Mockolate | 376.3 ns | 3.17 ns | 2.81 ns | 1.91 KB | -| Moq | 183,861.5 ns | 781.51 ns | 731.03 ns | 13.14 KB | -| NSubstitute | 4,478.3 ns | 32.83 ns | 27.41 ns | 7.93 KB | -| FakeItEasy | 5,088.7 ns | 31.41 ns | 29.38 ns | 7.44 KB | +| **TUnit.Mocks** | 642.5 ns | 1.54 ns | 1.37 ns | 3.11 KB | +| Imposter | 463.3 ns | 0.69 ns | 0.64 ns | 2.66 KB | +| Mockolate | 359.0 ns | 1.01 ns | 0.95 ns | 1.91 KB | +| Moq | 135,153.8 ns | 708.43 ns | 628.00 ns | 13.29 KB | +| NSubstitute | 4,216.8 ns | 21.53 ns | 16.81 ns | 7.93 KB | +| FakeItEasy | 4,614.5 ns | 15.36 ns | 13.61 ns | 7.44 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Callback registration and execution: xychart-beta title "Callback Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 220634 - bar [697.7, 469.3, 376.3, 183861.5, 4478.3, 5088.7] + y-axis "Time (ns)" 0 --> 162185 + bar [642.5, 463.3, 359, 135153.8, 4216.8, 4614.5] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 847.6 ns | 9.73 ns | 9.10 ns | 3.2 KB | -| Imposter | 543.8 ns | 4.98 ns | 3.89 ns | 2.82 KB | -| Mockolate | 411.8 ns | 8.07 ns | 7.15 ns | 1.95 KB | -| Moq | 193,329.5 ns | 1,121.02 ns | 993.75 ns | 13.73 KB | -| NSubstitute | 5,305.6 ns | 56.04 ns | 49.68 ns | 8.53 KB | -| FakeItEasy | 6,500.5 ns | 113.72 ns | 121.68 ns | 9.4 KB | +| **TUnit.Mocks** | 809.7 ns | 4.42 ns | 3.92 ns | 3.2 KB | +| Imposter | 528.0 ns | 1.91 ns | 1.79 ns | 2.82 KB | +| Mockolate | 402.1 ns | 1.17 ns | 1.09 ns | 1.95 KB | +| Moq | 145,136.1 ns | 1,325.21 ns | 1,174.76 ns | 13.73 KB | +| NSubstitute | 4,561.8 ns | 17.19 ns | 15.24 ns | 8.53 KB | +| FakeItEasy | 5,495.7 ns | 29.35 ns | 27.45 ns | 9.26 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Callback (with args) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 231996 - bar [847.6, 543.8, 411.8, 193329.5, 5305.6, 6500.5] + y-axis "Time (ns)" 0 --> 174164 + bar [809.7, 528, 402.1, 145136.1, 4561.8, 5495.7] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/docs/benchmarks/mocks/CombinedWorkflow.md b/docs/docs/benchmarks/mocks/CombinedWorkflow.md index 2a2f2f05c3..28f3861094 100644 --- a/docs/docs/benchmarks/mocks/CombinedWorkflow.md +++ b/docs/docs/benchmarks/mocks/CombinedWorkflow.md @@ -9,7 +9,7 @@ sidebar_position: 3 > Full workflow: create → setup → invoke → verify — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-18** from the latest CI run. +This benchmark was automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Full workflow: create → setup → invoke → verify: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1.931 μs | 0.0109 μs | 0.0091 μs | 6.23 KB | -| Imposter | 2.865 μs | 0.0373 μs | 0.0330 μs | 15.71 KB | -| Mockolate | 1.896 μs | 0.0182 μs | 0.0171 μs | 7.63 KB | -| Moq | 417.831 μs | 1.8875 μs | 1.7655 μs | 36.35 KB | -| NSubstitute | 17.856 μs | 0.2324 μs | 0.2173 μs | 26.72 KB | -| FakeItEasy | 18.856 μs | 0.3021 μs | 0.2522 μs | 25.52 KB | +| **TUnit.Mocks** | 1.866 μs | 0.0147 μs | 0.0130 μs | 6.23 KB | +| Imposter | 2.516 μs | 0.0110 μs | 0.0098 μs | 15.71 KB | +| Mockolate | 1.726 μs | 0.0145 μs | 0.0128 μs | 7.63 KB | +| Moq | 311.747 μs | 2.0081 μs | 1.6769 μs | 36.35 KB | +| NSubstitute | 15.658 μs | 0.1421 μs | 0.1260 μs | 26.85 KB | +| FakeItEasy | 15.440 μs | 0.1719 μs | 0.1524 μs | 25.52 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Full workflow: create → setup → invoke → verify: xychart-beta title "CombinedWorkflow Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (μs)" 0 --> 502 - bar [1.931, 2.865, 1.896, 417.831, 17.856, 18.856] + y-axis "Time (μs)" 0 --> 375 + bar [1.866, 2.516, 1.726, 311.747, 15.658, 15.44] ``` ## 🎯 Key Insights @@ -65,4 +65,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/docs/benchmarks/mocks/Invocation.md b/docs/docs/benchmarks/mocks/Invocation.md index 8586a3997b..d20fb1d27d 100644 --- a/docs/docs/benchmarks/mocks/Invocation.md +++ b/docs/docs/benchmarks/mocks/Invocation.md @@ -9,7 +9,7 @@ sidebar_position: 4 > Calling methods on mock objects — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-18** from the latest CI run. +This benchmark was automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Calling methods on mock objects: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 272.6 ns | 56.40 ns | 3.09 ns | 128 B | -| Imposter | 368.7 ns | 38.27 ns | 2.10 ns | 168 B | -| Mockolate | 121.8 ns | 61.95 ns | 3.40 ns | 84 B | -| Moq | 814.8 ns | 350.95 ns | 19.24 ns | 376 B | -| NSubstitute | 820.6 ns | 1,031.26 ns | 56.53 ns | 304 B | -| FakeItEasy | 1,852.5 ns | 1,311.34 ns | 71.88 ns | 944 B | +| **TUnit.Mocks** | 274.8 ns | 88.68 ns | 4.86 ns | 128 B | +| Imposter | 299.9 ns | 66.81 ns | 3.66 ns | 168 B | +| Mockolate | 124.0 ns | 42.11 ns | 2.31 ns | 84 B | +| Moq | 848.4 ns | 162.83 ns | 8.93 ns | 376 B | +| NSubstitute | 738.4 ns | 103.83 ns | 5.69 ns | 304 B | +| FakeItEasy | 1,827.2 ns | 45.03 ns | 2.47 ns | 944 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Calling methods on mock objects: xychart-beta title "Invocation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2223 - bar [272.6, 368.7, 121.8, 814.8, 820.6, 1852.5] + y-axis "Time (ns)" 0 --> 2193 + bar [274.8, 299.9, 124, 848.4, 738.4, 1827.2] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 174.2 ns | 56.08 ns | 3.07 ns | 96 B | -| Imposter | 302.7 ns | 87.58 ns | 4.80 ns | 168 B | -| Mockolate | 106.0 ns | 194.26 ns | 10.65 ns | 60 B | -| Moq | 550.0 ns | 101.00 ns | 5.54 ns | 296 B | -| NSubstitute | 641.9 ns | 53.00 ns | 2.90 ns | 272 B | -| FakeItEasy | 1,677.0 ns | 64.46 ns | 3.53 ns | 776 B | +| **TUnit.Mocks** | 166.7 ns | 57.05 ns | 3.13 ns | 96 B | +| Imposter | 297.9 ns | 54.27 ns | 2.97 ns | 168 B | +| Mockolate | 105.1 ns | 73.09 ns | 4.01 ns | 60 B | +| Moq | 562.1 ns | 157.00 ns | 8.61 ns | 296 B | +| NSubstitute | 628.4 ns | 92.25 ns | 5.06 ns | 272 B | +| FakeItEasy | 1,609.9 ns | 350.39 ns | 19.21 ns | 776 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Invocation (String) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2013 - bar [174.2, 302.7, 106, 550, 641.9, 1677] + y-axis "Time (ns)" 0 --> 1932 + bar [166.7, 297.9, 105.1, 562.1, 628.4, 1609.9] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 27,979.5 ns | 6,941.53 ns | 380.49 ns | 12736 B | -| Imposter | 33,056.6 ns | 13,945.35 ns | 764.39 ns | 16800 B | -| Mockolate | 13,212.4 ns | 20,439.77 ns | 1,120.37 ns | 8400 B | -| Moq | 84,896.3 ns | 58,242.67 ns | 3,192.48 ns | 37600 B | -| NSubstitute | 87,247.2 ns | 62,681.56 ns | 3,435.79 ns | 30848 B | -| FakeItEasy | 206,938.9 ns | 213,933.73 ns | 11,726.43 ns | 94400 B | +| **TUnit.Mocks** | 27,582.9 ns | 16,334.68 ns | 895.36 ns | 12736 B | +| Imposter | 29,495.4 ns | 9,482.65 ns | 519.78 ns | 16800 B | +| Mockolate | 11,756.6 ns | 3,847.27 ns | 210.88 ns | 8400 B | +| Moq | 83,319.3 ns | 22,111.43 ns | 1,212.00 ns | 37600 B | +| NSubstitute | 73,136.5 ns | 9,854.58 ns | 540.16 ns | 30848 B | +| FakeItEasy | 187,548.1 ns | 30,365.87 ns | 1,664.46 ns | 94400 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Invocation (100 calls) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 248327 - bar [27979.5, 33056.6, 13212.4, 84896.3, 87247.2, 206938.9] + y-axis "Time (ns)" 0 --> 225058 + bar [27582.9, 29495.4, 11756.6, 83319.3, 73136.5, 187548.1] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/docs/benchmarks/mocks/MockCreation.md b/docs/docs/benchmarks/mocks/MockCreation.md index 08474023a7..ec707e9f44 100644 --- a/docs/docs/benchmarks/mocks/MockCreation.md +++ b/docs/docs/benchmarks/mocks/MockCreation.md @@ -9,7 +9,7 @@ sidebar_position: 5 > Mock instance creation performance — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-18** from the latest CI run. +This benchmark was automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock instance creation performance: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 32.12 ns | 0.700 ns | 0.621 ns | 200 B | -| Imposter | 100.54 ns | 0.237 ns | 0.210 ns | 440 B | -| Mockolate | 78.19 ns | 0.726 ns | 0.644 ns | 424 B | -| Moq | 1,255.61 ns | 18.085 ns | 16.917 ns | 2048 B | -| NSubstitute | 1,724.95 ns | 11.601 ns | 10.851 ns | 5000 B | -| FakeItEasy | 1,717.67 ns | 33.764 ns | 33.161 ns | 2715 B | +| **TUnit.Mocks** | 33.12 ns | 0.454 ns | 0.402 ns | 200 B | +| Imposter | 115.83 ns | 0.661 ns | 0.586 ns | 440 B | +| Mockolate | 70.04 ns | 0.702 ns | 0.657 ns | 424 B | +| Moq | 1,268.78 ns | 22.540 ns | 21.084 ns | 2048 B | +| NSubstitute | 1,792.73 ns | 25.311 ns | 23.676 ns | 5000 B | +| FakeItEasy | 1,809.35 ns | 31.879 ns | 36.712 ns | 2715 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock instance creation performance: xychart-beta title "MockCreation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2070 - bar [32.12, 100.54, 78.19, 1255.61, 1724.95, 1717.67] + y-axis "Time (ns)" 0 --> 2172 + bar [33.12, 115.83, 70.04, 1268.78, 1792.73, 1809.35] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 32.79 ns | 0.076 ns | 0.072 ns | 200 B | -| Imposter | 156.24 ns | 0.382 ns | 0.319 ns | 696 B | -| Mockolate | 65.09 ns | 0.247 ns | 0.193 ns | 456 B | -| Moq | 1,273.92 ns | 15.538 ns | 14.535 ns | 1912 B | -| NSubstitute | 1,777.84 ns | 34.020 ns | 40.499 ns | 5000 B | -| FakeItEasy | 1,722.92 ns | 31.628 ns | 35.154 ns | 2715 B | +| **TUnit.Mocks** | 29.92 ns | 0.148 ns | 0.124 ns | 200 B | +| Imposter | 160.02 ns | 0.871 ns | 0.815 ns | 696 B | +| Mockolate | 67.56 ns | 0.729 ns | 0.646 ns | 456 B | +| Moq | 1,301.47 ns | 10.068 ns | 9.417 ns | 1912 B | +| NSubstitute | 1,845.32 ns | 28.797 ns | 26.936 ns | 5000 B | +| FakeItEasy | 1,883.04 ns | 33.726 ns | 43.853 ns | 2715 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "MockCreation (Repository) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2134 - bar [32.79, 156.24, 65.09, 1273.92, 1777.84, 1722.92] + y-axis "Time (ns)" 0 --> 2260 + bar [29.92, 160.02, 67.56, 1301.47, 1845.32, 1883.04] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/docs/benchmarks/mocks/Setup.md b/docs/docs/benchmarks/mocks/Setup.md index f575781a0d..73eabc9cdb 100644 --- a/docs/docs/benchmarks/mocks/Setup.md +++ b/docs/docs/benchmarks/mocks/Setup.md @@ -9,7 +9,7 @@ sidebar_position: 6 > Mock behavior configuration (returns, matchers) — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-18** from the latest CI run. +This benchmark was automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Mock behavior configuration (returns, matchers): | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 643.9 ns | 12.71 ns | 12.49 ns | 2.34 KB | -| Imposter | 1,010.5 ns | 13.67 ns | 12.12 ns | 6.12 KB | -| Mockolate | 404.9 ns | 4.96 ns | 4.64 ns | 1.65 KB | -| Moq | 320,796.8 ns | 2,492.44 ns | 2,081.30 ns | 28.67 KB | -| NSubstitute | 5,663.0 ns | 19.62 ns | 17.40 ns | 9.01 KB | -| FakeItEasy | 7,755.5 ns | 25.68 ns | 22.76 ns | 10.46 KB | +| **TUnit.Mocks** | 454.2 ns | 8.94 ns | 12.23 ns | 2.34 KB | +| Imposter | 627.9 ns | 12.61 ns | 25.47 ns | 6.12 KB | +| Mockolate | 283.6 ns | 2.45 ns | 2.05 ns | 1.65 KB | +| Moq | 243,235.3 ns | 1,528.16 ns | 1,354.67 ns | 28.56 KB | +| NSubstitute | 4,076.4 ns | 64.25 ns | 65.98 ns | 9.06 KB | +| FakeItEasy | 5,549.0 ns | 62.88 ns | 49.10 ns | 10.45 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock behavior configuration (returns, matchers): xychart-beta title "Setup Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 384957 - bar [643.9, 1010.5, 404.9, 320796.8, 5663, 7755.5] + y-axis "Time (ns)" 0 --> 291883 + bar [454.2, 627.9, 283.6, 243235.3, 4076.4, 5549] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 954.4 ns | 10.46 ns | 9.27 ns | 3.15 KB | -| Imposter | 1,705.0 ns | 33.68 ns | 71.78 ns | 10.59 KB | -| Mockolate | 675.3 ns | 7.09 ns | 6.63 ns | 2.6 KB | -| Moq | 85,539.5 ns | 342.14 ns | 285.70 ns | 16.53 KB | -| NSubstitute | 12,031.9 ns | 52.50 ns | 49.11 ns | 20.5 KB | -| FakeItEasy | 7,525.0 ns | 60.02 ns | 53.21 ns | 11.72 KB | +| **TUnit.Mocks** | 636.6 ns | 5.45 ns | 5.09 ns | 3.15 KB | +| Imposter | 1,064.3 ns | 7.85 ns | 7.35 ns | 10.59 KB | +| Mockolate | 480.1 ns | 6.73 ns | 5.62 ns | 2.6 KB | +| Moq | 69,447.9 ns | 204.42 ns | 191.22 ns | 16.53 KB | +| NSubstitute | 8,445.2 ns | 144.28 ns | 134.96 ns | 20.34 KB | +| FakeItEasy | 5,308.6 ns | 52.58 ns | 43.91 ns | 11.71 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Setup (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 102648 - bar [954.4, 1705, 675.3, 85539.5, 12031.9, 7525] + y-axis "Time (ns)" 0 --> 83338 + bar [636.6, 1064.3, 480.1, 69447.9, 8445.2, 5308.6] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/docs/benchmarks/mocks/Verification.md b/docs/docs/benchmarks/mocks/Verification.md index 05cbab2091..ecc71c6fa6 100644 --- a/docs/docs/benchmarks/mocks/Verification.md +++ b/docs/docs/benchmarks/mocks/Verification.md @@ -9,7 +9,7 @@ sidebar_position: 7 > Verifying mock method calls — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-06-18** from the latest CI run. +This benchmark was automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -20,12 +20,12 @@ Verifying mock method calls: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 788.12 ns | 3.045 ns | 2.543 ns | 3008 B | -| Imposter | 739.02 ns | 6.395 ns | 5.982 ns | 4688 B | -| Mockolate | 432.70 ns | 2.305 ns | 2.043 ns | 2240 B | -| Moq | 252,690.26 ns | 1,355.022 ns | 1,201.191 ns | 24324 B | -| NSubstitute | 6,171.27 ns | 42.226 ns | 37.432 ns | 10064 B | -| FakeItEasy | 6,787.33 ns | 59.435 ns | 52.687 ns | 10722 B | +| **TUnit.Mocks** | 741.98 ns | 1.913 ns | 1.790 ns | 3008 B | +| Imposter | 656.17 ns | 2.498 ns | 2.215 ns | 4688 B | +| Mockolate | 403.81 ns | 2.112 ns | 1.975 ns | 2240 B | +| Moq | 250,183.48 ns | 994.648 ns | 830.576 ns | 24578 B | +| NSubstitute | 5,689.24 ns | 22.429 ns | 19.882 ns | 10064 B | +| FakeItEasy | 6,496.46 ns | 28.324 ns | 25.109 ns | 10722 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Verifying mock method calls: xychart-beta title "Verification Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 303229 - bar [788.12, 739.02, 432.7, 252690.26, 6171.27, 6787.33] + y-axis "Time (ns)" 0 --> 300221 + bar [741.98, 656.17, 403.81, 250183.48, 5689.24, 6496.46] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 56.55 ns | 0.167 ns | 0.139 ns | 320 B | -| Imposter | 339.76 ns | 5.309 ns | 4.966 ns | 2400 B | -| Mockolate | 257.21 ns | 2.277 ns | 2.130 ns | 1240 B | -| Moq | 64,156.37 ns | 377.022 ns | 314.830 ns | 7005 B | -| NSubstitute | 3,591.51 ns | 45.024 ns | 42.116 ns | 7088 B | -| FakeItEasy | 3,466.47 ns | 60.666 ns | 53.779 ns | 5210 B | +| **TUnit.Mocks** | 56.76 ns | 0.112 ns | 0.094 ns | 320 B | +| Imposter | 326.54 ns | 2.374 ns | 2.105 ns | 2400 B | +| Mockolate | 249.62 ns | 0.819 ns | 0.684 ns | 1240 B | +| Moq | 62,584.21 ns | 618.520 ns | 578.564 ns | 6925 B | +| NSubstitute | 3,376.92 ns | 10.652 ns | 9.964 ns | 7088 B | +| FakeItEasy | 3,209.95 ns | 18.811 ns | 17.595 ns | 5210 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Verification (Never) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 76988 - bar [56.55, 339.76, 257.21, 64156.37, 3591.51, 3466.47] + y-axis "Time (ns)" 0 --> 75102 + bar [56.76, 326.54, 249.62, 62584.21, 3376.92, 3209.95] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1,342.57 ns | 23.123 ns | 21.629 ns | 4472 B | -| Imposter | 1,800.07 ns | 27.614 ns | 25.830 ns | 11192 B | -| Mockolate | 1,191.64 ns | 22.811 ns | 24.408 ns | 5376 B | -| Moq | 363,074.92 ns | 3,154.952 ns | 2,951.144 ns | 34922 B | -| NSubstitute | 10,887.68 ns | 83.524 ns | 78.128 ns | 16762 B | -| FakeItEasy | 12,157.60 ns | 144.392 ns | 135.065 ns | 19232 B | +| **TUnit.Mocks** | 1,262.20 ns | 4.986 ns | 4.664 ns | 4472 B | +| Imposter | 1,644.45 ns | 4.998 ns | 4.430 ns | 11192 B | +| Mockolate | 1,114.69 ns | 5.924 ns | 5.252 ns | 5376 B | +| Moq | 343,800.49 ns | 2,577.544 ns | 2,284.925 ns | 34699 B | +| NSubstitute | 10,191.09 ns | 29.891 ns | 24.960 ns | 16762 B | +| FakeItEasy | 11,948.41 ns | 113.923 ns | 95.131 ns | 19456 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Verification (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 435690 - bar [1342.57, 1800.07, 1191.64, 363074.92, 10887.68, 12157.6] + y-axis "Time (ns)" 0 --> 412561 + bar [1262.2, 1644.45, 1114.69, 343800.49, 10191.09, 11948.41] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/docs/benchmarks/mocks/index.md b/docs/docs/benchmarks/mocks/index.md index 0301526dbb..a23ac26a14 100644 --- a/docs/docs/benchmarks/mocks/index.md +++ b/docs/docs/benchmarks/mocks/index.md @@ -7,7 +7,7 @@ sidebar_position: 4 # Mock Library Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2026-06-18** from the latest CI run. +These benchmarks were automatically generated on **2026-06-19** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.301 ::: @@ -76,4 +76,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: 2026-06-18T03:29:53.480Z* +*Last generated: 2026-06-19T03:29:43.427Z* diff --git a/docs/static/benchmarks/mocks/Callback.json b/docs/static/benchmarks/mocks/Callback.json index 4ff65a14e7..6abbaed9ee 100644 --- a/docs/static/benchmarks/mocks/Callback.json +++ b/docs/static/benchmarks/mocks/Callback.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "category": "Callback", "description": "Callback registration and execution", "environment": { @@ -10,111 +10,111 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "697.7 ns", - "Error": "9.43 ns", - "StdDev": "8.82 ns", + "Mean": "642.5 ns", + "Error": "1.54 ns", + "StdDev": "1.37 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "469.3 ns", - "Error": "4.98 ns", - "StdDev": "4.66 ns", - "Gen0": "0.1621", - "Gen1": "0.0010", + "Mean": "463.3 ns", + "Error": "0.69 ns", + "StdDev": "0.64 ns", + "Gen0": "0.1626", + "Gen1": "0.0014", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "376.3 ns", - "Error": "3.17 ns", - "StdDev": "2.81 ns", + "Mean": "359.0 ns", + "Error": "1.01 ns", + "StdDev": "0.95 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "183,861.5 ns", - "Error": "781.51 ns", - "StdDev": "731.03 ns", - "Gen0": "0.4883", - "Gen1": "-", - "Allocated": "13.14 KB" + "Mean": "135,153.8 ns", + "Error": "708.43 ns", + "StdDev": "628.00 ns", + "Gen0": "0.7324", + "Gen1": "0.4883", + "Allocated": "13.29 KB" }, { "Method": "NSubstitute", - "Mean": "4,478.3 ns", - "Error": "32.83 ns", - "StdDev": "27.41 ns", - "Gen0": "0.4807", - "Gen1": "0.0076", + "Mean": "4,216.8 ns", + "Error": "21.53 ns", + "StdDev": "16.81 ns", + "Gen0": "0.4578", + "Gen1": "-", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "5,088.7 ns", - "Error": "31.41 ns", - "StdDev": "29.38 ns", + "Mean": "4,614.5 ns", + "Error": "15.36 ns", + "StdDev": "13.61 ns", "Gen0": "0.4501", "Gen1": "0.0153", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "847.6 ns", - "Error": "9.73 ns", - "StdDev": "9.10 ns", + "Mean": "809.7 ns", + "Error": "4.42 ns", + "StdDev": "3.92 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "543.8 ns", - "Error": "4.98 ns", - "StdDev": "3.89 ns", + "Mean": "528.0 ns", + "Error": "1.91 ns", + "StdDev": "1.79 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "411.8 ns", - "Error": "8.07 ns", - "StdDev": "7.15 ns", + "Mean": "402.1 ns", + "Error": "1.17 ns", + "StdDev": "1.09 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "193,329.5 ns", - "Error": "1,121.02 ns", - "StdDev": "993.75 ns", + "Mean": "145,136.1 ns", + "Error": "1,325.21 ns", + "StdDev": "1,174.76 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "5,305.6 ns", - "Error": "56.04 ns", - "StdDev": "49.68 ns", - "Gen0": "0.4883", - "Gen1": "-", + "Mean": "4,561.8 ns", + "Error": "17.19 ns", + "StdDev": "15.24 ns", + "Gen0": "0.5188", + "Gen1": "0.0076", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "6,500.5 ns", - "Error": "113.72 ns", - "StdDev": "121.68 ns", + "Mean": "5,495.7 ns", + "Error": "29.35 ns", + "StdDev": "27.45 ns", "Gen0": "0.5493", - "Gen1": "0.0610", - "Allocated": "9.4 KB" + "Gen1": "0.0305", + "Allocated": "9.26 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/CombinedWorkflow.json b/docs/static/benchmarks/mocks/CombinedWorkflow.json index 5f93f49685..50e1515a70 100644 --- a/docs/static/benchmarks/mocks/CombinedWorkflow.json +++ b/docs/static/benchmarks/mocks/CombinedWorkflow.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "category": "CombinedWorkflow", "description": "Full workflow: create → setup → invoke → verify", "environment": { @@ -10,54 +10,54 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "1.931 μs", - "Error": "0.0109 μs", - "StdDev": "0.0091 μs", - "Gen0": "0.3777", - "Gen1": "0.0038", + "Mean": "1.866 μs", + "Error": "0.0147 μs", + "StdDev": "0.0130 μs", + "Gen0": "0.3796", + "Gen1": "0.0057", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.865 μs", - "Error": "0.0373 μs", - "StdDev": "0.0330 μs", + "Mean": "2.516 μs", + "Error": "0.0110 μs", + "StdDev": "0.0098 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.896 μs", - "Error": "0.0182 μs", - "StdDev": "0.0171 μs", + "Mean": "1.726 μs", + "Error": "0.0145 μs", + "StdDev": "0.0128 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "417.831 μs", - "Error": "1.8875 μs", - "StdDev": "1.7655 μs", + "Mean": "311.747 μs", + "Error": "2.0081 μs", + "StdDev": "1.6769 μs", "Gen0": "1.9531", "Gen1": "0.9766", "Allocated": "36.35 KB" }, { "Method": "NSubstitute", - "Mean": "17.856 μs", - "Error": "0.2324 μs", - "StdDev": "0.2173 μs", + "Mean": "15.658 μs", + "Error": "0.1421 μs", + "StdDev": "0.1260 μs", "Gen0": "1.6174", "Gen1": "0.0305", - "Allocated": "26.72 KB" + "Allocated": "26.85 KB" }, { "Method": "FakeItEasy", - "Mean": "18.856 μs", - "Error": "0.3021 μs", - "StdDev": "0.2522 μs", + "Mean": "15.440 μs", + "Error": "0.1719 μs", + "StdDev": "0.1524 μs", "Gen0": "1.4648", "Gen1": "0.1221", "Allocated": "25.52 KB" diff --git a/docs/static/benchmarks/mocks/Invocation.json b/docs/static/benchmarks/mocks/Invocation.json index 438b76e91b..ef0e37c052 100644 --- a/docs/static/benchmarks/mocks/Invocation.json +++ b/docs/static/benchmarks/mocks/Invocation.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "category": "Invocation", "description": "Calling methods on mock objects", "environment": { @@ -10,162 +10,162 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "272.6 ns", - "Error": "56.40 ns", - "StdDev": "3.09 ns", + "Mean": "274.8 ns", + "Error": "88.68 ns", + "StdDev": "4.86 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "368.7 ns", - "Error": "38.27 ns", - "StdDev": "2.10 ns", + "Mean": "299.9 ns", + "Error": "66.81 ns", + "StdDev": "3.66 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "121.8 ns", - "Error": "61.95 ns", - "StdDev": "3.40 ns", + "Mean": "124.0 ns", + "Error": "42.11 ns", + "StdDev": "2.31 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "814.8 ns", - "Error": "350.95 ns", - "StdDev": "19.24 ns", + "Mean": "848.4 ns", + "Error": "162.83 ns", + "StdDev": "8.93 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "820.6 ns", - "Error": "1,031.26 ns", - "StdDev": "56.53 ns", + "Mean": "738.4 ns", + "Error": "103.83 ns", + "StdDev": "5.69 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "1,852.5 ns", - "Error": "1,311.34 ns", - "StdDev": "71.88 ns", - "Gen0": "0.0534", - "Gen1": "0.0496", + "Mean": "1,827.2 ns", + "Error": "45.03 ns", + "StdDev": "2.47 ns", + "Gen0": "0.0553", + "Gen1": "0.0534", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "174.2 ns", - "Error": "56.08 ns", - "StdDev": "3.07 ns", + "Mean": "166.7 ns", + "Error": "57.05 ns", + "StdDev": "3.13 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "302.7 ns", - "Error": "87.58 ns", - "StdDev": "4.80 ns", + "Mean": "297.9 ns", + "Error": "54.27 ns", + "StdDev": "2.97 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "106.0 ns", - "Error": "194.26 ns", - "StdDev": "10.65 ns", + "Mean": "105.1 ns", + "Error": "73.09 ns", + "StdDev": "4.01 ns", "Gen0": "0.0036", - "Gen1": "0.0035", + "Gen1": "0.0033", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "550.0 ns", - "Error": "101.00 ns", - "StdDev": "5.54 ns", + "Mean": "562.1 ns", + "Error": "157.00 ns", + "StdDev": "8.61 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "641.9 ns", - "Error": "53.00 ns", - "StdDev": "2.90 ns", + "Mean": "628.4 ns", + "Error": "92.25 ns", + "StdDev": "5.06 ns", "Gen0": "0.0153", "Gen1": "0.0143", "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,677.0 ns", - "Error": "64.46 ns", - "StdDev": "3.53 ns", + "Mean": "1,609.9 ns", + "Error": "350.39 ns", + "StdDev": "19.21 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "27,979.5 ns", - "Error": "6,941.53 ns", - "StdDev": "380.49 ns", + "Mean": "27,582.9 ns", + "Error": "16,334.68 ns", + "StdDev": "895.36 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "33,056.6 ns", - "Error": "13,945.35 ns", - "StdDev": "764.39 ns", + "Mean": "29,495.4 ns", + "Error": "9,482.65 ns", + "StdDev": "519.78 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "13,212.4 ns", - "Error": "20,439.77 ns", - "StdDev": "1,120.37 ns", + "Mean": "11,756.6 ns", + "Error": "3,847.27 ns", + "StdDev": "210.88 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "84,896.3 ns", - "Error": "58,242.67 ns", - "StdDev": "3,192.48 ns", + "Mean": "83,319.3 ns", + "Error": "22,111.43 ns", + "StdDev": "1,212.00 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "87,247.2 ns", - "Error": "62,681.56 ns", - "StdDev": "3,435.79 ns", + "Mean": "73,136.5 ns", + "Error": "9,854.58 ns", + "StdDev": "540.16 ns", "Gen0": "1.7090", "Gen1": "1.5869", "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "206,938.9 ns", - "Error": "213,933.73 ns", - "StdDev": "11,726.43 ns", + "Mean": "187,548.1 ns", + "Error": "30,365.87 ns", + "StdDev": "1,664.46 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" diff --git a/docs/static/benchmarks/mocks/MockCreation.json b/docs/static/benchmarks/mocks/MockCreation.json index 4e48f3b3e7..76e610bee8 100644 --- a/docs/static/benchmarks/mocks/MockCreation.json +++ b/docs/static/benchmarks/mocks/MockCreation.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "category": "MockCreation", "description": "Mock instance creation performance", "environment": { @@ -10,9 +10,9 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "32.12 ns", - "Error": "0.700 ns", - "StdDev": "0.621 ns", + "Mean": "33.12 ns", + "Error": "0.454 ns", + "StdDev": "0.402 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -20,9 +20,9 @@ }, { "Method": "Imposter", - "Mean": "100.54 ns", - "Error": "0.237 ns", - "StdDev": "0.210 ns", + "Mean": "115.83 ns", + "Error": "0.661 ns", + "StdDev": "0.586 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -30,9 +30,9 @@ }, { "Method": "Mockolate", - "Mean": "78.19 ns", - "Error": "0.726 ns", - "StdDev": "0.644 ns", + "Mean": "70.04 ns", + "Error": "0.702 ns", + "StdDev": "0.657 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -40,9 +40,9 @@ }, { "Method": "Moq", - "Mean": "1,255.61 ns", - "Error": "18.085 ns", - "StdDev": "16.917 ns", + "Mean": "1,268.78 ns", + "Error": "22.540 ns", + "StdDev": "21.084 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -50,9 +50,9 @@ }, { "Method": "NSubstitute", - "Mean": "1,724.95 ns", - "Error": "11.601 ns", - "StdDev": "10.851 ns", + "Mean": "1,792.73 ns", + "Error": "25.311 ns", + "StdDev": "23.676 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -60,9 +60,9 @@ }, { "Method": "FakeItEasy", - "Mean": "1,717.67 ns", - "Error": "33.764 ns", - "StdDev": "33.161 ns", + "Mean": "1,809.35 ns", + "Error": "31.879 ns", + "StdDev": "36.712 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -70,9 +70,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "32.79 ns", - "Error": "0.076 ns", - "StdDev": "0.072 ns", + "Mean": "29.92 ns", + "Error": "0.148 ns", + "StdDev": "0.124 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -80,9 +80,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "156.24 ns", - "Error": "0.382 ns", - "StdDev": "0.319 ns", + "Mean": "160.02 ns", + "Error": "0.871 ns", + "StdDev": "0.815 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -90,9 +90,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "65.09 ns", - "Error": "0.247 ns", - "StdDev": "0.193 ns", + "Mean": "67.56 ns", + "Error": "0.729 ns", + "StdDev": "0.646 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -100,9 +100,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,273.92 ns", - "Error": "15.538 ns", - "StdDev": "14.535 ns", + "Mean": "1,301.47 ns", + "Error": "10.068 ns", + "StdDev": "9.417 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -110,9 +110,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,777.84 ns", - "Error": "34.020 ns", - "StdDev": "40.499 ns", + "Mean": "1,845.32 ns", + "Error": "28.797 ns", + "StdDev": "26.936 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -120,9 +120,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,722.92 ns", - "Error": "31.628 ns", - "StdDev": "35.154 ns", + "Mean": "1,883.04 ns", + "Error": "33.726 ns", + "StdDev": "43.853 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", diff --git a/docs/static/benchmarks/mocks/Setup.json b/docs/static/benchmarks/mocks/Setup.json index 1ebe983540..dba982296e 100644 --- a/docs/static/benchmarks/mocks/Setup.json +++ b/docs/static/benchmarks/mocks/Setup.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "category": "Setup", "description": "Mock behavior configuration (returns, matchers)", "environment": { @@ -10,111 +10,111 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "643.9 ns", - "Error": "12.71 ns", - "StdDev": "12.49 ns", - "Gen0": "0.0954", - "Gen1": "-", + "Mean": "454.2 ns", + "Error": "8.94 ns", + "StdDev": "12.23 ns", + "Gen0": "0.1431", + "Gen1": "0.0010", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "1,010.5 ns", - "Error": "13.67 ns", - "StdDev": "12.12 ns", - "Gen0": "0.2480", - "Gen1": "0.0038", + "Mean": "627.9 ns", + "Error": "12.61 ns", + "StdDev": "25.47 ns", + "Gen0": "0.3738", + "Gen1": "0.0076", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "404.9 ns", - "Error": "4.96 ns", - "StdDev": "4.64 ns", - "Gen0": "0.0672", - "Gen1": "-", + "Mean": "283.6 ns", + "Error": "2.45 ns", + "StdDev": "2.05 ns", + "Gen0": "0.1006", + "Gen1": "0.0005", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "320,796.8 ns", - "Error": "2,492.44 ns", - "StdDev": "2,081.30 ns", - "Gen0": "0.9766", - "Gen1": "-", - "Allocated": "28.67 KB" + "Mean": "243,235.3 ns", + "Error": "1,528.16 ns", + "StdDev": "1,354.67 ns", + "Gen0": "1.4648", + "Gen1": "0.9766", + "Allocated": "28.56 KB" }, { "Method": "NSubstitute", - "Mean": "5,663.0 ns", - "Error": "19.62 ns", - "StdDev": "17.40 ns", - "Gen0": "0.3662", - "Gen1": "-", - "Allocated": "9.01 KB" + "Mean": "4,076.4 ns", + "Error": "64.25 ns", + "StdDev": "65.98 ns", + "Gen0": "0.5493", + "Gen1": "0.0076", + "Allocated": "9.06 KB" }, { "Method": "FakeItEasy", - "Mean": "7,755.5 ns", - "Error": "25.68 ns", - "StdDev": "22.76 ns", - "Gen0": "0.4120", + "Mean": "5,549.0 ns", + "Error": "62.88 ns", + "StdDev": "49.10 ns", + "Gen0": "0.6256", "Gen1": "0.0153", - "Allocated": "10.46 KB" + "Allocated": "10.45 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "954.4 ns", - "Error": "10.46 ns", - "StdDev": "9.27 ns", - "Gen0": "0.1278", - "Gen1": "-", + "Mean": "636.6 ns", + "Error": "5.45 ns", + "StdDev": "5.09 ns", + "Gen0": "0.1926", + "Gen1": "0.0019", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,705.0 ns", - "Error": "33.68 ns", - "StdDev": "71.78 ns", - "Gen0": "0.4311", - "Gen1": "0.0153", + "Mean": "1,064.3 ns", + "Error": "7.85 ns", + "StdDev": "7.35 ns", + "Gen0": "0.6485", + "Gen1": "0.0248", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "675.3 ns", - "Error": "7.09 ns", - "StdDev": "6.63 ns", - "Gen0": "0.1059", - "Gen1": "-", + "Mean": "480.1 ns", + "Error": "6.73 ns", + "StdDev": "5.62 ns", + "Gen0": "0.1583", + "Gen1": "0.0010", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "85,539.5 ns", - "Error": "342.14 ns", - "StdDev": "285.70 ns", - "Gen0": "0.4883", - "Gen1": "0.2441", + "Mean": "69,447.9 ns", + "Error": "204.42 ns", + "StdDev": "191.22 ns", + "Gen0": "0.9766", + "Gen1": "0.7324", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "12,031.9 ns", - "Error": "52.50 ns", - "StdDev": "49.11 ns", - "Gen0": "0.7324", + "Mean": "8,445.2 ns", + "Error": "144.28 ns", + "StdDev": "134.96 ns", + "Gen0": "1.2207", "Gen1": "-", - "Allocated": "20.5 KB" + "Allocated": "20.34 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,525.0 ns", - "Error": "60.02 ns", - "StdDev": "53.21 ns", - "Gen0": "0.4730", - "Gen1": "0.0153", - "Allocated": "11.72 KB" + "Mean": "5,308.6 ns", + "Error": "52.58 ns", + "StdDev": "43.91 ns", + "Gen0": "0.7019", + "Gen1": "0.0305", + "Allocated": "11.71 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Verification.json b/docs/static/benchmarks/mocks/Verification.json index f54537ae95..bea51a0d0e 100644 --- a/docs/static/benchmarks/mocks/Verification.json +++ b/docs/static/benchmarks/mocks/Verification.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "category": "Verification", "description": "Verifying mock method calls", "environment": { @@ -10,165 +10,165 @@ "results": [ { "Method": "TUnit.Mocks", - "Mean": "788.12 ns", - "Error": "3.045 ns", - "StdDev": "2.543 ns", + "Mean": "741.98 ns", + "Error": "1.913 ns", + "StdDev": "1.790 ns", "Gen0": "0.1793", "Gen1": "0.0010", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "739.02 ns", - "Error": "6.395 ns", - "StdDev": "5.982 ns", + "Mean": "656.17 ns", + "Error": "2.498 ns", + "StdDev": "2.215 ns", "Gen0": "0.2794", "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "432.70 ns", - "Error": "2.305 ns", - "StdDev": "2.043 ns", + "Mean": "403.81 ns", + "Error": "2.112 ns", + "StdDev": "1.975 ns", "Gen0": "0.1335", "Gen1": "0.0005", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "252,690.26 ns", - "Error": "1,355.022 ns", - "StdDev": "1,201.191 ns", - "Gen0": "0.9766", - "Gen1": "0.4883", - "Allocated": "24324 B" + "Mean": "250,183.48 ns", + "Error": "994.648 ns", + "StdDev": "830.576 ns", + "Gen0": "1.4648", + "Gen1": "-", + "Allocated": "24578 B" }, { "Method": "NSubstitute", - "Mean": "6,171.27 ns", - "Error": "42.226 ns", - "StdDev": "37.432 ns", - "Gen0": "0.5798", - "Gen1": "-", + "Mean": "5,689.24 ns", + "Error": "22.429 ns", + "StdDev": "19.882 ns", + "Gen0": "0.5951", + "Gen1": "0.0076", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "6,787.33 ns", - "Error": "59.435 ns", - "StdDev": "52.687 ns", + "Mean": "6,496.46 ns", + "Error": "28.324 ns", + "StdDev": "25.109 ns", "Gen0": "0.6409", - "Gen1": "0.0305", + "Gen1": "0.0153", "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "56.55 ns", - "Error": "0.167 ns", - "StdDev": "0.139 ns", + "Mean": "56.76 ns", + "Error": "0.112 ns", + "StdDev": "0.094 ns", "Gen0": "0.0191", "Gen1": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "339.76 ns", - "Error": "5.309 ns", - "StdDev": "4.966 ns", + "Mean": "326.54 ns", + "Error": "2.374 ns", + "StdDev": "2.105 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "257.21 ns", - "Error": "2.277 ns", - "StdDev": "2.130 ns", + "Mean": "249.62 ns", + "Error": "0.819 ns", + "StdDev": "0.684 ns", "Gen0": "0.0739", "Gen1": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "64,156.37 ns", - "Error": "377.022 ns", - "StdDev": "314.830 ns", + "Mean": "62,584.21 ns", + "Error": "618.520 ns", + "StdDev": "578.564 ns", "Gen0": "0.3662", "Gen1": "0.2441", - "Allocated": "7005 B" + "Allocated": "6925 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,591.51 ns", - "Error": "45.024 ns", - "StdDev": "42.116 ns", + "Mean": "3,376.92 ns", + "Error": "10.652 ns", + "StdDev": "9.964 ns", "Gen0": "0.4234", "Gen1": "0.0038", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,466.47 ns", - "Error": "60.666 ns", - "StdDev": "53.779 ns", + "Mean": "3,209.95 ns", + "Error": "18.811 ns", + "StdDev": "17.595 ns", "Gen0": "0.3052", "Gen1": "0.0153", "Allocated": "5210 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,342.57 ns", - "Error": "23.123 ns", - "StdDev": "21.629 ns", + "Mean": "1,262.20 ns", + "Error": "4.986 ns", + "StdDev": "4.664 ns", "Gen0": "0.2670", "Gen1": "0.0019", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,800.07 ns", - "Error": "27.614 ns", - "StdDev": "25.830 ns", + "Mean": "1,644.45 ns", + "Error": "4.998 ns", + "StdDev": "4.430 ns", "Gen0": "0.6676", "Gen1": "0.0210", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,191.64 ns", - "Error": "22.811 ns", - "StdDev": "24.408 ns", + "Mean": "1,114.69 ns", + "Error": "5.924 ns", + "StdDev": "5.252 ns", "Gen0": "0.3204", "Gen1": "0.0038", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "363,074.92 ns", - "Error": "3,154.952 ns", - "StdDev": "2,951.144 ns", + "Mean": "343,800.49 ns", + "Error": "2,577.544 ns", + "StdDev": "2,284.925 ns", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "34922 B" + "Allocated": "34699 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "10,887.68 ns", - "Error": "83.524 ns", - "StdDev": "78.128 ns", + "Mean": "10,191.09 ns", + "Error": "29.891 ns", + "StdDev": "24.960 ns", "Gen0": "0.9918", "Gen1": "0.0153", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "12,157.60 ns", - "Error": "144.392 ns", - "StdDev": "135.065 ns", - "Gen0": "1.0986", + "Mean": "11,948.41 ns", + "Error": "113.923 ns", + "StdDev": "95.131 ns", + "Gen0": "1.1597", "Gen1": "0.0610", - "Allocated": "19232 B" + "Allocated": "19456 B" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/latest.json b/docs/static/benchmarks/mocks/latest.json index db34de408d..afbb72da02 100644 --- a/docs/static/benchmarks/mocks/latest.json +++ b/docs/static/benchmarks/mocks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-06-18T03:29:53.480Z", + "timestamp": "2026-06-19T03:29:43.427Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.301", @@ -9,164 +9,164 @@ "Callback": [ { "Method": "TUnit.Mocks", - "Mean": "697.7 ns", - "Error": "9.43 ns", - "StdDev": "8.82 ns", + "Mean": "642.5 ns", + "Error": "1.54 ns", + "StdDev": "1.37 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "469.3 ns", - "Error": "4.98 ns", - "StdDev": "4.66 ns", - "Gen0": "0.1621", - "Gen1": "0.0010", + "Mean": "463.3 ns", + "Error": "0.69 ns", + "StdDev": "0.64 ns", + "Gen0": "0.1626", + "Gen1": "0.0014", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "376.3 ns", - "Error": "3.17 ns", - "StdDev": "2.81 ns", + "Mean": "359.0 ns", + "Error": "1.01 ns", + "StdDev": "0.95 ns", "Gen0": "0.1163", "Gen1": "0.0005", "Allocated": "1.91 KB" }, { "Method": "Moq", - "Mean": "183,861.5 ns", - "Error": "781.51 ns", - "StdDev": "731.03 ns", - "Gen0": "0.4883", - "Gen1": "-", - "Allocated": "13.14 KB" + "Mean": "135,153.8 ns", + "Error": "708.43 ns", + "StdDev": "628.00 ns", + "Gen0": "0.7324", + "Gen1": "0.4883", + "Allocated": "13.29 KB" }, { "Method": "NSubstitute", - "Mean": "4,478.3 ns", - "Error": "32.83 ns", - "StdDev": "27.41 ns", - "Gen0": "0.4807", - "Gen1": "0.0076", + "Mean": "4,216.8 ns", + "Error": "21.53 ns", + "StdDev": "16.81 ns", + "Gen0": "0.4578", + "Gen1": "-", "Allocated": "7.93 KB" }, { "Method": "FakeItEasy", - "Mean": "5,088.7 ns", - "Error": "31.41 ns", - "StdDev": "29.38 ns", + "Mean": "4,614.5 ns", + "Error": "15.36 ns", + "StdDev": "13.61 ns", "Gen0": "0.4501", "Gen1": "0.0153", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "847.6 ns", - "Error": "9.73 ns", - "StdDev": "9.10 ns", + "Mean": "809.7 ns", + "Error": "4.42 ns", + "StdDev": "3.92 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "543.8 ns", - "Error": "4.98 ns", - "StdDev": "3.89 ns", + "Mean": "528.0 ns", + "Error": "1.91 ns", + "StdDev": "1.79 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "411.8 ns", - "Error": "8.07 ns", - "StdDev": "7.15 ns", + "Mean": "402.1 ns", + "Error": "1.17 ns", + "StdDev": "1.09 ns", "Gen0": "0.1192", "Gen1": "0.0005", "Allocated": "1.95 KB" }, { "Method": "'Moq (with args)'", - "Mean": "193,329.5 ns", - "Error": "1,121.02 ns", - "StdDev": "993.75 ns", + "Mean": "145,136.1 ns", + "Error": "1,325.21 ns", + "StdDev": "1,174.76 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "5,305.6 ns", - "Error": "56.04 ns", - "StdDev": "49.68 ns", - "Gen0": "0.4883", - "Gen1": "-", + "Mean": "4,561.8 ns", + "Error": "17.19 ns", + "StdDev": "15.24 ns", + "Gen0": "0.5188", + "Gen1": "0.0076", "Allocated": "8.53 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "6,500.5 ns", - "Error": "113.72 ns", - "StdDev": "121.68 ns", + "Mean": "5,495.7 ns", + "Error": "29.35 ns", + "StdDev": "27.45 ns", "Gen0": "0.5493", - "Gen1": "0.0610", - "Allocated": "9.4 KB" + "Gen1": "0.0305", + "Allocated": "9.26 KB" } ], "CombinedWorkflow": [ { "Method": "TUnit.Mocks", - "Mean": "1.931 μs", - "Error": "0.0109 μs", - "StdDev": "0.0091 μs", - "Gen0": "0.3777", - "Gen1": "0.0038", + "Mean": "1.866 μs", + "Error": "0.0147 μs", + "StdDev": "0.0130 μs", + "Gen0": "0.3796", + "Gen1": "0.0057", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.865 μs", - "Error": "0.0373 μs", - "StdDev": "0.0330 μs", + "Mean": "2.516 μs", + "Error": "0.0110 μs", + "StdDev": "0.0098 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.896 μs", - "Error": "0.0182 μs", - "StdDev": "0.0171 μs", + "Mean": "1.726 μs", + "Error": "0.0145 μs", + "StdDev": "0.0128 μs", "Gen0": "0.4654", "Gen1": "0.0076", "Allocated": "7.63 KB" }, { "Method": "Moq", - "Mean": "417.831 μs", - "Error": "1.8875 μs", - "StdDev": "1.7655 μs", + "Mean": "311.747 μs", + "Error": "2.0081 μs", + "StdDev": "1.6769 μs", "Gen0": "1.9531", "Gen1": "0.9766", "Allocated": "36.35 KB" }, { "Method": "NSubstitute", - "Mean": "17.856 μs", - "Error": "0.2324 μs", - "StdDev": "0.2173 μs", + "Mean": "15.658 μs", + "Error": "0.1421 μs", + "StdDev": "0.1260 μs", "Gen0": "1.6174", "Gen1": "0.0305", - "Allocated": "26.72 KB" + "Allocated": "26.85 KB" }, { "Method": "FakeItEasy", - "Mean": "18.856 μs", - "Error": "0.3021 μs", - "StdDev": "0.2522 μs", + "Mean": "15.440 μs", + "Error": "0.1719 μs", + "StdDev": "0.1524 μs", "Gen0": "1.4648", "Gen1": "0.1221", "Allocated": "25.52 KB" @@ -175,162 +175,162 @@ "Invocation": [ { "Method": "TUnit.Mocks", - "Mean": "272.6 ns", - "Error": "56.40 ns", - "StdDev": "3.09 ns", + "Mean": "274.8 ns", + "Error": "88.68 ns", + "StdDev": "4.86 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "368.7 ns", - "Error": "38.27 ns", - "StdDev": "2.10 ns", + "Mean": "299.9 ns", + "Error": "66.81 ns", + "StdDev": "3.66 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "121.8 ns", - "Error": "61.95 ns", - "StdDev": "3.40 ns", + "Mean": "124.0 ns", + "Error": "42.11 ns", + "StdDev": "2.31 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "814.8 ns", - "Error": "350.95 ns", - "StdDev": "19.24 ns", + "Mean": "848.4 ns", + "Error": "162.83 ns", + "StdDev": "8.93 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "820.6 ns", - "Error": "1,031.26 ns", - "StdDev": "56.53 ns", + "Mean": "738.4 ns", + "Error": "103.83 ns", + "StdDev": "5.69 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "1,852.5 ns", - "Error": "1,311.34 ns", - "StdDev": "71.88 ns", - "Gen0": "0.0534", - "Gen1": "0.0496", + "Mean": "1,827.2 ns", + "Error": "45.03 ns", + "StdDev": "2.47 ns", + "Gen0": "0.0553", + "Gen1": "0.0534", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "174.2 ns", - "Error": "56.08 ns", - "StdDev": "3.07 ns", + "Mean": "166.7 ns", + "Error": "57.05 ns", + "StdDev": "3.13 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "302.7 ns", - "Error": "87.58 ns", - "StdDev": "4.80 ns", + "Mean": "297.9 ns", + "Error": "54.27 ns", + "StdDev": "2.97 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "106.0 ns", - "Error": "194.26 ns", - "StdDev": "10.65 ns", + "Mean": "105.1 ns", + "Error": "73.09 ns", + "StdDev": "4.01 ns", "Gen0": "0.0036", - "Gen1": "0.0035", + "Gen1": "0.0033", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "550.0 ns", - "Error": "101.00 ns", - "StdDev": "5.54 ns", + "Mean": "562.1 ns", + "Error": "157.00 ns", + "StdDev": "8.61 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "641.9 ns", - "Error": "53.00 ns", - "StdDev": "2.90 ns", + "Mean": "628.4 ns", + "Error": "92.25 ns", + "StdDev": "5.06 ns", "Gen0": "0.0153", "Gen1": "0.0143", "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,677.0 ns", - "Error": "64.46 ns", - "StdDev": "3.53 ns", + "Mean": "1,609.9 ns", + "Error": "350.39 ns", + "StdDev": "19.21 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "27,979.5 ns", - "Error": "6,941.53 ns", - "StdDev": "380.49 ns", + "Mean": "27,582.9 ns", + "Error": "16,334.68 ns", + "StdDev": "895.36 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "33,056.6 ns", - "Error": "13,945.35 ns", - "StdDev": "764.39 ns", + "Mean": "29,495.4 ns", + "Error": "9,482.65 ns", + "StdDev": "519.78 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "13,212.4 ns", - "Error": "20,439.77 ns", - "StdDev": "1,120.37 ns", + "Mean": "11,756.6 ns", + "Error": "3,847.27 ns", + "StdDev": "210.88 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "84,896.3 ns", - "Error": "58,242.67 ns", - "StdDev": "3,192.48 ns", + "Mean": "83,319.3 ns", + "Error": "22,111.43 ns", + "StdDev": "1,212.00 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "87,247.2 ns", - "Error": "62,681.56 ns", - "StdDev": "3,435.79 ns", + "Mean": "73,136.5 ns", + "Error": "9,854.58 ns", + "StdDev": "540.16 ns", "Gen0": "1.7090", "Gen1": "1.5869", "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "206,938.9 ns", - "Error": "213,933.73 ns", - "StdDev": "11,726.43 ns", + "Mean": "187,548.1 ns", + "Error": "30,365.87 ns", + "StdDev": "1,664.46 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" @@ -339,9 +339,9 @@ "MockCreation": [ { "Method": "TUnit.Mocks", - "Mean": "32.12 ns", - "Error": "0.700 ns", - "StdDev": "0.621 ns", + "Mean": "33.12 ns", + "Error": "0.454 ns", + "StdDev": "0.402 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -349,9 +349,9 @@ }, { "Method": "Imposter", - "Mean": "100.54 ns", - "Error": "0.237 ns", - "StdDev": "0.210 ns", + "Mean": "115.83 ns", + "Error": "0.661 ns", + "StdDev": "0.586 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -359,9 +359,9 @@ }, { "Method": "Mockolate", - "Mean": "78.19 ns", - "Error": "0.726 ns", - "StdDev": "0.644 ns", + "Mean": "70.04 ns", + "Error": "0.702 ns", + "StdDev": "0.657 ns", "Gen0": "0.0253", "Gen1": "-", "Gen2": "-", @@ -369,9 +369,9 @@ }, { "Method": "Moq", - "Mean": "1,255.61 ns", - "Error": "18.085 ns", - "StdDev": "16.917 ns", + "Mean": "1,268.78 ns", + "Error": "22.540 ns", + "StdDev": "21.084 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -379,9 +379,9 @@ }, { "Method": "NSubstitute", - "Mean": "1,724.95 ns", - "Error": "11.601 ns", - "StdDev": "10.851 ns", + "Mean": "1,792.73 ns", + "Error": "25.311 ns", + "StdDev": "23.676 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -389,9 +389,9 @@ }, { "Method": "FakeItEasy", - "Mean": "1,717.67 ns", - "Error": "33.764 ns", - "StdDev": "33.161 ns", + "Mean": "1,809.35 ns", + "Error": "31.879 ns", + "StdDev": "36.712 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -399,9 +399,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "32.79 ns", - "Error": "0.076 ns", - "StdDev": "0.072 ns", + "Mean": "29.92 ns", + "Error": "0.148 ns", + "StdDev": "0.124 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -409,9 +409,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "156.24 ns", - "Error": "0.382 ns", - "StdDev": "0.319 ns", + "Mean": "160.02 ns", + "Error": "0.871 ns", + "StdDev": "0.815 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -419,9 +419,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "65.09 ns", - "Error": "0.247 ns", - "StdDev": "0.193 ns", + "Mean": "67.56 ns", + "Error": "0.729 ns", + "StdDev": "0.646 ns", "Gen0": "0.0272", "Gen1": "-", "Gen2": "-", @@ -429,9 +429,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,273.92 ns", - "Error": "15.538 ns", - "StdDev": "14.535 ns", + "Mean": "1,301.47 ns", + "Error": "10.068 ns", + "StdDev": "9.417 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -439,9 +439,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,777.84 ns", - "Error": "34.020 ns", - "StdDev": "40.499 ns", + "Mean": "1,845.32 ns", + "Error": "28.797 ns", + "StdDev": "26.936 ns", "Gen0": "0.2975", "Gen1": "0.0019", "Gen2": "-", @@ -449,9 +449,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,722.92 ns", - "Error": "31.628 ns", - "StdDev": "35.154 ns", + "Mean": "1,883.04 ns", + "Error": "33.726 ns", + "StdDev": "43.853 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -461,281 +461,281 @@ "Setup": [ { "Method": "TUnit.Mocks", - "Mean": "643.9 ns", - "Error": "12.71 ns", - "StdDev": "12.49 ns", - "Gen0": "0.0954", - "Gen1": "-", + "Mean": "454.2 ns", + "Error": "8.94 ns", + "StdDev": "12.23 ns", + "Gen0": "0.1431", + "Gen1": "0.0010", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "1,010.5 ns", - "Error": "13.67 ns", - "StdDev": "12.12 ns", - "Gen0": "0.2480", - "Gen1": "0.0038", + "Mean": "627.9 ns", + "Error": "12.61 ns", + "StdDev": "25.47 ns", + "Gen0": "0.3738", + "Gen1": "0.0076", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "404.9 ns", - "Error": "4.96 ns", - "StdDev": "4.64 ns", - "Gen0": "0.0672", - "Gen1": "-", + "Mean": "283.6 ns", + "Error": "2.45 ns", + "StdDev": "2.05 ns", + "Gen0": "0.1006", + "Gen1": "0.0005", "Allocated": "1.65 KB" }, { "Method": "Moq", - "Mean": "320,796.8 ns", - "Error": "2,492.44 ns", - "StdDev": "2,081.30 ns", - "Gen0": "0.9766", - "Gen1": "-", - "Allocated": "28.67 KB" + "Mean": "243,235.3 ns", + "Error": "1,528.16 ns", + "StdDev": "1,354.67 ns", + "Gen0": "1.4648", + "Gen1": "0.9766", + "Allocated": "28.56 KB" }, { "Method": "NSubstitute", - "Mean": "5,663.0 ns", - "Error": "19.62 ns", - "StdDev": "17.40 ns", - "Gen0": "0.3662", - "Gen1": "-", - "Allocated": "9.01 KB" + "Mean": "4,076.4 ns", + "Error": "64.25 ns", + "StdDev": "65.98 ns", + "Gen0": "0.5493", + "Gen1": "0.0076", + "Allocated": "9.06 KB" }, { "Method": "FakeItEasy", - "Mean": "7,755.5 ns", - "Error": "25.68 ns", - "StdDev": "22.76 ns", - "Gen0": "0.4120", + "Mean": "5,549.0 ns", + "Error": "62.88 ns", + "StdDev": "49.10 ns", + "Gen0": "0.6256", "Gen1": "0.0153", - "Allocated": "10.46 KB" + "Allocated": "10.45 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "954.4 ns", - "Error": "10.46 ns", - "StdDev": "9.27 ns", - "Gen0": "0.1278", - "Gen1": "-", + "Mean": "636.6 ns", + "Error": "5.45 ns", + "StdDev": "5.09 ns", + "Gen0": "0.1926", + "Gen1": "0.0019", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,705.0 ns", - "Error": "33.68 ns", - "StdDev": "71.78 ns", - "Gen0": "0.4311", - "Gen1": "0.0153", + "Mean": "1,064.3 ns", + "Error": "7.85 ns", + "StdDev": "7.35 ns", + "Gen0": "0.6485", + "Gen1": "0.0248", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "675.3 ns", - "Error": "7.09 ns", - "StdDev": "6.63 ns", - "Gen0": "0.1059", - "Gen1": "-", + "Mean": "480.1 ns", + "Error": "6.73 ns", + "StdDev": "5.62 ns", + "Gen0": "0.1583", + "Gen1": "0.0010", "Allocated": "2.6 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "85,539.5 ns", - "Error": "342.14 ns", - "StdDev": "285.70 ns", - "Gen0": "0.4883", - "Gen1": "0.2441", + "Mean": "69,447.9 ns", + "Error": "204.42 ns", + "StdDev": "191.22 ns", + "Gen0": "0.9766", + "Gen1": "0.7324", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "12,031.9 ns", - "Error": "52.50 ns", - "StdDev": "49.11 ns", - "Gen0": "0.7324", + "Mean": "8,445.2 ns", + "Error": "144.28 ns", + "StdDev": "134.96 ns", + "Gen0": "1.2207", "Gen1": "-", - "Allocated": "20.5 KB" + "Allocated": "20.34 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,525.0 ns", - "Error": "60.02 ns", - "StdDev": "53.21 ns", - "Gen0": "0.4730", - "Gen1": "0.0153", - "Allocated": "11.72 KB" + "Mean": "5,308.6 ns", + "Error": "52.58 ns", + "StdDev": "43.91 ns", + "Gen0": "0.7019", + "Gen1": "0.0305", + "Allocated": "11.71 KB" } ], "Verification": [ { "Method": "TUnit.Mocks", - "Mean": "788.12 ns", - "Error": "3.045 ns", - "StdDev": "2.543 ns", + "Mean": "741.98 ns", + "Error": "1.913 ns", + "StdDev": "1.790 ns", "Gen0": "0.1793", "Gen1": "0.0010", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "739.02 ns", - "Error": "6.395 ns", - "StdDev": "5.982 ns", + "Mean": "656.17 ns", + "Error": "2.498 ns", + "StdDev": "2.215 ns", "Gen0": "0.2794", "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "432.70 ns", - "Error": "2.305 ns", - "StdDev": "2.043 ns", + "Mean": "403.81 ns", + "Error": "2.112 ns", + "StdDev": "1.975 ns", "Gen0": "0.1335", "Gen1": "0.0005", "Allocated": "2240 B" }, { "Method": "Moq", - "Mean": "252,690.26 ns", - "Error": "1,355.022 ns", - "StdDev": "1,201.191 ns", - "Gen0": "0.9766", - "Gen1": "0.4883", - "Allocated": "24324 B" + "Mean": "250,183.48 ns", + "Error": "994.648 ns", + "StdDev": "830.576 ns", + "Gen0": "1.4648", + "Gen1": "-", + "Allocated": "24578 B" }, { "Method": "NSubstitute", - "Mean": "6,171.27 ns", - "Error": "42.226 ns", - "StdDev": "37.432 ns", - "Gen0": "0.5798", - "Gen1": "-", + "Mean": "5,689.24 ns", + "Error": "22.429 ns", + "StdDev": "19.882 ns", + "Gen0": "0.5951", + "Gen1": "0.0076", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "6,787.33 ns", - "Error": "59.435 ns", - "StdDev": "52.687 ns", + "Mean": "6,496.46 ns", + "Error": "28.324 ns", + "StdDev": "25.109 ns", "Gen0": "0.6409", - "Gen1": "0.0305", + "Gen1": "0.0153", "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "56.55 ns", - "Error": "0.167 ns", - "StdDev": "0.139 ns", + "Mean": "56.76 ns", + "Error": "0.112 ns", + "StdDev": "0.094 ns", "Gen0": "0.0191", "Gen1": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "339.76 ns", - "Error": "5.309 ns", - "StdDev": "4.966 ns", + "Mean": "326.54 ns", + "Error": "2.374 ns", + "StdDev": "2.105 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "257.21 ns", - "Error": "2.277 ns", - "StdDev": "2.130 ns", + "Mean": "249.62 ns", + "Error": "0.819 ns", + "StdDev": "0.684 ns", "Gen0": "0.0739", "Gen1": "-", "Allocated": "1240 B" }, { "Method": "'Moq (Never)'", - "Mean": "64,156.37 ns", - "Error": "377.022 ns", - "StdDev": "314.830 ns", + "Mean": "62,584.21 ns", + "Error": "618.520 ns", + "StdDev": "578.564 ns", "Gen0": "0.3662", "Gen1": "0.2441", - "Allocated": "7005 B" + "Allocated": "6925 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "3,591.51 ns", - "Error": "45.024 ns", - "StdDev": "42.116 ns", + "Mean": "3,376.92 ns", + "Error": "10.652 ns", + "StdDev": "9.964 ns", "Gen0": "0.4234", "Gen1": "0.0038", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "3,466.47 ns", - "Error": "60.666 ns", - "StdDev": "53.779 ns", + "Mean": "3,209.95 ns", + "Error": "18.811 ns", + "StdDev": "17.595 ns", "Gen0": "0.3052", "Gen1": "0.0153", "Allocated": "5210 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "1,342.57 ns", - "Error": "23.123 ns", - "StdDev": "21.629 ns", + "Mean": "1,262.20 ns", + "Error": "4.986 ns", + "StdDev": "4.664 ns", "Gen0": "0.2670", "Gen1": "0.0019", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,800.07 ns", - "Error": "27.614 ns", - "StdDev": "25.830 ns", + "Mean": "1,644.45 ns", + "Error": "4.998 ns", + "StdDev": "4.430 ns", "Gen0": "0.6676", "Gen1": "0.0210", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "1,191.64 ns", - "Error": "22.811 ns", - "StdDev": "24.408 ns", + "Mean": "1,114.69 ns", + "Error": "5.924 ns", + "StdDev": "5.252 ns", "Gen0": "0.3204", "Gen1": "0.0038", "Allocated": "5376 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "363,074.92 ns", - "Error": "3,154.952 ns", - "StdDev": "2,951.144 ns", + "Mean": "343,800.49 ns", + "Error": "2,577.544 ns", + "StdDev": "2,284.925 ns", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "34922 B" + "Allocated": "34699 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "10,887.68 ns", - "Error": "83.524 ns", - "StdDev": "78.128 ns", + "Mean": "10,191.09 ns", + "Error": "29.891 ns", + "StdDev": "24.960 ns", "Gen0": "0.9918", "Gen1": "0.0153", "Allocated": "16762 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "12,157.60 ns", - "Error": "144.392 ns", - "StdDev": "135.065 ns", - "Gen0": "1.0986", + "Mean": "11,948.41 ns", + "Error": "113.923 ns", + "StdDev": "95.131 ns", + "Gen0": "1.1597", "Gen1": "0.0610", - "Allocated": "19232 B" + "Allocated": "19456 B" } ] }, "stats": { "categoryCount": 6, "totalBenchmarks": 78, - "lastUpdated": "2026-06-18T03:29:53.480Z" + "lastUpdated": "2026-06-19T03:29:43.427Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/summary.json b/docs/static/benchmarks/mocks/summary.json index 58842de99d..baf3d1b308 100644 --- a/docs/static/benchmarks/mocks/summary.json +++ b/docs/static/benchmarks/mocks/summary.json @@ -7,7 +7,7 @@ "Setup", "Verification" ], - "timestamp": "2026-06-18", + "timestamp": "2026-06-19", "environment": "Ubuntu Latest • .NET SDK 10.0.301", "libraries": [ "TUnit.Mocks", From 6049d732935ac55b950440db43d3ba35203e0a73 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 19 Jun 2026 18:53:26 +0100 Subject: [PATCH 14/18] fix(mocks): mock deep interface hierarchies (#6264) (#6283) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Transitive auto-mock discovery was capped at a fixed depth of 3. Every interface-returning member emits a reference to the next level's generated factory (XMockFactory.CreateAutoMock), but the depth cap stopped generating those factories at the boundary — so the deepest generated impl referenced a factory that was never emitted, failing the whole compilation with CS0400. Remove the cap. The `visited` set is the real termination guard: it bounds the walk to the finite set of distinct reachable interfaces and is cycle-safe (already covered by the circular-reference auto-mock tests). The closure's filters (interface / non-framework namespace / no static-abstract members) match the factory-emission filters exactly, so every referenced factory is now generated. Existing snapshots are byte-identical (all fixtures were within depth 3). --- .../Discovery/MockTypeDiscovery.cs | 44 ++++++---- TUnit.Mocks.Tests/Issue6264Tests.cs | 81 +++++++++++++++++++ 2 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 TUnit.Mocks.Tests/Issue6264Tests.cs diff --git a/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs b/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs index b0a2ec5948..e70796d273 100644 --- a/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs +++ b/TUnit.Mocks.SourceGenerator/Discovery/MockTypeDiscovery.cs @@ -151,10 +151,10 @@ public static ImmutableArray TransformToModels(GeneratorSyntaxCon // these, members returning user interfaces reference CreateAutoMock factories that are // never generated when only Mock.Of() appears in the assembly. var visited = new HashSet(); - var transitiveModels = DiscoverTransitiveInterfaceTypes(namedType, visited, maxDepth: 3, compilationAssembly, compilation); + var transitiveModels = DiscoverTransitiveInterfaceTypes(namedType, visited, compilationAssembly, compilation); foreach (var additionalType in additionalTypes) { - transitiveModels.AddRange(DiscoverTransitiveInterfaceTypes(additionalType, visited, maxDepth: 3, compilationAssembly, compilation)); + transitiveModels.AddRange(DiscoverTransitiveInterfaceTypes(additionalType, visited, compilationAssembly, compilation)); } // Build multi-type model (generates impl + factory) @@ -231,18 +231,31 @@ public static ImmutableArray TransformToModels(GeneratorSyntaxCon /// /// Walks the members of a type and discovers interface return types that need mock factories - /// generated for auto-mocking support. Recurses up to maxDepth levels. + /// generated for auto-mocking support. Recurses over the full transitive closure; the + /// set both prevents cycles and bounds the walk to the finite set + /// of distinct reachable interfaces. The closure must be complete — every auto-mockable return + /// type that a generated impl references must itself be generated, otherwise the boundary type + /// references a factory that was never emitted (CS0400). See issue #6264. /// private static List DiscoverTransitiveInterfaceTypes( - INamedTypeSymbol type, HashSet visited, int maxDepth, IAssemblySymbol? compilationAssembly, Compilation compilation) + INamedTypeSymbol type, HashSet visited, IAssemblySymbol? compilationAssembly, Compilation compilation) { var results = new List(); - if (maxDepth <= 0) return results; - - var canonicalType = NormalizeTransitiveInterfaceReturnType(type); - var fqn = canonicalType.GetFullyQualifiedName(); - visited.Add(fqn); + // Mark the entry type as visited so a member returning it (a self-cycle) is skipped. + visited.Add(NormalizeTransitiveInterfaceReturnType(type).GetFullyQualifiedName()); + CollectTransitiveInterfaceTypes(type, visited, results, compilationAssembly, compilation); + return results; + } + /// + /// Recursive worker for . Appends directly into + /// the shared accumulator (no per-frame list / merge) and records + /// each discovered type in before recursing. + /// + private static void CollectTransitiveInterfaceTypes( + INamedTypeSymbol type, HashSet visited, List results, + IAssemblySymbol? compilationAssembly, Compilation compilation) + { // Collect all members from the type and its interfaces var members = new List(type.GetMembers()); foreach (var iface in type.AllInterfaces) @@ -286,19 +299,16 @@ private static List DiscoverTransitiveInterfaceTypes( if (HasStaticAbstractMembers(namedReturn)) continue; - var returnFqn = namedReturn.GetFullyQualifiedName(); - if (visited.Contains(returnFqn)) continue; - visited.Add(returnFqn); + // Add returns false if already discovered/visited — skip without re-walking. + if (!visited.Add(namedReturn.GetFullyQualifiedName())) continue; var model = BuildSingleTypeModel(namedReturn, isPartialMock: false, compilationAssembly, compilation); if (model is null) continue; results.Add(model); - // Recurse into the transitive type's members - results.AddRange(DiscoverTransitiveInterfaceTypes(namedReturn, visited, maxDepth - 1, compilationAssembly, compilation)); + // Recurse into the transitive type's members, accumulating into the same list. + CollectTransitiveInterfaceTypes(namedReturn, visited, results, compilationAssembly, compilation); } - - return results; } /// @@ -388,7 +398,7 @@ private static ImmutableArray BuildModelWithTransitiveDependencie return ImmutableArray.Empty; var visited = new HashSet(); - var transitiveModels = DiscoverTransitiveInterfaceTypes(namedType, visited, maxDepth: 3, compilationAssembly, compilation); + var transitiveModels = DiscoverTransitiveInterfaceTypes(namedType, visited, compilationAssembly, compilation); if (transitiveModels.Count == 0) return ImmutableArray.Create(model); diff --git a/TUnit.Mocks.Tests/Issue6264Tests.cs b/TUnit.Mocks.Tests/Issue6264Tests.cs new file mode 100644 index 0000000000..aca25c0dc1 --- /dev/null +++ b/TUnit.Mocks.Tests/Issue6264Tests.cs @@ -0,0 +1,81 @@ +using TUnit.Mocks; + +namespace TUnit.Mocks.Tests; + +// Regression: https://github.com/thomhurst/TUnit/issues/6264 +// Mocking the top of a deep interface hierarchy (each level returns the next via a property) +// failed to compile. Transitive auto-mock discovery was capped at a fixed depth, so the +// deepest generated impl referenced the factory of the next level down — which was never +// generated — producing CS0400 ("the type or namespace name 'IDepthNMockFactory' could not +// be found"). The cap is removed; the full transitive closure of reachable interfaces is now +// generated (bounded by the finite set of distinct types, cycle-safe via the visited set). + +#region Test interfaces — deeper than the old depth cap of 3 + +public interface IDepth1 +{ + IDepth2 Inner { get; } +} + +public interface IDepth2 +{ + IDepth3 Inner { get; } +} + +public interface IDepth3 +{ + IDepth4 Inner { get; } +} + +public interface IDepth4 +{ + IDepth5 Inner { get; } +} + +public interface IDepth5 +{ + IDepth6 Inner { get; } +} + +public interface IDepth6 +{ + int Value { get; } +} + +#endregion + +public class Issue6264Tests +{ + [Test] + public async Task Mocking_Top_Of_Deep_Hierarchy_Compiles() + { + // Before the fix this file failed to compile with CS0400 on a generated + // IDepthN_MockImplFactory referencing an un-generated IDepthN+1MockFactory. + var mock = IDepth1.Mock(); + await Assert.That(mock).IsNotNull(); + } + + [Test] + public async Task Auto_Mock_Chains_Through_The_Full_Depth() + { + var mock = IDepth1.Mock(); + + // Navigate the chain past the old depth-3 cap — each level auto-mocks the next, which is + // only possible because every level's factory is now generated. + var leaf = mock.Object.Inner.Inner.Inner.Inner.Inner; + + await Assert.That(leaf).IsNotNull(); + await Assert.That(leaf.Value).IsEqualTo(0); + } + + [Test] + public async Task Auto_Mock_At_Depth_Is_Configurable() + { + var mock = IDepth1.Mock(); + + var leaf = mock.Object.Inner.Inner.Inner.Inner.Inner; + Mock.Get(leaf).Value.Returns(99); + + await Assert.That(leaf.Value).IsEqualTo(99); + } +} From d0547b3250a890b06565f5297eac473e8451ba01 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:03:14 +0100 Subject: [PATCH 15/18] feat: support artifact retention for auto-uploaded HTML report (#6266) (#6270) The automatic GitHub Actions artifact upload had no way to set a retention period, so reports accumulated until a workflow run was manually deleted, eating into the Actions storage quota. Add a `TUNIT_ARTIFACT_RETENTION_DAYS` environment variable. When set to a positive integer, TUnit sends an `expires_at` timestamp in the CreateArtifact request, clamped to the repository maximum (`GITHUB_RETENTION_DAYS`) when one is present. Invalid/non-positive values are ignored and fall back to GitHub's default retention. --- .../GitHubArtifactUploaderTests.cs | 56 +++++++++++++++++++ .../Configuration/EnvironmentConstants.cs | 7 +++ .../Reporters/Html/GitHubArtifactUploader.cs | 44 ++++++++++++++- TUnit.Engine/Reporters/Html/HtmlReporter.cs | 20 ++++++- docs/docs/guides/html-report.md | 17 ++++++ 5 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 TUnit.Engine.Tests/GitHubArtifactUploaderTests.cs diff --git a/TUnit.Engine.Tests/GitHubArtifactUploaderTests.cs b/TUnit.Engine.Tests/GitHubArtifactUploaderTests.cs new file mode 100644 index 0000000000..3944a4c505 --- /dev/null +++ b/TUnit.Engine.Tests/GitHubArtifactUploaderTests.cs @@ -0,0 +1,56 @@ +using Shouldly; +using TUnit.Engine.Reporters.Html; + +namespace TUnit.Engine.Tests; + +public class GitHubArtifactUploaderTests +{ + private static readonly DateTime FixedUtcNow = new(2026, 6, 17, 12, 0, 0, DateTimeKind.Utc); + + [Test] + public void ComputeExpiresAt_Returns_Null_When_No_Retention_Requested() + { + GitHubArtifactUploader.ComputeExpiresAt(null, maxRetentionDays: 90, FixedUtcNow).ShouldBeNull(); + } + + [Test] + [Arguments(0)] + [Arguments(-5)] + public void ComputeExpiresAt_Returns_Null_For_NonPositive_Retention(int retentionDays) + { + GitHubArtifactUploader.ComputeExpiresAt(retentionDays, maxRetentionDays: 90, FixedUtcNow).ShouldBeNull(); + } + + [Test] + public void ComputeExpiresAt_Returns_Rfc3339_Timestamp_Offset_From_Now() + { + var result = GitHubArtifactUploader.ComputeExpiresAt(5, maxRetentionDays: null, FixedUtcNow); + + result.ShouldBe("2026-06-22T12:00:00Z"); + } + + [Test] + public void ComputeExpiresAt_Clamps_To_Repository_Maximum_When_Exceeded() + { + var result = GitHubArtifactUploader.ComputeExpiresAt(120, maxRetentionDays: 90, FixedUtcNow); + + // 90 days, not 120 + result.ShouldBe("2026-09-15T12:00:00Z"); + } + + [Test] + public void ComputeExpiresAt_Does_Not_Clamp_When_Within_Repository_Maximum() + { + var result = GitHubArtifactUploader.ComputeExpiresAt(7, maxRetentionDays: 90, FixedUtcNow); + + result.ShouldBe("2026-06-24T12:00:00Z"); + } + + [Test] + public void ComputeExpiresAt_Ignores_NonPositive_Repository_Maximum() + { + var result = GitHubArtifactUploader.ComputeExpiresAt(10, maxRetentionDays: 0, FixedUtcNow); + + result.ShouldBe("2026-06-27T12:00:00Z"); + } +} diff --git a/TUnit.Engine/Configuration/EnvironmentConstants.cs b/TUnit.Engine/Configuration/EnvironmentConstants.cs index c929bbf1aa..f9717826aa 100644 --- a/TUnit.Engine/Configuration/EnvironmentConstants.cs +++ b/TUnit.Engine/Configuration/EnvironmentConstants.cs @@ -9,6 +9,9 @@ internal static class EnvironmentConstants public const string EnableJUnitReporter = "TUNIT_ENABLE_JUNIT_REPORTER"; public const string GitHubReporterStyle = "TUNIT_GITHUB_REPORTER_STYLE"; + // TUnit-specific: how long (in days) the auto-uploaded HTML report artifact is kept + public const string ArtifactRetentionDays = "TUNIT_ARTIFACT_RETENTION_DAYS"; + // TUnit-specific: Execution public const string ExecutionMode = "TUNIT_EXECUTION_MODE"; public const string MaxParallelTests = "TUNIT_MAX_PARALLEL_TESTS"; @@ -37,6 +40,10 @@ internal static class EnvironmentConstants public const string GitHubRepository = "GITHUB_REPOSITORY"; public const string GitHubRunId = "GITHUB_RUN_ID"; + // Repository/organization maximum artifact retention (set by GitHub on the runner). + // Used to clamp TUNIT_ARTIFACT_RETENTION_DAYS so the API does not reject the request. + public const string GitHubRetentionDays = "GITHUB_RETENTION_DAYS"; + // GitHub Actions context (for CI metadata in reports) public const string GitHubSha = "GITHUB_SHA"; public const string GitHubRef = "GITHUB_REF"; diff --git a/TUnit.Engine/Reporters/Html/GitHubArtifactUploader.cs b/TUnit.Engine/Reporters/Html/GitHubArtifactUploader.cs index a06af4f6ef..58ee705c43 100644 --- a/TUnit.Engine/Reporters/Html/GitHubArtifactUploader.cs +++ b/TUnit.Engine/Reporters/Html/GitHubArtifactUploader.cs @@ -1,8 +1,10 @@ +using System.Globalization; using System.Net; using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; using System.Text.Json; +using TUnit.Engine.Configuration; namespace TUnit.Engine.Reporters.Html; @@ -19,6 +21,7 @@ internal static class GitHubArtifactUploader string filePath, string runtimeToken, string resultsUrl, + int? retentionDays, CancellationToken cancellationToken) { var (workflowRunBackendId, workflowJobRunBackendId) = ExtractBackendIds(runtimeToken); @@ -30,6 +33,7 @@ internal static class GitHubArtifactUploader var origin = new Uri(resultsUrl).GetLeftPart(UriPartial.Authority); var fileName = Path.GetFileName(filePath); + var expiresAt = ComputeExpiresAt(retentionDays, ReadMaxRetentionDays(), DateTime.UtcNow); // Step 1: CreateArtifact (deduplicate name on 409 conflict) var createUrl = $"{origin}/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact"; @@ -49,7 +53,7 @@ internal static class GitHubArtifactUploader _ => $"{nameWithoutExt}-{GetShortJobId(workflowJobRunBackendId)}-{nameAttempt}{ext}", }; - var createBody = BuildCreateArtifactJson(workflowRunBackendId, workflowJobRunBackendId, artifactName); + var createBody = BuildCreateArtifactJson(workflowRunBackendId, workflowJobRunBackendId, artifactName, expiresAt); signedUploadUrl = await RetryAsync(async () => { @@ -147,7 +151,7 @@ private static string GetShortJobId(string jobRunBackendId) : jobRunBackendId; } - private static string BuildCreateArtifactJson(string runId, string jobId, string fileName) + private static string BuildCreateArtifactJson(string runId, string jobId, string fileName, string? expiresAt) { using var ms = new MemoryStream(); using var w = new Utf8JsonWriter(ms); @@ -157,11 +161,47 @@ private static string BuildCreateArtifactJson(string runId, string jobId, string w.WriteString("name", fileName); w.WriteNumber("version", 7); w.WriteString("mime_type", "text/html"); + if (expiresAt is not null) + { + // google.protobuf.Timestamp in proto3 canonical JSON form (RFC 3339, UTC). + w.WriteString("expires_at", expiresAt); + } w.WriteEndObject(); w.Flush(); return Encoding.UTF8.GetString(ms.ToArray()); } + private static int? ReadMaxRetentionDays() + { + var raw = Environment.GetEnvironmentVariable(EnvironmentConstants.GitHubRetentionDays); + return int.TryParse(raw, NumberStyles.Integer, CultureInfo.InvariantCulture, out var days) && days > 0 + ? days + : null; + } + + /// + /// Translates a requested retention period into the expires_at timestamp the + /// GitHub artifact API expects, clamping to the repository maximum when one is set. + /// Returns when no (valid) retention was requested, leaving the + /// artifact on GitHub's default retention. + /// + internal static string? ComputeExpiresAt(int? retentionDays, int? maxRetentionDays, DateTime utcNow) + { + if (retentionDays is not > 0) + { + return null; + } + + var days = retentionDays.Value; + if (maxRetentionDays is > 0 && days > maxRetentionDays.Value) + { + Console.WriteLine($"Warning: TUNIT_ARTIFACT_RETENTION_DAYS ({days}) exceeds the repository maximum ({maxRetentionDays.Value}); clamping to {maxRetentionDays.Value}."); + days = maxRetentionDays.Value; + } + + return utcNow.AddDays(days).ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture); + } + private static string BuildFinalizeArtifactJson(string runId, string jobId, string fileName, long size, string sha256Hash) { using var ms = new MemoryStream(); diff --git a/TUnit.Engine/Reporters/Html/HtmlReporter.cs b/TUnit.Engine/Reporters/Html/HtmlReporter.cs index 9edf953ec1..456483bd67 100644 --- a/TUnit.Engine/Reporters/Html/HtmlReporter.cs +++ b/TUnit.Engine/Reporters/Html/HtmlReporter.cs @@ -786,7 +786,8 @@ private async Task TryGitHubIntegrationAsync(string filePath, CancellationToken { try { - artifactId = await GitHubArtifactUploader.UploadAsync(filePath, runtimeToken!, resultsUrl!, cancellationToken); + var retentionDays = ParseRetentionDays(); + artifactId = await GitHubArtifactUploader.UploadAsync(filePath, runtimeToken!, resultsUrl!, retentionDays, cancellationToken); if (artifactId is not null) { @@ -812,4 +813,21 @@ private async Task TryGitHubIntegrationAsync(string filePath, CancellationToken } } } + + private static int? ParseRetentionDays() + { + var raw = Environment.GetEnvironmentVariable(EnvironmentConstants.ArtifactRetentionDays); + if (string.IsNullOrWhiteSpace(raw)) + { + return null; + } + + if (int.TryParse(raw, NumberStyles.Integer, CultureInfo.InvariantCulture, out var days) && days > 0) + { + return days; + } + + Console.WriteLine($"Warning: Ignoring invalid {EnvironmentConstants.ArtifactRetentionDays} value '{raw}' (expected a positive integer number of days)."); + return null; + } } diff --git a/docs/docs/guides/html-report.md b/docs/docs/guides/html-report.md index d2dca1ed87..a1b62eb5c0 100644 --- a/docs/docs/guides/html-report.md +++ b/docs/docs/guides/html-report.md @@ -93,6 +93,23 @@ If you prefer not to expose the runtime token, you can upload the report yoursel path: '**/*-report.html' ``` +### Setting Artifact Retention + +By default the uploaded artifact uses your repository's default retention period. To keep +the report for a shorter time (and stay under your Actions storage quota), set the +`TUNIT_ARTIFACT_RETENTION_DAYS` environment variable to the number of days you want: + +```yaml +- name: Run Tests + run: dotnet run --project MyTests + env: + TUNIT_ARTIFACT_RETENTION_DAYS: 5 +``` + +The value must be a positive integer. If it exceeds your repository/organization maximum, +TUnit clamps it to that maximum. This applies only to the automatic upload (Option A); the +manual `upload-artifact` step (Option B) has its own [`retention-days`](https://github.com/actions/upload-artifact#retention-period) input. + ### Viewing the Report After the workflow run completes: From f8cc4c75bf03e4bbfbff1dd415d42a1657c5df24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:04:19 +0100 Subject: [PATCH 16/18] chore(deps): bump webpack-dev-server from 5.2.4 to 5.2.5 in /docs (#6273) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 5.2.4 to 5.2.5. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v5.2.4...v5.2.5) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.5 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 c171e85a53..7b48507768 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -9756,9 +9756,9 @@ webpack-dev-middleware@^7.4.2: schema-utils "^4.0.0" webpack-dev-server@^5.2.2: - version "5.2.4" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz#6e6306ce59848ed322c235e48b326632b1eed6d6" - integrity sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA== + version "5.2.5" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz#648fceaac6a5736b0935e5c1e55d6aa1d0626119" + integrity sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg== dependencies: "@types/bonjour" "^3.5.13" "@types/connect-history-api-fallback" "^1.5.4" From 1b7218a176cfa6060af5c1fa42031e223c8994a8 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:04:34 +0100 Subject: [PATCH 17/18] fix(mocks): forward asymmetric `new`-hidden property slots per-accessor (#6263) (#6281) * fix(mocks): forward asymmetric new-hidden property slots per-accessor (#6263) A derived interface that hides a base property/indexer with `new` and a different accessor set (e.g. base { get; }, derived new { get; set; }) declares two distinct interface slots. The shared impl holds the merged accessors, but the wrapper emitted every explicit forward using those merged flags, so the get-only base slot's forward gained a `set` the interface never declared -> CS0550. Carry per-slot accessor info: each AdditionalExplicitSlot records the accessors its interface declares, and the primary forward emits the declaring slot's own (pre-merge) accessors via new OwnHasGetter/ OwnHasSetter. Each forward now emits only the accessors its slot has. Both asymmetry directions handled. Wrapper-only; impl/setup surface keep the merged flags, so output is byte-identical for non-asymmetric cases (all 225 snapshot tests unchanged). Fixes #6263 * refactor(mocks): explicit IEquatable on MockExplicitInterfaceSlot Match the codebase convention (MockParameterModel, MockTypeParameterModel, MockMemberModel, MockEventModel all declare IEquatable with hand-written Equals/GetHashCode) instead of relying on compiler-synthesized record members. Structural equality is unchanged, so generated output stays byte-identical (225 snapshot tests pass). --- .../MockGeneratorTests.cs | 40 +++++++ .../Builders/MockWrapperTypeBuilder.cs | 32 +++--- .../Discovery/MemberDiscovery.cs | 43 ++++++-- .../Models/MockEventModel.cs | 3 +- .../Models/MockExplicitInterfaceSlot.cs | 39 +++++++ .../Models/MockMemberModel.cs | 38 +++++-- TUnit.Mocks.Tests/Issue6263Tests.cs | 100 ++++++++++++++++++ 7 files changed, 259 insertions(+), 36 deletions(-) create mode 100644 TUnit.Mocks.SourceGenerator/Models/MockExplicitInterfaceSlot.cs create mode 100644 TUnit.Mocks.Tests/Issue6263Tests.cs diff --git a/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs b/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs index 19bd7134ef..8a82706a59 100644 --- a/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs +++ b/TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs @@ -2181,6 +2181,46 @@ public class TestUsage AssertNoGeneratedError(source, "CS0535"); } + [Test] + public void Interface_Hiding_Property_With_New_And_Different_Accessors_Forwards_Per_Slot_Accessors() + { + // Regression #6263: IDerived hides a base property with `new` AND a different accessor set. + // IBase.Prop (get-only) and IDerived.Prop (get+set) are distinct slots. The shared impl holds + // the merged accessors, but each explicit wrapper forward must emit only the accessors ITS + // slot declares — else the base forward adds a `set` IBase never had (CS0550). Both directions. + var source = """ + using TUnit.Mocks; + + public interface IBase { string Prop { get; } } + public interface IDerived : IBase { new string Prop { get; set; } } + + public interface IRwBase { string Other { get; set; } } + public interface IRoDerived : IRwBase { new string Other { get; } } + + public class TestUsage + { + void M() + { + var a = Mock.Of(); + var b = Mock.Of(); + } + } + """; + + var output = GetGeneratedOutput(source); + + // Derived slot keeps both accessors; the get-only base slot forward must NOT emit a setter. + AssertContains(output, "string global::IDerived.Prop { get => ((global::IDerived)Object).Prop; set => ((global::IDerived)Object).Prop = value; }"); + AssertContains(output, "string global::IBase.Prop { get => ((global::IBase)Object).Prop; }"); + + // Reverse: derived drops the setter, base keeps it. + AssertContains(output, "string global::IRoDerived.Other { get => ((global::IRoDerived)Object).Other; }"); + AssertContains(output, "string global::IRwBase.Other { get => ((global::IRwBase)Object).Other; set => ((global::IRwBase)Object).Other = value; }"); + + AssertNoGeneratedError(source, "CS0550"); + AssertNoGeneratedError(source, "CS0535"); + } + [Test] public void Interface_Inheriting_Identical_Member_From_Multiple_Interfaces_Forwards_Both_Slots() { diff --git a/TUnit.Mocks.SourceGenerator/Builders/MockWrapperTypeBuilder.cs b/TUnit.Mocks.SourceGenerator/Builders/MockWrapperTypeBuilder.cs index 5e155418b8..c353acc995 100644 --- a/TUnit.Mocks.SourceGenerator/Builders/MockWrapperTypeBuilder.cs +++ b/TUnit.Mocks.SourceGenerator/Builders/MockWrapperTypeBuilder.cs @@ -96,10 +96,10 @@ private static void GenerateMethodForwarding(CodeWriter writer, MockMemberModel // Additional explicit forwards for distinct interface slots this member also satisfies // (base members hidden by `new`, or inherited from multiple interfaces). Each slot needs // its own explicit impl, cast to that interface so the right slot is hit on Object (#6252). - foreach (var extra in method.AdditionalExplicitInterfaceNames) + foreach (var extra in method.AdditionalExplicitSlots) { writer.AppendLine(); - EmitMethodForward(writer, method, extra, CastTarget(extra)); + EmitMethodForward(writer, method, extra.InterfaceName, CastTarget(extra.InterfaceName)); } } @@ -132,16 +132,18 @@ private static void EmitMethodForward(CodeWriter writer, MockMemberModel method, private static void GeneratePropertyForwarding(CodeWriter writer, MockMemberModel prop, MockTypeModel model) { var interfaceName = GetForwardingInterfaceName(prop, model); - EmitPropertyForward(writer, prop, interfaceName, GetPrimaryTarget(prop, interfaceName)); + // The primary forward emits the declaring slot's OWN accessors, not the merged set, so an + // asymmetric `new`-hidden slot doesn't gain an accessor it never declared (CS0550, #6263). + EmitPropertyForward(writer, prop, interfaceName, GetPrimaryTarget(prop, interfaceName), prop.OwnHasGetter, prop.OwnHasSetter); - foreach (var extra in prop.AdditionalExplicitInterfaceNames) + foreach (var extra in prop.AdditionalExplicitSlots) { writer.AppendLine(); - EmitPropertyForward(writer, prop, extra, CastTarget(extra)); + EmitPropertyForward(writer, prop, extra.InterfaceName, CastTarget(extra.InterfaceName), extra.HasGetter, extra.HasSetter); } } - private static void EmitPropertyForward(CodeWriter writer, MockMemberModel prop, string interfaceName, string target) + private static void EmitPropertyForward(CodeWriter writer, MockMemberModel prop, string interfaceName, string target, bool hasGetter, bool hasSetter) { var returnType = prop.ReturnType; @@ -150,8 +152,8 @@ private static void EmitPropertyForward(CodeWriter writer, MockMemberModel prop, // Per-accessor [Obsolete] is injected inline so the property line stays a one-liner. var getterAttr = GetAccessorObsoletePrefix(prop.GetterObsoleteAttribute); var setterAttr = GetAccessorObsoletePrefix(prop.SetterObsoleteAttribute); - var getter = prop.HasGetter ? $"{getterAttr}get => {target}.{EscapeIdentifier(prop.Name)}; " : ""; - var setter = prop.HasSetter ? $"{setterAttr}set => {target}.{EscapeIdentifier(prop.Name)} = value; " : ""; + var getter = hasGetter ? $"{getterAttr}get => {target}.{EscapeIdentifier(prop.Name)}; " : ""; + var setter = hasSetter ? $"{setterAttr}set => {target}.{EscapeIdentifier(prop.Name)} = value; " : ""; writer.AppendLine($"{returnType} {interfaceName}.{EscapeIdentifier(prop.Name)} {{ {getter}{setter}}}"); } @@ -159,16 +161,16 @@ private static void EmitPropertyForward(CodeWriter writer, MockMemberModel prop, private static void GenerateIndexerForwarding(CodeWriter writer, MockMemberModel prop, MockTypeModel model) { var interfaceName = GetForwardingInterfaceName(prop, model); - EmitIndexerForward(writer, prop, interfaceName, GetPrimaryTarget(prop, interfaceName)); + EmitIndexerForward(writer, prop, interfaceName, GetPrimaryTarget(prop, interfaceName), prop.OwnHasGetter, prop.OwnHasSetter); - foreach (var extra in prop.AdditionalExplicitInterfaceNames) + foreach (var extra in prop.AdditionalExplicitSlots) { writer.AppendLine(); - EmitIndexerForward(writer, prop, extra, CastTarget(extra)); + EmitIndexerForward(writer, prop, extra.InterfaceName, CastTarget(extra.InterfaceName), extra.HasGetter, extra.HasSetter); } } - private static void EmitIndexerForward(CodeWriter writer, MockMemberModel prop, string interfaceName, string target) + private static void EmitIndexerForward(CodeWriter writer, MockMemberModel prop, string interfaceName, string target, bool hasGetter, bool hasSetter) { var returnType = prop.ReturnType; var paramList = MockImplBuilder.GetParameterList(prop); @@ -178,8 +180,8 @@ private static void EmitIndexerForward(CodeWriter writer, MockMemberModel prop, var getterAttr = GetAccessorObsoletePrefix(prop.GetterObsoleteAttribute); var setterAttr = GetAccessorObsoletePrefix(prop.SetterObsoleteAttribute); - var getter = prop.HasGetter ? $"{getterAttr}get => {target}[{argPassList}]; " : ""; - var setter = prop.HasSetter ? $"{setterAttr}set => {target}[{argPassList}] = value; " : ""; + var getter = hasGetter ? $"{getterAttr}get => {target}[{argPassList}]; " : ""; + var setter = hasSetter ? $"{setterAttr}set => {target}[{argPassList}] = value; " : ""; writer.AppendLine($"{returnType} {interfaceName}.this[{paramList}] {{ {getter}{setter}}}"); } @@ -197,7 +199,7 @@ private static string GetForwardingInterfaceName(MockMemberModel member, MockTyp // or when it also satisfies other slots — otherwise `Object.X` may be ambiguous (CS0121) or bind // to the wrong slot (#6252). private static string GetPrimaryTarget(MockMemberModel member, string interfaceName) - => member.ExplicitInterfaceName is not null || member.AdditionalExplicitInterfaceNames.Length > 0 + => member.ExplicitInterfaceName is not null || member.AdditionalExplicitSlots.Length > 0 ? CastTarget(interfaceName) : "Object"; diff --git a/TUnit.Mocks.SourceGenerator/Discovery/MemberDiscovery.cs b/TUnit.Mocks.SourceGenerator/Discovery/MemberDiscovery.cs index 0cacc51f0a..7db6053a6c 100644 --- a/TUnit.Mocks.SourceGenerator/Discovery/MemberDiscovery.cs +++ b/TUnit.Mocks.SourceGenerator/Discovery/MemberDiscovery.cs @@ -98,12 +98,27 @@ private static bool RequiresExplicitImpl(INamedTypeSymbol? primaryClassSymbol, I /// the interface already matches the member's own slot or is already recorded. Only meaningful /// for single-interface mocks — the only ones with a wrapper. /// - private static void RecordAdditionalWrapperInterface(List members, int index, string interfaceFqn) + /// /: the accessors declared by the + /// shadowed slot itself, so the wrapper forward for it emits only those (asymmetric new + /// hiding — CS0550, #6263). Both true for methods, where accessor presence is irrelevant. + private static void RecordAdditionalWrapperInterface(List members, int index, string interfaceFqn, + bool slotHasGetter, bool slotHasSetter) { var existing = members[index]; - var updated = AppendDistinctSlot(existing.AdditionalExplicitInterfaceNames, - existing.ExplicitInterfaceName ?? existing.DeclaringInterfaceName, interfaceFqn, out var changed); - if (changed) members[index] = existing with { AdditionalExplicitInterfaceNames = updated }; + var ownSlot = existing.ExplicitInterfaceName ?? existing.DeclaringInterfaceName; + if (ownSlot == interfaceFqn) return; + var array = existing.AdditionalExplicitSlots.AsImmutableArray(); + if (array.Any(s => s.InterfaceName == interfaceFqn)) return; + var slot = new MockExplicitInterfaceSlot + { + InterfaceName = interfaceFqn, + HasGetter = slotHasGetter, + HasSetter = slotHasSetter + }; + members[index] = existing with + { + AdditionalExplicitSlots = new EquatableArray(array.Add(slot)) + }; } /// Event counterpart of . Locates the @@ -221,7 +236,7 @@ private static void CollectMembers( // forwards that slot, else the build fails with CS0535 (#6252). if (primaryClassSymbol is null && existing.Index >= 0) { - RecordAdditionalWrapperInterface(state.Methods, existing.Index, interfaceFqn); + RecordAdditionalWrapperInterface(state.Methods, existing.Index, interfaceFqn, slotHasGetter: true, slotHasSetter: true); } continue; } @@ -277,8 +292,11 @@ private static void CollectMembers( { MergePropertyAccessors(state.Properties, existingIndex.Value, property, ref state.MemberIdCounter, compilationAssembly); // Distinct slot hidden by `new` (or inherited twice) — the wrapper - // needs its own explicit forward for it too (#6252). - RecordAdditionalWrapperInterface(state.Properties, existingIndex.Value, interfaceFqn); + // needs its own explicit forward for it too (#6252), emitting only + // the accessors this slot declares (#6263). + RecordAdditionalWrapperInterface(state.Properties, existingIndex.Value, interfaceFqn, + IsAccessorAccessible(property.GetMethod, compilationAssembly), + IsAccessorAccessible(property.SetMethod, compilationAssembly)); } // else: class-primary walk and the existing member already covers // every accessor the interface needs — plain dedup. @@ -308,10 +326,13 @@ private static void CollectMembers( { MergePropertyAccessors(state.Properties, existingIndex.Value, indexer, ref state.MemberIdCounter, compilationAssembly); // Distinct indexer slot hidden by `new` (or inherited twice) — the - // wrapper needs its own explicit forward for it too (#6252). + // wrapper needs its own explicit forward for it too (#6252), emitting + // only the accessors this slot declares (#6263). if (primaryClassSymbol is null) { - RecordAdditionalWrapperInterface(state.Properties, existingIndex.Value, interfaceFqn); + RecordAdditionalWrapperInterface(state.Properties, existingIndex.Value, interfaceFqn, + IsAccessorAccessible(indexer.GetMethod, compilationAssembly), + IsAccessorAccessible(indexer.SetMethod, compilationAssembly)); } } else if (primaryClassSymbol is not null && state.SeenExplicitImpls.Add($"{interfaceFqn}|{key}")) @@ -781,6 +802,8 @@ private static MockMemberModel CreatePropertyModel(IPropertySymbol property, ref IsProperty = true, HasGetter = hasGetter, HasSetter = hasSetter, + OwnHasGetter = hasGetter, + OwnHasSetter = hasSetter, SetterMemberId = setterId, ExplicitInterfaceName = explicitInterfaceName, DeclaringInterfaceName = declaringInterfaceName, @@ -874,6 +897,8 @@ private static MockMemberModel CreateIndexerModel(IPropertySymbol indexer, ref i IsIndexer = true, HasGetter = hasGetter, HasSetter = hasSetter, + OwnHasGetter = hasGetter, + OwnHasSetter = hasSetter, Parameters = new EquatableArray( indexer.Parameters.Select(p => new MockParameterModel { diff --git a/TUnit.Mocks.SourceGenerator/Models/MockEventModel.cs b/TUnit.Mocks.SourceGenerator/Models/MockEventModel.cs index d67962dea5..f0152e71e3 100644 --- a/TUnit.Mocks.SourceGenerator/Models/MockEventModel.cs +++ b/TUnit.Mocks.SourceGenerator/Models/MockEventModel.cs @@ -40,7 +40,8 @@ internal sealed record MockEventModel : IEquatable /// Extra interface FQNs whose identically-named event slot this event also satisfies but /// which the generated wrapper must forward explicitly. Populated when a base-interface /// event is hidden by a new event (or inherited from multiple interfaces). See - /// (#6252). + /// (#6252). Events have no asymmetric + /// accessors, so this stays a plain name list (unlike the property/method slot model). /// public EquatableArray AdditionalExplicitInterfaceNames { get; init; } = EquatableArray.Empty; public string OverrideAccessModifier { get; init; } = "public"; diff --git a/TUnit.Mocks.SourceGenerator/Models/MockExplicitInterfaceSlot.cs b/TUnit.Mocks.SourceGenerator/Models/MockExplicitInterfaceSlot.cs new file mode 100644 index 0000000000..e02c12e6ed --- /dev/null +++ b/TUnit.Mocks.SourceGenerator/Models/MockExplicitInterfaceSlot.cs @@ -0,0 +1,39 @@ +using System; + +namespace TUnit.Mocks.SourceGenerator.Models; + +/// +/// A distinct interface slot that a single shared member also satisfies, but which the generated +/// wrapper type must implement with its own explicit interface forward (#6252). Carries the slot's +/// own accessor presence so the forward emits only the accessors that this interface declares: +/// when a base property is hidden by a new member with a different accessor set (e.g. base +/// { get; }, derived new { get; set; }), the shared model holds the merged +/// accessors for the implicit impl, but each explicit forward must match its own slot exactly or the +/// build fails with CS0550 (#6263). For methods these flags are unused. +/// +internal sealed record MockExplicitInterfaceSlot : IEquatable +{ + public string InterfaceName { get; init; } = ""; + public bool HasGetter { get; init; } + public bool HasSetter { get; init; } + + public bool Equals(MockExplicitInterfaceSlot? other) + { + if (other is null) return false; + return InterfaceName == other.InterfaceName + && HasGetter == other.HasGetter + && HasSetter == other.HasSetter; + } + + public override int GetHashCode() + { + unchecked + { + int hash = 17; + hash = hash * 31 + InterfaceName.GetHashCode(); + hash = hash * 31 + HasGetter.GetHashCode(); + hash = hash * 31 + HasSetter.GetHashCode(); + return hash; + } + } +} diff --git a/TUnit.Mocks.SourceGenerator/Models/MockMemberModel.cs b/TUnit.Mocks.SourceGenerator/Models/MockMemberModel.cs index 4b4787bb9c..b486b8e2e5 100644 --- a/TUnit.Mocks.SourceGenerator/Models/MockMemberModel.cs +++ b/TUnit.Mocks.SourceGenerator/Models/MockMemberModel.cs @@ -38,16 +38,28 @@ internal sealed record MockMemberModel : IEquatable public string? DeclaringInterfaceName { get; init; } /// - /// Extra interface FQNs whose identically-signed member slot this single member also - /// satisfies, but which the generated wrapper type must implement with its own explicit - /// interface forward. Populated when a base-interface member is hidden by a new - /// member, or when identical members are inherited from multiple interfaces: the shared - /// impl implements every slot implicitly, but the wrapper forwards explicitly, and an - /// explicit impl satisfies only the one slot it names — so each shadowed base slot needs - /// its own forward or the build fails with CS0535 (#6252). Empty in the common case and - /// consumed only by (single-interface mocks). + /// Extra interface slots whose identically-signed member this single member also satisfies, + /// but which the generated wrapper type must implement with its own explicit interface forward. + /// Populated when a base-interface member is hidden by a new member, or when identical + /// members are inherited from multiple interfaces: the shared impl implements every slot + /// implicitly, but the wrapper forwards explicitly, and an explicit impl satisfies only the one + /// slot it names — so each shadowed base slot needs its own forward or the build fails with + /// CS0535 (#6252). Each slot carries its own accessor presence so the forward emits only the + /// accessors that interface declares (asymmetric new hiding — CS0550, #6263). Empty in the + /// common case and consumed only by (single-interface mocks). /// - public EquatableArray AdditionalExplicitInterfaceNames { get; init; } = EquatableArray.Empty; + public EquatableArray AdditionalExplicitSlots { get; init; } = EquatableArray.Empty; + + /// + /// The accessors declared by this member's own primary slot + /// (), before MergePropertyAccessors widened + /// / to the union across all shadowed slots. + /// The wrapper's primary explicit forward emits from these so it doesn't add an accessor the + /// declaring interface lacks (CS0550, #6263). Equal to / + /// in the common (non-shadowing) case, keeping generated output byte-identical. Unused for methods. + /// + public bool OwnHasGetter { get; init; } + public bool OwnHasSetter { get; init; } public string NullableAnnotation { get; init; } = "None"; public string SmartDefault { get; init; } = "default!"; public string UnwrappedSmartDefault { get; init; } = "default!"; @@ -147,7 +159,9 @@ public bool Equals(MockMemberModel? other) && ExplicitInterfaceName == other.ExplicitInterfaceName && ExplicitInterfaceCanDelegate == other.ExplicitInterfaceCanDelegate && DeclaringInterfaceName == other.DeclaringInterfaceName - && AdditionalExplicitInterfaceNames.Equals(other.AdditionalExplicitInterfaceNames) + && AdditionalExplicitSlots.Equals(other.AdditionalExplicitSlots) + && OwnHasGetter == other.OwnHasGetter + && OwnHasSetter == other.OwnHasSetter && NullableAnnotation == other.NullableAnnotation && SmartDefault == other.SmartDefault && UnwrappedSmartDefault == other.UnwrappedSmartDefault @@ -186,7 +200,9 @@ public override int GetHashCode() hash = hash * 31 + (ExplicitInterfaceName?.GetHashCode() ?? 0); hash = hash * 31 + ExplicitInterfaceCanDelegate.GetHashCode(); hash = hash * 31 + (DeclaringInterfaceName?.GetHashCode() ?? 0); - hash = hash * 31 + AdditionalExplicitInterfaceNames.GetHashCode(); + hash = hash * 31 + AdditionalExplicitSlots.GetHashCode(); + hash = hash * 31 + OwnHasGetter.GetHashCode(); + hash = hash * 31 + OwnHasSetter.GetHashCode(); hash = hash * 31 + ObsoleteAttribute.GetHashCode(); hash = hash * 31 + GetterObsoleteAttribute.GetHashCode(); hash = hash * 31 + SetterObsoleteAttribute.GetHashCode(); diff --git a/TUnit.Mocks.Tests/Issue6263Tests.cs b/TUnit.Mocks.Tests/Issue6263Tests.cs new file mode 100644 index 0000000000..d47487d20e --- /dev/null +++ b/TUnit.Mocks.Tests/Issue6263Tests.cs @@ -0,0 +1,100 @@ +using TUnit.Mocks; + +namespace TUnit.Mocks.Tests; + +// Regression: https://github.com/thomhurst/TUnit/issues/6263 +// When a derived interface hides a base property/indexer with `new` and a DIFFERENT accessor set +// (e.g. base { get; }, derived new { get; set; }), the two slots are distinct. The shared impl holds +// the merged accessors, but each explicit wrapper forward must emit only the accessors ITS slot +// declares — otherwise the forward adds an accessor the interface lacks and the build fails with +// CS0550. Both asymmetry directions are covered (adding and dropping an accessor in the derived slot). + +#region Test interfaces + +// Issue's exact case: base get-only, derived adds a setter. +public interface IGetOnlyBase +{ + string SomeProperty { get; } +} + +public interface IAddSetterDerived : IGetOnlyBase +{ + new string SomeProperty { get; set; } +} + +// Reverse asymmetry: base read/write, derived drops the setter. +public interface IReadWriteBase +{ + string Prop { get; set; } +} + +public interface IDropSetterDerived : IReadWriteBase +{ + new string Prop { get; } +} + +// Asymmetric indexer: base get-only, derived adds a setter. +public interface IGetOnlyIndexerBase +{ + int this[int index] { get; } +} + +public interface IAddSetterIndexerDerived : IGetOnlyIndexerBase +{ + new int this[int index] { get; set; } +} + +#endregion + +public class Issue6263Tests +{ + [Test] + public async Task Mocking_Asymmetric_New_Hidden_Property_Compiles() + { + // Before the fix this file failed to compile: CS0550 'IAddSetterDerivedMock.IGetOnlyBase + // .SomeProperty.set' adds an accessor not found in interface member 'IGetOnlyBase.SomeProperty'. + var mock = IAddSetterDerived.Mock(); + await Assert.That(mock).IsNotNull(); + } + + [Test] + public async Task AddedSetter_Getter_Forwards_Through_Both_Slots() + { + var mock = IAddSetterDerived.Mock(); + mock.SomeProperty.Returns("configured"); + + // The base slot is get-only; only the derived slot exposes the setter. + await Assert.That(((IAddSetterDerived)mock).SomeProperty).IsEqualTo("configured"); + await Assert.That(((IGetOnlyBase)mock).SomeProperty).IsEqualTo("configured"); + + // Setter exists on the derived slot only — must not throw / must compile. + ((IAddSetterDerived)mock).SomeProperty = "x"; + } + + [Test] + public async Task DroppedSetter_Setter_Still_Reachable_Through_Base_Slot() + { + // Reverse direction: derived slot is get-only, base slot keeps the setter. + var mock = IDropSetterDerived.Mock(); + mock.Prop.Returns("configured"); + + await Assert.That(((IDropSetterDerived)mock).Prop).IsEqualTo("configured"); + await Assert.That(((IReadWriteBase)mock).Prop).IsEqualTo("configured"); + + // Setter exists on the base slot only. + ((IReadWriteBase)mock).Prop = "y"; + } + + [Test] + public async Task Asymmetric_New_Hidden_Indexer_Forwards_Through_Both_Slots() + { + var mock = IAddSetterIndexerDerived.Mock(); + mock.Item(0).Returns(100); + + await Assert.That(((IAddSetterIndexerDerived)mock)[0]).IsEqualTo(100); + await Assert.That(((IGetOnlyIndexerBase)mock)[0]).IsEqualTo(100); + + // Setter on the derived slot only. + ((IAddSetterIndexerDerived)mock)[0] = 5; + } +} From 9807ab167a9d6de478ed82225872e268d79aebc4 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:04:53 +0100 Subject: [PATCH 18/18] fix: honor OverloadResolutionPriority on net8 consumers (#6276, #6280) (#6282) * fix: honor OverloadResolutionPriority on net8 consumers (#6276, #6280) TUnit's Assert.That(...) overloads are disambiguated with [OverloadResolutionPriority], which is only honored by C# 13+. Projects targeting net8.0 (and earlier) default to C# 12, which silently ignores the attribute, so Assert.That binds to the generic catch-all overload instead of the typed collection/dictionary overload. The typed surface (All, Count, ContainsKey, ...) then disappears and calls fail to compile (CS0411/CS0121). net9.0/net10.0 default to C# 13/14, so they were unaffected. PR #2437 already set latest to address this, but it lived in the package .targets. The SDK assigns the target-framework default LangVersion (e.g. 12.0 for net8.0) during the .targets phase, so a .targets default guarded by Condition="'$(LangVersion)' == ''" never fires. Move the default to the package .props (imported earlier, before the SDK default) so it actually wins, while still letting consumers override LangVersion explicitly. Also remove the #if NET9_0_OR_GREATER gate from ImplicitConversionEqualityExtensions (a partial band-aid for the same root cause, issue #5765) and the matching test gates, restoring the implicit-conversion IsEqualTo / collection-overload-resolution coverage on net8.0. The JsonElement.DeepEquals gate stays (genuine net9+ BCL API), as do the Mocks ref-struct (allows ref struct) gates. Validated end to end with a packed net8 consumer: forced C#12 reproduces CS0411; the props default builds clean. net8 test build green (Issue5720 15/15, CollectionOverloadResolution 47/47). * test: update net8 PublicAPI snapshot for restored typed Assert.That overloads Dropping the #5765 #if NET9 gate restored IsEqualTo and IsNotEqualTo on net8, changing the net8 public API surface. --- TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs | 4 ---- .../CollectionOverloadResolutionTests.cs | 2 -- .../ImplicitConversionEqualityExtensions.cs | 9 +++------ TUnit.Assertions/TUnit.Assertions.props | 12 ++++++++++++ TUnit.Engine/TUnit.Engine.props | 12 ++++++++++++ TUnit.Engine/TUnit.Engine.targets | 5 ++--- ...Library_Has_No_API_Changes.DotNet8_0.verified.txt | 6 ++++++ TUnit/TUnit.props | 12 ++++++++++++ TUnit/TUnit.targets | 5 ++--- 9 files changed, 49 insertions(+), 18 deletions(-) diff --git a/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs b/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs index eb28eb2cbd..7081355ec3 100644 --- a/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs +++ b/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs @@ -1,5 +1,3 @@ -// Gated to match ImplicitConversionEqualityExtensions.cs — see issue #5765. -#if NET9_0_OR_GREATER namespace TUnit.Assertions.Tests.Bugs; /// @@ -193,5 +191,3 @@ await Assert.That(assertionException.InnerException!.Message).StartsWith( $"No implicit conversion operator from '{typeof(UnrelatedType)}' to '{typeof(string)}' was found."); } } - -#endif diff --git a/TUnit.Assertions.Tests/CollectionOverloadResolutionTests.cs b/TUnit.Assertions.Tests/CollectionOverloadResolutionTests.cs index 910f76f688..bc9e6c0a10 100644 --- a/TUnit.Assertions.Tests/CollectionOverloadResolutionTests.cs +++ b/TUnit.Assertions.Tests/CollectionOverloadResolutionTests.cs @@ -1,4 +1,3 @@ -#if NET9_0_OR_GREATER using System.Collections; using System.Collections.Concurrent; using System.Collections.Frozen; @@ -393,4 +392,3 @@ public async Task NullableIReadOnlyCollection_ResolvesToCollectionAssertion() await Assert.That(collection).Contains(1); } } -#endif diff --git a/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs b/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs index b91c0e0486..70bdb4ed0e 100644 --- a/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs +++ b/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs @@ -1,8 +1,6 @@ -// Gated to .NET 9+ because these overloads rely on [OverloadResolutionPriority] to -// lose to the source-generated single-generic IsEqualTo / IsNotEqualTo on same-type -// calls, and that attribute is silently dropped on net8.0 / netstandard2.0 (Polyfill -// does not supply it), causing CS0121. See issue #5765. -#if NET9_0_OR_GREATER +// These overloads rely on [OverloadResolutionPriority] (honored only by C# 13+) to lose to the +// source-generated same-type IsEqualTo / IsNotEqualTo. TUnit raises consumer LangVersion so the +// attribute is honored on every target (see TUnit.Assertions.props). Issues #5765, #6276, #6280. using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Reflection; @@ -151,4 +149,3 @@ internal static class ImplicitConversionCache return null; } } -#endif diff --git a/TUnit.Assertions/TUnit.Assertions.props b/TUnit.Assertions/TUnit.Assertions.props index 6525bb1f7b..6e553dc80c 100644 --- a/TUnit.Assertions/TUnit.Assertions.props +++ b/TUnit.Assertions/TUnit.Assertions.props @@ -1,6 +1,18 @@ + + + latest + + true diff --git a/TUnit.Engine/TUnit.Engine.props b/TUnit.Engine/TUnit.Engine.props index 70cd800cd9..296dc59a7a 100644 --- a/TUnit.Engine/TUnit.Engine.props +++ b/TUnit.Engine/TUnit.Engine.props @@ -20,6 +20,18 @@ true + + + latest + + 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 18eb3060a9..010201b3c4 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 @@ -4299,6 +4299,9 @@ namespace .Extensions { public static . IsEqualTo(this . source, TValue? expected, [.("expected")] string? expectedExpression = null) { } public static . IsEqualTo(this . source, TValue? expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } + [.("Looks up implicit conversion operators via reflection. Trimming may remove user-d" + + "efined operators.")] + public static . IsEqualTo(this . source, TOther? expected, [.("expected")] string? expectedExpression = null) { } } public static class EquatableAssertionExtensions { @@ -5225,6 +5228,9 @@ namespace .Extensions public static class NotEqualsAssertionExtensions { public static . IsNotEqualTo(this . source, TValue notExpected, .? comparer = null, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null) { } + [.("Looks up implicit conversion operators via reflection. Trimming may remove user-d" + + "efined operators.")] + public static . IsNotEqualTo(this . source, TOther? notExpected, [.("notExpected")] string? notExpectedExpression = null) { } } public static class NotEquivalentToAssertionExtensions { diff --git a/TUnit/TUnit.props b/TUnit/TUnit.props index 62e88b551b..01fdd0aea8 100644 --- a/TUnit/TUnit.props +++ b/TUnit/TUnit.props @@ -17,6 +17,18 @@ true + + + latest + + \ No newline at end of file