37 lines
2.2 KiB
JavaScript
37 lines
2.2 KiB
JavaScript
// 铸身 擅长/性格 → 官职 联动 单测 —— 2026-07-21(老板:"每维多选项、各带权重真影响官职,不能打折扣")。
|
|
// 锁死:①选项→副天赋(每个1项,不重叠) ②每点一个【本行】擅长官职升一级 ③旁轴也算(攒够+1) ④非法id忽略。
|
|
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { subsFromAttrs, validAttrIds, SHANCHANG_OPTS, XINGGE_OPTS } from '../src/attributes.js';
|
|
import { computeAxes } from '../src/dynasties.js';
|
|
import { computeOffice5D } from '../src/office5d.js';
|
|
|
|
const tierOf = (lei, sc, xg) =>
|
|
computeOffice5D({ professionLei: lei, axes: computeAxes(subsFromAttrs(sc, xg)), jiashi: 0 }, 'tang').rank.tier;
|
|
|
|
test('①每个选项恰好 1 项副天赋,且 17 项不重叠(多选不互顶)', () => {
|
|
const all = [...SHANCHANG_OPTS, ...XINGGE_OPTS];
|
|
for (const o of all) assert.ok(o.sub, `${o.id} 应有 sub`);
|
|
const subs = all.map((o) => o.sub);
|
|
assert.equal(new Set(subs).size, subs.length, '★ 副天赋不重叠');
|
|
});
|
|
|
|
test('②本行擅长抬官职,但【全面下调】后一选不到顶(才满也只到 t3)', () => {
|
|
// 文人 lei=wen,本行核心轴 wen;wen 的擅长:poetic/story/vivid
|
|
assert.equal(tierOf('wen', [], []), 1, '空 → 县尉 t1');
|
|
assert.equal(tierOf('wen', ['poetic'], []), 2, '1本行擅长 → 县令 t2');
|
|
assert.ok(tierOf('wen', ['poetic', 'story', 'vivid'], []) >= tierOf('wen', ['poetic'], []), '多点本行擅长,官职非降');
|
|
assert.ok(tierOf('wen', ['poetic', 'story', 'vivid'], []) <= 3, '★ 才满(纯擅长)也只到 t3,不到顶——顶级要叠分量/门第/改命');
|
|
});
|
|
|
|
test('③非本行选项:单个不动官(需攒),命中本行才是主力', () => {
|
|
// 吏才 lei=li 核心轴 fa;选 wen 的擅长(poetic)是纯旁轴
|
|
assert.equal(tierOf('li', ['poetic'], []), tierOf('li', [], []), '吏才选文采(纯旁轴)单个不抬');
|
|
assert.ok(tierOf('li', ['rigorous'], []) > tierOf('li', [], []), '吏才选严谨(本行fa)→ 升');
|
|
});
|
|
|
|
test('④validAttrIds 去非法/去重', () => {
|
|
assert.deepEqual(validAttrIds(['poetic', 'poetic', 'nope', 'rigorous'], 'shanchang'), ['poetic', 'rigorous']);
|
|
assert.deepEqual(validAttrIds(['warm', 'poetic'], 'xingge'), ['warm'], '性格表里没有 poetic → 滤掉');
|
|
});
|