DiagnosticCatalog.Xunit
1.0.0
dotnet add package DiagnosticCatalog.Xunit --version 1.0.0
NuGet\Install-Package DiagnosticCatalog.Xunit -Version 1.0.0
<PackageReference Include="DiagnosticCatalog.Xunit" Version="1.0.0" />
<PackageVersion Include="DiagnosticCatalog.Xunit" Version="1.0.0" />
<PackageReference Include="DiagnosticCatalog.Xunit" />
paket add DiagnosticCatalog.Xunit --version 1.0.0
#r "nuget: DiagnosticCatalog.Xunit, 1.0.0"
#:package DiagnosticCatalog.Xunit@1.0.0
#addin nuget:?package=DiagnosticCatalog.Xunit&version=1.0.0
#tool nuget:?package=DiagnosticCatalog.Xunit&version=1.0.0
DiagnosticCatalog.Xunit
π Languages:
π¬π§ English (this file) | π«π· FranΓ§ais
The xunit.analyzers rules as strongly referenced constants, so that
SuppressMessageAttribute takes compile-checked references instead of magic strings.
πͺ Mirrors
xunit.analyzers 1.27.090 rules, 3 categories, every identifier and category read from that release's own analyzers. Regenerated 2026-08-05.
Unofficial. Not affiliated with, endorsed by, or supported by the xUnit.net project.
Why
Every xUnit test project already runs these analyzers, and almost nobody installed them on
purpose: xunit depends on xunit.analyzers, so they arrive with the test framework. That
is what makes their rules the ones people actually suppress in source β a test that
deliberately asserts on a literal, a theory whose data cannot be inlined, an assertion the
analyzer would rather see written another way. These are local exceptions with a reason,
which is a suppression's job rather than an .editorconfig entry's.
[SuppressMessage("Assertions", "xUnit2013:Do not use equality check to check for collection size", Justification = "β¦")]
Three strings, and nothing checks any of them. Get the id wrong and the suppression silently
does nothing β the warning simply stays. Get the category wrong and nothing happens at
all, ever: the .NET platform never reads that argument, so no error, no warning and no
failing test will tell you. Would you have known that xUnit2013 is "Assertions" while
xUnit1013 is "Usage" and xUnit3000 is "Extensibility"?
using DiagnosticCatalog.Xunit;
[SuppressMessage(
XunitRule.xUnit2013.Category,
XunitRule.xUnit2013.Id,
Justification = "The count is the subject of this test.")]
The day a rule moves to another category, the second version follows it and the first is left naming a category the rule no longer carries β silently, and for as long as the line survives.
Installation
<PackageReference Include="DiagnosticCatalog.Xunit" Version="1.0.0" />
That is the only reference you need. This package depends on DiagnosticCatalog, which carries
the DCAT analyzers and code fixes beside its attributes, so referencing this catalogue is what
switches on the checks that validate rule declarations and their use sites. A literal suppression
a catalogue reference would replace is an error by default, and a code fix rewrites it for you.
What is in the package
90 rules across 3 categories, and it is the tidiest of the catalogues here: every rule carries the title its descriptor declares, and every one of the 90 carries a help link into xunit.net's own rule pages.
| Category | Rules | What they are about |
|---|---|---|
Usage |
54 | How tests, theories and their data are declared β the xUnit1xxx range |
Assertions |
32 | Assertions that would read better written another way β xUnit2xxx |
Extensibility |
4 | Extending the framework itself β xUnit3xxx |
[DiagnosticRule]
public static class xUnit2013
{
public const string Id = nameof(xUnit2013);
public const string Category = XunitCategory.Assertions;
public const string HelpLinkUri = "https://xunit.net/xunit.analyzers/rules/xUnit2013";
}
The identifiers keep the vendor's own casing, xUnit2013 and not XUnit2013, because a
catalogue's member name is the identifier a suppression carries β renaming it to suit C#
convention would make the constant and the string it stands for disagree.
A note on how you already have these analyzers
You almost certainly do not need to install xunit.analyzers: xunit depends on it, so a
test project has the rules whether or not anybody asked. This catalogue names them; where
they come from is your test project's business.
That transitive arrival is also why this catalogue exists. A rule you chose to switch on gets
tuned in .editorconfig; a rule that arrives with the framework gets suppressed at the one
place it is wrong, with a Justification beside the test that earns it.
Categories declared once
XunitCategory holds each category once, and the rules reference it β so a category's
spelling exists in exactly one place. It is internal by design: a suppression reaches a
category through the rule that carries it, XunitRule.xUnit2013.Category, and never through
the category constant on its own. The two fold to the same string today and stop agreeing the
day xUnit moves the rule
(ADR-0026).
How it is produced
Not transcribed from documentation. The generator reads the analyzer assemblies' metadata for
the types they mark with [DiagnosticAnalyzer], constructs those, and reads the
DiagnosticDescriptor instances they actually declare β the only source that cannot have
drifted.
dotnet run --project src/DiagnosticCatalog.Cli -- generate \
--package xunit.analyzers --package-version latest \
--namespace DiagnosticCatalog.Xunit --container XunitRule \
--output src/DiagnosticCatalog.Xunit/XunitRules.g.cs
How it stays current
A nightly workflow regenerates every catalogue from its upstream package and opens a pull request when anything the catalogue publishes has moved. It never publishes: a category or an id that changed upstream changes a published contract, and since the platform never reads a suppression's category, a wrong value merged unreviewed would produce no symptom anywhere. A human reads the diff.
A rule retired upstream is never deleted. It is kept and marked [Obsolete] naming
the version that dropped it, so a project still referencing it gets a CS0618 warning
telling it to remove the suppression β rather than a hard error from a member that
vanished. Consumers inline constant values at their own compile time, so deleting one
breaks their recompilation.
How it reaches nuget.org
This catalogue rides the xunit release train
and versions independently of the foundation, so it can follow xunit.analyzers' releases
without dragging anything else along.
Publishing is not part of the nightly. A maintainer pushes an xunit-vX.Y.Z tag, and the
release workflow packs the package, embeds an SPDX SBOM, and publishes through NuGet
Trusted Publishing
with signed build provenance β no long-lived API key exists anywhere to leak.
Limits
[SuppressMessage] cannot suppress compiler warnings β CS0219 and friends need
#pragma warning disable, which takes bare identifiers and so can never reference a
constant. This package covers the xUnitxxxx analyzer rules only.
See also
Every catalogue this repository publishes is listed in one place β pick the one that matches an analyzer you run:
Want a catalogue of your own? Your analyzer's rules, or an internal ruleset, are declared exactly
the way these are: a static class of constants marked [DiagnosticRule], referenced by consumers
instead of retyped. That marker ships in
DiagnosticCatalog, the foundation this catalogue is built
on, and its README is the guide.
Documentation
For using a catalogue, in the order the work happens:
- Getting started β ten minutes: reference this package, rewrite one suppression, break it on purpose and watch the compiler catch it.
- Writing suppressions that the compiler checks β the full version, including migrating the literals you already have.
- Adopting a catalogue on an existing codebase β the severity ramp, Fix all occurrences, scoping by folder, and what order to convert in.
- Configuration
β every severity key, the category-wide switch, and the
PrivateAssetsmistake that silences everything. - Troubleshooting
β by symptom: nothing is reported,
CS0117,CS0618after an upgrade.
The documentation map picks a page by what you are trying to do; every guide exists in English and French. The specification is the normative version of all of it.
License
Apache-2.0. The rule identifiers, categories, titles and help links are read from a third-party analyzer, which is itself Apache-2.0 licensed.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- DiagnosticCatalog (>= 1.0.1)
-
net10.0
- DiagnosticCatalog (>= 1.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 113 | 8/7/2026 |