Skip to content

fix(assertions): skip using directive for global-namespace assertion types - #7139

Merged
thomhurst merged 2 commits into
mainfrom
fix/issue-7133-global-namespace-using
Oct 20, 2026
Merged

thomhurst merged 2 commits into
mainfrom
fix/issue-7133-global-namespace-using

Conversation

@thomhurst

@thomhurst thomhurst commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

Summary

Assertion types declared in the global namespace (no namespace declaration) made the assertion source generators emit using <global namespace>;, which broke the consumer's build with errors pointing into generated files (CS8955, CS8802).

Root cause

The generators recorded the declaring type's namespace with INamespaceSymbol.ToDisplayString(). For the global namespace that returns the literal text <global namespace>. The emitter writes using {namespace}; whenever that string is non-empty.

The issue names AssertionMethodGenerator ([AssertionFrom]) and MethodAssertionGenerator ([GenerateAssertion]). AssertionExtensionGenerator ([AssertionExtension]) had the same bug, and I reproduced it with the same test.

Fix

In all three generators, the model stores null when ContainingNamespace.IsGlobalNamespace is true, so the existing IsNullOrEmpty check skips the using. The global namespace needs no using. ContainingTypeData.ContainingNamespace in MethodAssertionGenerator is now string?.

Tests

  • tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceRegressionTests.cs: one test per generator. Each runs the generator on a global-namespace input and compiles the input together with the generated output. It requires that the output does not contain <global namespace> and that the compilation has zero errors. Snapshots are accepted for all four TFMs. All three tests failed before the fix.
  • tests/TUnit.Assertions.Tests/Bugs/Tests7133.cs: an end-to-end check. Global-namespace [AssertionFrom], [GenerateAssertion] and [AssertionExtension] declarations compile in a real project and work at runtime, both pass and fail cases.

Test runs:

  • TUnit.Assertions.SourceGenerator.Tests, full suite: net10.0, net9.0 and net8.0 pass 73/73. On net472, 71/72 pass. The one failure is MethodAssertionGeneratorTests.ParamsParameter (CS0234 UnconditionalSuppressMessageAttribute). It existed before this change and is unrelated: that input is not in the global namespace. I filed it separately.
  • TUnit.Assertions.Tests with --treenode-filter "/*/*/Issue7133GlobalNamespaceTests/*" on net10.0: 4/4 pass.

Fixes #7133

Summary by CodeRabbit

  • Bug Fixes

    • Assertion generators now correctly handle assertions declared in the global namespace, allowing generated assertions and extensions to compile and work as expected.
  • Tests

    • Added coverage for global-namespace assertions across supported target frameworks.

…types

The assertion source generators recorded the declaring type's namespace with
INamespaceSymbol.ToDisplayString(), which returns the literal text
"<global namespace>" for the global namespace. The generated files then started
with "using <global namespace>;", which broke the build (CS8955, CS8802).

Store null for the global namespace in AssertionMethodGenerator ([AssertionFrom]),
MethodAssertionGenerator ([GenerateAssertion]) and AssertionExtensionGenerator
([AssertionExtension]) so the existing IsNullOrEmpty check skips the using.

Fixes #7133
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-19T21:14:15.526389Z 44da632 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 12ae7c34-6e0b-40d3-b27f-5cd4e3467170
📥 Commits

Reviewing files that changed from the base of the PR and between 44da632 and a1dcbd7.

