diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index a8d8edf3d60..2909549af87 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -1,4 +1,5 @@ import { BattlerIndex } from "#app/battle"; +import Pokemon from "#app/field/pokemon"; import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; @@ -27,7 +28,7 @@ describe("Items - Grip Claw", () => { game.override .battleType("double") - .moveset([ Moves.TACKLE, Moves.SPLASH ]) + .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.ATTRACT ]) .startingHeldItems([ { name: "GRIP_CLAW", count: 1 }, ]) @@ -46,28 +47,66 @@ describe("Items - Grip Claw", () => { it("should steal items on contact and only from the attack target", async () => { await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); - const [ player, ] = game.scene.getPlayerField(); - const gripClaw = player.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; + const [ playerPokemon, ] = game.scene.getPlayerField(); + + const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); const enemyPokemon = game.scene.getEnemyField(); - const enemy1HeldItemCounts = enemyPokemon[0].getHeldItems().map((item) => item.getStackCount()); - const enemy1HeldItemTotal = enemy1HeldItemCounts[0] + enemy1HeldItemCounts[1]; - const enemy2HeldItemCounts = enemyPokemon[1].getHeldItems().map((item) => item.getStackCount()); - const enemy2HeldItemTotal = enemy2HeldItemCounts[0] + enemy2HeldItemCounts[1]; + const playerHeldItemCount = getHeldItemCount(playerPokemon); + const enemy1HeldItemCount = getHeldItemCount(enemyPokemon[0]); + const enemy2HeldItemCount = getHeldItemCount(enemyPokemon[1]); + expect(enemy2HeldItemCount).toBeGreaterThan(0); game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY_2); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to("BerryPhase", false); - const enemy1HeldItemCountsAfter = enemyPokemon[0].getHeldItems().map((item) => item.getStackCount()); - const enemy1HeldItemTotalAfter = enemy1HeldItemCountsAfter[0] + enemy1HeldItemCountsAfter[1]; - const enemy2HeldItemCountsAfter = enemyPokemon[1].getHeldItems().map((item) => item.getStackCount()); - const enemy2HeldItemTotalAfter = enemy2HeldItemCountsAfter[0] + enemy2HeldItemCountsAfter[1]; + const playerHeldItemCountAfter = getHeldItemCount(playerPokemon); + const enemy1HeldItemCountsAfter = getHeldItemCount(enemyPokemon[0]); + const enemy2HeldItemCountsAfter = getHeldItemCount(enemyPokemon[1]); - expect(enemy1HeldItemTotalAfter).toBe(enemy1HeldItemTotal); - expect(enemy2HeldItemTotalAfter).toBe(enemy2HeldItemTotal - 1); + expect(playerHeldItemCountAfter).toBe(playerHeldItemCount + 1); + expect(enemy1HeldItemCountsAfter).toBe(enemy1HeldItemCount); + expect(enemy2HeldItemCountsAfter).toBe(enemy2HeldItemCount - 1); + }); + + it("should not steal items when using a targetted, non attack move", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + + const [ playerPokemon, ] = game.scene.getPlayerField(); + + const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; + vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); + + const enemyPokemon = game.scene.getEnemyField(); + + const playerHeldItemCount = getHeldItemCount(playerPokemon); + const enemy1HeldItemCount = getHeldItemCount(enemyPokemon[0]); + const enemy2HeldItemCount = getHeldItemCount(enemyPokemon[1]); + expect(enemy2HeldItemCount).toBeGreaterThan(0); + + game.move.select(Moves.ATTRACT, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + const playerHeldItemCountAfter = getHeldItemCount(playerPokemon); + const enemy1HeldItemCountsAfter = getHeldItemCount(enemyPokemon[0]); + const enemy2HeldItemCountsAfter = getHeldItemCount(enemyPokemon[1]); + + expect(playerHeldItemCountAfter).toBe(playerHeldItemCount); + expect(enemy1HeldItemCountsAfter).toBe(enemy1HeldItemCount); + expect(enemy2HeldItemCountsAfter).toBe(enemy2HeldItemCount); }); }); + +/* + * Gets the total number of items a Pokemon holds + */ +function getHeldItemCount(pokemon: Pokemon) { + return pokemon.getHeldItems().reduce((currentTotal, item) => currentTotal + item.getStackCount(), 0); +} +