mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-08-09 00:49:27 +02:00
Finished up fixing up tidy up tests; removed matcher to go to its own PR
This commit is contained in:
parent
caa62987d6
commit
4dda982ff6
@ -6096,6 +6096,7 @@ export class AddArenaTrapTagAttr extends AddArenaTagAttr {
|
|||||||
* @extends AddArenaTagAttr
|
* @extends AddArenaTagAttr
|
||||||
* @see {@linkcode apply}
|
* @see {@linkcode apply}
|
||||||
*/
|
*/
|
||||||
|
// TODO: This has exactly 1 line of code difference from the base attribute wrt. effect chances...
|
||||||
export class AddArenaTrapTagHitAttr extends AddArenaTagAttr {
|
export class AddArenaTrapTagHitAttr extends AddArenaTagAttr {
|
||||||
/**
|
/**
|
||||||
* @param user {@linkcode Pokemon} using this move
|
* @param user {@linkcode Pokemon} using this move
|
||||||
|
8
test/@types/vitest.d.ts
vendored
8
test/@types/vitest.d.ts
vendored
@ -86,14 +86,6 @@ declare module "vitest" {
|
|||||||
*/
|
*/
|
||||||
toHaveTerrain(expectedTerrainType: TerrainType): void;
|
toHaveTerrain(expectedTerrainType: TerrainType): void;
|
||||||
|
|
||||||
/**
|
|
||||||
* Matcher to check if the current {@linkcode Arena} contains the given {@linkcode ArenaTag}.
|
|
||||||
*
|
|
||||||
* @param expected - The expected {@linkcode ArenaTagType}
|
|
||||||
* @param options - The options passed to the matcher
|
|
||||||
*/
|
|
||||||
toHaveArenaTag<T extends ArenaTagType>(expected: T, options?: toHaveArenaTagOptions<T>): void;v
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether a {@linkcode Pokemon} is at full HP.
|
* Check whether a {@linkcode Pokemon} is at full HP.
|
||||||
*/
|
*/
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
import { SubstituteTag } from "#data/battler-tags";
|
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaTagSide } from "#enums/arena-tag-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { MoveEndPhase } from "#phases/move-end-phase";
|
|
||||||
import { TurnEndPhase } from "#phases/turn-end-phase";
|
|
||||||
import { GameManager } from "#test/test-utils/game-manager";
|
import { GameManager } from "#test/test-utils/game-manager";
|
||||||
import type { ArenaTrapTagType } from "#types/arena-tags";
|
import type { ArenaTrapTagType } from "#types/arena-tags";
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
@ -36,51 +35,62 @@ describe("Moves - Tidy Up", () => {
|
|||||||
.ability(AbilityId.BALL_FETCH);
|
.ability(AbilityId.BALL_FETCH);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.each<{ name: string; hazard: ArenaTrapTagType }>([{ name: "Spikes", hazard: ArenaTagType.SPIKES }])(
|
it.each<{ name: string; tagType: ArenaTrapTagType }>([
|
||||||
"should remove $name from both sides of the field",
|
{ name: "Spikes", tagType: ArenaTagType.SPIKES },
|
||||||
async ({ hazard }) => {
|
{ name: "Toxic Spikes", tagType: ArenaTagType.TOXIC_SPIKES },
|
||||||
await game.classicMode.startBattle([SpeciesId.FEEBAS]);
|
{ name: "Stealth Rock", tagType: ArenaTagType.STEALTH_ROCK },
|
||||||
|
{ name: "Sticky Web", tagType: ArenaTagType.STICKY_WEB },
|
||||||
|
])("should remove $name from both sides of the field", async ({ tagType }) => {
|
||||||
|
await game.classicMode.startBattle([SpeciesId.FEEBAS]);
|
||||||
|
|
||||||
// Add tag to both sides of the field
|
// Add tag to both sides of the field
|
||||||
game.scene.arena.addTag(hazard, 1, undefined, game.field.getPlayerPokemon().id, ArenaTagSide.PLAYER);
|
game.scene.arena.addTag(tagType, 1, undefined, game.field.getPlayerPokemon().id, ArenaTagSide.PLAYER);
|
||||||
game.scene.arena.addTag(hazard, 1, undefined, game.field.getPlayerPokemon().id, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(tagType, 1, undefined, game.field.getPlayerPokemon().id, ArenaTagSide.ENEMY);
|
||||||
|
|
||||||
expect(game.scene.arena.getTag());
|
expect(game.scene.arena.getTag(tagType)).toBeDefined();
|
||||||
game.move.use(MoveId.TIDY_UP);
|
|
||||||
await game.toEndOfTurn();
|
|
||||||
expect(game.scene.arena.getTag(ArenaTagType.SPIKES)).toBeUndefined();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
it("substitutes are cleared", async () => {
|
game.move.use(MoveId.TIDY_UP);
|
||||||
game.override.moveset([MoveId.SUBSTITUTE, MoveId.TIDY_UP]).enemyMoveset(MoveId.SUBSTITUTE);
|
await game.toEndOfTurn();
|
||||||
|
|
||||||
await game.classicMode.startBattle();
|
expect(game.scene.arena.getTag(tagType)).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
game.move.select(MoveId.SUBSTITUTE);
|
it("should clear substitutes from all pokemon", async () => {
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
game.override.battleStyle("double");
|
||||||
game.move.select(MoveId.TIDY_UP);
|
await game.classicMode.startBattle([SpeciesId.CINCCINO, SpeciesId.FEEBAS]);
|
||||||
await game.phaseInterceptor.to(MoveEndPhase);
|
|
||||||
|
|
||||||
const pokemon = [game.scene.getPlayerPokemon()!, game.scene.getEnemyPokemon()!];
|
game.move.use(MoveId.SUBSTITUTE, BattlerIndex.PLAYER);
|
||||||
pokemon.forEach(p => {
|
game.move.use(MoveId.SUBSTITUTE, BattlerIndex.PLAYER_2);
|
||||||
expect(p).toBeDefined();
|
await game.move.forceEnemyMove(MoveId.SUBSTITUTE);
|
||||||
expect(p!.getTag(SubstituteTag)).toBeUndefined();
|
await game.move.forceEnemyMove(MoveId.SUBSTITUTE);
|
||||||
|
await game.toNextTurn();
|
||||||
|
|
||||||
|
game.scene.getField(true).forEach(p => {
|
||||||
|
expect(p).toHaveBattlerTag(BattlerTagType.SUBSTITUTE);
|
||||||
|
});
|
||||||
|
|
||||||
|
game.move.use(MoveId.TIDY_UP, BattlerIndex.PLAYER);
|
||||||
|
game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2);
|
||||||
|
await game.move.forceEnemyMove(MoveId.SPLASH);
|
||||||
|
await game.move.forceEnemyMove(MoveId.SPLASH);
|
||||||
|
await game.toEndOfTurn();
|
||||||
|
|
||||||
|
game.scene.getField(true).forEach(p => {
|
||||||
|
expect(p).not.toHaveBattlerTag(BattlerTagType.SUBSTITUTE);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("user's stats are raised with no traps set", async () => {
|
it("should raise the user's stats even if a tag cannot be removed", async () => {
|
||||||
await game.classicMode.startBattle();
|
await game.classicMode.startBattle([SpeciesId.FEEBAS]);
|
||||||
|
|
||||||
const playerPokemon = game.scene.getPlayerPokemon()!;
|
const feebas = game.field.getPlayerPokemon();
|
||||||
|
expect(feebas).toHaveStatStage(Stat.ATK, 0);
|
||||||
|
expect(feebas).toHaveStatStage(Stat.SPD, 0);
|
||||||
|
|
||||||
expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0);
|
game.move.use(MoveId.TIDY_UP);
|
||||||
expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0);
|
await game.toEndOfTurn();
|
||||||
|
|
||||||
game.move.select(MoveId.TIDY_UP);
|
expect(feebas).toHaveStatStage(Stat.ATK, 1);
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
expect(feebas).toHaveStatStage(Stat.SPD, 1);
|
||||||
|
|
||||||
expect(playerPokemon.getStatStage(Stat.ATK)).toBe(1);
|
|
||||||
expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
import type { ArenaTagSide } from "#enums/arena-tag-side";
|
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
|
||||||
// biome-ignore lint/correctness/noUnusedImports: TSDoc
|
|
||||||
import type { GameManager } from "#test/test-utils/game-manager";
|
|
||||||
import { getEnumStr, stringifyEnumArray } from "#test/test-utils/string-utils";
|
|
||||||
import { isGameManagerInstance, receivedStr } from "#test/test-utils/test-utils";
|
|
||||||
import type { MatcherState, SyncExpectationResult } from "@vitest/expect";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Matcher to check if the {@linkcode Arena} has a given {@linkcode ArenaTag} active.
|
|
||||||
* @param received - The object to check. Should be the current {@linkcode GameManager}.
|
|
||||||
* @param expectedType - The {@linkcode ArenaTagType} of the desired tag
|
|
||||||
* @param side - The {@linkcode ArenaTagSide | side of the field} the tag should affect, or
|
|
||||||
* {@linkcode ArenaTagSide.BOTH} to check both sides.
|
|
||||||
* @param options - The options passed to this matcher
|
|
||||||
* @returns The result of the matching
|
|
||||||
*/
|
|
||||||
export function toHaveArenaTag(
|
|
||||||
this: MatcherState,
|
|
||||||
received: unknown,
|
|
||||||
expectedType: ArenaTagType,
|
|
||||||
side: ArenaTagSide,
|
|
||||||
): SyncExpectationResult {
|
|
||||||
if (!isGameManagerInstance(received)) {
|
|
||||||
return {
|
|
||||||
pass: false,
|
|
||||||
message: () => `Expected to recieve a GameManager, but got ${receivedStr(received)}!`,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!received.scene?.arena) {
|
|
||||||
return {
|
|
||||||
pass: false,
|
|
||||||
message: () => `Expected GameManager.${received.scene ? "scene" : "scene.arena"} to be defined!`,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const tag = received.scene.arena.getTagOnSide(expectedType, side);
|
|
||||||
const pass = !!tag;
|
|
||||||
const expectedStr = getEnumStr(ArenaTagType, expectedType);
|
|
||||||
return {
|
|
||||||
pass,
|
|
||||||
message: () =>
|
|
||||||
pass
|
|
||||||
? `Expected the arena to NOT have a tag matching ${expectedStr}, but it did!`
|
|
||||||
: // Replace newlines with spaces to preserve one-line ness
|
|
||||||
`Expected the arena to have a tag matching ${expectedStr}, but it didn't!`,
|
|
||||||
expected: getEnumStr(ArenaTagType, expectedType),
|
|
||||||
actual: stringifyEnumArray(
|
|
||||||
ArenaTagType,
|
|
||||||
received.scene.arena.tags.map(t => t.tagType),
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user