Aligns Mockolate with aweXpect and Testably.Abstractions, which run their tests on TUnit and the Microsoft.Testing.Platform, so all test projects use one framework.
## Changes
- **TUnit for all tests**: `Mockolate.Tests`, `Mockolate.Internal.Tests`, `Mockolate.SourceGenerators.Tests`, `Mockolate.Analyzers.Tests`, `Mockolate.ExampleTests`, `Mockolate.Api.Tests` and `Build.Tests` run on TUnit in reflection mode and share `Tests/Directory.Build.props`. `[Fact]`/`[Theory]` become `[Test]`, `[InlineData]` `[Arguments]`, `[MemberData]`/`TheoryData` `[MethodDataSource]`, xUnit's `TestContext.Current.CancellationToken` an injected `CancellationToken`, and `Record.Exception` a small `Catch.Exception` helper. xUnit, coverlet and `Microsoft.NET.Test.Sdk` are removed.
- **Explicit acceptance tests**: `AcceptApiChanges` and `AcceptSnapshotChanges` stay `[Explicit]`, so neither a normal run nor CI executes them. They run on purpose with a tree node filter that selects only them.
- **`global.json` opts into the Microsoft.Testing.Platform**, so `dotnet test` runs the whole solution.
- **Pipeline**: `UnitTests` and `ApiChecks` run each project and target framework through `dotnet test` and write `TestResults/<project>_<tfm>.trx`, plus `.cobertura.xml` from Microsoft.Testing.Extensions.CodeCoverage for the unit tests, which ReportGenerator turns into the SonarQube report as before. Stryker runs with `--test-runner mtp`. The unused `xunit.runner.console` and `coverlet.console` downloads are removed, and Dependabot groups `TUnit*` instead of `xunit*`.
- **Docs**: the agent guide and `Docs/agents/workflows.md` describe how to run and filter the tests and the acceptance tests, and outdated statements about `rollForward`, the coverage report format and the mutation test targets are corrected.
## Verification
- Test counts are unchanged per class on every target framework: `Mockolate.Tests` 3,419 (net10.0) / 3,288 (net8.0) / 3,057 (net48), `Mockolate.Internal.Tests` 582 / 564 / 564, `Mockolate.ExampleTests` 19 / 19 / 14, `Mockolate.SourceGenerators.Tests` 345, `Mockolate.Analyzers.Tests` 96, `Build.Tests` 58, `Mockolate.Api.Tests` 3. xUnit listed the two explicit tests as not executed; TUnit leaves them out. `dotnet test --solution Mockolate.slnx` runs 12,028 tests, all passing, and four more runs of `Mockolate.Tests` and `Mockolate.Internal.Tests` on all three frameworks passed as well.
- A temporary public API change fails the API test, and the acceptance tests run on purpose with their filter.
- `CodeCoverage` and `ApiChecks` succeed locally and write the TRX, Cobertura and SonarQube files; line coverage is 93.3% as on main.
- Stryker 5.0.0 on `Source/Mockolate/Verify` (net8.0, mutation level Advanced): 3,875 tests found and 303 mutants tested on both sides; main 260 killed, 26 survived, 10 timeout, 7 no coverage (89.11%, 12 min); this branch 261 killed, 27 survived, 8 timeout, 7 no coverage (88.78%, 13 min).
Aligns Mockolate with aweXpect and Testably.Abstractions, which run their tests on TUnit and the Microsoft.Testing.Platform, so all test projects use one framework.
Changes
Mockolate.Tests,Mockolate.Internal.Tests,Mockolate.SourceGenerators.Tests,Mockolate.Analyzers.Tests,Mockolate.ExampleTests,Mockolate.Api.TestsandBuild.Testsrun on TUnit in reflection mode and shareTests/Directory.Build.props.[Fact]/[Theory]become[Test],[InlineData][Arguments],[MemberData]/TheoryData[MethodDataSource], xUnit'sTestContext.Current.CancellationTokenan injectedCancellationToken, andRecord.Exceptiona smallCatch.Exceptionhelper. xUnit, coverlet andMicrosoft.NET.Test.Sdkare removed.AcceptApiChangesandAcceptSnapshotChangesstay[Explicit], so neither a normal run nor CI executes them. They run on purpose with a tree node filter that selects only them.global.jsonopts into the Microsoft.Testing.Platform, sodotnet testruns the whole solution.UnitTestsandApiChecksrun each project and target framework throughdotnet testand writeTestResults/<project>_<tfm>.trx, plus.cobertura.xmlfrom Microsoft.Testing.Extensions.CodeCoverage for the unit tests, which ReportGenerator turns into the SonarQube report as before. Stryker runs with--test-runner mtp. The unusedxunit.runner.consoleandcoverlet.consoledownloads are removed, and Dependabot groupsTUnit*instead ofxunit*.Docs/agents/workflows.mddescribe how to run and filter the tests and the acceptance tests, and outdated statements aboutrollForward, the coverage report format and the mutation test targets are corrected.Verification
Mockolate.Tests3,419 (net10.0) / 3,288 (net8.0) / 3,057 (net48),Mockolate.Internal.Tests582 / 564 / 564,Mockolate.ExampleTests19 / 19 / 14,Mockolate.SourceGenerators.Tests345,Mockolate.Analyzers.Tests96,Build.Tests58,Mockolate.Api.Tests3. xUnit listed the two explicit tests as not executed; TUnit leaves them out.dotnet test --solution Mockolate.slnxruns 12,028 tests, all passing, and four more runs ofMockolate.TestsandMockolate.Internal.Testson all three frameworks passed as well.CodeCoverageandApiCheckssucceed locally and write the TRX, Cobertura and SonarQube files; line coverage is 93.3% as on main.Source/Mockolate/Verify(net8.0, mutation level Advanced): 3,875 tests found and 303 mutants tested on both sides; main 260 killed, 26 survived, 10 timeout, 7 no coverage (89.11%, 12 min); this branch 261 killed, 27 survived, 8 timeout, 7 no coverage (88.78%, 13 min).