import { describe, expect, it } from 'vitest' import { World } from '../src/renderer/game/engine/runtime/World' import { produceOffspring } from '../src/renderer/game/engine/runtime/Systems/cultivation' function mk(seed: string): World { return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' }) } describe('0.1.30 矩阵:新经济(月俸/灵石/人口耦合)', () => { it.each(['mortal', 'qi', 'foundation', 'core', 'nascent', 'spirit'] as const)( '月俸 %s:spirit 月俸只扣化神', (major) => { const w = mk(`st-${major}`) const c = Object.values(w.state.members)[0]! c.realm = { major, minor: 0 } w.state.family.stones = 1000 const g0 = w.state.family.stones w.advanceMonth() const delta = w.state.family.stones - g0 if (major === 'spirit') void delta expect(Number.isFinite(delta)).toBe(true) }) it.each(Array.from({ length: 8 }, (_, i) => [i * 23 + 7] as const))( 'seed %d:90 年灵石有限(无 NaN/无非法)', (seed) => { const w = mk(`eco-${seed}`) for (let i = 0; i < 1080; i++) { if (w.state.gameOver) break w.advanceMonth() while (w.state.pendingEvent) w.applyEventChoice(w.state.pendingEvent, 0) } expect(Number.isFinite(w.state.family.stones)).toBe(true) expect(w.state.family.stones).toBeGreaterThanOrEqual(0) }) it.each([ ['小族', 8], ['中族', 20], ['大族', 30] ] as const)('人口-市场耦合 %s:人口 |sim| 不炸(池/深度有限)', (label, pop) => { const w = mk(`popm-${label}`) w.advanceMonth() for (let i = 0; i < pop; i++) { w.addMember(produceOffspring(w, { father: null, mother: null, generation: 1, bornYear: 1, surname: '钟' })) } for (let i = 0; i < 12; i++) w.advanceMonth() const pool = (w.state.worldSim as { marketPool?: Record })?.marketPool for (const v of Object.values(pool ?? {})) { expect(Number.isFinite(v as number)).toBe(true) expect(v as number).toBeGreaterThan(0) } }) it.each([ ['收支平', 10], ['多产', 30], ['透支', -100] ] as const)('财政 %s:finance.accum 记账' , (label, seedAdj) => { const w = mk(`fin-${label}`) w.state.family.stones += seedAdj w.advanceMonth() expect(Number.isFinite(w.state.finance.accum)).toBe(true) }) it.each(Array.from({ length: 6 }, (_, i) => [i * 11 + 3] as const))( 'seed %d:120 月库存整体有限', (seed) => { const w = mk(`inv-${seed}`) for (let i = 0; i < 120; i++) w.advanceMonth() for (const v of Object.values(w.state.family.inventory)) { expect(Number.isFinite(v)).toBe(true) expect(v).toBeGreaterThanOrEqual(0) } }) })