📒 Files selected for processing: 11
  • src/TUnit.Assertions.SourceGenerator/Generators/AssertionExtensionGenerator.cs
  • src/TUnit.Assertions.SourceGenerator/Generators/AssertionMethodGenerator.cs
  • src/TUnit.Assertions.SourceGenerator/Generators/CollectionShapeAssertionGenerator.cs
  • src/TUnit.Assertions.SourceGenerator/Generators/MethodAssertionGenerator.cs
  • src/TUnit.Assertions.SourceGenerator/Generators/NamespaceHelper.cs
  • tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceCollectionShapeAssertionTests.CollectionShapeWrapper_InGlobalNamespace_EmitsValidTypeName.DotNet10_0.verified.txt
  • tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceCollectionShapeAssertionTests.CollectionShapeWrapper_InGlobalNamespace_EmitsValidTypeName.DotNet8_0.verified.txt
  • tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceCollectionShapeAssertionTests.CollectionShapeWrapper_InGlobalNamespace_EmitsValidTypeName.DotNet9_0.verified.txt
  • tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceCollectionShapeAssertionTests.CollectionShapeWrapper_InGlobalNamespace_EmitsValidTypeName.Net4_7.verified.txt
  • tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceRegressionTests.cs
  • tests/TUnit.Assertions.SourceGenerator.Tests/TestData/GlobalNamespaceCollectionShapeAssertionSource.cs

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 4 remain after this review.

📝 Walkthrough

The assertion generators now represent global namespaces as null rather than "<global namespace>". Regression tests cover generated output, compilation, collection-shape generation, and use of global-namespace assertions.

Changes: Global Namespace Assertions

Layer / File(s) Summary
Global namespace modeling
src/TUnit.Assertions.SourceGenerator/Generators/NamespaceHelper.cs, src/TUnit.Assertions.SourceGenerator/Generators/AssertionExtensionGenerator.cs, src/TUnit.Assertions.SourceGenerator/Generators/AssertionMethodGenerator.cs, src/TUnit.Assertions.SourceGenerator/Generators/MethodAssertionGenerator.cs, src/TUnit.Assertions.SourceGenerator/Generators/CollectionShapeAssertionGenerator.cs
The generators store null for global namespaces and retain displayed names for named namespaces. ContainingNamespace is nullable. Collection-shape generation omits the namespace segment for global-namespace targets.
Generated output and compilation coverage
tests/TUnit.Assertions.SourceGenerator.Tests/TestData/GlobalNamespace*, tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespaceRegressionTests.cs, tests/TUnit.Assertions.SourceGenerator.Tests/GlobalNamespace*verified.txt
Global-namespace test inputs cover assertion-from, generated-method, assertion-extension, and collection-shape generation. Regression tests check generated output and compilation. Verified snapshots contain generated assertion output across supported target frameworks.
Assertion usage regression
tests/TUnit.Assertions.Tests/Bugs/Tests7133.cs
Tests invoke the three global-namespace assertion forms. A test checks that the generated positive assertion throws AssertionException for -1.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~12 minutes

Change: Bug fix · Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to a1dcb

Global-namespace assertions and collection wrappers avoid invalid namespace qualifiers, while named-namespace output retains its namespace. No actionable merge-blocking risk is evident.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 4.35% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 23 functions across 11 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly describes the main change: preventing invalid using directives for assertion types declared in the global namespace.
Linked Issues check Passed Issue #7133 requires usable global-namespace assertions for [AssertionFrom] and [GenerateAssertion]. The three assertion generators now use NamespaceHelper.GetNamespaceOrNull, which omits the gl…
Out of Scope Changes check Passed The changes remain connected to issue #7133. The AssertionExtensionGenerator and CollectionShapeAssertionGenerator changes fix the same global-namespace handling defect. The helper, snapshots, tes…
Full details: Linked Issues check

Explanation

Issue #7133 requires usable global-namespace assertions for [AssertionFrom] and [GenerateAssertion]. The three assertion generators now use NamespaceHelper.GetNamespaceOrNull, which omits the global namespace from generated using directives. The collection-shape generator also emits valid global::X names. Regression tests compile global-namespace input for all affected generators and cover runtime use. The reported focused tests pass.

Full details: Out of Scope Changes check

Explanation

The changes remain connected to issue #7133. The AssertionExtensionGenerator and CollectionShapeAssertionGenerator changes fix the same global-namespace handling defect. The helper, snapshots, test inputs, compile checks, and end-to-end tests support and verify that fix. No unrelated product behavior is identified.

  • Fix all pre-merge checks with AI
✨ Finishing Touches: 💡 1
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the namespace line,
No global label slips inside.
New assertions compile and run,
With empty strings and tests begun.
I nibble, hop, and mark the fix!

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

