import { test } from 'node:test'; import assert from 'node:assert/strict'; import { extractResult } from './opencode.js'; test('extractResult: 解析乾淨的 JSON', () => { const r = extractResult('{"title":"標題","description":"描述"}'); assert.deepEqual(r, { title: '標題', description: '描述' }); }); test('extractResult: 忽略 JSON 前後的雜訊文字', () => { const r = extractResult('以下是結果:\n{"title":"T","description":"D"}\n完成'); assert.deepEqual(r, { title: 'T', description: 'D' }); }); test('extractResult: 修正字串值內未跳脫的換行', () => { // LLM 常輸出字串內含真實換行的無效 JSON const r = extractResult('{"title":"T","description":"第一行\n第二行"}'); assert.equal(r.title, 'T'); assert.equal(r.description, '第一行\n第二行'); }); test('extractResult: 去除 ANSI 控制碼後解析', () => { const r = extractResult('\x1b[32m{"title":"T","description":"D"}\x1b[0m'); assert.deepEqual(r, { title: 'T', description: 'D' }); }); test('extractResult: 挑出第一個含 title 的物件', () => { const r = extractResult('{"foo":1}\n{"title":"對的","description":"D"}'); assert.equal(r.title, '對的'); }); test('extractResult: 無有效物件回傳 null', () => { assert.equal(extractResult('沒有任何 JSON'), null); assert.equal(extractResult(''), null); assert.equal(extractResult('{"description":"缺少 title"}'), null); }); test('extractResult: description 缺漏時以空字串補上', () => { const r = extractResult('{"title":"只有標題"}'); assert.deepEqual(r, { title: '只有標題', description: '' }); });