Overhaul tests + add tests

This commit is contained in:
Zach Day 2024-08-10 01:24:09 -04:00
parent 570074c041
commit c6757d0996

View File

@ -9,14 +9,12 @@ import { getMovePosition } from "../utils/gameManagerUtils";
import { Command } from "#app/ui/command-ui-handler"; import { Command } from "#app/ui/command-ui-handler";
import { MoveResult } from "#app/field/pokemon.js"; import { MoveResult } from "#app/field/pokemon.js";
import { Stat } from "#app/data/pokemon-stat.js"; import { Stat } from "#app/data/pokemon-stat.js";
import { DisabledTag } from "#app/data/battler-tags.js"; import { SPLASH_ONLY } from "../utils/testUtils";
import { BattlerTagType } from "#enums/battler-tag-type";
describe("Moves - Disable", () => { describe("Moves - Disable", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;
/** If in CommandPhase, input a move */
const _useMove = (move?: Moves) => { const _useMove = (move?: Moves) => {
move ??= Moves.DISABLE; move ??= Moves.DISABLE;
@ -39,71 +37,125 @@ describe("Moves - Disable", () => {
game.phaseInterceptor.restoreOg(); game.phaseInterceptor.restoreOg();
}); });
beforeEach(() => { beforeEach(async () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleType("single");
game.override.ability(Abilities.NONE); game.override.ability(Abilities.NONE);
game.override.enemyAbility(Abilities.NONE); game.override.enemyAbility(Abilities.NONE);
game.override.moveset([Moves.DISABLE, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.moveset([Moves.DISABLE, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]);
game.override.enemyMoveset([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); game.override.enemyMoveset(SPLASH_ONLY);
game.override.starterSpecies(Species.PIKACHU); game.override.starterSpecies(Species.PIKACHU);
game.override.enemySpecies(Species.SHUCKLE); game.override.enemySpecies(Species.SHUCKLE);
}); });
it("DISABLE fails if enemy has no move history", async() => { it("disables moves", async () => {
// Player goes first
await game.startBattle(); await game.startBattle();
expect(game.scene.getParty()[0].stats[Stat.SPD]).toBeGreaterThan(game.scene.getEnemyParty()[0].stats[Stat.SPD]); const playerMon = game.scene.getPlayerPokemon()!;
const enemyMon = game.scene.getEnemyPokemon()!;
_useMove(); playerMon.stats[Stat.SPD] = 1;
enemyMon.stats[Stat.SPD] = 2;
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase);
expect(game.scene.getParty()[0].getMoveHistory().at(0)!.result).toBe(MoveResult.FAIL);
}, 20000);
it("DISABLE works when user moves after enemy", async() => {
game.override.starterSpecies(Species.SHUCKLE);
game.override.enemySpecies(Species.PIKACHU);
await game.startBattle();
expect(game.scene.getParty()[0].stats[Stat.SPD]).toBeLessThan(game.scene.getEnemyParty()[0].stats[Stat.SPD]);
_useMove(); _useMove();
await game.phaseInterceptor.to(CommandPhase); await game.phaseInterceptor.to(CommandPhase);
expect(game.scene.getParty()[0].getMoveHistory().at(0)!.move).toBe(Moves.DISABLE); expect(playerMon.getMoveHistory()).toHaveLength(1);
expect(game.scene.getParty()[0].getMoveHistory().at(0)!.result).toBe(MoveResult.SUCCESS); expect(enemyMon.getMoveHistory()).toHaveLength(1);
expect(game.scene.getEnemyParty()[0].getMoveHistory().at(0)!.move).toBe(Moves.SPLASH); expect(playerMon.getMoveHistory()[0]).toMatchObject({ move: Moves.DISABLE, result: MoveResult.SUCCESS });
expect(game.scene.getEnemyParty()[0].summonData.tags).toHaveLength(1); expect(enemyMon.isMoveDisabled(Moves.SPLASH)).toBe(true);
expect(game.scene.getEnemyParty()[0].summonData.tags[0]).toBeInstanceOf(DisabledTag); });
expect((game.scene.getEnemyParty()[0].getTag(BattlerTagType.DISABLED) as DisabledTag).moveId).toBe(Moves.SPLASH);
expect(game.scene.getEnemyParty()[0].isMoveDisabled(Moves.SPLASH)).toBe(true); it("fails if enemy has no move history", async() => {
await game.startBattle();
const playerMon = game.scene.getPlayerPokemon()!;
const enemyMon = game.scene.getEnemyPokemon()!;
playerMon.stats[Stat.SPD] = 2;
enemyMon.stats[Stat.SPD] = 1;
_useMove(); _useMove();
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase);
expect(game.scene.getEnemyParty()[0].getLastXMoves().at(0)!.move).toBe(Moves.STRUGGLE);
expect(playerMon.getMoveHistory()).toHaveLength(1);
expect(playerMon.getMoveHistory()[0]).toMatchObject({ move: Moves.DISABLE, result: MoveResult.FAIL });
}, 20000); }, 20000);
it("DISABLE interrupts target's move when user moves first", async() => { it("causes STRUGGLE if all usable moves are disabled", async() => {
// Player goes first
await game.startBattle(); await game.startBattle();
const playerMon = game.scene.getPlayerPokemon()!;
const enemyMon = game.scene.getEnemyPokemon()!;
playerMon.stats[Stat.SPD] = 1;
enemyMon.stats[Stat.SPD] = 2;
// Enemy will use SPLASH, we will disable it
_useMove();
await game.phaseInterceptor.to(CommandPhase);
// Enemy will use STRUGGLE
_useMove();
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase);
const enemyHistory = enemyMon.getMoveHistory();
expect(enemyHistory).toHaveLength(2);
expect(enemyHistory[0].move).toBe(Moves.SPLASH);
expect(enemyHistory[1].move).toBe(Moves.STRUGGLE);
}, 20000);
it("cannot disable STRUGGLE", async() => {
game.override.enemyMoveset(Array(4).fill(Moves.STRUGGLE));
await game.startBattle();
const playerMon = game.scene.getPlayerPokemon()!;
const enemyMon = game.scene.getEnemyPokemon()!;
playerMon.stats[Stat.SPD] = 1;
enemyMon.stats[Stat.SPD] = 2;
_useMove();
await game.phaseInterceptor.to(CommandPhase);
expect(playerMon.getLastXMoves()[0].result).toBe(MoveResult.FAIL);
expect(enemyMon.getLastXMoves()[0].move).toBe(Moves.STRUGGLE);
expect(enemyMon.isMoveDisabled(Moves.STRUGGLE)).toBe(false);
}, 20000);
it("interrupts target's move when target moves after", async() => {
await game.startBattle();
const playerMon = game.scene.getPlayerPokemon()!;
const enemyMon = game.scene.getEnemyPokemon()!;
playerMon.stats[Stat.SPD] = 2;
enemyMon.stats[Stat.SPD] = 1;
// Waste a turn to let the target make move history
_useMove(Moves.SPLASH); _useMove(Moves.SPLASH);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase);
expect(game.scene.getEnemyParty()[0].getMoveHistory()).toHaveLength(1);
// Both mons just used Splash last turn; now have player use Disable. // Both mons just used Splash last turn; now have player use Disable.
_useMove(Moves.DISABLE);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase);
const enemyHistory = enemyMon.getMoveHistory();
expect(enemyHistory).toHaveLength(2);
expect(enemyHistory[0]).toMatchObject({ move: Moves.SPLASH, result: MoveResult.SUCCESS });
expect(enemyHistory[1].result).toBe(MoveResult.FAIL);
}, 20000);
it("disables NATURE POWER, not the move invoked by it", async() => {
await game.startBattle();
const playerMon = game.scene.getPlayerPokemon()!;
const enemyMon = game.scene.getEnemyPokemon()!;
game.override.moveset(Array(4).fill(Moves.DISABLE));
game.override.enemyMoveset(Array(4).fill(Moves.NATURE_POWER));
playerMon.stats[Stat.SPD] = 1;
enemyMon.stats[Stat.SPD] = 2;
_useMove(Moves.DISABLE); _useMove(Moves.DISABLE);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(CommandPhase);
expect(game.scene.getPlayerPokemon()!.getMoveHistory().length).toBe(2); expect(enemyMon.isMoveDisabled(Moves.NATURE_POWER)).toBe(true);
expect(enemyMon.isMoveDisabled(enemyMon.getLastXMoves(2)[1].move)).toBe(false);
expect(game.scene.getEnemyParty()[0].isMoveDisabled(Moves.SPLASH));
expect(game.scene.getEnemyParty()[0].getMoveHistory().length).toBe(2);
expect(game.scene.getEnemyParty()[0].getLastXMoves(2).at(0)!.result).toBe(MoveResult.FAIL);
expect(game.scene.getEnemyParty()[0].getLastXMoves(2).at(1)!.result).toBe(MoveResult.SUCCESS);
}, 20000); }, 20000);
}); });