import test from 'node:test'; import assert from 'node:assert/strict'; import { buildBaihuaPrompt, parseBaihua } from '../src/baihua.js'; const battle = { id: 'x', name: '赤壁之战', side: '曹军 vs 孙刘', year: 208, stake: '天下三分还是一统', situ: '曹军首尾相接', real: '曹操大败北还', chao: 'donghan', nodes: [{ label: '黄盖诈降火攻' }, { label: '延烧岸营' }, { label: '曹操华容道遁走' }], }; test('buildBaihuaPrompt:四锁铁律 + 节点条数注入', () => { const msgs = buildBaihuaPrompt(battle); assert.ok(/换皮翻译|不是创作/.test(msgs[0].content)); assert.ok(/不新增或改动任何硬史实/.test(msgs[0].content)); assert.ok(/借东风/.test(msgs[0].content), '含演义黑名单'); assert.ok(msgs[1].content.includes('条数=3'), '注入节点条数'); }); test('parseBaihua:正常JSON → ok,节点截到史实条数', () => { const t = '{"hook":"你在江边","situ":"对面号称八十万","real":"曹操被一把火烧退了","nodes":["黄盖假投降放火","火烧上了岸","曹操踩着烂泥逃","多余的一条"],"scene":"火贴着水面冲过来"}'; const r = parseBaihua(t, battle); assert.ok(r.ok); assert.equal(r.baihua.nodes.length, 3, '节点截到史实条数(3)'); assert.ok(r.baihua.hook && r.baihua.scene); }); test('parseBaihua:命中演义黑名单 → 不过(宁可显原文)', () => { const t = '{"situ":"诸葛亮借东风","real":"曹操败","nodes":["a","b","c"]}'; assert.equal(parseBaihua(t, battle).ok, false); }); test('parseBaihua:断代违禁器物(东汉出现火炮) → 不过', () => { const t = '{"situ":"曹军架起火炮","real":"曹操败","nodes":["a","b","c"]}'; const r = parseBaihua(t, battle); assert.equal(r.ok, false); assert.ok(r.reason.startsWith('era')); }); test('parseBaihua:坏JSON → 不过', () => { assert.equal(parseBaihua('我不会写', battle).ok, false); });