Files
battleship/test/web/test_target_interaction.js
T

50 lines
2.1 KiB
JavaScript

const assert = require('node:assert/strict');
const test = require('node:test');
const { createTargetActivator } = require('../../data/target_interaction.js');
test('a single tap selects a target without firing', () => {
const selected = [];
let shots = 0;
const activator = createTargetActivator({ canFire: () => true, select: target => selected.push(target), fire: async () => { shots += 1; } });
assert.equal(activator.tap({ x: 1, y: 6 }).action, 'select');
assert.deepEqual(selected, [{ x: 1, y: 6 }]);
assert.equal(shots, 0);
});
test('a second tap on the same cell fires once while a different cell selects', async () => {
let timeMs = 0;
const selected = [];
let shots = 0;
const activator = createTargetActivator({ canFire: () => true, select: target => selected.push(target), fire: async () => { shots += 1; }, now: () => timeMs });
activator.tap({ x: 1, y: 6 });
timeMs = 200;
const sameCell = activator.tap({ x: 1, y: 6 });
await sameCell.promise;
timeMs = 300;
assert.equal(activator.tap({ x: 2, y: 6 }).action, 'select');
assert.equal(shots, 1);
assert.deepEqual(selected, [{ x: 1, y: 6 }, { x: 2, y: 6 }]);
});
test('double activation and explicit fire are deduplicated while a shot is pending', async () => {
let resolveShot;
let shots = 0;
const activator = createTargetActivator({ canFire: () => true, select: () => {}, fire: () => new Promise(resolve => { shots += 1; resolveShot = resolve; }) });
const first = activator.doubleActivate({ x: 1, y: 6 });
const duplicate = activator.doubleActivate({ x: 1, y: 6 });
assert.equal(await duplicate.promise, false);
assert.equal(shots, 1);
resolveShot();
await first.promise;
});
test('out-of-turn or already-targeted cells cannot select or fire', () => {
let selected = 0;
let shots = 0;
const activator = createTargetActivator({ canFire: () => false, select: () => { selected += 1; }, fire: async () => { shots += 1; } });
assert.equal(activator.tap({ x: 1, y: 6 }).action, 'ignored');
assert.equal(activator.keyboard({ x: 1, y: 6 }).action, 'ignored');
assert.equal(selected, 0);
assert.equal(shots, 0);
});