From d2ae1175c474b8788d06bd28386a753a6eca0ed8 Mon Sep 17 00:00:00 2001 From: GGbond Date: Mon, 23 Feb 2026 21:50:03 +0800 Subject: [PATCH] Add tests for Hadron Engine and Psyblade (#9314) --- test/battle/ability/hadron_engine.c | 43 ++++++++++++++++++++++++++++- test/battle/move_effect/psyblade.c | 35 ++++++++++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/test/battle/ability/hadron_engine.c b/test/battle/ability/hadron_engine.c index e6324c0c51..0de50c94ec 100644 --- a/test/battle/ability/hadron_engine.c +++ b/test/battle/ability/hadron_engine.c @@ -1,4 +1,45 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Hadron Engine (Ability) test titles") +SINGLE_BATTLE_TEST("Hadron Engine creates Electric Terrain when entering the battle") +{ + GIVEN { + PLAYER(SPECIES_MIRAIDON) { Ability(ABILITY_HADRON_ENGINE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_HADRON_ENGINE); + MESSAGE("An electric current ran across the battlefield!"); + } +} + +SINGLE_BATTLE_TEST("Hadron Engine boosts the Pokemon's Special Attack on Electric Terrain even if not grounded", s16 damage) +{ + bool32 overrideTerrain, airBalloon; + + PARAMETRIZE { airBalloon = FALSE; overrideTerrain = TRUE; } + PARAMETRIZE { airBalloon = FALSE; overrideTerrain = FALSE; } + PARAMETRIZE { airBalloon = TRUE; overrideTerrain = TRUE; } + PARAMETRIZE { airBalloon = TRUE; overrideTerrain = FALSE; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON); + ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); + ASSUME(GetMoveCategory(MOVE_POWER_GEM) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_MIRAIDON) { Ability(ABILITY_HADRON_ENGINE); Moves(MOVE_POWER_GEM, MOVE_CELEBRATE); Item(airBalloon ? ITEM_AIR_BALLOON : ITEM_NONE); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GRASSY_TERRAIN, MOVE_CELEBRATE); Speed(2); } + } WHEN { + if (overrideTerrain) + TURN { MOVE(opponent, MOVE_GRASSY_TERRAIN); } + TURN { MOVE(player, MOVE_POWER_GEM); } + } SCENE { + if (overrideTerrain) + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASSY_TERRAIN, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_GEM, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.3333), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.3333), results[3].damage); + } +} diff --git a/test/battle/move_effect/psyblade.c b/test/battle/move_effect/psyblade.c index 3a5778d1f4..edc079fb84 100644 --- a/test/battle/move_effect/psyblade.c +++ b/test/battle/move_effect/psyblade.c @@ -1,4 +1,37 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Psyblade (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_PSYBLADE) == EFFECT_PSYBLADE); +} + +SINGLE_BATTLE_TEST("Psyblade's power increases by 50% on Electric Terrain even if the user is not grounded", s16 damage) +{ + bool32 terrain, airBalloon; + + PARAMETRIZE { terrain = FALSE; airBalloon = FALSE; } + PARAMETRIZE { terrain = TRUE; airBalloon = FALSE; } + PARAMETRIZE { terrain = FALSE; airBalloon = TRUE; } + PARAMETRIZE { terrain = TRUE; airBalloon = TRUE; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON); + ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); + ASSUME(GetMoveEffect(MOVE_PSYBLADE) == EFFECT_PSYBLADE); + PLAYER(SPECIES_SLOWKING) { Moves(MOVE_ELECTRIC_TERRAIN, MOVE_PSYBLADE); Item(airBalloon ? ITEM_AIR_BALLOON : ITEM_NONE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (terrain) + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); } + TURN { MOVE(player, MOVE_PSYBLADE); } + } SCENE { + if (terrain) + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYBLADE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[3].damage); + } +}