41 lines
1.9 KiB
JavaScript
41 lines
1.9 KiB
JavaScript
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);
|
|
});
|