clone

a browser grid puzzle game where you push words around to rewrite the rules of each level

main
miau-is-true / tests / garden-basics.test.js
garden-basics.test.js 2.5K
1import test from 'node:test';2import assert from 'node:assert/strict';3import { readFile } from 'node:fs/promises';4import { createGame } from '../src/engine.js';5import { loadMod } from '../src/mods.js';67const source = await readFile(new URL('../mods/garden-basics.cjs', import.meta.url), 'utf8');8const basicProofs = loadMod(source, { filename: 'garden-basics.cjs' });910const move = (game, direction, count = 1) => {11 const delta = { up: [0, -1], down: [0, 1], left: [-1, 0], right: [1, 0] }[direction];12 for (let index = 0; index < count; index++) game.step(...delta);13};1415test('Basic Proofs keeps its stable internal pack and level IDs', () => {16 assert.equal(basicProofs.manifest.name, 'Basic Proofs');17 assert.equal(basicProofs.manifest.id, 'garden-basics');18 assert.equal(basicProofs.levels[0].title, 'Clear the Path');19 assert.deepEqual(basicProofs.levels.map(level => level.id), ['garden-push', 'garden-pond', 'garden-thorns']);20 assert.equal(new Set(basicProofs.levels.map(level => level.id)).size, basicProofs.levels.length);21 assert.deepEqual(basicProofs.vocabulary, ['MIAU', 'ROCK', 'FLAG', 'WATER', 'THORN']);22});2324test('garden-push requires the PUSH rule to clear ROCK', () => {25 const game = createGame(basicProofs.levels[0]);26 assert.equal(game.has('ROCK', 'PUSH'), true);27 move(game, 'right');28 move(game, 'down');29 move(game, 'right', 2);30 move(game, 'up');31 const rock = game.getState().objects.find(object => object.id === 'garden-push-rock');32 assert.equal(rock.y, 2);33 move(game, 'right', 3);34 assert.equal(game.getState().won, true);35});3637test('garden-pond exposes SINK and still has a safe winning route', () => {38 const hazard = createGame(basicProofs.levels[1]);39 assert.equal(hazard.has('WATER', 'SINK'), true);40 move(hazard, 'right', 3);41 assert.equal(hazard.getState().objects.some(object => object.id === 'garden-pond-miau'), false);4243 const game = createGame(basicProofs.levels[1]);44 move(game, 'right', 2);45 move(game, 'up', 2);46 move(game, 'right', 4);47 move(game, 'down', 2);48 assert.equal(game.getState().won, true);49});5051test('garden-thorns exposes DEFEAT and still has a safe winning route', () => {52 const hazard = createGame(basicProofs.levels[2]);53 assert.equal(hazard.has('THORN', 'DEFEAT'), true);54 move(hazard, 'right', 3);55 assert.equal(hazard.getState().objects.some(object => object.id === 'garden-thorn-miau'), false);5657 const game = createGame(basicProofs.levels[2]);58 move(game, 'right', 2);59 move(game, 'up', 2);60 move(game, 'right', 4);61 move(game, 'down', 2);62 assert.equal(game.getState().won, true);63});