import { describe, expect, it } from 'vitest'; import { lastMoveCells, replay } from './board'; import type { MoveRecord } from './model'; function play(tiles: { row: number; col: number; letter: string; blank: boolean }[]): MoveRecord { return { player: 0, action: 'play', dir: 'H', mainRow: tiles[0].row, mainCol: tiles[0].col, tiles, words: [], count: 0, score: 0, total: 0, }; } function simple(action: 'pass' | 'exchange'): MoveRecord { return { player: 1, action, dir: '', mainRow: 0, mainCol: 0, tiles: [], words: [], count: 0, score: 0, total: 0 }; } const pass = simple('pass'); describe('board replay', () => { it('places play tiles and ignores non-play moves', () => { const moves = [ play([ { row: 7, col: 7, letter: 'A', blank: false }, { row: 7, col: 8, letter: 'B', blank: true }, ]), pass, play([{ row: 8, col: 7, letter: 'C', blank: false }]), ]; const b = replay(moves); expect(b[7][7]?.letter).toBe('A'); expect(b[7][8]?.blank).toBe(true); expect(b[8][7]?.letter).toBe('C'); expect(b[0][0]).toBeNull(); expect(b.length).toBe(15); expect(b[0].length).toBe(15); }); }); describe('lastMoveCells', () => { it('returns the last move cells when the last move is a play', () => { const moves = [ pass, play([ { row: 7, col: 7, letter: 'A', blank: false }, { row: 7, col: 8, letter: 'B', blank: false }, ]), ]; expect(lastMoveCells(moves)).toEqual(new Set(['7,7', '7,8'])); }); it('highlights nothing when the last move is a pass after a play', () => { const moves = [play([{ row: 7, col: 7, letter: 'A', blank: false }]), pass]; expect(lastMoveCells(moves).size).toBe(0); }); it('highlights nothing when the last move is an exchange', () => { const moves = [play([{ row: 7, col: 7, letter: 'A', blank: false }]), simple('exchange')]; expect(lastMoveCells(moves).size).toBe(0); }); it('highlights nothing for an empty journal', () => { expect(lastMoveCells([]).size).toBe(0); }); });