From cd49a47aa1fd948968d9654d6d16972a06c89f5e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 5 Dec 2025 09:47:12 -0300 Subject: [PATCH] Added missing Move Effect TODO tests - Volume G (#8428) --- test/battle/ability/damp.c | 6 +- test/battle/move_effect/baddy_bad.c | 6 - test/battle/move_effect/celebrate.c | 4 + .../{fixed_damage_arg.c => fixed_hp_damage.c} | 0 .../battle/move_effect/fixed_percent_damage.c | 9 ++ test/battle/move_effect/gear_up.c | 2 +- test/battle/move_effect/geomancy.c | 4 +- test/battle/move_effect/grassy_glide.c | 3 +- test/battle/move_effect/grav_apple.c | 3 +- test/battle/move_effect/gravity.c | 15 +- test/battle/move_effect/growth.c | 4 +- test/battle/move_effect/grudge.c | 16 +- test/battle/move_effect/guard_split.c | 4 + test/battle/move_effect/guard_swap.c | 2 +- test/battle/move_effect/guardian_of_alola.c | 4 - test/battle/move_effect/heal_pulse.c | 1 + .../move_effect/hit_set_remove_terrain.c | 0 test/battle/move_effect/misty_explosion.c | 93 +++++++++++ test/battle/move_effect/overwrite_ability.c | 150 ++++++++++++++++++ test/battle/move_effect/rain_always_hit.c | 4 - test/battle/move_effect/recoil.c | 4 + test/battle/move_effect/recoil_hp_25.c | 4 - test/battle/move_effect/simple_beam.c | 76 --------- test/battle/move_effect/sketch.c | 4 + .../steal_item.c | 0 test/battle/move_effect/super_fang.c | 4 - test/battle/move_effect/worry_seed.c | 76 --------- .../move_effect_secondary/recoil_hp_25.c | 4 + test/battle/move_effect_secondary/reflect.c | 5 +- test/battle/move_flags/always_hits_in_rain.c | 12 +- 30 files changed, 321 insertions(+), 198 deletions(-) delete mode 100644 test/battle/move_effect/baddy_bad.c create mode 100644 test/battle/move_effect/celebrate.c rename test/battle/move_effect/{fixed_damage_arg.c => fixed_hp_damage.c} (100%) create mode 100644 test/battle/move_effect/fixed_percent_damage.c delete mode 100644 test/battle/move_effect/guardian_of_alola.c delete mode 100644 test/battle/move_effect/hit_set_remove_terrain.c create mode 100644 test/battle/move_effect/misty_explosion.c create mode 100644 test/battle/move_effect/overwrite_ability.c delete mode 100644 test/battle/move_effect/rain_always_hit.c create mode 100644 test/battle/move_effect/recoil.c delete mode 100644 test/battle/move_effect/recoil_hp_25.c delete mode 100644 test/battle/move_effect/simple_beam.c create mode 100644 test/battle/move_effect/sketch.c rename test/battle/{move_effect_secondary => move_effect}/steal_item.c (100%) delete mode 100644 test/battle/move_effect/super_fang.c delete mode 100644 test/battle/move_effect/worry_seed.c create mode 100644 test/battle/move_effect_secondary/recoil_hp_25.c diff --git a/test/battle/ability/damp.c b/test/battle/ability/damp.c index 030e698d8e..021517334b 100644 --- a/test/battle/ability/damp.c +++ b/test/battle/ability/damp.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies") +SINGLE_BATTLE_TEST("Damp prevents Explosion-like moves from enemies") { u32 move; PARAMETRIZE { move = MOVE_EXPLOSION; } @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies") } } -DOUBLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies in a double battle") +DOUBLE_BATTLE_TEST("Damp prevents Explosion-like moves from enemies in a double battle") { u32 move; PARAMETRIZE { move = MOVE_EXPLOSION; } @@ -39,7 +39,7 @@ DOUBLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies in a double } } -SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from self") +SINGLE_BATTLE_TEST("Damp prevents Explosion-like moves from self") { u32 move; PARAMETRIZE { move = MOVE_EXPLOSION; } diff --git a/test/battle/move_effect/baddy_bad.c b/test/battle/move_effect/baddy_bad.c deleted file mode 100644 index e2ee4a6d84..0000000000 --- a/test/battle/move_effect/baddy_bad.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("Baddy Bad sets up Reflect, reducing physical damage"); -TO_DO_BATTLE_TEST("Baddy Bad's Reflect lasts for 5 turns"); -TO_DO_BATTLE_TEST("Baddy Bad can still damage the target when Reflect is already set up"); diff --git a/test/battle/move_effect/celebrate.c b/test/battle/move_effect/celebrate.c new file mode 100644 index 0000000000..f5719f5718 --- /dev/null +++ b/test/battle/move_effect/celebrate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Celebrate (Move Effect) test titles") diff --git a/test/battle/move_effect/fixed_damage_arg.c b/test/battle/move_effect/fixed_hp_damage.c similarity index 100% rename from test/battle/move_effect/fixed_damage_arg.c rename to test/battle/move_effect/fixed_hp_damage.c diff --git a/test/battle/move_effect/fixed_percent_damage.c b/test/battle/move_effect/fixed_percent_damage.c new file mode 100644 index 0000000000..408139b98e --- /dev/null +++ b/test/battle/move_effect/fixed_percent_damage.c @@ -0,0 +1,9 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Super Fang does 50% damage to the target's current HP") +TO_DO_BATTLE_TEST("Super Fang always deals at least 1 HP of damage") +TO_DO_BATTLE_TEST("Super Fang is unaffected by type immunities (Gen 1)") +TO_DO_BATTLE_TEST("Super Fang doesn't hit Ghost-type Pokémon (Gen 2+)") + +TO_DO_BATTLE_TEST("Guardian of Alola does 75% damage to the target's current HP") diff --git a/test/battle/move_effect/gear_up.c b/test/battle/move_effect/gear_up.c index 051205a2ba..8689d6d268 100644 --- a/test/battle/move_effect/gear_up.c +++ b/test/battle/move_effect/gear_up.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Gear Up (Move Effect) test titles") +TO_DO_BATTLE_TEST("Gear Up increases the Attack and Sp. Attack of the user and allies if they have Plus or Minus") AI_DOUBLE_BATTLE_TEST("AI uses Gear Up") { diff --git a/test/battle/move_effect/geomancy.c b/test/battle/move_effect/geomancy.c index f5b113a452..934e5e2f0a 100644 --- a/test/battle/move_effect/geomancy.c +++ b/test/battle/move_effect/geomancy.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Geomancy (Move Effect) test titles") +TO_DO_BATTLE_TEST("Geomancy takes 2 turns to increase Sp. Atk, Sp. Def and Speed by 2 stages"); +TO_DO_BATTLE_TEST("Geomancy only takes 1 turn when holding Power Herb") +TO_DO_BATTLE_TEST("Geomancy fails on the second turn if the user falls for Taunt while charging") diff --git a/test/battle/move_effect/grassy_glide.c b/test/battle/move_effect/grassy_glide.c index 00219fb1dd..64e3300970 100644 --- a/test/battle/move_effect/grassy_glide.c +++ b/test/battle/move_effect/grassy_glide.c @@ -1,4 +1,5 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grassy Glide (Move Effect) test titles") +TO_DO_BATTLE_TEST("Grassy Glide's priority increases by 1 when the user is affected by Grassy Terrain") +TO_DO_BATTLE_TEST("Dynamax: Grassy Glide's priority doesn't increase for the Max Move it becomes") diff --git a/test/battle/move_effect/grav_apple.c b/test/battle/move_effect/grav_apple.c index 7ce2dd26c7..f2c3099fdc 100644 --- a/test/battle/move_effect/grav_apple.c +++ b/test/battle/move_effect/grav_apple.c @@ -1,4 +1,5 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grav Apple (Move Effect) test titles") +TO_DO_BATTLE_TEST("Grav Apple lowers the target's Defense by 1 stage") +TO_DO_BATTLE_TEST("Grav Apple's power increases by 50% under Gravity's effect") diff --git a/test/battle/move_effect/gravity.c b/test/battle/move_effect/gravity.c index ec24917f6d..001505bae0 100644 --- a/test/battle/move_effect/gravity.c +++ b/test/battle/move_effect/gravity.c @@ -6,7 +6,11 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_GRAVITY) == EFFECT_GRAVITY); } -DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") +TO_DO_BATTLE_TEST("Gravity causes certain moves to fail") // Fly, Jump Kick, High Jump Kick, Splash, Bounce, Magnet Rise, Telekinesis, Sky Drop, Flying Press, Floaty Fall +TO_DO_BATTLE_TEST("Gravity increases accuracy of all moves by 5/3 (~1.67)") +TO_DO_BATTLE_TEST("Gravity causes all battlers to become grounded") + +DOUBLE_BATTLE_TEST("Gravity cancels Fly and Sky Drop if they are in the air") { u8 visibility; GIVEN { @@ -55,13 +59,13 @@ AI_DOUBLE_BATTLE_TEST("AI uses Gravity") PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } GIVEN { @@ -77,4 +81,3 @@ AI_DOUBLE_BATTLE_TEST("AI uses Gravity") TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } } } - diff --git a/test/battle/move_effect/growth.c b/test/battle/move_effect/growth.c index 7b53f56cfc..a9dda9cfd5 100644 --- a/test/battle/move_effect/growth.c +++ b/test/battle/move_effect/growth.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Growth (Move Effect) test titles") +TO_DO_BATTLE_TEST("Growth increases Sp. Atk and Sp. Def by 1 stage (Gen 1)") // Equivalent to raising Special +TO_DO_BATTLE_TEST("Growth increases Sp. Atk by 1 stage (Gen 2-4)") +TO_DO_BATTLE_TEST("Growth increases Attack and Sp. Atk by 1 stage or 2 stages under Sun (Gen 5+)") diff --git a/test/battle/move_effect/grudge.c b/test/battle/move_effect/grudge.c index 870d39c203..2b74a3b05a 100644 --- a/test/battle/move_effect/grudge.c +++ b/test/battle/move_effect/grudge.c @@ -1,9 +1,7 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") - -SINGLE_BATTLE_TEST("Grudge depletes all pp of the move that fainted the target") +SINGLE_BATTLE_TEST("Grudge depletes all PP of the move that fainted the target") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); } @@ -27,7 +25,7 @@ SINGLE_BATTLE_TEST("Grudge depletes all pp of the move that fainted the target") } } -SINGLE_BATTLE_TEST("Grudge does not depletes pp of a z-move") +SINGLE_BATTLE_TEST("Grudge does not deplete PP of a Z-Move") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); } @@ -51,3 +49,13 @@ SINGLE_BATTLE_TEST("Grudge does not depletes pp of a z-move") EXPECT_GT(opponent->pp[3], 0); } } + +TO_DO_BATTLE_TEST("Grudge depletes all PP from a Max Move's base move") +TO_DO_BATTLE_TEST("Grudge does not activate for Struggle") +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Move"); +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Sleep"); +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Paralysis"); +TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Flinching"); +TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Sandstorm"); +TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Leech Seed"); +TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Future Sight"); diff --git a/test/battle/move_effect/guard_split.c b/test/battle/move_effect/guard_split.c index d7572c1431..15b14c59d2 100644 --- a/test/battle/move_effect/guard_split.c +++ b/test/battle/move_effect/guard_split.c @@ -20,3 +20,7 @@ SINGLE_BATTLE_TEST("Guard Split averages users and targets Def and Sp. Def stats EXPECT_EQ(player->spDefense, opponent->spDefense); } } + +TO_DO_BATTLE_TEST("Stat stages use Guard Split's altered stats") +TO_DO_BATTLE_TEST("Assault Vest uses Guard Split's altered stats") +TO_DO_BATTLE_TEST("Eviolite uses Guard Split's altered stats") diff --git a/test/battle/move_effect/guard_swap.c b/test/battle/move_effect/guard_swap.c index f0e0e53b6a..d4be4dbd93 100644 --- a/test/battle/move_effect/guard_swap.c +++ b/test/battle/move_effect/guard_swap.c @@ -1,4 +1,4 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") +TO_DO_BATTLE_TEST("Guard Swap switches the user's Defense and Sp. Def stat stages with the target") diff --git a/test/battle/move_effect/guardian_of_alola.c b/test/battle/move_effect/guardian_of_alola.c deleted file mode 100644 index fe33236363..0000000000 --- a/test/battle/move_effect/guardian_of_alola.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Guardian of Alola (Move Effect) test titles") diff --git a/test/battle/move_effect/heal_pulse.c b/test/battle/move_effect/heal_pulse.c index 7c46cbf344..c383b72682 100644 --- a/test/battle/move_effect/heal_pulse.c +++ b/test/battle/move_effect/heal_pulse.c @@ -86,6 +86,7 @@ SINGLE_BATTLE_TEST("Heal Pulse is blocked by Substitute") SINGLE_BATTLE_TEST("Floral Healing heals the target by 2/3rd of it's maxHP if Grassy Terrain is on the field") { GIVEN { + ASSUME(GetMoveEffect(MOVE_FLORAL_HEALING) == EFFECT_HEAL_PULSE); ASSUME(GetMoveEffectArg_MoveProperty(MOVE_FLORAL_HEALING) == MOVE_EFFECT_FLORAL_HEALING); ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } diff --git a/test/battle/move_effect/hit_set_remove_terrain.c b/test/battle/move_effect/hit_set_remove_terrain.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/battle/move_effect/misty_explosion.c b/test/battle/move_effect/misty_explosion.c new file mode 100644 index 0000000000..b7e0ede902 --- /dev/null +++ b/test/battle/move_effect/misty_explosion.c @@ -0,0 +1,93 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_MISTY_EXPLOSION) == EFFECT_MISTY_EXPLOSION); +} + +TO_DO_BATTLE_TEST("Misty Explosion increases in power by 50% when affected by Misty Terrain") + +SINGLE_BATTLE_TEST("Misty Explosion causes the user to faint") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); } + } SCENE { + HP_BAR(player, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + MESSAGE("Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("Misty Explosion causes the user & the target to faint") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); } + } SCENE { + HP_BAR(player, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + HP_BAR(opponent, hp: 0); + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("Misty Explosion causes the user to faint even if it misses") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION, hit: FALSE); } + } SCENE { + HP_BAR(player, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + MESSAGE("Wobbuffet fainted!"); + } +} + +DOUBLE_BATTLE_TEST("Misty Explosion causes everyone to faint in a double battle") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_ABRA) { HP(1); } + OPPONENT(SPECIES_KADABRA) { HP(1); } + OPPONENT(SPECIES_KADABRA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MISTY_EXPLOSION); } + } SCENE { + HP_BAR(playerLeft, hp: 0); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, playerLeft); + HP_BAR(opponentLeft, hp: 0); + HP_BAR(playerRight, hp: 0); + HP_BAR(opponentRight, hp: 0); + MESSAGE("The opposing Abra fainted!"); + MESSAGE("Wynaut fainted!"); + MESSAGE("The opposing Kadabra fainted!"); + MESSAGE("Wobbuffet fainted!"); + } +} + +SINGLE_BATTLE_TEST("Misty Explosion does not trigger Destiny Bond") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_MISTY_EXPLOSION);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, opponent); + HP_BAR(player); + NOT HP_BAR(opponent); + } +} diff --git a/test/battle/move_effect/overwrite_ability.c b/test/battle/move_effect/overwrite_ability.c new file mode 100644 index 0000000000..e4be2b0667 --- /dev/null +++ b/test/battle/move_effect/overwrite_ability.c @@ -0,0 +1,150 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + }WHEN { + TURN { MOVE(player, MOVE_SIMPLE_BEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); + ABILITY_POPUP(opponent, ABILITY_BLAZE); + } THEN { + EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); + } +} + +DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } + OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SIMPLE_BEAM, target: opponentLeft); MOVE(playerRight, MOVE_SIMPLE_BEAM, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_SIMPLE); + } + } THEN { + EXPECT_EQ(opponentLeft->ability, ABILITY_SIMPLE); + } +} + +SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SIMPLE_BEAM); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + }WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ABILITY_POPUP(opponent, ABILITY_BLAZE); + } THEN { + EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); + } +} + +DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } + OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_WORRY_SEED, target: opponentLeft); MOVE(playerRight, MOVE_WORRY_SEED, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_INSOMNIA); + } + } THEN { + EXPECT_EQ(opponentLeft->ability, ABILITY_INSOMNIA); + } +} + +SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/rain_always_hit.c b/test/battle/move_effect/rain_always_hit.c deleted file mode 100644 index 3bed952a37..0000000000 --- a/test/battle/move_effect/rain_always_hit.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Bleakwind/Wildbolt/Sandsear Storm (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil.c b/test/battle/move_effect/recoil.c new file mode 100644 index 0000000000..60bf17435a --- /dev/null +++ b/test/battle/move_effect/recoil.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Take Down (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil_hp_25.c b/test/battle/move_effect/recoil_hp_25.c deleted file mode 100644 index 9abb1bcfd0..0000000000 --- a/test/battle/move_effect/recoil_hp_25.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Struggle (Move Effect) test titles") diff --git a/test/battle/move_effect/simple_beam.c b/test/battle/move_effect/simple_beam.c deleted file mode 100644 index 66d2a59fcc..0000000000 --- a/test/battle/move_effect/simple_beam.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); - ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); -} - -SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - }WHEN { - TURN { MOVE(player, MOVE_SIMPLE_BEAM); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); - ABILITY_POPUP(opponent, ABILITY_BLAZE); - } THEN { - EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); - } -} - -DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } - OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_SIMPLE_BEAM, target: opponentLeft); MOVE(playerRight, MOVE_SIMPLE_BEAM, target: opponentLeft); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerLeft); - ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerRight); - ABILITY_POPUP(opponentLeft, ABILITY_SIMPLE); - } - } THEN { - EXPECT_EQ(opponentLeft->ability, ABILITY_SIMPLE); - } -} - -SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") -{ - u32 species; - enum Ability ability; - - PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } - PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } - PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } - PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } - PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } - PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } - PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } - PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } - PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } - PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_SIMPLE_BEAM); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); - MESSAGE("But it failed!"); - } -} diff --git a/test/battle/move_effect/sketch.c b/test/battle/move_effect/sketch.c new file mode 100644 index 0000000000..e78aaa93af --- /dev/null +++ b/test/battle/move_effect/sketch.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sketch (Move Effect) test titles") diff --git a/test/battle/move_effect_secondary/steal_item.c b/test/battle/move_effect/steal_item.c similarity index 100% rename from test/battle/move_effect_secondary/steal_item.c rename to test/battle/move_effect/steal_item.c diff --git a/test/battle/move_effect/super_fang.c b/test/battle/move_effect/super_fang.c deleted file mode 100644 index 33e162395d..0000000000 --- a/test/battle/move_effect/super_fang.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Super Fang (Move Effect) test titles") diff --git a/test/battle/move_effect/worry_seed.c b/test/battle/move_effect/worry_seed.c deleted file mode 100644 index a536802087..0000000000 --- a/test/battle/move_effect/worry_seed.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); - ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); -} - -SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - }WHEN { - TURN { MOVE(player, MOVE_WORRY_SEED); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); - ABILITY_POPUP(opponent, ABILITY_BLAZE); - } THEN { - EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); - } -} - -DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } - OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_WORRY_SEED, target: opponentLeft); MOVE(playerRight, MOVE_WORRY_SEED, target: opponentLeft); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerLeft); - ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerRight); - ABILITY_POPUP(opponentLeft, ABILITY_INSOMNIA); - } - } THEN { - EXPECT_EQ(opponentLeft->ability, ABILITY_INSOMNIA); - } -} - -SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") -{ - u32 species; - enum Ability ability; - - PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } - PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } - PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } - PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } - PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } - PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } - PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } - PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } - PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } - PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_WORRY_SEED); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); - MESSAGE("But it failed!"); - } -} diff --git a/test/battle/move_effect_secondary/recoil_hp_25.c b/test/battle/move_effect_secondary/recoil_hp_25.c new file mode 100644 index 0000000000..834b55aace --- /dev/null +++ b/test/battle/move_effect_secondary/recoil_hp_25.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Struggle (Secondary Move Effect) test titles") diff --git a/test/battle/move_effect_secondary/reflect.c b/test/battle/move_effect_secondary/reflect.c index 0b1dbf7fd3..d0ada07926 100644 --- a/test/battle/move_effect_secondary/reflect.c +++ b/test/battle/move_effect_secondary/reflect.c @@ -21,8 +21,7 @@ SINGLE_BATTLE_TEST("Baddy Bad sets up Reflect when it was succesful") MOVE(player, MOVE_BADDY_BAD, hit: moveSuccess); } } SCENE { - if (moveSuccess == TRUE) - { + if (moveSuccess == TRUE) { ANIMATION(ANIM_TYPE_MOVE, MOVE_BADDY_BAD, player); MESSAGE("Reflect made your team stronger against physical moves!"); } else { @@ -33,3 +32,5 @@ SINGLE_BATTLE_TEST("Baddy Bad sets up Reflect when it was succesful") } } } + +TO_DO_BATTLE_TEST("Baddy Bad can still damage the target when Reflect is already set up"); diff --git a/test/battle/move_flags/always_hits_in_rain.c b/test/battle/move_flags/always_hits_in_rain.c index c4c5b5138b..4703052716 100644 --- a/test/battle/move_flags/always_hits_in_rain.c +++ b/test/battle/move_flags/always_hits_in_rain.c @@ -1,15 +1,21 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Thunder bypasses accuracy checks in Rain") +SINGLE_BATTLE_TEST("Thunder and Bleakwind/Wildbolt/Sandsear Storm bypass accuracy checks in Rain") { + u32 move; + PARAMETRIZE { move = MOVE_THUNDER; } + PARAMETRIZE { move = MOVE_BLEAKWIND_STORM; } + PARAMETRIZE { move = MOVE_WILDBOLT_STORM; } + PARAMETRIZE { move = MOVE_SANDSEAR_STORM; } PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - ASSUME(MoveAlwaysHitsInRain(MOVE_THUNDER) == TRUE); + ASSUME(GetMoveAccuracy(move) < 100 && GetMoveAccuracy(move) > 0); + ASSUME(MoveAlwaysHitsInRain(move) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, MOVE_THUNDER); } + TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, move); } } SCENE { NONE_OF { MESSAGE("Wobbuffet's attack missed!"); } }