import { describe, expect, it } from 'vitest';
import { lipReadLine } from '../src/rules/lipRead';

describe('lipReadLine', () => {
  it('is deterministic — re-asking does not reroll reality', () => {
    const line = 'mate im on the list i promise you im on the list';
    expect(lipReadLine(line, 'p1')).toBe(lipReadLine(line, 'p1'));
  });

  it('different patrons hear the room differently', () => {
    const line = 'im on the list i swear on my nan';
    const guesses = new Set(['p1', 'p2', 'p3', 'p4', 'p5'].map((s) => lipReadLine(line, s)));
    expect(guesses.size).toBeGreaterThan(1);
  });

  it('every token is a bracketed uppercase guess', () => {
    const out = lipReadLine('mate the owner literally invited me', 'p9');
    for (const tok of out.split(' ')) {
      expect(tok.startsWith('[')).toBe(true);
      expect(tok.endsWith(']')).toBe(true);
      expect(tok).toBe(tok.toUpperCase());
    }
  });

  it('shows real uncertainty across a long line — not a clean transcript', () => {
    const out = lipReadLine(
      'listen i know the promoter and the promoter knows the owner and honestly the whole situation is very much under control',
      'p2',
    );
    expect(out).toContain('?');
  });

  it('never emits an empty guess', () => {
    expect(lipReadLine('', 'p1')).toBe('[???]');
    expect(lipReadLine('...', 'p1')).toBe('[???]');
    expect(lipReadLine('*points*', 'p1').length).toBeGreaterThan(0);
  });
});