Review

The fix is correct and minimal. All three generators (AssertionExtensionGenerator, AssertionMethodGenerator, MethodAssertionGenerator) now store null for the global namespace. The existing IsNullOrEmpty guards then skip the using. Changing ContainingTypeData.ContainingNamespace to string? is consistent with that. I read GenerateAssertions in MethodAssertionGenerator and checked its using emission against the new null; it handles it. The snapshot tests for all three generators and the end-to-end Tests7133 runtime test cover the regression well.

Suggestions, none of them blocking:

  • The same expression, ContainingNamespace is { IsGlobalNamespace: false } ns ? ns.ToDisplayString() : null, is now repeated in three places. A small shared helper such as GetUsingNamespaceOrNull(INamespaceSymbol) would keep the next generator from reintroducing this bug.
  • CollectionShapeAssertionGenerator.cs:88 builds global::{target.ContainingNamespace.ToDisplayString()}.{target.Name}. It would produce global::<global namespace>.X for a global-namespace wrapper. That is likely rare, because the attribute is internal to TUnit. It is still worth confirming, or applying the same helper.

Approve.

@thomhurst
thomhurst enabled auto-merge (squash) October 19, 2026 21:15
@greptile-apps

greptile-apps Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; no actionable defects were found.

Summary

Fixes generated assertion code for types declared without a namespace.

  • Global-namespace assertions now generate usable assertion methods.
  • Collection-shape wrappers now name global types correctly.

No actionable issues were found in the changes since the previous review. Tests were not run during this review.

Reviews (2) · Last reviewed commit: "refactor(assertions): share global-names..." · Reviewed by Greptile

…ion-shape generator

Move the repeated global-namespace check into NamespaceHelper.GetNamespaceOrNull so
every assertion generator uses one implementation. CollectionShapeAssertionGenerator
built `global::<global namespace>.X` for a wrapper declared in the global namespace;
it now emits `global::X`. Add a snapshot regression test for that case.
@thomhurst

Copy link
Copy Markdown
Owner Author

Review dispositions:

  • github-actions: the global-namespace check appears in three places; extract a shared helper. Fixed in a1dcbd7. NamespaceHelper.GetNamespaceOrNull(INamespaceSymbol?) now handles this check in AssertionExtensionGenerator, AssertionMethodGenerator, MethodAssertionGenerator and CollectionShapeAssertionGenerator.
  • github-actions: CollectionShapeAssertionGenerator.cs:88 builds global::<global namespace>.X. I confirmed it, and it is fixed in a1dcbd7. A global-namespace wrapper now gets global::X. The new snapshot test GlobalNamespaceCollectionShapeAssertionTests covers it on all four TFMs. I checked that the test fails when the old line is put back. The attribute is internal, so users are unlikely to hit this today.
  • macOS modularpipeline failure. This PR did not cause it. ExecutionTimeTests.Completes_Within_Unhappy/Unhappy2 measured 1.19s and 1.32s against a fixed 1s wall-clock bound on the arm64 runner. Tracked in Flaky: ExecutionTimeTests.Completes_Within_Unhappy* exceed 1s wall-clock bound on macOS CI #7159.

@github-actions

Copy link
Copy Markdown
Contributor

Review

The fix is correct and small. NamespaceHelper.GetNamespaceOrNull is applied at all three using-emitting sites (AssertionMethodGenerator, MethodAssertionGenerator, AssertionExtensionGenerator). It also covers the global::<global namespace>.X bug in CollectionShapeAssertionGenerator. The ContainingTypeData.ContainingNamespace type change to string? fits the existing IsNullOrEmpty check. The tests compile the generator output and also include a runtime end-to-end test. I didn't build or run anything.

I checked the remaining ContainingNamespace.ToDisplayString() call sites in the base checkout. They are comparisons against fixed namespace strings, so <global namespace> can't cause a bug there. One thing to confirm: MethodAssertionGenerator.cs:596 reads containingType.ContainingNamespace as originalNamespace. I haven't traced how it's used, so check it handles the global namespace.

