jevstrudel.git / website / src / jev / jevLog.test.mjs
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});