+semver:minor - feat(mocks): runtime auto-stubs for interfaces the source generator cannot see - #6519
Conversation
…urce generator cannot see A loose-mode mock member that must produce an interface with no source-generated factory — most notably a generic method like IFeatures.Get<T>() invoked inside a third-party SDK with a T that is internal to that SDK, unnameable by the test assembly — fell through to null, surfacing as an NRE deep in SDK code (#6514). Runtime-proxy libraries handle this via Castle auto-substitution, and its absence was a structural migration blocker. The engine's auto-mock fallback now emits a functional stub at runtime when the registry has no factory: a Reflection.Emit type in a dynamic assembly named DynamicProxyGenAssembly2 carrying Castle DynamicProxy's well-known public key, so the InternalsVisibleTo grants SDKs already extend for NSubstitute/Moq compatibility apply to TUnit.Mocks too. Dynamic assemblies are never strong-name verified, so the public key alone satisfies the grant. Stubs are recursive with NSubstitute-style defaults — empty strings, completed tasks, empty collections, zeroed value types, further stubs (or a real configurable Mock<T> when a generated factory exists) for interface members — properties round-trip set values, and member results are cached for stable identity. Generic interface methods are supported, including constraint re-emission. Not configurable or verifiable: their types cannot be named by the test. Guards: loose mode only; RuntimeFeature.IsDynamicCodeSupported (inert on Native AOT, retaining the previous defaults); opt-out via TUnitMocksSettings.RuntimeAutoStubs; emission failures (no IVT grant, static abstracts, by-ref returns) are cached misses that fall back to the previous behavior. netstandard2.0 keeps a no-op implementation. Fixes #6514
Greptile SummaryRuntime auto-stubs now provide loose-mode defaults for interfaces unavailable to source generation.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains.
|
| Filename | Overview |
|---|---|
| src/TUnit.Mocks/RuntimeStubs/RuntimeStub.cs | Stores property and indexer state and caches defaults by member slot and closed return-type identity, resolving the previously reported generic-instantiation collision. |
| src/TUnit.Mocks/RuntimeStubs/RuntimeStubGenerator.cs | Emits cached runtime implementations for supported closed interfaces, including generic method signatures, constraints, accessors, events, and out-parameter initialization. |
| src/TUnit.Mocks/RuntimeStubs/RuntimeStubDefaults.cs | Produces recursive mocks or stubs and conventional defaults for strings, tasks, collections, arrays, nullable types, and value types. |
| src/TUnit.Mocks/MockEngine.cs | Adds runtime stubs to loose auto-mock fallback and keys the engine cache by member name and exact return-type identity. |
| tests/TUnit.Mocks.Tests/Issue6514Tests.cs | Covers inaccessible interfaces, recursive defaults, settings and platform guards, generic-instantiation isolation, identity caching, and stateful properties and indexers. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Loose mock member call] --> B{Generated mock factory exists?}
B -->|Yes| C[Return configurable generated mock]
B -->|No| D{Runtime auto-stubs enabled and dynamic code supported?}
D -->|No| E[Return previous default value]
D -->|Yes| F[Emit or reuse interface stub type]
F --> G[Create and cache stub per member and return type]
G --> H[Return recursive default or stored property/indexer value]
Reviews (9): Last reviewed commit: "fix(mocks): preserve custom modifiers on..." | Re-trigger Greptile
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 722f6f2571
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| protected object? GetReturnValue(int slot, Type returnType) | ||
| => _returnCache.GetOrAdd(slot, static (_, t) => RuntimeStubDefaults.GetDefault(t), returnType); |
There was a problem hiding this comment.
Keep null defaults out of the concurrent cache
When a runtime stub member returns an ordinary class, delegate, nullable value, or another unsupported reference type, RuntimeStubDefaults.GetDefault returns null, but ConcurrentDictionary.GetOrAdd rejects null values and throws ArgumentNullException. Thus loose stubs throw instead of returning the documented default; use a sentinel or bypass caching when the computed value is null.
Useful? React with 👍 / 👎.
| protected object? GetReturnValue(int slot, Type returnType) | ||
| => _returnCache.GetOrAdd(slot, static (_, t) => RuntimeStubDefaults.GetDefault(t), returnType); |
There was a problem hiding this comment.
Include the closed return type in the cache key
For an emitted generic member such as T Get<T>(), every constructed invocation shares the same numeric slot. After Get<int>() caches a boxed integer, a later Get<string>() retrieves that value and the emitted unbox.any/cast fails with InvalidCastException. Key the cache by both slot and the runtime return type so different generic instantiations retain independent defaults.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Review
Clever fix for #6514 — reusing Castle DynamicProxy's well-known public key to piggyback on SDKs' existing InternalsVisibleTo grants is a neat way to reach unnameable internal types without needing per-SDK configuration. AOT/trimming guards, the opt-out flag, and the docs are all solid.
Two correctness issues, one already partially flagged by Greptile:
1. Generic-method return cache collides across type arguments (confirmed, same as Greptile's finding)
RuntimeStub.GetReturnValue(int slot, Type returnType) (RuntimeStub.cs:99-100) keys the cache by slot alone:
protected object? GetReturnValue(int slot, Type returnType)
=> _returnCache.GetOrAdd(slot, static (_, t) => RuntimeStubDefaults.GetDefault(t), returnType);RuntimeStubGenerator explicitly supports generic methods on the stubbed interface (constraint re-emission, DefineGenericParameters, etc. in RuntimeStubGenerator.cs:490-536), and each generic method gets one fixed slot. If a single stub instance invokes that method twice with different type arguments (e.g. Convert<int>() then Convert<string>()), the second call reuses the first call's cached boxed value and Unbox_Any throws InvalidCastException — the generic-method support is untested for this exact case (Issue6514Tests only exercises Get<T>() on the source-generated mock of IStubFeatures, never a generic method declared on a runtime-stubbed interface).
Suggested fix: key the cache by (int Slot, Type ReturnType) instead of int alone — e.g. ConcurrentDictionary<(int, Type), object?>. That preserves per-instantiation identity stability (the stated goal) while eliminating the collision, and is a minimal change to the existing structure. Please also add a test that invokes a stubbed generic method with two different type arguments on the same stub instance.
2. Unsynchronized ModuleBuilder/TypeBuilder access under TUnit's parallel-by-default execution
EmitStubType (RuntimeStubGenerator.cs:349-425) calls module.DefineType(...) / tb.CreateType() with no synchronization beyond the ConcurrentDictionary.GetOrAdd on _stubTypes. GetOrAdd's factory can run concurrently for different keys — so two tests running in parallel that each first-touch a distinct never-before-stubbed interface will call into EmitStubType on the same shared ModuleBuilder from different threads simultaneously.
ModuleBuilder.DefineType/TypeBuilder.CreateType are documented as not thread-safe on coreclr without external synchronization (see dotnet/runtime#64094, "Generation of dynamic types with multiple threads ... causes runtime corruption"). Notably, Castle DynamicProxy — whose identity this code deliberately impersonates — wraps its own ModuleScope.DefineType in a lock for exactly this reason (castleproject/Core#399); this PR borrows Castle's assembly identity but not its concurrency safeguard. Given TUnit tests run in parallel by default, this looks reachable in normal use, not just a theoretical edge case.
Suggested fix: wrap the type-definition/creation section of EmitStubType (or at minimum module.DefineType(...) through tb.CreateType()) in a static lock, matching Castle's approach.
Everything else — the defaults table, out-parameter zeroing, recursive stub/mock preference order in RuntimeStubDefaults.GetDefault, and the opt-out test — looks correct and well covered.
Review finding (#6519): a generic member like T Get<T>() on a runtime-stubbed interface shares one member slot across every instantiation, so the per-slot default cache handed Get<string>() the boxed value cached by Get<int>() and the emitted unbox/cast threw InvalidCastException. The cache key now pairs the slot with the closed return type observed at the call; property slots are unaffected (their type is constant) and same-instantiation identity stays stable.
|
Both P1s reviewed: Generic return cache conflation — valid, fixed in 9bba13e. "GetOrAdd rejects null values" — not correct, no change. |
There was a problem hiding this comment.
Review
Overall this is a well-scoped, carefully-guarded feature: gated behind RuntimeFeature.IsDynamicCodeSupported (inert on AOT), a documented opt-out, cached emission with a sane try/catch-to-null-on-miss fallback, and solid generic-constraint re-emission for the Get<T>() case the issue is actually about. The two P1s from the earlier review round (generic-instantiation cache conflation, GetOrAdd-null claim) both look correctly resolved in the current diff — the return cache is now keyed by (slot, closedReturnType) and there's a regression test for it (Stub_Generic_Method_Keeps_Instantiations_Separate).
One correctness issue I think is worth fixing before merge:
Indexer properties ignore their index argument and share a single cached value.
RuntimeStubGenerator.EmitAccessor (src/TUnit.Mocks/RuntimeStubs/RuntimeStubGenerator.cs:314-341) and EmitReturn (:362-394) key a property's cached value purely by slot — the emitted IL for a getter never loads the index parameter(s) onto the stack, and the setter only ever stores the last argument (the value) via SetPropertyValueMethod at that same fixed slot (:324-333). IsSupported (:189-207) only rejects static-abstract members and by-ref returns — it doesn't flag indexers, so an interface with an indexer is still considered "supported" and gets a stub silently emitted.
Concretely, for an interface with TValue this[TKey key] { get; set; } (e.g. IDictionary<,>-shaped interfaces, or something like ASP.NET's IHeaderDictionary — exactly the kind of HTTP "features" interface this PR's own motivating issue is about):
stub["A"] = valueA;
stub["B"] = valueB;
stub["A"]; // returns valueB, not valueA — same slot, index ignoredand for an unset indexer, stub[key1] and stub[key2] return the same cached default instance regardless of key. This is silent — it doesn't throw or fall back to the documented null/previous-default behavior, so it's a plausible source of confusing test failures for exactly the SDK-interface scenarios this feature targets.
Given the existing pattern in the file (reject unsupported shapes in IsSupported and let them fall back to the previous null-returning behavior, as already done for static-abstract members and by-ref returns), I'd suggest adding a check there for indexers (property.GetIndexParameters().Length > 0) rather than trying to key the cache by argument values — that keeps the fix small and consistent with how every other unsupported shape in this emitter is already handled, and it's a safe fallback since loose-mode null is already an accepted (if less convenient) outcome elsewhere in this design.
Everything else — the module/type caching, the DynamicProxyGenAssembly2 identity trick, the generic constraint re-emission, the AOT/netstandard2.0 fallback split — looks solid and well-tested. Nice work on the fast turnaround on the earlier review round.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9bba13e66d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (definition == typeof(ValueTask<>)) | ||
| { | ||
| return Activator.CreateInstance(type, GetDefault(typeArgs[0])); |
There was a problem hiding this comment.
Construct ValueTask without ambiguous overload binding
When T is an ordinary reference type for which GetDefault(T) returns null, such as a sealed DTO, this reflective construction must choose between ValueTask<T>(T) and ValueTask<T>(Task<T>). Since null matches both unrelated parameter types, the default binder throws AmbiguousMatchException, so invoking a runtime-stub member returning ValueTask<Dto> fails instead of returning a completed task containing null. Select the constructor whose parameter is exactly T, or use a closed generic helper.
Useful? React with 👍 / 👎.
…alueTask default construction Review findings (#6519): Indexers: the emitted accessors forwarded only the member slot, so stub[1] = x made stub[2] return x and every index observed the last write. The emitted IL now boxes the index arguments into an object?[] and state lives in a per-(slot, structural index key) map; defaults stay index-independent for stable identity. Indexers with by-ref / ref-struct / pointer index parameters (which cannot be boxed) keep the previous slot-level behavior. ValueTask<T> defaults: ValueTask<T> has both (T) and (Task<T>) constructors, and a null inner default (reference-typed T) matches either, making Activator.CreateInstance ambiguous. The constructor is now selected explicitly by parameter type.
|
Second review round — both P2s verified and fixed in 5cae648: Indexer state keyed by index arguments — valid. Emitted accessors now box the index arguments into an
Suites: 1195/1195 net10.0, 1172/1172 net8.0. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5cae64836e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Two types with identical namespace-qualified names from different assemblies collided in the auto-mock/stub cache (memberName + FullName string), so the second invocation retrieved the first type's stub and the TReturn cast threw InvalidCastException. Cache is now keyed by (memberName, Type). TryGetAutoMock (no callers) updated to match.
|
Third round — Codex P2 (stub cache keyed by Valid: Regression test emits two dynamic assemblies each declaring Suites: 1196/1196 net10.0, 1173/1173 net8.0. |
ReviewChecked this round's changes against the three prior review rounds — the generic-instantiation cache fix ( One issue from round 1 appears to have been dropped rather than fixed:
I flagged this in the first review round; the reply addressing "Both P1s" fixed the generic-cache collision and a separate Suggested fix, consistent with the private static readonly Lock _emitLock = new();
...
lock (_emitLock)
{
var module = EnsureModule();
...
return tb.CreateType();
}This keeps the existing Everything else in this round — Type-identity cache keys across all call sites in |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 89c6d6bf54
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| var cacheKey = (memberName, typeof(TReturn)); | ||
| var autoMock = AutoMockCache.GetOrAdd(cacheKey, _ => | ||
| { | ||
| MockRegistry.TryCreateAutoMock(typeof(TReturn), Behavior, out var m); |
There was a problem hiding this comment.
Route typed cache misses through runtime stubs
When a generated non-generic member has 1–8 arguments and returns an interface without a generated factory—for example, IServiceProvider Resolve(int id), since MemberDiscovery.GetAutoMockFactoryMethod excludes System.* interfaces—the generator selects this typed handler. Its cache factory only queries MockRegistry, so a miss still returns null and never reaches the new RuntimeStubGenerator fallback used by the object-array handler. Apply the runtime-stub fallback to every typed arity as well, preferably through the shared helper.
Useful? React with 👍 / 👎.
…ugh stubs Review round 4: - EmitStubType now runs under a static lock: ConcurrentDictionary.GetOrAdd only de-duplicates per key, so distinct interfaces first-touched in parallel reached ModuleBuilder.DefineType/TypeBuilder.CreateType on the shared module concurrently (unsafe on coreclr, dotnet/runtime#64094). Cache hits stay lock-free. - The eight typed cache-miss handlers (1-8 args) in MockEngine.Typed.cs now call TryGetLooseAutoMockResult instead of an inlined registry-only lookup, so members returning interfaces without a generated factory (e.g. System.*) reach the runtime-stub fallback like the object-array handler.
Updated [defaultdocumentation.console](https://github.com/Doraku/DefaultDocumentation) from 1.2.2 to 1.2.5. <details> <summary>Release notes</summary> _Sourced from [defaultdocumentation.console's releases](https://github.com/Doraku/DefaultDocumentation/releases)._ ## 1.2.5 ## Bug fixes - fixed nint and nuint handling (#255) - replaced HTML numeric entities with literal Unicode arrows - [api nuget package](https://www.nuget.org/packages/DefaultDocumentation.Api/1.2.5) - [markdown nuget package](https://www.nuget.org/packages/DefaultDocumentation.Markdown/1.2.5) - [msbuild task nuget package](https://www.nuget.org/packages/DefaultDocumentation/1.2.5) - [dotnet tool nuget package](https://www.nuget.org/packages/DefaultDocumentation.Console/1.2.5) ## 1.2.4 - fixed msbuild task issue (#237) - [api nuget package](https://www.nuget.org/packages/DefaultDocumentation.Api/1.2.4) - [markdown nuget package](https://www.nuget.org/packages/DefaultDocumentation.Markdown/1.2.4) - [msbuild task nuget package](https://www.nuget.org/packages/DefaultDocumentation/1.2.4) - [dotnet tool nuget package](https://www.nuget.org/packages/DefaultDocumentation.Console/1.2.4) ## 1.2.3 - added net10 support for DefaultDocumentation.Console - fixed ValueType appearing in definition constrains - [api nuget package](https://www.nuget.org/packages/DefaultDocumentation.Api/1.2.3) - [markdown nuget package](https://www.nuget.org/packages/DefaultDocumentation.Markdown/1.2.3) - [msbuild task nuget package](https://www.nuget.org/packages/DefaultDocumentation/1.2.3) - [dotnet tool nuget package](https://www.nuget.org/packages/DefaultDocumentation.Console/1.2.3) Commits viewable in [compare view](https://github.com/Doraku/DefaultDocumentation/compare/1.2.2...1.2.5). </details> Updated [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 18.6.0 to 18.8.1. <details> <summary>Release notes</summary> _Sourced from [Microsoft.NET.Test.Sdk's releases](https://github.com/microsoft/vstest/releases)._ ## 18.8.1 ## What's Changed * Fix protocol negotiation timeout when STJ reflection is disabled (18.8.1) by @nohwnd in https://github.com/microsoft/vstest/pull/16281 **Full Changelog**: https://github.com/microsoft/vstest/compare/v18.8.0...v18.8.1 ## 18.8.0 ## What's Changed * Migrate from Newtonsoft.Json to System.Text.Json / Jsonite (merge to main) by @nohwnd in https://github.com/microsoft/vstest/pull/15687 - For more detail refer to https://devblogs.microsoft.com/dotnet/vs-test-is-removing-its-newtonsoft-json-dependency/ * Create source-only filter package by @Youssef1313 in https://github.com/microsoft/vstest/pull/15638 * Add ARM64 msdia140.dll support to test platform packages by @nohwnd in https://github.com/microsoft/vstest/pull/15692 * Fix mutex cleanup crash on macOS/Linux by @nohwnd in https://github.com/microsoft/vstest/pull/15684 * Restrict artifact temp directory permissions on Unix by @nohwnd in https://github.com/microsoft/vstest/pull/15729 * Add support for filtering uncategorized tests with TestCategory=None by @Evangelink in https://github.com/microsoft/vstest/pull/15727 * Fix SCI binding failure in DTA hosts (main) by @nohwnd in https://github.com/microsoft/vstest/pull/15724 * Fix HTML logger parallel file collision by @nohwnd in https://github.com/microsoft/vstest/pull/15435 * Improve error message when testhost cannot be found by @nohwnd in https://github.com/microsoft/vstest/pull/16053 * Fix HTML logger exception on invalid XML chars in test display names by @nohwnd in https://github.com/microsoft/vstest/pull/16051 **Full Changelog**: https://github.com/microsoft/vstest/compare/v18.7.0...v18.8.0 ## 18.7.0 ## What's Changed * Add ARM64 msdia140.dll support to test platform packages by @jamesmcroft in https://github.com/microsoft/vstest/pull/15689 * Update System.Memory from 4.5.5 to 4.6.3 by @nohwnd in https://github.com/microsoft/vstest/pull/15706 ## New Contributors * @jamesmcroft made their first contribution in https://github.com/microsoft/vstest/pull/15689 **Full Changelog**: https://github.com/microsoft/vstest/compare/v18.6.0...v18.7.0 Commits viewable in [compare view](https://github.com/microsoft/vstest/compare/v18.6.0...v18.8.1). </details> Updated [Microsoft.SourceLink.GitHub](https://github.com/dotnet/dotnet) from 10.0.300 to 10.0.301. <details> <summary>Release notes</summary> _Sourced from [Microsoft.SourceLink.GitHub's releases](https://github.com/dotnet/dotnet/releases)._ ## 10.0.301 You can build .NET 10.0 from the repository by cloning the release tag `v10.0.301` and following the build instructions in the [main README.md](https://github.com/dotnet/dotnet/blob/v10.0.301/README.md#building). Alternatively, you can build from the sources attached to this release directly. More information on this process can be found in the [dotnet/dotnet repository](https://github.com/dotnet/dotnet/blob/v10.0.301/README.md#building-from-released-sources). Attached are PGP signatures for the GitHub generated tarball and zipball. You can find the public key at https://dot.net/release-key-2023 Commits viewable in [compare view](https://github.com/dotnet/dotnet/compare/v10.0.300...v10.0.301). </details> Updated [nbgv](https://github.com/dotnet/Nerdbank.GitVersioning) from 3.7.115 to 3.10.91. <details> <summary>Release notes</summary> _Sourced from [nbgv's releases](https://github.com/dotnet/Nerdbank.GitVersioning/releases)._ ## 3.10.91 ## What's Changed * Retry file operations on access denied errors by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1408 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.10.85...v3.10.91 ## 3.10.85 ## What's Changed * Avoid writing server.json multiple times in a single pack by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1391 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.10.70...v3.10.85 ## 3.10.70 ## What's Changed ### Fixes * Fix case insensitivity for the managed engine on git worktrees, and implement for libgit2 by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1334 * Fix native heap corruption in GitPackIndexMappedReaderTests by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1360 ### Enhancements * Add prerelease property to inheriting version.json files by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1317 * Add NBGV_SetCloudBuildVersionVars property to disable cloud build variable output by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1324 * Add --what-if option to prepare-release command for simulating version changes by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1242 * Build nbgv CLI tool for .NET 9 and 10 by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1369 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.50...v3.10.70 ## 3.10.44-alpha ## What's Changed ### Fixes * Fix case insensitivity for the managed engine on git worktrees, and implement for libgit2 by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1334 ### Enhancements * Add --what-if option to prepare-release command for simulating version changes by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1242 * Add NBGV_SetCloudBuildVersionVars property to disable cloud build variable output by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1324 ### Dependency updates * chore(deps): update dependency microsoft.build.locator to 1.11.2 by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1304 * chore(deps): update dotnet monorepo by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1309 * Update dotnet monorepo by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1338 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.10.8-alpha...v3.10.44-alpha ## 3.10.8-alpha ## What's Changed * Add prerelease property to inheriting version.json files by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1317 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.50...v3.10.8-alpha ## 3.9.50 ## What's Changed * Add `versionHeightOffsetAppliesTo` property to version.json by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1279 * Fix `nbgv prepare-release` command to honor inheriting version.json files by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1281 * Automatically disable git engine for Dependabot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1284 * Add --what-if switch to nbgv tag command to preview tag names by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1287 * Auto-disable git engine for GitHub Copilot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1291 * Allow uppercase letters in pre-release version identifiers by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1293 ## New Contributors * @micheloliveira-com made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1277 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.8.118...v3.9.50 ## 3.9.37-alpha ## What's Changed * Auto-disable git engine for GitHub Copilot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1291 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.32-alpha...v3.9.37-alpha ## 3.9.32-alpha ## What's Changed * Automatically disable git engine for Dependabot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1284 * Add --what-if switch to nbgv tag command to preview tag names by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1287 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.17-alpha...v3.9.32-alpha ## 3.9.17-alpha ## What's Changed * Fix `nbgv prepare-release` command to honor inheriting version.json files by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1281 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.15-alpha...v3.9.17-alpha ## 3.9.15-alpha ## What's Changed * Add `versionHeightOffsetAppliesTo` property to version.json by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1279 ## New Contributors * @micheloliveira-com made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1277 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.8.118...v3.9.15-alpha ## 3.8.118 ## Fixes * Don't try to disable CA2243 warnings in the generated version info files for F# by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1174 * Catch a more general JsonException. by @ANGEL-OF-DEV in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * Retarget links to migrated docs by @bencemali in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * Check MSBuild items with case insensitivity by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1213 * Fix inconsistent CLI output format for GitCommitDate by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1246 * Fix version height computed as 0 when project path has non-canonical casing by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1244 * When generating the GitCommitDate field in the AssemblyInfo for F#, d… by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1253 * Only do Android version check on applications by @dotMorten in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 * Fix `nbgv set-version` to write to the best version.json file in scope by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1264 ## Enhancements * Add msbuild-provided prerelease identifiers by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1153 * Add support for stamping version on server.json for MCP servers with 0.0.0-placeholder replacement by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1270 and by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1271 * Add option to set / skip CloudBuildNumber by @MattKotsenas in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1190 * Add Central Package Management (CPM) support to nbgv install command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * Add --public-release argument to nbgv get-version command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1245 * Invoke PrivateP2PCaching.proj fewer times by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1263 ## Other changes * Update dependency Cake.Core to v5 by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1183 ## New Contributors * @ANGEL-OF-DEV made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * @bencemali made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * @Copilot made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * @dotMorten made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 * @emmanuel-ferdman made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1145 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.7.115...v3.8.118 ## 3.8.106-alpha ## What's Changed ### Enhancements * Add option to set / skip CloudBuildNumber by @MattKotsenas in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1190 * Add Central Package Management (CPM) support to nbgv install command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * Add --public-release argument to nbgv get-version command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1245 * Invoke PrivateP2PCaching.proj fewer times by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1263 ### Fixes * Catch a more general JsonException. by @ANGEL-OF-DEV in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * Retarget links to migrated docs by @bencemali in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * Check MSBuild items with case insensitivity by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1213 * Fix inconsistent CLI output format for GitCommitDate by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1246 * Fix version height computed as 0 when project path has non-canonical casing by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1244 * When generating the GitCommitDate field in the AssemblyInfo for F#, d… by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1253 * Only do Android version check on applications by @dotMorten in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 * Fix `nbgv set-version` to write to the best version.json file in scope by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1264 ### Other changes * Update dependency Cake.Core to v5 by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1183 ## New Contributors * @ANGEL-OF-DEV made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * @bencemali made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * @Copilot made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * @dotMorten made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.8.38-alpha...v3.8.106-alpha ## 3.8.38-alpha ## Fixes * Don't try to disable CA2243 warnings in the generated version info files for F# by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1174 ## Enhancements * Add msbuild-provided prerelease identifiers by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1153 ## New Contributors * @emmanuel-ferdman made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1145 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.7.115...v3.8.38-alpha Commits viewable in [compare view](https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.7.115...v3.10.91). </details> Updated [Nerdbank.GitVersioning](https://github.com/dotnet/Nerdbank.GitVersioning) from 3.7.115 to 3.10.91. <details> <summary>Release notes</summary> _Sourced from [Nerdbank.GitVersioning's releases](https://github.com/dotnet/Nerdbank.GitVersioning/releases)._ ## 3.10.91 ## What's Changed * Retry file operations on access denied errors by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1408 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.10.85...v3.10.91 ## 3.10.85 ## What's Changed * Avoid writing server.json multiple times in a single pack by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1391 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.10.70...v3.10.85 ## 3.10.70 ## What's Changed ### Fixes * Fix case insensitivity for the managed engine on git worktrees, and implement for libgit2 by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1334 * Fix native heap corruption in GitPackIndexMappedReaderTests by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1360 ### Enhancements * Add prerelease property to inheriting version.json files by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1317 * Add NBGV_SetCloudBuildVersionVars property to disable cloud build variable output by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1324 * Add --what-if option to prepare-release command for simulating version changes by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1242 * Build nbgv CLI tool for .NET 9 and 10 by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1369 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.50...v3.10.70 ## 3.10.44-alpha ## What's Changed ### Fixes * Fix case insensitivity for the managed engine on git worktrees, and implement for libgit2 by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1334 ### Enhancements * Add --what-if option to prepare-release command for simulating version changes by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1242 * Add NBGV_SetCloudBuildVersionVars property to disable cloud build variable output by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1324 ### Dependency updates * chore(deps): update dependency microsoft.build.locator to 1.11.2 by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1304 * chore(deps): update dotnet monorepo by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1309 * Update dotnet monorepo by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1338 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.10.8-alpha...v3.10.44-alpha ## 3.10.8-alpha ## What's Changed * Add prerelease property to inheriting version.json files by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1317 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.50...v3.10.8-alpha ## 3.9.50 ## What's Changed * Add `versionHeightOffsetAppliesTo` property to version.json by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1279 * Fix `nbgv prepare-release` command to honor inheriting version.json files by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1281 * Automatically disable git engine for Dependabot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1284 * Add --what-if switch to nbgv tag command to preview tag names by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1287 * Auto-disable git engine for GitHub Copilot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1291 * Allow uppercase letters in pre-release version identifiers by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1293 ## New Contributors * @micheloliveira-com made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1277 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.8.118...v3.9.50 ## 3.9.37-alpha ## What's Changed * Auto-disable git engine for GitHub Copilot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1291 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.32-alpha...v3.9.37-alpha ## 3.9.32-alpha ## What's Changed * Automatically disable git engine for Dependabot environments by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1284 * Add --what-if switch to nbgv tag command to preview tag names by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1287 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.17-alpha...v3.9.32-alpha ## 3.9.17-alpha ## What's Changed * Fix `nbgv prepare-release` command to honor inheriting version.json files by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1281 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.9.15-alpha...v3.9.17-alpha ## 3.9.15-alpha ## What's Changed * Add `versionHeightOffsetAppliesTo` property to version.json by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1279 ## New Contributors * @micheloliveira-com made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1277 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.8.118...v3.9.15-alpha ## 3.8.118 ## Fixes * Don't try to disable CA2243 warnings in the generated version info files for F# by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1174 * Catch a more general JsonException. by @ANGEL-OF-DEV in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * Retarget links to migrated docs by @bencemali in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * Check MSBuild items with case insensitivity by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1213 * Fix inconsistent CLI output format for GitCommitDate by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1246 * Fix version height computed as 0 when project path has non-canonical casing by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1244 * When generating the GitCommitDate field in the AssemblyInfo for F#, d… by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1253 * Only do Android version check on applications by @dotMorten in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 * Fix `nbgv set-version` to write to the best version.json file in scope by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1264 ## Enhancements * Add msbuild-provided prerelease identifiers by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1153 * Add support for stamping version on server.json for MCP servers with 0.0.0-placeholder replacement by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1270 and by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1271 * Add option to set / skip CloudBuildNumber by @MattKotsenas in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1190 * Add Central Package Management (CPM) support to nbgv install command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * Add --public-release argument to nbgv get-version command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1245 * Invoke PrivateP2PCaching.proj fewer times by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1263 ## Other changes * Update dependency Cake.Core to v5 by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1183 ## New Contributors * @ANGEL-OF-DEV made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * @bencemali made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * @Copilot made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * @dotMorten made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 * @emmanuel-ferdman made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1145 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.7.115...v3.8.118 ## 3.8.106-alpha ## What's Changed ### Enhancements * Add option to set / skip CloudBuildNumber by @MattKotsenas in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1190 * Add Central Package Management (CPM) support to nbgv install command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * Add --public-release argument to nbgv get-version command by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1245 * Invoke PrivateP2PCaching.proj fewer times by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1263 ### Fixes * Catch a more general JsonException. by @ANGEL-OF-DEV in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * Retarget links to migrated docs by @bencemali in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * Check MSBuild items with case insensitivity by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1213 * Fix inconsistent CLI output format for GitCommitDate by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1246 * Fix version height computed as 0 when project path has non-canonical casing by @Copilot in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1244 * When generating the GitCommitDate field in the AssemblyInfo for F#, d… by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1253 * Only do Android version check on applications by @dotMorten in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 * Fix `nbgv set-version` to write to the best version.json file in scope by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1264 ### Other changes * Update dependency Cake.Core to v5 by @renovate[bot] in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1183 ## New Contributors * @ANGEL-OF-DEV made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1191 * @bencemali made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1193 * @Copilot made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1208 * @dotMorten made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1256 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.8.38-alpha...v3.8.106-alpha ## 3.8.38-alpha ## Fixes * Don't try to disable CA2243 warnings in the generated version info files for F# by @Numpsy in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1174 ## Enhancements * Add msbuild-provided prerelease identifiers by @AArnott in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1153 ## New Contributors * @emmanuel-ferdman made their first contribution in https://github.com/dotnet/Nerdbank.GitVersioning/pull/1145 **Full Changelog**: https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.7.115...v3.8.38-alpha Commits viewable in [compare view](https://github.com/dotnet/Nerdbank.GitVersioning/compare/v3.7.115...v3.10.91). </details> Updated [NexusLabs.Framework.Analyzers](https://github.com/ncosentino/NexusLabs.Framework) from 0.2.6 to 0.2.9. <details> <summary>Release notes</summary> _Sourced from [NexusLabs.Framework.Analyzers's releases](https://github.com/ncosentino/NexusLabs.Framework/releases)._ No release notes found for this version range. Commits viewable in [compare view](https://github.com/ncosentino/NexusLabs.Framework/commits). </details> Updated [TUnit](https://github.com/thomhurst/TUnit) from 1.53.0 to 1.63.0. <details> <summary>Release notes</summary> _Sourced from [TUnit's releases](https://github.com/thomhurst/TUnit/releases)._ ## 1.63.0 <!-- Release notes generated using configuration in .github/release.yml at v1.63.0 --> ## What's Changed ### Other Changes * fix(mocks): dispatch abstract indexers through the engine instead of calling base by @thomhurst in https://github.com/thomhurst/TUnit/pull/6517 * feat(mocks): experimental compile-time internals access (#6514 Tier 2) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6520 * feat(mocks): make the async-factory Returns alias available below net9.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6518 * +semver:minor - feat(mocks): runtime auto-stubs for interfaces the source generator cannot see by @thomhurst in https://github.com/thomhurst/TUnit/pull/6519 ### Dependencies * chore(deps): update tunit to 1.62.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6508 * chore(deps): update dependency mockolate to 3.4.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6512 * chore(deps): update dependency cliwrap to 3.10.4 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6513 * chore(deps): update dependency stackexchange.redis to 3.0.25 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6522 * chore(deps): update dependency brace-expansion to v5.0.9 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6523 * chore(deps): update dependency microsoft.build.utilities.core to v18 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6525 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.62.0...v1.63.0 ## 1.62.0 <!-- Release notes generated using configuration in .github/release.yml at v1.62.0 --> ## What's Changed ### Other Changes * fix(docs): make Mermaid lifecycle diagrams readable by @thomhurst in https://github.com/thomhurst/TUnit/pull/6485 * fix(mocks): strip nullable annotation from constructor dispatch patterns by @thomhurst in https://github.com/thomhurst/TUnit/pull/6498 * fix(mocks): skip interfaces with inaccessible abstract members by @thomhurst in https://github.com/thomhurst/TUnit/pull/6502 * feat(mocks): accept an async factory in Returns() on async members by @thomhurst in https://github.com/thomhurst/TUnit/pull/6503 * fix(mocks): report TM006 instead of CS1729 for unsubclassable classes by @thomhurst in https://github.com/thomhurst/TUnit/pull/6501 * fix(mocks): emit the setup surface into the globally-imported namespace by @thomhurst in https://github.com/thomhurst/TUnit/pull/6504 * fix(mocks): reference TUnit.Mocks once in snapshot test compilations by @thomhurst in https://github.com/thomhurst/TUnit/pull/6506 * fix(mocks): make generated identifier sanitization injective by @thomhurst in https://github.com/thomhurst/TUnit/pull/6507 ### Dependencies * chore(deps): update tunit to 1.61.38 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6479 * chore(deps): update dependency brace-expansion to v5.0.8 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6478 * chore(deps): update dependency cliwrap to 3.10.3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6482 * chore(deps): bump postcss from 8.5.10 to 8.5.22 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6480 * chore(deps): update dependency fscheck to 3.3.4 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6486 * chore(deps): update dependency minimatch to v10.2.6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6490 * chore(deps): update actions/stale action to v11 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6496 * chore(deps): update microsoft.testing to 2.3.3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6499 * chore(deps): update mstest to 4.3.3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6500 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.61.38...v1.62.0 ## 1.61.38 <!-- Release notes generated using configuration in .github/release.yml at v1.61.38 --> ## What's Changed ### Other Changes * fix: apply 'unmanaged' constraint handling to remaining source generators by @thomhurst in https://github.com/thomhurst/TUnit/pull/6474 * feat: expose data source attributes on TestContext by @thomhurst in https://github.com/thomhurst/TUnit/pull/6477 ### Dependencies * chore(deps): update tunit to 1.61.35 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6475 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.61.35...v1.61.38 ## 1.61.35 <!-- Release notes generated using configuration in .github/release.yml at v1.61.35 --> ## What's Changed ### Other Changes * fix(mocks): omit 'struct' constraint when type parameter has 'unmanaged' constraint by @thomhurst in https://github.com/thomhurst/TUnit/pull/6473 ### Dependencies * chore(deps): bump fast-uri from 3.1.2 to 3.1.4 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6466 * chore(deps): update tunit to 1.61.29 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6467 * chore(deps): update dependency verify.tool to v0.8.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6470 * chore(deps): update dependency docusaurus-plugin-llms to ^0.5.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6472 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.61.29...v1.61.35 ## 1.61.29 <!-- Release notes generated using configuration in .github/release.yml at v1.61.29 --> ## What's Changed ### Other Changes * perf: remove EnumerableAsyncProcessor dependency by @thomhurst in https://github.com/thomhurst/TUnit/pull/6465 ### Dependencies * chore(deps): bump shell-quote from 1.8.4 to 1.10.0 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6462 * chore(deps): bump body-parser from 1.20.5 to 1.20.6 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6461 * chore(deps): bump webpack-dev-server from 5.2.5 to 5.2.6 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6460 * chore(deps): update dependency microsoft.kiota.abstractions to v2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6464 * chore(deps): update tunit to 1.61.23 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6463 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.61.23...v1.61.29 ## 1.61.23 <!-- Release notes generated using configuration in .github/release.yml at v1.61.23 --> ## What's Changed ### Other Changes * fix(mocks): emit 'where T : default' for interface-constrained generic methods by @thomhurst in https://github.com/thomhurst/TUnit/pull/6458 ### Dependencies * chore(deps): update tunit to 1.61.15 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6450 * chore(deps): update actions/checkout action to v7.0.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6453 * chore(deps): update verify to 31.26.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6454 * chore(deps): update verify to 31.27.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6457 * chore(deps): update react to ^19.2.8 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6459 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.61.15...v1.61.23 ## 1.61.15 <!-- Release notes generated using configuration in .github/release.yml at v1.61.15 --> ## What's Changed ### Other Changes * feat: Allow disabling the automatic html report upload to upload-artifacts@v7 by @Crashdummyy in https://github.com/thomhurst/TUnit/pull/6447 * fix: stop retrying artifact upload on non-retryable status codes by @thomhurst in https://github.com/thomhurst/TUnit/pull/6449 ### Dependencies * chore(deps): update tunit to 1.61.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6437 * chore(deps): update verify to 31.24.3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6438 * chore(deps): update dependency opentelemetry.instrumentation.aspnetcore to 1.17.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6440 * chore(deps): update verify to 31.25.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6442 * chore(deps): update dependency docusaurus-plugin-llms to ^0.5.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6443 * chore(deps): update opentelemetry to 1.17.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6441 ## New Contributors * @Crashdummyy made their first contribution in https://github.com/thomhurst/TUnit/pull/6447 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.61.0...v1.61.15 ## 1.61.0 <!-- Release notes generated using configuration in .github/release.yml at v1.61.0 --> ## What's Changed ### Other Changes * docs: revamp README with feature showcase and auto-updating benchmarks by @thomhurst in https://github.com/thomhurst/TUnit/pull/6430 * docs: align docs homepage messaging with revamped README by @thomhurst in https://github.com/thomhurst/TUnit/pull/6431 * fix(engine): emit ECMA-335 metadata-format type names in TestMethodIdentifierProperty by @thomhurst in https://github.com/thomhurst/TUnit/pull/6433 * fix(benchmarks): make SetupTeardownTests JSON tests Native AOT compatible by @thomhurst in https://github.com/thomhurst/TUnit/pull/6434 * Organize repository into conventional .NET layout by @thomhurst in https://github.com/thomhurst/TUnit/pull/6435 ### Dependencies * chore(deps): update dependency polyfill to v11 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6418 * chore(deps): update dependency tunit.aspire to 1.6* by @thomhurst in https://github.com/thomhurst/TUnit/pull/6419 * chore(deps): update tunit to 1.6* by @thomhurst in https://github.com/thomhurst/TUnit/pull/6420 * chore(deps): update dependency polyfill to 11.0.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6421 * chore(deps): update dependency polyfill to 11.0.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6422 * chore(deps): update verify to 31.24.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6424 * chore(deps): update microsoft.build to 18.8.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6426 * chore(deps): update dependency microsoft.net.stringtools to 18.8.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6425 * chore(deps): update actions/setup-dotnet action to v6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6427 * chore(deps): bump websocket-driver from 0.7.4 to 0.7.5 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6429 * chore(deps): update opentelemetry to 1.17.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6432 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.60.0...v1.61.0 ## 1.60.0 <!-- Release notes generated using configuration in .github/release.yml at v1.60.0 --> ## What's Changed ### Other Changes * feat: cross-process test report aggregation — merged HTML report + single GitHub summary by @thomhurst in https://github.com/thomhurst/TUnit/pull/6415 ### Dependencies * chore(deps): update tunit to 1.59.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6398 * chore(deps): update verify to 31.24.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6399 * chore(deps): update microsoft.testing to 2.3.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6401 * chore(deps): update mstest to 4.3.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6402 * chore(deps): update actions/setup-node action to v7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6403 * chore(deps): update dependency microsoft.net.test.sdk to 18.8.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6404 * chore(deps): update dependency microsoft.net.test.sdk to 18.8.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6405 * chore(deps): update dependency fsharp.core to 10.1.302 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6406 * chore(deps): update dependency microsoft.templateengine.authoring.cli to v10.0.302 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6407 * chore(deps): update dependency microsoft.entityframeworkcore to 10.0.10 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6410 * chore(deps): update dependency dotnet-sdk to v10.0.302 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6409 * chore(deps): update dependency system.commandline to 2.0.10 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6412 * chore(deps): update dependency microsoft.templateengine.authoring.templateverifier to 10.0.302 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6411 * chore(deps): update microsoft.aspnetcore to 10.0.10 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6413 * chore(deps): update microsoft.extensions to 10.0.10 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6414 * chore(deps): update microsoft.extensions to 10.8.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6416 * chore(deps): update dependency polyfill to v11 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6417 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.59.0...v1.60.0 ## 1.59.0 <!-- Release notes generated using configuration in .github/release.yml at v1.59.0 --> ## What's Changed ### Other Changes * Fix typed MethodDataSource provider instances by @thomhurst in https://github.com/thomhurst/TUnit/pull/6378 * Fix instance MethodDataSource isolation by @thomhurst in https://github.com/thomhurst/TUnit/pull/6379 * fix(mocks): CS9262 in generated mock members on VS 17.14 (Roslyn 4.14) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6392 * Remove EqualTo alias documentation by @thomhurst in https://github.com/thomhurst/TUnit/pull/6396 * fix(aspnetcore): guard hosted-service stop against concurrent double Host.StopAsync by @thomhurst in https://github.com/thomhurst/TUnit/pull/6397 * Add single-item assertion chaining by @thomhurst in https://github.com/thomhurst/TUnit/pull/6395 * Improve test framework migrations by @thomhurst in https://github.com/thomhurst/TUnit/pull/6381 * Add -f/--framework support to TUnit template with .NET Framework handling by @thomhurst with @Copilot in https://github.com/thomhurst/TUnit/pull/6262 ### Dependencies * chore(deps): update tunit to 1.58.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6351 * chore(deps): update dependency tunit.core to 1.58.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6352 * chore(deps): update dependency picomatch to v4.0.5 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6354 * chore(deps): update dependency testcontainers.postgresql to 4.13.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6356 * chore(deps): update dependency testcontainers.redis to 4.13.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6357 * chore(deps): update dependency testcontainers.kafka to 4.13.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6355 * chore(deps): update dependency gitversion.tool to v6.8.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6359 * chore(deps): update dependency typescript to v7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6372 * chore(deps): update mstest to 4.3.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6374 * chore(deps): update dependency messagepack to 3.1.8 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6376 * chore(deps): update dependency opentelemetry.instrumentation.runtime to 1.16.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6380 * chore(deps): update dependency vogen to 8.0.6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6382 * chore(deps): update dependency gitversion.tool to v6.8.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6384 * chore(deps): update dependency npgsql.entityframeworkcore.postgresql to 10.0.3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6385 * chore(deps): update docusaurus to v3.10.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6386 * chore(deps): update dependency stackexchange.redis to 3.0.17 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6387 * chore(deps): update dependency dompurify to v3.4.12 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6389 * chore(deps): update dependency svgo to v4.0.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6390 * chore(deps): update dependency nsubstitute to v6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6394 * chore(deps): update verify to 31.24.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6367 * chore(deps): update microsoft.testing by @thomhurst in https://github.com/thomhurst/TUnit/pull/6369 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.58.0...v1.59.0 ## 1.58.0 <!-- Release notes generated using configuration in .github/release.yml at v1.58.0 --> ## What's Changed ### Other Changes * feat(aspire): opt-in live forwarding of resource logs into test output (#6341) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6345 * fix(aspire): fail fast on Finished-state crashes during startup (#6342) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6346 * fix(engine): keep per-test timeout token source alive through teardown (#6339) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6349 * feat(aspire): resource-diagnostics helpers + retained log buffer (#6343) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6350 * feat(aspire): surface exception detail in routed OTLP logs (#6347) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6348 ### Dependencies * chore(deps): update tunit to 1.57.17 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6344 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.57.17...v1.58.0 ## 1.57.17 <!-- Release notes generated using configuration in .github/release.yml at v1.57.17 --> ## What's Changed ### Other Changes * fix(engine): reset test cancellation token before After hooks on timeout path (#6339) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6340 ### Dependencies * chore(deps): update tunit to 1.57.14 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6336 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.57.14...v1.57.17 ## 1.57.14 <!-- Release notes generated using configuration in .github/release.yml at v1.57.14 --> ## What's Changed ### Other Changes * fix(engine): apply --treenode-filter to --list-tests by @thomhurst in https://github.com/thomhurst/TUnit/pull/6334 * feat(aspire): dump resource error logs on test failure + warn on missing telemetry wiring by @thomhurst in https://github.com/thomhurst/TUnit/pull/6323 ### Dependencies * chore(deps): update dependency stackexchange.redis to 3.0.11 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6324 * chore(deps): update tunit to 1.57.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6322 * chore(deps): update dependency brace-expansion to v5.0.7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6326 * chore(deps): update dependency polyfill to 10.11.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6327 * chore(deps): update dependency polyfill to 10.11.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6329 * chore(deps): update dependency polyfill to 10.11.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6330 * chore(deps): update dependency polyfill to 10.11.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6331 * chore(deps): update dependency serialize-javascript to v7.0.7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6333 * chore(deps): update dependency gitversion.tool to v6.8.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6335 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.57.0...v1.57.14 ## 1.57.0 <!-- Release notes generated using configuration in .github/release.yml at v1.57.0 --> ## What's Changed ### Other Changes * perf(sourcegen): consolidate per-file ModuleInitializers into merged .cctor (#6226) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6286 * fix: resolve CS0121 IsEqualTo ambiguity on .NET 8 SDK (#6296) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6313 * chore(docs): apply Codacy markdownlint fixes by @thomhurst in https://github.com/thomhurst/TUnit/pull/6284 * fix(mocks): generate mock for qualified-name X.Mock() calls (#6298) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6314 ### Dependencies * chore(deps): update tunit to 1.56.35 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6306 * chore(deps): update dependency stackexchange.redis to 3.0.7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6307 * chore(deps): update dependency opentelemetry.instrumentation.http to 1.16.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6308 * chore(deps): update dependency opentelemetry.instrumentation.aspnetcore to 1.16.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6309 * chore(deps): update dependency qs to v6.15.3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6310 * chore(deps): update dependency polyfill to 10.11.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6312 * chore(deps): update dependency polyfill to 10.11.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6311 * chore(deps): bump http-proxy-middleware from 2.0.9 to 2.0.10 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6303 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.56.35...v1.57.0 ## 1.56.35 <!-- Release notes generated using configuration in .github/release.yml at v1.56.35 --> ## What's Changed ### Other Changes * feat(aspire): tear down Aspire on test-run abort via session cancellation token by @thomhurst in https://github.com/thomhurst/TUnit/pull/6292 ### Dependencies * chore(deps): update tunit to 1.56.25 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6294 * chore(deps): update dependency microsoft.visualstudio.threading.analyzers to v18 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6297 * chore(deps): update dependency microsoft.net.test.sdk to 18.7.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6300 * chore(deps): update dependency microsoft.playwright to 1.61.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6302 * chore(deps): update actions/cache action to v6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6301 * chore(deps): update dependency azure.storage.blobs to 12.29.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6304 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.56.25...v1.56.35 ## 1.56.25 <!-- Release notes generated using configuration in .github/release.yml at v1.56.25 --> ## What's Changed ### Other Changes * feat(aspire): actionable diagnostics when resources fail to start by @thomhurst in https://github.com/thomhurst/TUnit/pull/6293 ### Dependencies * chore(deps): update tunit to 1.56.18 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6285 * chore(deps): update aspire to 13.4.6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6287 * chore(deps): update dependency mockolate to 3.3.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6291 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.56.18...v1.56.25 ## 1.56.18 <!-- Release notes generated using configuration in .github/release.yml at v1.56.18 --> ## What's Changed ### Other Changes * fix(mocks): mock deep interface hierarchies (#6264) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6283 * feat: artifact retention for auto-uploaded HTML report (#6266) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6270 * fix(mocks): forward asymmetric `new`-hidden property slots per-accessor (#6263) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6281 * fix: honor OverloadResolutionPriority on net8 consumers (#6276, #6280) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6282 ### Dependencies * chore(deps): update tunit to 1.56.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6259 * chore(deps): update dependency streamjsonrpc to 2.25.29 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6258 * chore(deps): update aspire to 13.4.5 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6267 * chore(deps): bump launch-editor from 2.12.0 to 2.14.1 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6268 * chore(deps): bump @babel/core from 7.28.5 to 7.29.7 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6269 * chore(deps): update dependency dompurify to v3.4.11 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6271 * chore(deps): update dependency serialize-javascript to v7.0.6 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6272 * chore(deps): update actions/checkout action to v7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6277 * chore(deps): update verify to 31.20.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6278 * chore(deps): bump webpack-dev-server from 5.2.4 to 5.2.5 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6273 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.56.0...v1.56.18 ## 1.56.0 <!-- Release notes generated using configuration in .github/release.yml at v1.56.0 --> ## What's Changed ### Other Changes * fix(aspnetcore): serialize WithWebHostBuilder to stop _derivedFactories race (flaky disposal NRE) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6251 * fix(mocks): wrap a real object whose class has no parameterless ctor (#6253) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6255 * fix(mocks): implement `new`-hidden base interface members in wrapper (#6252) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6256 * fix(mocks): mocking a method with more params than Func/Action arity (#6254) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6257 ### Dependencies * chore(deps): update tunit to 1.55.2 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6248 * chore(deps): update aspire to 13.4.4 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6249 * chore(deps): update dependency stackexchange.redis to v3 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6250 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.55.2...v1.56.0 ## 1.55.2 <!-- Release notes generated using configuration in .github/release.yml at v1.55.2 --> ## What's Changed ### Other Changes * fix(aspire): publish TUnit.Aspire.Core package (#6246) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6247 ### Dependencies * chore(deps): update tunit to 1.55.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6245 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.55.0...v1.55.2 ## 1.55.0 <!-- Release notes generated using configuration in .github/release.yml at v1.55.0 --> ## What's Changed ### Other Changes * feat(aspire): add TUnit.Aspire.Core without TUnit metapackage dependency (#5471) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6243 * fix(analyzers): scope TUnit0031 async-void rule to tests and hooks (#6190) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6244 ### Dependencies * chore(deps): update dependency streamjsonrpc to 2.25.28 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6232 * chore(deps): update tunit to 1.54.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6233 * chore(deps): bump joi from 17.13.3 to 17.13.4 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6234 * chore(deps): update dependency polyfill to 10.9.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6238 * chore(deps): update _tunitpolyfillversion to 10.9.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6237 * chore(deps): update dependency polyfill to 10.10.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6242 * chore(deps): update _tunitpolyfillversion to 10.10.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6241 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.54.0...v1.55.0 ## 1.54.0 <!-- Release notes generated using configuration in .github/release.yml at v1.54.0 --> ## What's Changed ### Other Changes * Generate collection-shape drill-in overloads (#6185) by @thomhurst in https://github.com/thomhurst/TUnit/pull/6218 * feat(mocks): setup/verify on secondary interfaces of multi-type mocks by @thomhurst in https://github.com/thomhurst/TUnit/pull/6230 * perf: reduce allocations in source-gen test building hot paths by @thomhurst in https://github.com/thomhurst/TUnit/pull/6228 * perf: shrink generated TestEntry builder IL via shared TUnit.Core factory helpers by @thomhurst in https://github.com/thomhurst/TUnit/pull/6231 ### Dependencies * chore(deps): update tunit to 1.53.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6199 * chore(deps): update verify to 31.19.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6200 * chore(deps): update dependency messagepack to 3.1.7 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6203 * chore(deps): update dependency fsharp.core to 10.1.301 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6202 * chore(deps): update dependency microsoft.entityframeworkcore to 10.0.9 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6205 * chore(deps): update dependency dotnet-sdk to v10.0.301 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6204 * chore(deps): update dependency microsoft.templateengine.authoring.cli to v10.0.301 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6206 * chore(deps): update dependency microsoft.templateengine.authoring.templateverifier to 10.0.301 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6207 * chore(deps): update microsoft.aspnetcore to 10.0.9 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6209 * chore(deps): update dependency system.commandline to 2.0.9 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6208 * chore(deps): update microsoft.extensions by @thomhurst in https://github.com/thomhurst/TUnit/pull/6211 * chore(deps): update dependency dompurify to v3.4.9 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6213 * chore(deps): bump shell-quote from 1.8.3 to 1.8.4 in /docs by @dependabot[bot] in https://github.com/thomhurst/TUnit/pull/6210 * chore(deps): update dependency polly to 8.7.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6214 * chore(deps): update dependency microsoft.net.stringtools to 18.7.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6215 * chore(deps): update microsoft.build to 18.7.1 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6216 * chore(deps): update opentelemetry to 1.16.0 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6217 * chore(deps): update dependency dompurify to v3.4.10 by @thomhurst in https://github.com/thomhurst/TUnit/pull/6229 **Full Changelog**: https://github.com/thomhurst/TUnit/compare/v1.53.0...v1.54.0 Commits viewable in [compare view](https://github.com/thomhurst/TUnit/compare/v1.53.0...v1.63.0). </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nick Cosentino <nbcosentino@gmail.com>
Summary
Fixes #6514 — feature parity with runtime-proxy libraries' auto-substitution. When a loose-mode mock member must produce an interface the source generator produced no mock for — most notably a generic method like
IInvocationFeatures.Get<T>()invoked inside a third-party SDK with aTthat isinternalto that SDK and structurally unnameable by the test assembly — the call fell through tonull, surfacing as an NRE deep in SDK code. This was a hard migration blocker from NSubstitute (reported against the Azure Functions Worker SDK).How it works
The key insight: the generated
Get<T>()override is itself generic, so at runtime the engine sees the realSystem.Typeeven when the test assembly can't name it. The engine's existing auto-mock fallback (TryGetLooseAutoMockResult→MockRegistry.TryCreateAutoMock) now falls back toRuntimeStubGeneratoron a registry miss:Reflection.Emittype per interface (cached), in a dynamic assembly namedDynamicProxyGenAssembly2carrying Castle DynamicProxy's well-known public key — the exact identity SDKs across the ecosystem already grantInternalsVisibleTofor NSubstitute/Moq compatibility, so every internal interface reachable by those proxies is reachable by these stubs. Dynamic assemblies are never strong-name verified; the public key alone satisfies the grant.""for strings, completed tasks (Task<T>/ValueTask<T>included), empty collections, zeroed value types, recursive stubs for interface members (or a real configurableMock<T>when a source-generated factory exists for that nested type). Properties round-trip set values. Generic interface methods are supported, including constraint re-emission and out-parameter zeroing.RuntimeFeature.IsDynamicCodeSupported— inert on Native AOT, which keeps the previous default-value behavior; opt-out viasettings.Mocks.RuntimeAutoStubs = false; any emission failure (interface with no matching IVT grant, static abstract members, by-ref returns) is a cached miss falling back to the previous behavior. netstandard2.0 builds carry a no-op implementation.Behavior change
In loose mode, unconfigured interface-returning calls that previously returned
null(no generated factory) now return a functional stub on JIT runtimes — hence+semver:minor. Opt-out restores the old behavior globally.Tests
Issue6514Tests(skipped on Native AOT via the existingSkipIfNotDynamicCodeSupportedattribute): the issue'sGet<T>-with-internal-type shape (the test project now grants IVT toDynamicProxyGenAssembly2exactly like real SDKs do), unregistered public interfaces, recursion, task/collection/string defaults, identity caching, registry-preferred real mocks viaMock.Get, value-type defaults unchanged, strict mode unchanged, and the opt-out. Full suites: 1192/1192 (net10.0), 1191/1191 (net9.0), 1169/1169 (net8.0); generator snapshots 90/90; Http 54/54, Logging 31/31.Docs: new Runtime Auto-Stubs section under Recursive / Auto-Mocking in
docs/writing-tests/mocking/advanced.md.