Suggestion (optional): the ToDisplayString() mistake is easy to repeat, so a small Roslyn analyzer or a lint test that flags raw ContainingNamespace.ToDisplayString() in the generators could prevent a repeat. The helper plus the regression tests are probably enough.

Approve from my side.

@thomhurst
thomhurst deployed to Pull Requests October 19, 2026 23:39 — with GitHub Actions Active
@thomhurst
thomhurst deployed to Pull Requests October 19, 2026 23:39 — with GitHub Actions Active
@thomhurst
thomhurst deployed to Pull Requests October 19, 2026 23:39 — with GitHub Actions Active
@thomhurst

Copy link
Copy Markdown
Owner Author

Review dispositions for a1dcbd7. There are no code changes in this round.

CI (.NET run 39337252693). The run did not fail; GitHub cancelled every job about a minute in, before any step ran. The job annotation says: "Canceling since a higher priority waiting request for .NET-fix/issue-7133-global-namespace-using exists". That comes from the workflow's cancel-in-progress concurrency group, and no newer .NET run for this branch exists, so nothing replaced it. Locale, CloudShop, smoke and Claude review passed on the same commit. I reran the cancelled jobs (attempt 2).

github-actions review (22:53):

  • Check that MethodAssertionGenerator.cs:596 (originalNamespace) handles the global namespace. It already does. originalNamespace is ContainingTypeData.ContainingNamespace, which line 358 sets through NamespaceHelper.GetNamespaceOrNull(...). For a global-namespace type that is null, and line 609 (!string.IsNullOrEmpty(originalNamespace)) then skips the using. The MethodAssertionGenerator global-namespace snapshot test covers this path.
  • Optional analyzer or lint for raw ContainingNamespace.ToDisplayString(). No change. The remaining raw calls are comparisons against fixed namespace strings, which the reviewer also noted are safe. With the shared helper and the regression tests on all four generators, a dedicated lint does not seem worth the extra machinery.

