From 4116ac9b5cb2a22d4082bd887d412f24eb0b8e64 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Wed, 22 Apr 2026 04:35:51 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E5=A2=9E=E5=BC=BA=20creature.test.ts?= =?UTF-8?q?=20=E8=A6=86=E7=9B=96=EF=BC=88recalculateLevel/getActiveCreatur?= =?UTF-8?q?e/=E6=80=A7=E6=A0=BC=E6=95=88=E6=9E=9C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 8 个测试用例: - recalculateLevel: 等级不变/随经验更新 - getActiveCreature: 空 party/party[0]/legacy activeCreatureId/优先级/ID 不存在 - 性格效果: adamant 加攻减特攻、timid 加速减攻 Co-Authored-By: Claude Opus 4.6 --- .../pokemon/src/__tests__/creature.test.ts | 79 ++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/packages/pokemon/src/__tests__/creature.test.ts b/packages/pokemon/src/__tests__/creature.test.ts index 7307d00e4..d8c275d4a 100644 --- a/packages/pokemon/src/__tests__/creature.test.ts +++ b/packages/pokemon/src/__tests__/creature.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from 'bun:test' import type { SpeciesId, Creature } from '../types' -import { generateCreature, calculateStats, getCreatureName, getTotalEV, recalculateLevel } from '../core/creature' +import { generateCreature, calculateStats, getCreatureName, getTotalEV, recalculateLevel, getActiveCreature } from '../core/creature' import { getSpeciesData } from '../data/species' describe('generateCreature', () => { @@ -105,3 +105,80 @@ describe('getTotalEV', () => { expect(getTotalEV(c)).toBe(210) }) }) + +describe('recalculateLevel', () => { + test('returns same creature if level unchanged', async () => { + const c = await generateCreature('bulbasaur', 42) + const result = recalculateLevel(c) + expect(result.level).toBe(c.level) + }) + + test('updates level based on totalXp', async () => { + const c = await generateCreature('charmander', 42) + c.totalXp = 8000 + const result = recalculateLevel(c) + expect(result.level).toBeGreaterThan(1) + }) +}) + +describe('getActiveCreature', () => { + test('returns null when party is empty', async () => { + const c = await generateCreature('bulbasaur') + const result = getActiveCreature({ party: [null, null, null, null, null, null], creatures: [c] }) + expect(result).toBeNull() + }) + + test('returns creature from party[0]', async () => { + const c = await generateCreature('pikachu') + const result = getActiveCreature({ party: [c.id, null, null, null, null, null], creatures: [c] }) + expect(result).not.toBeNull() + expect(result!.id).toBe(c.id) + }) + + test('returns creature from activeCreatureId (legacy)', async () => { + const c = await generateCreature('squirtle') + const result = getActiveCreature({ activeCreatureId: c.id, creatures: [c] }) + expect(result).not.toBeNull() + expect(result!.id).toBe(c.id) + }) + + test('prefers party[0] over activeCreatureId', async () => { + const c1 = await generateCreature('bulbasaur') + const c2 = await generateCreature('charmander') + const result = getActiveCreature({ party: [c1.id, null, null, null, null, null], activeCreatureId: c2.id, creatures: [c1, c2] }) + expect(result!.id).toBe(c1.id) + }) + + test('returns null when creature ID not found', () => { + const result = getActiveCreature({ party: ['nonexistent', null, null, null, null, null], creatures: [] }) + expect(result).toBeNull() + }) +}) + +describe('calculateStats - nature effects', () => { + test('adamant nature boosts attack and lowers spAtk', async () => { + const c = await generateCreature('charmander', 42) + c.level = 50 + c.nature = 'adamant' + const adamantStats = calculateStats(c) + + c.nature = 'hardy' + const hardyStats = calculateStats(c) + + expect(adamantStats.attack).toBeGreaterThan(hardyStats.attack) + expect(adamantStats.spAtk).toBeLessThan(hardyStats.spAtk) + }) + + test('timid nature boosts speed and lowers attack', async () => { + const c = await generateCreature('pikachu', 42) + c.level = 50 + c.nature = 'timid' + const timidStats = calculateStats(c) + + c.nature = 'hardy' + const hardyStats = calculateStats(c) + + expect(timidStats.speed).toBeGreaterThan(hardyStats.speed) + expect(timidStats.attack).toBeLessThan(hardyStats.attack) + }) +})