1import { beforeEach, describe, expect, it } from 'vitest'; 2import { jevLog, LOG_MAX } from './jevLog.mjs'; 3 4beforeEach(() => jevLog.clear()); 5 6describe('jevLog', () => { 7 it('puts each new line on top', () => { 8 jevLog.add({ status: 'answered', text: 'a' }); 9 jevLog.add({ status: 'answered', text: 'b' }); 10 expect(jevLog.get().map((e) => e.text)).toEqual(['b', 'a']); 11 }); 12 13 it('fills a line in where it is, when its answer lands', () => { 14 const asked = jevLog.add({ status: 'asking', text: 'cycles 5-8' }); 15 jevLog.add({ status: 'picked', text: 'a song' }); 16 jevLog.update(asked, { status: 'answered', text: 'cycles 5-8: verse', ms: 90 }); 17 expect(jevLog.get().map((e) => `${e.status} ${e.text}`)).toEqual(['picked a song', 'answered cycles 5-8: verse']); 18 expect(jevLog.get()[1].ms).toBe(90); 19 }); 20 21 it(`keeps the newest ${LOG_MAX}`, () => { 22 for (let i = 0; i < LOG_MAX + 5; i++) jevLog.add({ status: 'answered', text: String(i) }); 23 expect(jevLog.get()).toHaveLength(LOG_MAX); 24 expect(jevLog.get()[0].text).toBe(String(LOG_MAX + 4)); 25 }); 26 27 it('tells its readers', () => { 28 let heard = 0; 29 const stop = jevLog.subscribe(() => heard++); 30 jevLog.add({ status: 'asking', text: 'x' }); 31 stop(); 32 jevLog.add({ status: 'asking', text: 'y' }); 33 expect(heard).toBe(1); 34 }); 35});