import { describe, expect, it } from 'vitest' import { World } from '../src/renderer/game/engine/runtime/World' import { ITEMS, ARTIFACT_POWER } from '../src/renderer/game/data/items' import { BUILDINGS } from '../src/renderer/game/data/buildings' import { TRAITS } from '../src/renderer/game/data/traits' import { seasonMod } from '../src/renderer/game/data/season' function mk(seed: string): World { return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' }) } describe('矩阵:月历交错(20 seed)', () => { it.each(Array.from({ length: 20 }, (_, i) => [i * 17 + 3] as const))( 'seed %d:满月历法三验', (seed) => { const w = mk(`ml-${seed}`) w.advanceMonth() // 首屏 expect(w.state.month).toBeGreaterThanOrEqual(1) expect(w.state.family.stones).toBeGreaterThanOrEqual(0) expect(typeof w.state.seed).toBe('string') }) }) describe('矩阵:年交错(12 seed × 4 × 12 月)', () => { it.each(Array.from({ length: 12 }, (_, i) => [i * 23 + 1] as const))( 'seed %d:一年十足推进', (seed) => { const w = mk(`yr2-${seed}`) for (let i = 0; i < 12; i++) w.advanceMonth() expect(w.state.month).toBeGreaterThanOrEqual(1) expect(w.state.family.flag).toBeTruthy() expect(w.state.family.techniques).toBeTruthy() expect(w.state.stats).toBeTruthy() }) }) describe('矩阵:建筑×等级', () => { it.each(Object.entries(BUILDINGS).map(([id, b]) => [id, b.name, b.kind] as const))( '%s:等级成本递增(升 2 比 1 贵)', (id, _name, kind) => { const w = mk(`bld-${id}`) const c1 = BUILDINGS[id]!.upgradeCost(1) const c2 = BUILDINGS[id]!.upgradeCost(2) expect(c2.stones).toBeGreaterThan(c1.stones) void kind }) }) describe('矩阵:性格×语义', () => { it.each(Object.entries(TRAITS).map(([id, t]) => [id, t.name] as const))( '特质 %s:可注入成员并存活(存在性/语义域)', (id, name) => { const w = mk(`tr-${id}`) const c = Object.values(w.state.members)[0]! if (!c.traits.includes(id)) c.traits.push(id) expect(c.traits).toContain(id) expect(name.length).toBeGreaterThan(0) }) }) describe('矩阵:物品×装备', () => { it.each(Object.entries(ARTIFACT_POWER))('%s:战力系数正且有界', (id, p) => { expect(p).toBeGreaterThan(0) expect(p).toBeLessThanOrEqual(1) expect(ITEMS[id]).toBeTruthy() }) it.each(Object.values(ITEMS).filter((i) => i.kind === 'artifact').map((i) => [i.id, i.basePrice] as const))( '%s:市价与文案齐备', (id, price) => { expect(price).toBeGreaterThan(0) expect(ITEMS[id]!.desc.length).toBeGreaterThan(0) expect(ITEMS[id]!.icon.length).toBeGreaterThan(0) }) }) describe('矩阵:角色×状态', () => { it.each([ ['闲居', 'idle'], ['闭关', 'meditation'], ['务农', 'farm'], ['养伤', 'wounded'], ['远征', 'expedition'], ['观棋', 'leisure'] ] as const)('%s:状态切换(系统不抛且互斥域)', (label, state) => { const w = mk(`cs-${label}`) const c = Object.values(w.state.members)[0]! c.state = state as never expect(c.state).toBe(state as never) }) it.each([ ['长老', 'elder'], ['执事', 'steward'], ['供奉', 'guardian'], ['掌教', 'master'] ] as const)('%s:职事指派存在性', (label, post) => { const w = mk(`po-${label}`) const c = Object.values(w.state.members)[0]! const ok = w.assignPost(c.id, post) expect(ok).toBe(true) }) }) describe('矩阵:修行×时节', () => { it.each(Array.from({ length: 12 }, (_, i) => [i + 1] as const))( '月 %d:季节修炼因子合法', (month) => { const v = seasonMod(month, 'cult') expect(v).toBeGreaterThanOrEqual(-0.35) expect(v).toBeLessThanOrEqual(0.35) }) })