Files
leggenda-del-regolo/tests/command.test.mjs
T
manzoloandClaude Opus 5.5 826f5f99ec Prototipo del motore: scena, camminata, verbi, inventario, dialoghi, salvataggio
Motore guidato dai dati con due scene di prova (Piazza e salita alla Fortezza),
percorsi su area concava, clic intelligente e pressione lunga, test della soluzione
completa in node e nel browser con Playwright. Nel documento la leggenda del nonno.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 00:08:00 +02:00

67 lines
2.6 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { story } from '../src/story/story.js';
import { Game } from '../src/engine/game.js';
import { Command } from '../src/engine/command.js';
import { settle } from './helpers.mjs';
const center = h => [h.box[0] + h.box[2] / 2, h.box[1] + h.box[3] / 2];
const setup = () => {
const g = new Game(story);
return { g, c: new Command(g), at: id => center(g.hotspot(id)) };
};
test('clic intelligente: parla con le persone, guarda le cose, attraversa le uscite', () => {
const { g, c, at } = setup();
assert.equal(c.sentence('vecchietti'), 'Parla con vecchietti');
assert.equal(c.sentence('bacheca'), 'Guarda bacheca');
assert.equal(c.sentence('verso_salita'), 'Vai a verso la Fortezza');
assert.equal(c.clickScene(at('vecchietti')), 'act');
settle(g);
assert.equal(g.dialogue?.id, 'vecchietti');
});
test('verbo scelto, poi bersaglio; il verbo si azzera dopo il comando', () => {
const { g, c, at } = setup();
c.pickVerb('take');
assert.equal(c.sentence(), 'Prendi…');
assert.equal(c.sentence('asta'), 'Prendi asta del drappo');
c.clickScene(at('asta'));
assert.equal(c.verb, null);
assert.match(settle(g)[0].text, /rincorrerebbero/);
});
test('pressione lunga o clic destro guarda', () => {
const { g, c, at } = setup();
c.clickScene(at('vecchietti'), { look: true });
assert.match(settle(g)[0].text, /panchina/);
assert.equal(g.dialogue, null);
});
test('un clic sul vuoto cammina; un clic mentre si parla salta la battuta', () => {
const { g, c } = setup();
assert.equal(c.clickScene([300, 330]), 'walk');
settle(g);
assert.deepEqual([g.state.x, g.state.y], [300, 330]);
g.queue.push({ say: 'Una battuta lunga.' });
g.update(0.01);
assert.equal(c.clickScene([10, 330]), 'skip');
assert.equal(g.speech, null);
});
test('oggetto dell\'inventario: usa con, dai a, guarda', () => {
const { g, c, at } = setup();
g.state.inventory.push('squama');
assert.equal(c.clickItem('squama'), 'select');
assert.equal(c.sentence('vecchietti'), 'Usa squama con vecchietti');
c.reset();
c.pickVerb('give');
c.clickItem('squama');
assert.equal(c.sentence('vecchietti'), 'Dai squama a vecchietti');
c.clickScene(at('vecchietti'));
assert.deepEqual(settle(g).map(s => s.who), ['andrea', 'vecchioA', 'vecchioB', 'andrea']);
assert.deepEqual(g.state.inventory, ['squama'], 'nessun vicolo cieco: la squama resta');
c.clickItem('squama', { look: true });
assert.match(settle(g)[0].text, /cantina/);
});