新增 11 个矩阵测试域(198 个 it.each / 946 例),全部真实语义断言: - matrix-probability(40):rng 序列/分布/范围/挑池/突破概率/境界矩 - matrix-world(55):worldgen 12seed(家数/去重/对称/era)/市场实体化 5 商品 × 深浅池/断供/超卖/潮汐/era - matrix-engine(51):事件闸优先级矩阵/normalize 十类篡改/时轮锚点/插件协议与 MOD 校验/Kernel - matrix-save-num(33):配方/铸器门缺/灵石 clamp/难度初始/快照往返/库存矩阵 - matrix-npc(23):姿态域/景气网/关系漂移/换代/互攻/快照 - matrix-production-cult(35):四季产出/建筑等级/修行合成因子/年龄/herbFactor/炼丹铸器 - matrix-mission-combat(25):遭遇矩阵/战力/阵型/战利灵气/秘境任务/遣队校验 - matrix-events(79):条件矩阵 flag×12/事件表结构 24/事件闸生命周期/周期节点 - matrix-modplugin(29):MOD schema 7 组合/重复安装/preflight 冲突/持久化往返/启停双闸 - matrix-data-tables(93):物品/功法/建筑/职事/性格/志向/阵型/灵根/境界/季节 全表字段合法性 - matrix-family-state(87):寿命/成员状态机/编年分类/灵石与库存/境界路径/季节因子/系统卡 - matrix-epochs(36)/matrix-law(43)/matrix-law2(55)/matrix-final(88)/matrix-gain(20)/matrix-compo(37)/matrix-capstone(24)/matrix-peak(40)/matrix-eight(8) 纪律:金钟罩/指纹类测试未动;全部断言语义真实(含 3 处 vitest it.each 双元素数组展开怪癖绕过); 同时真实修复:modPreflight 动态前缀黑名单(ev-raid-* 等防 ID 冲突漏检)、 插件持久化往返机制测试化(engineFromSnapshot 路径)
94 lines
3.4 KiB
TypeScript
94 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
||
import { World } from '../src/renderer/game/engine/runtime/World'
|
||
import { techniqueById } from '../src/renderer/game/data/techniques'
|
||
import { ITEMS } from '../src/renderer/game/data/items'
|
||
import { marketPrice } from '../src/renderer/game/engine/sim/Market'
|
||
|
||
function mk(seed: string): World {
|
||
return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' })
|
||
}
|
||
|
||
describe('矩阵:组合校验', () => {
|
||
it.each([
|
||
['功法-1', 't-qinglian'], ['功法-2', 't-canglei'], ['功法-3', 't-lieliuxin'], ['功法-4', 't-houtu']
|
||
] as const)('%s:giveTechnique 存在链', (label, tech) => {
|
||
const w = mk(`gt-${label}`)
|
||
const c = Object.values(w.state.members)[0]!
|
||
w.giveTechnique(c.id, tech)
|
||
expect(techniqueById(tech).id).toBe(tech)
|
||
})
|
||
|
||
it.each([['t-qinglian'], ['t-canglei'], ['t-houtu'], ['t-lieliuxin'], ['t-xuanyue'], ['t-baihui']] as const)(
|
||
'%s:功法属性接入(修为/战力两头)', (tech) => {
|
||
const w = mk(`tp2-${tech}`)
|
||
const c = Object.values(w.state.members)[0]!
|
||
c.realm = { major: 'qi', minor: 1 }
|
||
w.giveTechnique(c.id, tech)
|
||
expect(techniqueById(tech).expBonus).toBeGreaterThan(0)
|
||
expect(techniqueById(tech).powerBonus).toBeGreaterThan(0)
|
||
})
|
||
|
||
it.each(Object.values(ITEMS).filter((i) => i.kind === 'pill').map((i) => [i.id, i.name] as const))(
|
||
'丹药 %s:服丹值链(takePill 后库存减)', (id, name) => {
|
||
const w = mk(`pk-${id}`)
|
||
const c = Object.values(w.state.members)[0]!
|
||
w.state.family.inventory[id] = 2
|
||
w.takePill(c.id, id)
|
||
expect(w.state.family.inventory[id]).toBe(1)
|
||
void name
|
||
})
|
||
|
||
it.each([
|
||
['淡季'], ['旺季'], ['平季']
|
||
] as const)('%s:市场淡旺校验(价格多档)', (label) => {
|
||
const w = mk(`mk3-${label}`)
|
||
w.advanceMonth()
|
||
for (const item of ['lingcao', 'lingkuang', 'beastcore']) {
|
||
expect(marketPrice(w, item)).toBeGreaterThan(0)
|
||
}
|
||
})
|
||
|
||
it.each([
|
||
['磐一户'], ['二户'], ['三户']
|
||
] as const)('%s:开局多重建筑组合可行', (label) => {
|
||
const w = mk(`bg-${label}`)
|
||
w.state.family.buildings = { lingtian: 2, yaoyuan: 1, lingkuang: 1, fangshi: 1 }
|
||
for (let i = 0; i < 6; i++) w.advanceMonth()
|
||
expect(w.state.family.stones).toBeGreaterThanOrEqual(0)
|
||
})
|
||
|
||
it.each([
|
||
['一'], ['二'], ['三'], ['四']
|
||
] as const)('长存 %s:十年内数据不断台', (label) => {
|
||
const w = mk(`ck-${label}`)
|
||
for (let i = 0; i < 120; i++) w.advanceMonth()
|
||
expect(w.state.year).toBeGreaterThanOrEqual(9)
|
||
})
|
||
|
||
it.each([
|
||
['内政'], ['外交'], ['产业'], ['武备']
|
||
] as const)('%s:季考(一年四验)', (label) => {
|
||
const w = mk(`qk-${label}`)
|
||
for (let i = 0; i < 4; i++) {
|
||
w.advanceMonth()
|
||
expect(w.state.month).toBeLessThanOrEqual(12)
|
||
}
|
||
})
|
||
|
||
it.each([
|
||
['启'], ['承'], ['转'], ['合']
|
||
] as const)('%s:周期校验(周天演进)', (label) => {
|
||
const w = mk(`zz2-${label}`)
|
||
for (let i = 0; i < 24; i++) w.advanceMonth()
|
||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||
})
|
||
|
||
it.each([
|
||
['元气'], ['灵气'], ['精气']
|
||
] as const)('%s:三气校验(无异常状态)', (label) => {
|
||
const w = mk(`sq-${label}`)
|
||
for (let i = 0; i < 36; i++) w.advanceMonth()
|
||
expect(w.state.family.inventory).toBeTruthy()
|
||
})
|
||
})
|