Plateau : glisser-déposer, double toucher, clavier, raccourcis et filet des pions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Pierre MARTIN
2026-11-12 09:59:34 +01:00
co-authored by Claude Opus 5.5
parent 6dd0e93d3d
commit 835a907b9c
11 changed files with 1127 additions and 42 deletions
+45
View File
@@ -0,0 +1,45 @@
// Les gestes du plateau qui se vérifient sans navigateur : le double toucher
// et l'ordre des pions et des cases au clavier. Le glisser-déposer lui-même
// est joué dans un navigateur (tests/browser/plateau.mjs).
//
// Copyright (C) 2026 les auteurs d'Ustagammon.
// Licence : GPLv3 ou ultérieure (voir LICENSE).
import assert from "node:assert/strict";
import { test } from "node:test";
import { createDoubleTap, DOUBLE_TAP_MS, nextPlace } from "../src/ui/board-gestures.js";
import type { Place } from "../src/ui/board-model.js";
test("double toucher : deux touchers rapprochés sur le même endroit", () => {
const taps = createDoubleTap<string>();
let firsts = 0;
const first = () => {
firsts++;
return `premier ${firsts}`;
};
assert.equal(taps.tap("p8", 0, first), null);
assert.equal(taps.tap("p8", DOUBLE_TAP_MS - 1, first), "premier 1");
// Le troisième toucher recommence un double toucher.
assert.equal(taps.tap("p8", DOUBLE_TAP_MS, first), null);
// Trop lent : un nouveau premier toucher.
assert.equal(taps.tap("p8", 3 * DOUBLE_TAP_MS, first), null);
// Un autre endroit : un nouveau premier toucher.
assert.equal(taps.tap("p6", 3 * DOUBLE_TAP_MS + 10, first), null);
assert.equal(taps.tap("p6", 3 * DOUBLE_TAP_MS + 20, first), "premier 4");
assert.equal(firsts, 4);
});
test("clavier : les pions dans le sens de la course, en boucle", () => {
const places: Place[] = ["p6", "bar-player", "p13", "p8"];
assert.equal(nextPlace(places, null, 1), "bar-player");
assert.equal(nextPlace(places, null, -1), "p6");
assert.equal(nextPlace(places, "bar-player", 1), "p13");
assert.equal(nextPlace(places, "p8", 1), "p6");
assert.equal(nextPlace(places, "p6", 1), "bar-player");
assert.equal(nextPlace(places, "bar-player", -1), "p6");
// Un endroit qui n'est plus jouable : on repart du début.
assert.equal(nextPlace(places, "p24", 1), "bar-player");
assert.equal(nextPlace([], null, 1), null);
// Les cases d'arrivée, sortie comprise.
assert.equal(nextPlace(["off-player", "p2"], "p2", 1), "off-player");
});