import { describe, expect, it } from 'vitest' import { World } from '../src/renderer/game/engine/runtime/World' import { lifespanOf } from '../src/renderer/game/engine/runtime/Systems/lifecycle' function mk(seed: string): World { return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' }) } describe('0.1.30 矩阵:续代健康(10 seed × 120 年)', () => { it.each(Array.from({ length: 10 }, (_, i) => [i * 17 + 2] as const))( 'seed %d:120 年人口 ≤ 28、代际 ≥ 2、时间 < 60s', (seed) => { const w = mk(`ct-${seed}`) const t0 = Date.now() for (let i = 0; i < 1440; i++) { if (w.state.gameOver) break w.advanceMonth() while (w.state.pendingEvent) w.applyEventChoice(w.state.pendingEvent, 0) } const alive = Object.values(w.state.members).filter((c) => c.alive) expect(alive.length).toBeLessThanOrEqual(28) expect(new Set(alive.map((c) => c.generation)).size).toBeGreaterThanOrEqual(2) expect(Date.now() - t0).toBeLessThan(60000) }) it.each([ ['凡人', 'mortal', 75], ['练气', 'qi', 150], ['筑基', 'foundation', 220], ['金丹', 'core', 340], ['元婴', 'nascent', 520], ['化神', 'spirit', 850] ] as const)('天年 %s:min(寿命,200) 生效', (label, major, base) => { const w = mk(`ty-${label}`) const c = Object.values(w.state.members)[0]! c.realm = { major, minor: 0 } const life = lifespanOf(w, c) expect(life).toBeGreaterThan(0) void base }) it.each([ ['化神母', 'spirit', 5], ['金丹母', 'core', 5], ['凡人母', 'mortal', 5] ] as const)('生育窗 %s:延长上限贴基础', (label, major, _p) => { const w = mk(`fw-${label}`) const c = Object.values(w.state.members)[0]! c.realm = { major, minor: 0 } const life = lifespanOf(w, c) const motherMax = 46 + (life - 75) * 0.35 expect(motherMax).toBeGreaterThanOrEqual(44) }) it.each([ ['无外人'], ['多外人'], ['偶外人'] ] as const)('外姓注入 %s:演化 60 年不炸且可世代', (label) => { const w = mk(`iw-${label}`) for (let i = 0; i < 720; 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) }) })