github-actions Bot pushed a commit to BenjaminMichaelis/TrxLib that referenced this pull request Oct 26, 2026
Updated [TUnit](https://github.com/thomhurst/TUnit) from 1.75.0 to
1.76.28.

<details>
<summary>Release notes</summary>

_Sourced from [TUnit's
releases](https://github.com/thomhurst/TUnit/releases)._

## 1.76.28

<!-- Release notes generated using configuration in .github/release.yml
at v1.76.28 -->

## What's Changed
### Other Changes
* Remove legacy JSON output implementation by @​Saad-elnagar in
thomhurst/TUnit#7234
* fix(engine): drop row-scoped data sources from failed test metadata by
@​kenny-ish in thomhurst/TUnit#7079
* Merge the analyzer release tables under one New Rules section (RS2007)
by @​bfs2021 in thomhurst/TUnit#7174
* fix: release finished test instances before session end by @​thomhurst
in thomhurst/TUnit#7262
* fix: never hand out a disposed shared data-source instance by
@​thomhurst in thomhurst/TUnit#7248
### Dependencies
* chore(deps): update all non-major dependencies to 1.76.0 by
@​thomhurst in thomhurst/TUnit#7233
* chore(deps): bump follow-redirects from 1.16.0 to 1.16.1 in /docs by
@​dependabot[bot] in thomhurst/TUnit#7232
* chore(deps): bump launch-editor from 2.14.1 to 2.14.2 in /docs by
@​dependabot[bot] in thomhurst/TUnit#7231
* chore(deps): update all non-major dependencies to 1.20.1 by
@​thomhurst in thomhurst/TUnit#7235
* chore(deps): update dependency awssdk.sqs to 4.0.100.20 by @​thomhurst
in thomhurst/TUnit#7236
* chore(deps): update dependency microsoft.playwright to 1.64.0 by
@​thomhurst in thomhurst/TUnit#7237
* chore(deps): update all non-major dependencies by @​thomhurst in
thomhurst/TUnit#7238
* chore(deps): update dependency path-to-regexp to v9 by @​thomhurst in
thomhurst/TUnit#7241
* chore(deps): update all non-major dependencies by @​thomhurst in
thomhurst/TUnit#7242
* chore(deps): update dependency serialize-javascript to v7.1.3 by
@​thomhurst in thomhurst/TUnit#7243
* chore(deps): update dependency imposter to 1.0.4 by @​thomhurst in
thomhurst/TUnit#7244
* chore(deps): update dependency stackexchange.redis to 3.4.20 by
@​thomhurst in thomhurst/TUnit#7245
* chore(deps): update dependency serialize-javascript to v7.1.4 by
@​thomhurst in thomhurst/TUnit#7246
* chore(deps): update dependency imposter to 1.0.5 by @​thomhurst in
thomhurst/TUnit#7247
* chore(deps): update all non-major dependencies to 13.6.4 by
@​thomhurst in thomhurst/TUnit#7251
* chore(deps): update dependency imposter to 1.0.6 by @​thomhurst in
thomhurst/TUnit#7258
* chore(deps): bump fast-uri from 3.1.8 to 3.1.9 in /docs by
@​dependabot[bot] in thomhurst/TUnit#7253
* chore(deps): bump body-parser from 1.20.6 to 1.20.9 in /docs by
@​dependabot[bot] in thomhurst/TUnit#7252

## New Contributors
* @​Saad-elnagar made their first contribution in
thomhurst/TUnit#7234
* @​kenny-ish made their first contribution in
thomhurst/TUnit#7079
* @​bfs2021 made their first contribution in
thomhurst/TUnit#7174

**Full Changelog**:
thomhurst/TUnit@v1.76.0...v1.76.28

## 1.76.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.76.0 -->

## What's Changed
### Other Changes
* chore: add OSS scanner config, threat model and SECURITY.md by
@​thomhurst in thomhurst/TUnit#7080
* fix(deps): patch MessagePack for Aspire and use per-TFM
Microsoft.Extensions.Http by @​Quattordici in
thomhurst/TUnit#7072
* fix: skip tests marked with an empty skip reason by @​thomhurst in
thomhurst/TUnit#7083
* fix(engine): report the engine mode actually selected in the banner by
@​thomhurst in thomhurst/TUnit#7085
* fix(engine): order keyed NotInParallel tests by priority, not hash
code by @​thomhurst in thomhurst/TUnit#7090
* fix: remove root causes of flaky tests and the broken Apple smoke jobs
by @​thomhurst in thomhurst/TUnit#7095
* fix(engine): run synchronous keyed NotInParallel tests concurrently by
@​thomhurst in thomhurst/TUnit#7087
* fix(sourcegen): run every [Arguments] row that infers the same generic
type by @​thomhurst in thomhurst/TUnit#7100
* fix: same filter path and display name for generic tests in both
engine modes by @​thomhurst in
thomhurst/TUnit#7110
* fix(engine): apply max parallelism cap to keyed NotInParallel tests by
@​thomhurst in thomhurst/TUnit#7084
* fix(ci): install only Chromium for Playwright and wait on dpkg lock by
@​thomhurst in thomhurst/TUnit#6994
* fix(core): keep the engine-selected execution mode when late
assemblies load by @​thomhurst in
thomhurst/TUnit#7091
* fix(engine): end fail-fast runs without crashing the test host by
@​thomhurst in thomhurst/TUnit#7115
* test: stop the AOT [EngineTest=Pass] run hitting its 5 minute budget
by @​thomhurst in thomhurst/TUnit#7125
* fix(engine): align reflection-mode data sources and hooks with
source-gen by @​thomhurst in
thomhurst/TUnit#7094
* fix(pipeline): stop skipping the NuGet package tester modules by
@​thomhurst in thomhurst/TUnit#7127
* ci: take AOT publishes and doc snippets off the Ubuntu critical path
by @​thomhurst in thomhurst/TUnit#7128
* fix(analyzers): TUnit0001 false positive for MethodDataSource on
generic type-parameter parameters by @​thomhurst in
thomhurst/TUnit#7109
* fix: report generic class constraint violations as failed tests in
both modes by @​thomhurst in
thomhurst/TUnit#7112
* ci: cut runner contention and the AOT publish off the critical path by
@​thomhurst in thomhurst/TUnit#7131
* fix(assertions): make cross-type IsEqualTo work for numeric and
nullable arguments on C# 12 by @​thomhurst in
thomhurst/TUnit#7086
* fix(engine): substitute class type arguments and array element types
in build-time constraint checks by @​thomhurst in
thomhurst/TUnit#7102
* ci: test the NuGet packages on Windows in their own job by @​thomhurst
in thomhurst/TUnit#7130
* fix(sourcegen): bind params T[] on generic test methods by @​thomhurst
in thomhurst/TUnit#7101
* fix(engine): run every [Arguments] row on generic test classes in both
modes by @​thomhurst in thomhurst/TUnit#7111
* fix(engine): use last inferred type for repeated generic parameters by
@​theluckystrike in thomhurst/TUnit#7134
* Make the test suite pass in every environment and run fully in CI by
@​Quattordici in thomhurst/TUnit#7129
* fix(assertions): skip using directive for global-namespace assertion
types by @​thomhurst in thomhurst/TUnit#7139
* fix(core): format numeric display-name arguments with the invariant
culture by @​thomhurst in thomhurst/TUnit#7138
* fix(engine): dispose data-source objects of rows that end as failed
tests by @​thomhurst in thomhurst/TUnit#7150
* Fix net472 compile gate failure in assertions source generator tests
by @​thomhurst in thomhurst/TUnit#7170
* fix(sourcegen): close generic methods of generic classes on every
class source by @​thomhurst in
thomhurst/TUnit#7152
* fix(engine): infer object for null rows on generic test methods in
reflection mode by @​thomhurst in
thomhurst/TUnit#7142
* fix(engine): report every test once on fail-fast runs by @​thomhurst
in thomhurst/TUnit#7145
* test(engine): stop whole-process budgets killing healthy scheduling
engine tests by @​thomhurst in
thomhurst/TUnit#7177
* feat(analyzers): report MethodDataSource Arguments that fit two
overloads equally (TUnit0076) by @​thomhurst in
thomhurst/TUnit#7181
* fix(sourcegen): render top-level dynamic as object so typeof compiles
by @​thomhurst in thomhurst/TUnit#7182
* fix(sourcegen): pair each GenerateGenericTest type only with its typed
ClassDataSource<T> by @​thomhurst in
thomhurst/TUnit#7188
* fix(engine): run untyped [Arguments(null)] rows on generic classes
instead of dropping them by @​thomhurst in
thomhurst/TUnit#7203
* fix(engine): report generic test classes by their generic type
definition in TRX by @​thomhurst in
thomhurst/TUnit#7200
* test(sourcegen): parse snapshot fixtures as a real build does by
@​thomhurst in thomhurst/TUnit#7189
* refactor(engine): dedupe reflection generic discovery by @​thomhurst
in thomhurst/TUnit#7183
* test: make TimeoutHelperTests deterministic under thread-pool load by
@​thomhurst in thomhurst/TUnit#7180
* fix(analyzers): accept null MethodDataSource arguments for nullable
parameters by @​thomhurst in
thomhurst/TUnit#7179
* test(assertions): make WaitsFor cancellation tests robust to slow CI
runners by @​thomhurst in thomhurst/TUnit#7176
* fix(assertions): support [AssertionFrom] with unbound generic types by
@​thomhurst in thomhurst/TUnit#7144
 ... (truncated)

Commits viewable in [compare
view](thomhurst/TUnit@v1.75.0...v1.76.28).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=TUnit&package-manager=nuget&previous-version=1.75.0&new-version=1.76.28)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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 this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

This branch was successfully deployed

1 active deployment
Pull Requests — a1dcbd70 Deployed Oct 19, 2026 by thomhurst via modularpipeline (ubuntu-latest) #20232
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Assertion source generators emit using <global namespace>; for types in the global namespace, breaking the build

1 participant