import { describe, it, afterEach, expect, $, click, sleep, closeAll } from './runner.js?v=3'; // Helper: simulate typing a snippet trigger in the editor body function typeSnippet(bodyEl, trigger) { bodyEl.value = trigger; bodyEl.selectionStart = bodyEl.selectionEnd = trigger.length; // Simulate the space key that triggers snippet expansion bodyEl.value = trigger + ' '; bodyEl.selectionStart = bodyEl.selectionEnd = trigger.length + 1; bodyEl.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ' ' })); } describe('Snippets: Date & Time', () => { afterEach(() => closeAll()); it('?dat inserts current date', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?dat'); await sleep(100); // Match editor's local-time formatting (not UTC) so the assertion doesn't // drift at midnight depending on timezone offset. const d = new Date(); const pad = n => String(n).padStart(2, '0'); const today = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; expect(body.value).toContain(today); }); it('?time inserts current time', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?time'); await sleep(100); // Should contain HH:MM pattern expect(body.value).toMatch(/\d{2}:\d{2}/); }); it('?now inserts date and time', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?now'); await sleep(100); expect(body.value).toMatch(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}/); }); it('?week inserts KW number', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?week'); await sleep(100); expect(body.value).toMatch(/KW\d+/); }); }); describe('Snippets: Markdown Helpers', () => { afterEach(() => closeAll()); it('?todo inserts checkbox', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?todo'); await sleep(100); expect(body.value).toContain('- [ ] '); }); it('?hr inserts horizontal rule', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?hr'); await sleep(100); expect(body.value).toContain('---'); }); it('?h1 inserts heading', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?h1'); await sleep(100); expect(body.value).toContain('# '); }); it('?table inserts table template', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?table'); await sleep(100); expect(body.value).toContain('| col1 |'); expect(body.value).toContain('| --- |'); }); it('?code inserts code block', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?code'); await sleep(100); expect(body.value).toContain('```'); }); }); describe('Snippets: Inline Calculator', () => { afterEach(() => closeAll()); it('?3+5 calculates to 8', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?3+5'); await sleep(100); expect(body.value).toContain('8'); }); it('34+56? becomes 34+56=90', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '34+56?'); await sleep(100); expect(body.value).toContain('34+56=90'); }); it('?10*3 calculates to 30', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?10*3'); await sleep(100); expect(body.value).toContain('30'); }); it('?100/4 calculates to 25', async () => { click('#add-btn'); await sleep(200); const body = $('#editor-body'); typeSnippet(body, '?100/4'); await sleep(100); expect(body.value).toContain('25'); }); });