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() }) })