From 4cf1a8353e9806d05ce7febfd767b7263e93320b Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Fri, 24 Apr 2026 09:07:46 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E6=B7=BB=E5=8A=A0=20PP=20=E9=80=92?= =?UTF-8?q?=E5=87=8F=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 验证使用招式后 PP 减少 1,maxPp 保持不变。 Co-Authored-By: Claude Opus 4.7 --- packages/pokemon/src/__tests__/battle-helper.ts | 10 ++++++++++ .../src/__tests__/battle-scenarios.test.ts | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/packages/pokemon/src/__tests__/battle-helper.ts b/packages/pokemon/src/__tests__/battle-helper.ts index 5a7262e07..192659f76 100644 --- a/packages/pokemon/src/__tests__/battle-helper.ts +++ b/packages/pokemon/src/__tests__/battle-helper.ts @@ -146,6 +146,8 @@ export interface BattleAssertions { turnIs(n: number): BattleAssertions /** Player party has N alive (hp > 0) Pokémon */ aliveInParty(n: number): BattleAssertions + /** Player's move at index has expected pp and maxPp */ + playerMovePp(moveIndex: number, pp: number, maxPp: number): BattleAssertions /** Generic assertion */ satisfies(fn: (state: BattleState) => boolean, msg?: string): BattleAssertions } @@ -297,6 +299,14 @@ class BattleAssertionsImpl implements BattleAssertions { return this } + playerMovePp(moveIndex: number, pp: number, maxPp: number) { + const move = this.s.playerPokemon.moves[moveIndex] + expect(move).toBeDefined() + expect(move!.pp).toBe(pp) + expect(move!.maxPp).toBe(maxPp) + return this + } + satisfies(fn: (state: BattleState) => boolean, msg?: string) { expect(fn(this.s), msg).toBe(true) return this diff --git a/packages/pokemon/src/__tests__/battle-scenarios.test.ts b/packages/pokemon/src/__tests__/battle-scenarios.test.ts index 75be2d2c3..28f5a8f81 100644 --- a/packages/pokemon/src/__tests__/battle-scenarios.test.ts +++ b/packages/pokemon/src/__tests__/battle-scenarios.test.ts @@ -69,6 +69,23 @@ describe('Battle Scenario: 单回合事件', () => { .hasMove('opponent') }) + battleTest('使用招式后 PP 递减', async () => { + const s = await battleScenario() + .party('charmander', 50, ['flamethrower', 'scratch']) + .opponent('squirtle', 50) + .start() + + // Record initial PP + const initialState = s.state + const initialPp = initialState.playerPokemon.moves[0]!.pp + const maxPp = initialState.playerPokemon.moves[0]!.maxPp + expect(initialPp).toBe(maxPp) + + const state = await s.useMove(0).runTurn() + // PP should decrease by 1, maxPp stays the same + s.expect(state).playerMovePp(0, initialPp - 1, maxPp) + }) + battleTest('等级碾压一击击杀', async () => { const s = await battleScenario() .party('charmander', 100, ['flamethrower'], { ev: { hp: 252, attack: 252, speed: 252 } })