import { describe, it, afterEach, mock } from 'node:test'; import assert from 'node:assert/strict'; import { section, step, line, input, output, result, ok, warn, error } from '../log.js'; afterEach(() => mock.restoreAll()); describe('log helpers', () => { it('formats section and step messages', () => { const calls = []; mock.method(console, 'log', (...args) => { calls.push(args.join(' ')); }); section('Pipeline'); step('Step1', 'Start'); assert.deepEqual(calls, [ '\n=== Pipeline ===', '\n[Step1] Start', ]); }); it('formats line and ok messages with console.log', () => { const calls = []; mock.method(console, 'log', (...args) => { calls.push(args.join(' ')); }); line('hello'); ok('done'); assert.deepEqual(calls, [ ' - hello', ' ✓ done', ]); }); it('formats input/output and pass/fail result messages', () => { const calls = []; mock.method(console, 'log', (...args) => { calls.push(args.join(' ')); }); input('5 筆'); output('3 筆'); result(true, '通過'); result(false, '未通過'); assert.deepEqual(calls, [ ' ← 輸入:5 筆', ' → 輸出:3 筆', ' ✅ 成功:通過', ' ❌ 失敗:未通過', ]); }); it('formats warn messages with console.warn', () => { const calls = []; mock.method(console, 'warn', (...args) => { calls.push(args.join(' ')); }); warn('careful'); assert.deepEqual(calls, [' ! careful']); }); it('formats error messages with console.error', () => { const calls = []; mock.method(console, 'error', (...args) => { calls.push(args.join(' ')); }); error('boom'); assert.deepEqual(calls, [' x boom']); }); });