OneAbove.Arena.GameContract.Testing
4.1.0
See the version list below for details.
dotnet add package OneAbove.Arena.GameContract.Testing --version 4.1.0
NuGet\Install-Package OneAbove.Arena.GameContract.Testing -Version 4.1.0
<PackageReference Include="OneAbove.Arena.GameContract.Testing" Version="4.1.0" />
<PackageVersion Include="OneAbove.Arena.GameContract.Testing" Version="4.1.0" />
<PackageReference Include="OneAbove.Arena.GameContract.Testing" />
paket add OneAbove.Arena.GameContract.Testing --version 4.1.0
#r "nuget: OneAbove.Arena.GameContract.Testing, 4.1.0"
#:package OneAbove.Arena.GameContract.Testing@4.1.0
#addin nuget:?package=OneAbove.Arena.GameContract.Testing&version=4.1.0
#tool nuget:?package=OneAbove.Arena.GameContract.Testing&version=4.1.0
OneAbove.Arena.GameContract.Testing
The check every rule module of the One-Above Arena has to pass.
It is no recommendation: the platform takes on no module version whose suite has not run green. It stands in place of the code review that does not exist between the repos.
Use
Inherit, fill one member, done:
using OneAbove.Arena.GameContract.Testing;
public sealed class MyGameContractTests
: GameEngineContract<MyState, MyMove, MyView>
{
protected override IGameEngine<MyState, MyMove, MyView> Engine { get; }
= new MyGame();
}
That checks purity, determinism, the serialisation round trip, totality, leaks and the end of the match — and plays a few moves by itself in the process, so that not only the initial state is checked.
The suite derives its arrangements from your descriptor: every offering, every declared seat count, and every option sampled one at a time. You cannot narrow it; you can only declare less — and that stands out.
PlayDepth says how many moves deep it plays. The default is 12; override it
when a game needs more or fewer.
⚠️ What you have to say: what is hidden
Since contract 4.0 that stands in the rule module, no longer in the test project.
Two statements, and they have to match one another:
1. In the descriptor, for every game:
OpenInformation = true, // chess, Vier gewinnt: everyone sees everything
2. On the module, when OpenInformation = false:
public sealed class MyGame
: IGameEngine<MyState, MyMove, MyView>, ISecretDeclaration<MyState>
{
public IReadOnlyList<string> SecretsFor(MyState state, Seat? seat) =>
seat is Seat owner
? [.. state.Hands[owner.Index].Select(card => card.Id)]
: [.. state.DrawPile.Select(card => card.Id)];
}
The suite then checks that none of these strings occurs in a foreign view.
⚠️ Seat?, not Seat — and null is the interesting case. It means
„nobody may see this": the unshuffled draw pile, Minesweeper's mines, a
hidden solution. Whoever attributes such a thing to a seat is claiming that this
seat may see it — and then precisely that seat's view is not checked.
Why this moved
Your rule module runs in the arena in a container of its own. The platform checks a new release over a socket — there it has neither your state type nor your test project. A check running only at your place is none.
Concretely the migration reads: your secrets method moves out of rules.tests
into rules, is called SecretsFor and takes a Seat? instead of a Seat.
The old overridable hook is gone — OpenInformation in the descriptor now says
it.
For a game with completely open information you do not need the interface. There the canary bites: the match's seed may stand in no view.
Golden matches
Recorded matches, replayed bit-identically. The only defence against a change nobody took for a rule change.
GoldenGameRunner.Verify(GoldenGameFile.Load("2026-09-06-first-match.json"), engine);
When a golden test goes red, the first question is not „what is wrong with the recording" but: did we just change the rules?
- Deliberately ⇒ raise
GameVersionand create a new recording. The old one stays and has to remain green under its old version — it is the proof that running matches stay replayable. - Unintentionally ⇒ you have just found a bug.
What this suite does not check
Your game's rules. That a rook does not move diagonally is noticed by nobody here. That is what your own tests are for.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- OneAbove.Arena.GameContract (>= 4.1.0)
- xunit (>= 2.9.3)
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 |
|---|---|---|
| 4.4.0 | 0 | 9/18/2026 |
| 4.4.0-rc.1 | 0 | 9/18/2026 |
| 4.3.0 | 24 | 9/17/2026 |
| 4.3.0-rc.2 | 20 | 9/17/2026 |
| 4.3.0-rc.1 | 26 | 9/17/2026 |
| 4.2.0 | 32 | 9/17/2026 |
| 4.2.0-rc.1 | 25 | 9/17/2026 |
| 4.1.1 | 47 | 9/17/2026 |
| 4.1.1-rc.1 | 35 | 9/17/2026 |
| 4.1.0 | 31 | 9/17/2026 |
| 4.1.0-rc.3 | 38 | 9/17/2026 |
| 4.1.0-rc.2 | 29 | 9/17/2026 |
| 4.1.0-rc.1 | 35 | 9/17/2026 |
| 4.0.0 | 54 | 9/16/2026 |
| 4.0.0-rc.5 | 74 | 9/16/2026 |
| 4.0.0-rc.4 | 56 | 9/15/2026 |
| 4.0.0-rc.3 | 38 | 9/15/2026 |
| 4.0.0-rc.2 | 39 | 9/15/2026 |
| 4.0.0-rc.1 | 38 | 9/15/2026 |
| 3.0.1 | 83 | 9/14/2026 |