From c2256e5e59740ecb6d9b128af56501ae7a1f477e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 14 Jan 2026 19:37:12 -0300 Subject: [PATCH] Added tests for fainting form changes (#8912) --- test/battle/form_change/end_battle.c | 12 +++--- test/battle/form_change/faint.c | 43 +++++++++++++++++++ test/battle/form_change/gigantamax.c | 19 ++++++++ test/battle/form_change/mega_evolution.c | 38 ++++++++++++++++ test/battle/form_change/primal_reversion.c | 50 ++++++++++++++++------ test/battle/form_change/ultra_burst.c | 22 ++++++++++ test/battle/gimmick/terastal.c | 16 +++---- test/battle/hold_effect/ogerpon_mask.c | 4 +- test/battle/move_effect/ivy_cudgel.c | 10 ++--- 9 files changed, 178 insertions(+), 36 deletions(-) diff --git a/test/battle/form_change/end_battle.c b/test/battle/form_change/end_battle.c index d4f29e4315..c3ae62f77d 100644 --- a/test/battle/form_change/end_battle.c +++ b/test/battle/form_change/end_battle.c @@ -259,13 +259,13 @@ SINGLE_BATTLE_TEST("Morpeko Hangry reverts to Full Belly Form upon battle end af SINGLE_BATTLE_TEST("Ogerpon reverts to the correct form upon battle end after terastallizing") { - u32 species; - PARAMETRIZE { species = SPECIES_OGERPON_TEAL; } - PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; } - PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; } - PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; } + u32 species, item; + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_HEARTHFLAME_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; item = ITEM_CORNERSTONE_MASK; } GIVEN { - PLAYER(species); + PLAYER(species) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } diff --git a/test/battle/form_change/faint.c b/test/battle/form_change/faint.c index 4f66dc84c1..b0566d1e56 100644 --- a/test/battle/form_change/faint.c +++ b/test/battle/form_change/faint.c @@ -69,3 +69,46 @@ DOUBLE_BATTLE_TEST("Causing a Forecast or Flower Gift Pokémon to faint should n } } } + +SINGLE_BATTLE_TEST("Ogerpon reverts to the correct form upon fainting after terastallizing") +{ + u32 species, item; + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_HEARTHFLAME_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; item = ITEM_CORNERSTONE_MASK; } + GIVEN { + PLAYER(species) { HP(1); Item(item); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, species); + } +} + +SINGLE_BATTLE_TEST("Terapagos reverts to the correct form upon fainting after terastallizing") +{ + GIVEN { + PLAYER(SPECIES_TERAPAGOS_NORMAL) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_MEMENTO, gimmick: GIMMICK_TERA); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, SPECIES_TERAPAGOS_TERASTAL); // Not Normal form due to Tera Shift + } +} diff --git a/test/battle/form_change/gigantamax.c b/test/battle/form_change/gigantamax.c index 92e2b49224..ae34a5acf2 100644 --- a/test/battle/form_change/gigantamax.c +++ b/test/battle/form_change/gigantamax.c @@ -43,3 +43,22 @@ SINGLE_BATTLE_TEST("Dynamax: Venusaur returns its base Form upon battle end afte EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_VENUSAUR); } } + +SINGLE_BATTLE_TEST("Dynamax: Venusaur returns its base Form upon fainting end after Gigantamaxing") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { HP(1); GigantamaxFactor(TRUE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, SPECIES_VENUSAUR); + } +} diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index f246cf1cc6..8e1945c558 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -216,3 +216,41 @@ SINGLE_BATTLE_TEST("Rayquaza returns its base Form upon battle end after Mega Ev EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_RAYQUAZA); } } + +SINGLE_BATTLE_TEST("Venusaur returns its base Form upon fainting end after Mega Evolving") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { HP(1); Item(ITEM_VENUSAURITE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, SPECIES_VENUSAUR); + } +} + +SINGLE_BATTLE_TEST("Rayquaza returns its base Form upon fainting end after Mega Evolving") +{ + GIVEN { + PLAYER(SPECIES_RAYQUAZA) { HP(1); Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, SPECIES_RAYQUAZA); + } +} diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index c6bab2f77a..445420a55d 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Primal reversion happens for Groudon only when holding Red Orb") +SINGLE_BATTLE_TEST("Primal Reversion happens for Groudon only when holding Red Orb") { u16 heldItem; PARAMETRIZE { heldItem = ITEM_NONE; } @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens for Groudon only when holding Red O } } -SINGLE_BATTLE_TEST("Primal reversion happens for Kyogre only when holding Blue Orb") +SINGLE_BATTLE_TEST("Primal Reversion happens for Kyogre only when holding Blue Orb") { u16 heldItem; PARAMETRIZE { heldItem = ITEM_NONE; } @@ -65,7 +65,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens for Kyogre only when holding Blue O } } -DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - opponent faster") +DOUBLE_BATTLE_TEST("Primal Reversion's order is determined by Speed - opponent faster") { GIVEN { PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(5); } @@ -91,7 +91,7 @@ DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - opponent f } } -DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - player faster") +DOUBLE_BATTLE_TEST("Primal Reversion's order is determined by Speed - player faster") { GIVEN { PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(20); } @@ -117,7 +117,7 @@ DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - player fas } } -SINGLE_BATTLE_TEST("Primal reversion happens after a mon is sent out after a mon is fainted") +SINGLE_BATTLE_TEST("Primal Reversion happens after a mon is sent out after a mon is fainted") { GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); @@ -136,7 +136,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a mon is sent out after a mon } } -SINGLE_BATTLE_TEST("Primal reversion happens after a mon is switched in") +SINGLE_BATTLE_TEST("Primal Reversion happens after a mon is switched in") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -153,7 +153,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a mon is switched in") } } -SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Eject Button") +SINGLE_BATTLE_TEST("Primal Reversion happens after a switch-in caused by Eject Button") { GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); @@ -174,7 +174,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Eject B } } -SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Red Card") +SINGLE_BATTLE_TEST("Primal Reversion happens after a switch-in caused by Red Card") { GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); @@ -194,7 +194,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Red Car } } -SINGLE_BATTLE_TEST("Primal reversion happens after the entry hazards damage") +SINGLE_BATTLE_TEST("Primal Reversion happens after the entry hazards damage") { GIVEN { ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); @@ -215,7 +215,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after the entry hazards damage") } } -SINGLE_BATTLE_TEST("Primal reversion happens immediately if it was brought in by U-turn") +SINGLE_BATTLE_TEST("Primal Reversion happens immediately if it was brought in by U-turn") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -236,7 +236,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens immediately if it was brought in by } -DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple fainted the previous turn") +DOUBLE_BATTLE_TEST("Primal Reversion triggers for multiple battlers if multiple fainted the previous turn") { GIVEN { ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); @@ -259,7 +259,7 @@ DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple } } -DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple fainted the previous turn") +DOUBLE_BATTLE_TEST("Primal Reversion triggers for all battlers if multiple fainted the previous turn") { GIVEN { ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); @@ -287,7 +287,7 @@ DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple faint } } -DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all battlers if multiple fainted the previous turn") +DOUBLE_BATTLE_TEST("Primal Reversion and other switch-in effects trigger for all battlers if multiple fainted the previous turn") { GIVEN { ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); @@ -333,7 +333,7 @@ DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all } } -SINGLE_BATTLE_TEST("Primal reversion is reverted upon battle end") +SINGLE_BATTLE_TEST("Primal Reversion is reverted upon battle end") { u32 species, item; PARAMETRIZE { species = SPECIES_GROUDON; item = ITEM_RED_ORB; } @@ -347,3 +347,25 @@ SINGLE_BATTLE_TEST("Primal reversion is reverted upon battle end") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), species); } } + +SINGLE_BATTLE_TEST("Primal Reversion is NOT reverted upon fainting") +{ + u32 species, item, targetSpecies; + PARAMETRIZE { species = SPECIES_GROUDON; item = ITEM_RED_ORB; targetSpecies = SPECIES_GROUDON_PRIMAL; } + PARAMETRIZE { species = SPECIES_KYOGRE; item = ITEM_BLUE_ORB; targetSpecies = SPECIES_KYOGRE_PRIMAL; } + GIVEN { + PLAYER(species) { HP(1); Item(item); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_CELEBRATE); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, targetSpecies); + } +} diff --git a/test/battle/form_change/ultra_burst.c b/test/battle/form_change/ultra_burst.c index fcb0efded5..1db0bf7fd8 100644 --- a/test/battle/form_change/ultra_burst.c +++ b/test/battle/form_change/ultra_burst.c @@ -135,3 +135,25 @@ SINGLE_BATTLE_TEST("Necrozma returns its proper Form upon battle end after Ultra EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), species); } } + +SINGLE_BATTLE_TEST("Necrozma returns its proper Form upon fainting after Ultra Bursting") +{ + u32 species; + PARAMETRIZE { species = SPECIES_NECROZMA_DUSK_MANE; } + PARAMETRIZE { species = SPECIES_NECROZMA_DAWN_WINGS; } + GIVEN { + PLAYER(species) { HP(1); Item(ITEM_ULTRANECROZIUM_Z); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); + MOVE(opponent, MOVE_SCRATCH); + SEND_OUT(player, 1); + } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, species); + } +} diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 2379df58dc..6cd9e290be 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -761,19 +761,19 @@ SINGLE_BATTLE_TEST("(TERA) Transformed Pokémon can't Terastalize") SINGLE_BATTLE_TEST("(TERA) Pokemon with Tera forms change upon Terastallizing") { - u32 species, targetSpecies; - PARAMETRIZE { species = SPECIES_OGERPON_TEAL; targetSpecies = SPECIES_OGERPON_TEAL_TERA; } - PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; targetSpecies = SPECIES_OGERPON_WELLSPRING_TERA; } - PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; targetSpecies = SPECIES_OGERPON_HEARTHFLAME_TERA; } - PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; targetSpecies = SPECIES_OGERPON_CORNERSTONE_TERA; } - PARAMETRIZE { species = SPECIES_TERAPAGOS_TERASTAL; targetSpecies = SPECIES_TERAPAGOS_STELLAR; } + u32 species, target, item; + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; target = SPECIES_OGERPON_TEAL_TERA; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; target = SPECIES_OGERPON_WELLSPRING_TERA; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; target = SPECIES_OGERPON_HEARTHFLAME_TERA; item = ITEM_HEARTHFLAME_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; target = SPECIES_OGERPON_CORNERSTONE_TERA; item = ITEM_CORNERSTONE_MASK; } + PARAMETRIZE { species = SPECIES_TERAPAGOS_TERASTAL; target = SPECIES_TERAPAGOS_STELLAR; item = ITEM_NONE; } GIVEN { - PLAYER(species); + PLAYER(species) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } } THEN { - EXPECT_EQ(player->species, targetSpecies); + EXPECT_EQ(player->species, target); } } diff --git a/test/battle/hold_effect/ogerpon_mask.c b/test/battle/hold_effect/ogerpon_mask.c index d1353d090f..7dcce5690b 100644 --- a/test/battle/hold_effect/ogerpon_mask.c +++ b/test/battle/hold_effect/ogerpon_mask.c @@ -15,8 +15,8 @@ SINGLE_BATTLE_TEST("Ogerpon Masks increase the base power of moves by 20%", s16 { u32 species; u32 item; - PARAMETRIZE { species = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } - PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; item = ITEM_CORNERSTONE_MASK; } + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; item = ITEM_CORNERSTONE_MASK; } PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_WELLSPRING_MASK; } PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; item = ITEM_HEARTHFLAME_MASK; } diff --git a/test/battle/move_effect/ivy_cudgel.c b/test/battle/move_effect/ivy_cudgel.c index 88d002ae35..fff580a1f8 100644 --- a/test/battle/move_effect/ivy_cudgel.c +++ b/test/battle/move_effect/ivy_cudgel.c @@ -8,14 +8,12 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Ivy Cudgel changes the move type depending on the form of Ogerpon") { - u16 species; - u16 ogerpon; - u16 item; + u32 species, ogerpon, item; - PARAMETRIZE { species = SPECIES_BLASTOISE; ogerpon = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } + PARAMETRIZE { species = SPECIES_BLASTOISE; ogerpon = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_CORNERSTONE; item = ITEM_CORNERSTONE_MASK; } - PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_WELLSPRING; item = ITEM_WELLSPRING_MASK; } - PARAMETRIZE { species = SPECIES_VENUSAUR; ogerpon = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_HEARTHFLAME_MASK; } + PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_WELLSPRING; item = ITEM_WELLSPRING_MASK; } + PARAMETRIZE { species = SPECIES_VENUSAUR; ogerpon = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_HEARTHFLAME_MASK; } GIVEN { PLAYER(ogerpon) { Item(item); }