import { describe, expect, it } from 'vitest'; import { parseGameChat } from '../../src/lib/game-chat.js'; describe('game chat', () => { it('extracts say messages and ignores joins', () => { expect(parseGameChat([ ' 61:19 J;6493949;3;Conda1989', ' 63:09 say;4229696;0;alienfr;\x15just noticed i didnt have ANY perks go figure', ' 63:22 say;2989140;1;mikakyu;\x15whoopsie' ])).toEqual([ { time: '63:09', guid: '4229696', slot: 0, player: 'alienfr', message: 'just noticed i didnt have ANY perks go figure' }, { time: '63:22', guid: '2989140', slot: 1, player: 'mikakyu', message: 'whoopsie' } ]); }); it('preserves semicolons, Unicode, repeated messages and log order across timer resets', () => { const lines = ['120:59 say;abc;2;^2Player;\x15hello; café friends!', '0:01 say;abc;2;Player;hello', '0:01 say;abc;2;Player;hello']; const messages = parseGameChat(lines); expect(messages.map(message => message.time)).toEqual(['120:59', '0:01', '0:01']); expect(messages[0]).toMatchObject({ player: 'Player', message: 'hello; café friends!' }); expect(messages).toHaveLength(3); }); it('ignores malformed, unrelated and empty entries', () => { expect(parseGameChat(['', 'say;123;0;Player;no timestamp', '1:00 say;123;0;Player', '1:00 say;123;bad;Player;hello', '1:00 say;123;0;Player;\x15^7', '1:00 InitGame: say;123;0;Player;hello', '1:00 sayteam;123;0;Player;hello'])).toEqual([]); }); });