Generate collection-shape drill-in overloads (#6185) - #6218
Conversation
Adds CollectionShapeFanOutGenerator, a Roslyn incremental generator that replaces hand-written "one method per collection shape" boilerplate at three sites, driven by a single shape->source registry plus symbol reflection. - Emitter A: [GenerateCollectionShapeDrillIns] on a drill-in source emits the full shape-specific assertion surface (Count/Contains/HasItemAt/IsSubsetOf/ ContainsKey/...) onto DictionaryValueSource<Shape>. Fixes the CS0411 where `.Value.Count()` bound to LINQ Enumerable.Count when a dictionary value is itself a collection. Signatures are reflected from each shape's assertion source, so per-shape differences (e.g. the comparer param on ReadOnlyList.HasItemAt that IList lacks) are always correct. - Emitter B: replaces CollectionItemSatisfiesExtensions.cs. - Emitter C: replaces the #5707 Count(itemAssertion) block in AssertionExtensions. Concrete value shapes (List<T>/Dictionary<K,V>) upcast their context via a generated helper that preserves PendingPreWork, so the ContainsKey pre-work still runs before the value is read. Sites B and C reproduce their existing public API exactly (PublicAPI net-zero); Emitter A is a deliberate full-surface expansion.
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| ErrorProne | 1 high |
| CodeStyle | 1 minor |
🟢 Metrics 78 complexity
Metric Results Complexity 78
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
There was a problem hiding this comment.
Code Review — PR #6218: Generate collection-shape drill-in overloads
This is a well-architected PR that solves a real problem elegantly. Using a Roslyn incremental generator to eliminate ~90+ hand-written per-shape forwarding methods per call site is the right structural approach — and the reflection-based method collection from real IMethodSymbols means per-shape signature differences (the IEqualityComparer on ReadOnlyList.HasItemAt vs. IList.HasItemAt) are always correct without manual upkeep.
Overall: approve-ready, with a few items worth considering.
What works well
- Incremental generator design —
WithTrackingNameon each pipeline stage, fully equatableImmutableEquatableArray-based models, noISymbolstored across the incremental boundary. This is textbook correct incremental generator practice. Upcast+PendingPreWorkpreservation — the concrete-shape upcast (List<T> → IList<T>) chains the pre-work lambdas so a missing key still surfaces the clean "contain key" failure. The sequencing ofexistingandpreWorkis correct.- Zero removals on Emitters B & C — the PublicAPI snapshots confirm exact API parity with the hand-written code they replace.
CollectMethodsmost-derived-wins walk — stops beforeAssertion<T>/object, deduplicates byName + param types, and skips Obsolete members. All correct.- Test depth — snapshot tests for generator output fidelity, integration tests covering the original bug, missing-key pre-work path, and concrete (
List<T>/Dictionary<K,V>) shapes.
Issues
1. Emitter B / C trigger multiplicity — silent duplicate-file risk
fires once per item in the pipeline. If a second method ever carries (now or in a future refactor), Roslyn will try to add twice → CS8785 duplicate hint name diagnostic. The same applies to Emitter C.
The fix is cheap — deduplicate with and emit once:
This is low risk today since each attribute appears exactly once, but a single misplaced attribute could cause a confusing build failure.
2. Three types are now public API
The PublicAPI snapshot now includes , , and as public types. If these are only intended as internal generator triggers (no downstream library author would ever apply them to their own types), marking them would avoid confusion and API churn.
If they are intentional extensibility points — so that consumers can write their own drill-in sources — they should be documented as such. The current XML docs describe what the generator does but not whether the attribute is intended for public use.
3. is fragile without explanation of each entry
A new assertion method added to a source class whose name isn't in this set will silently appear on all drill-in surfaces. The reverse — a needed method accidentally blocked — is harder to notice. A short grouped comment categorising why each name is excluded ("generic value-shape methods", "infrastructure / lifecycle", "System.Object") would help a future maintainer decide where a new entry belongs. Alternatively, an attribute-based approach () on the sources themselves would be self-documenting and easier to audit.
4. helper is always emitted even when no upcast shapes are needed
If a drill-in source only maps to interface-shaped collection types (no / concrete shapes in the Rows registry), the helper is dead code in that file. Minor, but emitting it conditionally based on whether any row actually produced methods for this model would keep generated files cleaner.
Minor observation
The documented gap — "Dictionary / are not forwarded onto dict drill-ins (method type param collides with the source's )" — is correctly handled and documented inline. No action needed, just flagging it as confirmed correct behavior.
Summary: The architecture is sound, tests are thorough, and public API impact is controlled. Items 1 and 2 are the ones most worth addressing before merge; 3 and 4 are lower priority.
There was a problem hiding this comment.
Code Review — PR #6218: Generate collection-shape drill-in overloads
This is a well-architected PR that solves a real problem elegantly. Using a Roslyn incremental generator to eliminate ~90+ hand-written per-shape forwarding methods per call site is the right structural approach — and the reflection-based method collection from real IMethodSymbols means per-shape signature differences (the IEqualityComparer on ReadOnlyList.HasItemAt vs. IList.HasItemAt) are always correct without manual upkeep.
Overall: approve-ready, with a few items worth considering.
What works well
- Incremental generator design —
WithTrackingNameon each pipeline stage, fully equatableImmutableEquatableArray-based models, noISymbolstored across the incremental boundary. Textbook correct incremental generator practice. Upcast+PendingPreWorkpreservation — the concrete-shape upcast (List<T>toIList<T>) chains the pre-work lambdas so a missing key still surfaces the clean "contain key" failure. The sequencing ofexistingandpreWorkis correct.- Zero removals on Emitters B & C — the PublicAPI snapshots confirm exact API parity with the hand-written code they replace.
CollectMethodsmost-derived-wins walk — stops beforeAssertion<T>/object, deduplicates byName + param types, and skips Obsolete members. All correct.- Test depth — snapshot tests for generator output fidelity, integration tests covering the original bug, missing-key pre-work path, and concrete (
List<T>/Dictionary<K,V>) shapes.
Issues
1. Emitter B / C trigger multiplicity — silent duplicate-file risk
RegisterSourceOutput fires once per item in the pipeline. If a second method ever carries [GenerateCollectionShapeItemSourceOverloads] (now or in a future refactor), Roslyn will try to add CollectionItemSatisfiesExtensions.g.cs twice — CS8785 duplicate hint name. The same applies to Emitter C.
The fix is cheap — deduplicate with .Collect() and emit once:
context.RegisterSourceOutput(
itemSourceTrigger.Collect(),
static (spc, items) => { if (items.Length > 0) EmitItemSourceOverloads(spc); });
This is low risk today since each attribute appears exactly once, but a single misplaced attribute would produce a confusing build failure with no obvious cause.
2. Three Generate*Attribute types are now public API
The PublicAPI snapshot now includes GenerateCollectionShapeDrillInsAttribute, GenerateCollectionShapeCountOverloadsAttribute, and GenerateCollectionShapeItemSourceOverloadsAttribute as public types. If these are only intended as internal generator triggers (no downstream library author would ever apply them), marking them internal would avoid API churn and consumer confusion.
If they are intentional extensibility points — so that consumers can write their own drill-in sources — they should be documented as such. The current XML docs describe what the generator does but do not clarify whether downstream use is supported.
3. ExcludedNames is fragile without rationale for each entry
A new assertion method added to a source class whose name is not in this set will silently appear on all drill-in surfaces. The reverse — a needed method accidentally blocked — is harder to notice. Grouped comments explaining why each name is excluded (e.g. "generic value-shape methods already on IAssertionSource", "infrastructure / lifecycle", "System.Object inherited") would help a future maintainer decide where a new entry belongs.
4. Upcast helper always emitted regardless of whether upcast shapes appear
The private Upcast<TFrom, TTo> helper (~15 lines) is emitted unconditionally at the top of every generated file. If a drill-in source produces no UpcastCtor-seeded methods (no List<T> or Dictionary<K,V> concrete shapes in the output), the helper is dead code in that file. Minor, but emitting it conditionally based on whether any UpcastCtor row produced methods would keep generated files cleaner.
Minor observation
The documented gap — "Dictionary IsOrderedBy<TKey> / IsOrderedByDescending<TKey> are not forwarded onto dict drill-ins (method type param collides with the source's TKey)" — is correctly handled and explained inline. Confirmed as expected behavior.
Summary: The architecture is sound, tests are thorough, and API impact is controlled. Items 1 and 2 are most worth addressing before merge; 3 and 4 are lower-priority cleanup.
…nerator
Renames the codegen vocabulary to match the repo's "source"/"assertion" terms
instead of the ad-hoc "DrillIn"/"FanOut"/"ItemSource" coinages:
- CollectionShapeFanOutGenerator -> CollectionShapeAssertionGenerator
- [GenerateCollectionShapeDrillIns] -> [GenerateCollectionShapeAssertions]
- [GenerateCollectionShapeItemSourceOverloads] -> [GenerateCollectionShapeSatisfiesOverloads]
- generated {Wrapper}CollectionShapeDrillInExtensions -> {Wrapper}CollectionShapeAssertions
- internal model/method names (DrillInModel/BuildDrillInModel/EmitDrillIn ->
WrapperModel/BuildWrapperModel/EmitWrapperAssertions)
Pure rename: generated output and behaviour are unchanged. PublicAPI snapshots
are a symmetric rename (5 names in/out, no other surface change).
There was a problem hiding this comment.
Follow-up Review — PR #6218
This is a follow-up to the two prior reviews (both posted 2026-06-10). All four issues raised remain unaddressed in the current code. Summarising the outstanding items:
1. Emitter B / C trigger multiplicity — still unresolved
RegisterSourceOutput still fires once per item without .Collect() deduplication:
// Current (fragile):
context.RegisterSourceOutput(satisfiesTrigger, static (spc, _) => EmitSatisfiesOverloads(spc));
context.RegisterSourceOutput(countTrigger, static (spc, _) => EmitCountOverloads(spc));If a second method ever carries either attribute, Roslyn will attempt to add the same hint name twice → CS8785, with no obvious error pointing back to this code. The fix is a one-liner:
context.RegisterSourceOutput(satisfiesTrigger.Collect(),
static (spc, items) => { if (items.Length > 0) EmitSatisfiesOverloads(spc); });2. Three Generate*Attribute types still public API
GenerateCollectionShapeAssertionsAttribute, GenerateCollectionShapeSatisfiesOverloadsAttribute, and GenerateCollectionShapeCountOverloadsAttribute are all public sealed class. If these are purely internal generator triggers (no intended downstream use), they should be internal to avoid locking in an accidental API surface. If they are intended extensibility points, they need documentation saying so.
3. ExcludedNames still lacks per-entry rationale
The block comment ("Names already present on IAssertionSource<T> / ValueAssertion<T> / Assertion<T> / object, or that are pure infrastructure") is too generic to guide future decisions. When a new assertion method is added, a maintainer can't tell from this comment whether to include or exclude it — and a wrong call silently changes the public API surface of all drill-in types. Short grouped comments (or an attribute-based opt-out on the source class itself) would make this self-documenting.
4. Upcast helper still emitted unconditionally
The private Upcast\<TFrom, TTo\> helper is emitted at the top of every EmitWrapperAssertions output file regardless of whether any SeedKind.UpcastCtor shape actually appears. Only two of the eleven rows use UpcastCtor (List<T> and Dictionary<K,V>); for drill-in sources that produce no methods from those shapes, the helper is dead code in the generated file.
Priority: Issues 1 and 2 are the ones most worth fixing before merge — 1 is a latent build-breaker, 2 is an API decision that's expensive to reverse. Issues 3 and 4 are lower-priority cleanup. The core architecture remains solid.
…-set docs - Collect() the Satisfies/Count trigger pipelines so each single output file is emitted exactly once even if a second method ever carries the trigger attribute (avoids a CS8785 duplicate-hint-name build failure). - Group ExcludedNames with per-group rationale (IAssertionSource members / Assertion<T> infrastructure / System.Object) so a future maintainer knows where a new entry belongs. Generator-internal only; generated output and public API are unchanged.
There was a problem hiding this comment.
Code Review
This is a well-structured solution to the CS0411 ambiguity bug. The approach of using a Roslyn incremental generator to replace hand-written fan-out is clearly the right architectural direction — it eliminates 3 separate copy-paste sites and makes new collection-shape assertion methods automatically available on all drill-in targets.
Correctness
Upcast + PendingPreWork transfer is correct. The Upcast helper correctly handles the two-step context flow: when .Value is accessed, Context.Map<TValue>() consumes the PendingLink (the ContainsKey assertion) and stores it as PendingPreWork on the new value context. Later, when Upcast calls context.Map(upcast) internally, it doesn't re-consume a PendingLink (already gone), but the helper manually reads context.PendingPreWork and threads it into mapped.PendingPreWork. This correctly ensures the ContainsKey check fires first regardless of which collection-shape extension is used. The test Dictionary_ContainsKey_And_Value_Collection_Fails_When_Key_Missing covers this path.
Set SeedKind.FromContext vs Ctor distinction is justified. SetAssertion, HashSetAssertion, and ReadOnlySetAssertion have private protected context constructors (not internal), so the generator can't emit new SetAssertion<T>(ctx) from the generated extension file. The FromContext static factory methods added in this PR bridge that gap cleanly without widening constructor visibility.
Emitter C constructs sources with new SourceClosed(item, expression) — this is safe. For set shapes in Emitter C, new SetAssertion<TInner>(item, expression) uses the public SetAssertion(ISet<TItem>? value, string expression) ctor which is accessible. This is consistent with how the hand-written code worked before.
Design Observations
Three-Emitter architecture is sensible but slightly surprising. Emitters B and C are triggered by attributes on methods ([GenerateCollectionShapeSatisfiesOverloads], [GenerateCollectionShapeCountOverloads]) and use a static precomputed ItemShapes table rather than symbol reflection. This means they never have per-compilation data — they'll produce identical output on every compilation where the trigger attribute is present. The Collect() trick to deduplicate the hint name is correct but slightly unusual. Consider a brief inline comment (beyond what's already there) explaining why the attribute-on-a-method trigger pattern was chosen over a simpler assembly-level attribute, since it's not immediately obvious.
GenerateCollectionShapeCountOverloadsAttribute and GenerateCollectionShapeSatisfiesOverloadsAttribute are public. These two attributes appear in the PublicAPI snapshots and are placed on interface/private members, so end users cannot usefully apply them. They're purely internal wiring. Consider making them internal sealed to avoid cluttering the public API surface. GenerateCollectionShapeAssertionsAttribute is correctly public since it's documented as reusable.
The hardcoded Rows table is the right trade-off, but the maintenance coupling is worth documenting. Rows is used in three places: BuildWrapperModel (Emitter A, via symbol reflection), BuildItemShapes (Emitter B/C, via string formatting). If a new collection shape is added to TUnit, a developer must update Rows — which is a single place, so the coupling is minimal. However, Emitters B and C additionally embed constructor call syntax (new SourceClosed(item, ...)) which assumes each arity-1 shape has a public (TCollection, string) constructor. This invariant isn't enforced anywhere. A comment alongside Rows documenting this assumption (or a validator in BuildItemShapes) would make future additions safer.
int.Parse in BuildItemShapes is reliable but fragile. The arity is parsed from the metadata name substring after the backtick (\1→1). Since Rowsis a controlled static list this won't fail in practice, but a brief comment noting the dependency (or replacing withrow.SourceMetadataName.EndsWith("``1")` pattern matching) would guard against copy-paste errors when someone adds a new row.
CancellationToken is only checked per-row in BuildWrapperModel, not inside CollectMethods. For codebases where a single assertion source has many public methods, the inner foreach in CollectMethods could be slow without cancellation checks. Adding ct.ThrowIfCancellationRequested() inside CollectMethods would make the generator more IDE-responsive.
Minor
- The
context.PendingPreWorkafterMapis not cleared insource.Context— this is fine becauseAssertion.ExecuteCoreAsyncclears it on first run andDictionaryValueSourceis not expected to be stored and re-used. - The
CollectionShapeAssertionSource<T>test data hasContext { get; } = null!;which would NPE at runtime, but it's never executed — it's only compiled for the snapshot test. This is correct and common in generator test data. - The
ExcludedNamesset correctly covers all public methods ofValueAssertion<T>(the base ofDictionaryValueSource) so no double-forwarding occurs.
Summary
The approach is architecturally sound, the correctness is well-tested, and the PR description is exceptionally thorough. The two points worth addressing before merge are:
- Make
GenerateCollectionShapeCountOverloadsAttributeandGenerateCollectionShapeSatisfiesOverloadsAttributeinternalto avoid unnecessary public API surface. - Add a comment alongside
Rowsdocumenting the(TCollection, string)constructor assumption for Emitters B and C.
Everything else is either already documented or minor style.
The three GenerateCollectionShape* trigger attributes are internal generator plumbing, not a public extensibility point, so mark them internal — removing them from the public API surface. They are applied only within TUnit.Assertions itself. The generator matches triggers by metadata name, so the generator snapshot test's TestData declares a same-named local stand-in attribute rather than depending on the internal one (strong naming makes InternalsVisibleTo to the unsigned test project impractical — the same wall TUnit.Mocks hit). PublicAPI snapshots updated: removal of the three attribute types only.
There was a problem hiding this comment.
Code Review — PR #6218 (Follow-up: Issues Resolved)
This is a follow-up to the three prior reviews posted 2026-06-10. All critical and high-priority issues have been addressed in the current code.
Issues resolved since last review
✅ Issue #1 — Emitter B/C trigger multiplicity
Both satisfiesTrigger and countTrigger now use .Collect() with a triggers.Length > 0 guard:
context.RegisterSourceOutput(satisfiesTrigger, static (spc, triggers) =>
{
if (triggers.Length > 0) EmitSatisfiesOverloads(spc);
});A duplicate [GenerateCollectionShape*] attribute on a second method will no longer silently cause a CS8785 duplicate hint name at build time.
✅ Issue #2 — Generate*Attribute types now internal sealed
All three attributes (GenerateCollectionShapeAssertionsAttribute, GenerateCollectionShapeSatisfiesOverloadsAttribute, GenerateCollectionShapeCountOverloadsAttribute) are internal sealed. The PublicAPI snapshots no longer include them, and the API surface is smaller and cleaner.
✅ Issue #3 — ExcludedNames now has grouped rationale comments
Each exclusion group is now explained: re-forwarding-would-be-ambiguous, lifecycle/infrastructure, and System.Object inherited members. A future maintainer adding a new assertion method can now decide whether to include or exclude it with confidence.
Remaining minor item
Issue #4 — Upcast helper still emitted unconditionally (minor)
In EmitWrapperAssertions (line 438 of the generator), the private Upcast<TFrom, TTo> helper (~15 lines) is always emitted at the top of every generated file, even when no SeedKind.UpcastCtor-seeded shape produces any methods. Only two of the eleven Rows entries use UpcastCtor (List<T> and Dictionary<K,V>). For a drill-in source whose model.Shapes produce no upcast-seeded methods, the helper is dead code in the output file.
The fix is adding a bool HasUpcastShapes field to WrapperModel:
private sealed record WrapperModel(
string WrapperName,
string WrapperOpenType,
ImmutableEquatableArray<ShapeModel> Shapes,
bool HasUpcastShapes); // <-- newSet it in BuildWrapperModel when any UpcastCtor row produced at least one method, and gate the emission in EmitWrapperAssertions:
if (model.HasUpcastShapes)
{
sb.AppendLine(" private static global::TUnit.Assertions.Core.AssertionContext<TTo> Upcast...");
...
}This is purely a cleanliness concern — the generated code is functionally correct as-is and the compiler will warn on unused private members in consuming code anyway. It does not block merge.
Summary
The three blocking/high-priority issues from prior reviews are fully resolved. The architecture is sound, the incremental generator model is correctly equatable with no ISymbol stored across the boundary, the API surface is now clean, and test coverage is thorough.
Verdict: approve-ready. Issue #4 is a nice-to-have that can be addressed in a follow-up if desired.
…nerator Addresses static-analysis nits on the new generator (matches the repo's always-brace convention; no brace-less single-line ifs elsewhere in the generators): - Add braces to all single-line if statements. - Derive shape arity from the metadata-name digit instead of int.Parse (no FormatException path, no culture dependency). Generator-internal only; generated output is unchanged.
There was a problem hiding this comment.
Code Review — Follow-up (Round 6)
Previous reviews flagged four issues; three were resolved in commits 2 and 3 (emit-once guard, internal sealed attributes, ExcludedNames rationale comments). This round verifies the remaining open item and checks the latest styling commit.
Issue #4 — Upcast helper always emitted (still open, still minor)
The helper is emitted unconditionally at the top of EmitWrapperAssertions before any shape is visited:
// CollectionShapeAssertionGenerator.cs — EmitWrapperAssertions
sb.AppendLine(" private static global::TUnit.Assertions.Core.AssertionContext<TTo> Upcast<TFrom, TTo>(");
// ... always appended regardless of model.Shapes contentsBecause the current Rows table always includes UpcastCtor entries (List<T> and Dictionary<K,V>), in practice the helper is never dead code today. The risk is if a future caller uses [GenerateCollectionShapeAssertions] on a source that happens not to map any upcast shapes — they'd get an unused private method in the generated file. This is a minor aesthetic issue (and won't cause a compile error in C#), not a correctness concern. Can be addressed in a follow-up if desired.
A simple guard would be:
bool hasUpcastShapes = model.Shapes.Any(s => s.Methods.Any(/* seed was UpcastCtor */));
// or, since ShapeModel doesn't carry that flag, just:
bool hasUpcastShapes = model.Shapes
.SelectMany(s => s.Methods)
.Any(m => m.Body.Contains("Upcast<"));
if (hasUpcastShapes) { /* emit Upcast helper */ }Latest commit — styling pass looks clean
The braces-normalization and arity adjustments in the final commit are purely mechanical and correct. No new issues introduced.
Ctor assumption
The SeedKind.Ctor branch emits new {sourceClosed}(source.Context) — silently assuming every assertion source has a single-arg (AssertionContext<T>) constructor. The Rows table comment describes what each row is, but not why the ctor is assumed to accept a single context argument. Adding a one-liner like // All Ctor seeds must have a public .ctor(AssertionContext<T>) near the SeedKind.Ctor case would make this contract explicit for future maintainers. Non-blocking.
Summary
All previously blocking issues (Issues 1–3) are resolved. Issue #4 (unconditional Upcast emission) and the undocumented ctor assumption are both non-blocking and can be addressed in a follow-up. The core logic — Upcast+PendingPreWork transfer, reflection-driven method surface, per-shape #if guards, and the Collect() deduplication for Emitters B/C — is correct. The PR is approve-ready.
…work helper
Design cleanup for the collection-shape codegen (no public API or behaviour change;
PublicAPI snapshots unchanged):
- Split the single multi-purpose generator into two single-purpose ones sharing a
named registry:
- CollectionShapeRegistry — the one shape -> source -> seed table + emit helpers
(single source of truth; documents the per-SeedKind ctor/FromContext contract).
- CollectionShapeAssertionGenerator — reflection-driven full wrapper surface (Emitter A).
- CollectionShapeOverloadGenerator — the fixed per-shape Satisfies/Count templates (B/C).
- Move the pre-work-preserving identity upcast out of the generated output into a real
internal AssertionContext.MapPreservingPreWork<TNew> helper. Generated concrete-shape
seeds now call it instead of each file emitting a ~15-line Upcast helper, so the output
is smaller and the logic is real, testable source. This also removes the need to
conditionally emit that helper.
Generator-A snapshots updated (helper removed, shorter seeds); behaviour verified by the
existing value/#5707/Satisfies tests.
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>
What & why
Fixes #6185: when a dictionary value is itself a collection,
await Assert.That(dict).ContainsKey(k).And.Value.Count()failed to compile (CS0411) because the.Valuedrill-in returned a scalarValueAssertionlacking the collection surface, so.Count()bound to LINQ'sEnumerable.Count.Because
DictionaryValueSource<T>andAssertionContext<T>are invariant, every value shape needs its own overload — hand-writing that is ~90+ methods per call site and drifts (e.g.ReadOnlyList.HasItemAthas anIEqualityComparerparam theIListone doesn't). The same "one method per collection shape" boilerplate already existed in three places, all keyed off the same shape→assertion-source map.Approach
New Roslyn incremental generator
CollectionShapeFanOutGenerator— one hardcoded shape→source→seed registry (11 rows) + symbol reflection — with three emitters:.Valuedrill-in, full surface.[GenerateCollectionShapeDrillIns]on a drill-in source emits the full shape-specific surface (Count/Contains/HasItemAt/IsSubsetOf/ContainsKey/…) ontoDictionaryValueSource<Shape>. Signatures are reflected from each shape's assertion source, so per-shape differences are always correct and new methods are picked up automatically. Reusable: any arity-1 drill-in source opts in with one attribute.CollectionItemSatisfiesExtensions.cs(per-shapeSatisfies).Count(itemAssertion)block inAssertionExtensions.cs.Concrete value shapes (
List<T>/Dictionary<K,V>) upcast their context via a generatedUpcasthelper that preservesPendingPreWork, so theContainsKeypre-work still runs first (a missing key fails with the normal "contain key" message instead of readingdefault).API impact
.Valuedrill-in now exposes the complete per-shape collection surface).Validation
netstandard2.0/net8.0/net9.0/net10.0(onlyIReadOnlySetrows are#if NET5_0_OR_GREATER; theSatisfiesfile is#if !NETSTANDARD2_0).HasItemAt, setIsSubsetOf, nested-dictContainsKey, array, and concreteList<T>/Dictionary<K,V>incl. the missing-key pre-work path; plus a generator content-assertion test.Notes
Memory/ReadOnlyMemory/IAsyncEnumerable(not collection drill-in targets) — documented inline.IsOrderedBy<TKey>/IsOrderedByDescending<TKey>are not forwarded onto dict drill-ins (method type param collides with the source'sTKey) — a documented niche gap.