Skip to main content

Testing

Recipies about testing your game logic.

Creating Tests

Create tests in the test folder. Each of your test files should end with .test.ts. For example game.test.ts.

The contents of the file would look something like this:

import { expect, test, beforeEach } from "vitest";
import { TestRunner } from "@boardzilla/core";
import {
MyGame,
SevenPlayer,
Card,
default as setup,
} from "../src/game/index.js";

let runner: TestRunner<MyPlayer, MyGame>;

beforeEach(() => {
runner = new TestRunner(setup);
});

test("test setup", () => {
const [p1, p2] = runner.start({
players: 2,
settings: {},
});
expect(runner.server.game.round).toBe(1);
});

Obviously adding more tests to the file as you go on.

Getting Access To Player Objects

p1 and p2 from the example above gives you access to player data, but the player object is actually an attribute of each of those objects.

p1.player.my("hand")?.all().putInto(runner.server.game.first("discard")!);

Getting Access To The Game Object

All of the server accessible objects, including game are on runner.server like so:

runner.server.game.first("draw");

Creating Mock Objects

For unit testing it is often useful to create mock objects, such as a hand of cards.

import { MyGame, Space, Card } from "../src/game/index.js";

const game = new MyGame();

Then use that mock game object to create mock components with whatever properties they need for testing:

const card1 = game.create(Card, "card1", { value: 2 });
const card1 = game.create(Card, "card2", { value: 7 });
const card1 = game.create(Card, "card3", { value: 4 });