OneAbove.Arena.GameContract.Testing 4.1.0

There is a newer version of this package available.
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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="OneAbove.Arena.GameContract.Testing" Version="4.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="OneAbove.Arena.GameContract.Testing" Version="4.1.0" />
                    
Directory.Packages.props
<PackageReference Include="OneAbove.Arena.GameContract.Testing" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add OneAbove.Arena.GameContract.Testing --version 4.1.0
                    
#r "nuget: OneAbove.Arena.GameContract.Testing, 4.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package OneAbove.Arena.GameContract.Testing@4.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=OneAbove.Arena.GameContract.Testing&version=4.1.0
                    
Install as a Cake Addin
#tool nuget:?package=OneAbove.Arena.GameContract.Testing&version=4.1.0
                    
Install as a Cake Tool

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 GameVersion and 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed