pokemon-showdown/test/sim/abilities/dancer.js
Guangcong Luo a65faf263f
Stop using assert.strict.strictEqual (#7515)
It turns out that when I switched us from `assert` to `assert.strict`,
I didn't actually update any existing tests or tell anyone:

0df0d234f2

So apparently everyone else just kept on using `strictEqual`.

This will be a PR and also throw an error if people continue trying to
use it, which should make it much clearer what PS policy is on this.

A lot of the problem may be that TypeScript marks assert.strict.equal
as deprecated when it's not. This was fixed 4 days ago:

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/48452

But this probably hasn't made it to a thing yet. Until then, you'll
have to deal with TS marking your tests as deprecated, but it shouldn't
be too long.

Accidentally using `assert` instead of `assert.strict` should now show
an error. This protects against the probably much worse mistake of
accidentally using `assert.equal` rather than `assert.strict.equal`.

`assert.ok` is also deprecated now.
2020-10-14 01:19:03 -07:00

148 lines
7.3 KiB
JavaScript

'use strict';
const assert = require('./../../assert');
const common = require('./../../common');
let battle;
describe('Dancer', function () {
afterEach(function () {
battle.destroy();
});
it('should only copy dance moves used by other Pokemon', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: 'Oricorio', ability: 'dancer', moves: ['swordsdance']}]});
battle.setPlayer('p2', {team: [{species: 'Oricorio', ability: 'dancer', moves: ['howl']}]});
battle.makeChoices('move swordsdance', 'move howl');
assert.statStage(battle.p1.active[0], 'atk', 2);
assert.statStage(battle.p2.active[0], 'atk', 3);
});
it('should activate in order of lowest to highest raw speed', function () {
battle = common.createBattle({gameType: 'doubles'});
battle.setPlayer('p1', {team: [
{species: 'Shedinja', level: 98, ability: 'dancer', item: 'focussash', moves: ['sleeptalk']},
{species: 'Shedinja', level: 99, ability: 'dancer', moves: ['sleeptalk']},
]});
battle.setPlayer('p2', {team: [
{species: 'Shedinja', ability: 'wonderguard', moves: ['fierydance']},
{species: 'Shedinja', ability: 'dancer', moves: ['sleeptalk']},
]});
const [, fastDancer] = battle.p1.active;
const [wwDanceSource, foeDancer] = battle.p2.active;
fastDancer.boostBy({spe: 6});
battle.makeChoices('move sleeptalk, move sleeptalk', 'move fierydance 1, move sleeptalk');
assert.fainted(wwDanceSource);
assert.fainted(foeDancer);
});
it('should activate in order of lowest to highest raw speed inside Trick Room', function () {
battle = common.createBattle({gameType: 'doubles'});
battle.setPlayer('p1', {team: [
{species: 'Shedinja', level: 98, ability: 'dancer', item: 'focussash', moves: ['sleeptalk']},
{species: 'Shedinja', level: 99, ability: 'dancer', moves: ['sleeptalk']},
]});
battle.setPlayer('p2', {team: [
{species: 'Shedinja', ability: 'wonderguard', moves: ['fierydance', 'trickroom']},
{species: 'Shedinja', ability: 'dancer', moves: ['sleeptalk']},
]});
const [, fastDancer] = battle.p1.active;
const [wwDanceSource, foeDancer] = battle.p2.active;
fastDancer.boostBy({spe: 6});
battle.makeChoices('move sleeptalk, move sleeptalk', 'move trickroom, move sleeptalk');
battle.makeChoices('move sleeptalk, move sleeptalk', 'move fierydance 1, move sleeptalk');
assert.fainted(wwDanceSource);
assert.fainted(foeDancer);
});
it('should not copy a move that failed or was blocked by Protect', function () {
// hardcoded to RNG seed
battle = common.createBattle({gameType: 'doubles', seed: [1, 2, 3, 4]});
battle.setPlayer('p1', {team: [
{species: 'Oricorio', level: 98, ability: 'dancer', item: 'laggingtail', moves: ['dragondance', 'protect', 'teeterdance']},
{species: 'Oricorio', level: 99, ability: 'dancer', moves: ['featherdance']},
]});
battle.setPlayer('p2', {team: [
{species: 'Oricorio', ability: 'dancer', moves: ['fierydance', 'protect', 'teeterdance']},
{species: 'Shedinja', ability: 'wonderguard', moves: ['finalgambit']},
]});
const [p1active, p2active] = [battle.p1.active, battle.p2.active];
battle.resetRNG();
p1active[0].boostBy({atk: 6, spe: 6});
p2active[0].boostBy({atk: -6});
p2active[1].boostBy({spe: 6});
battle.makeChoices('move dragondance, move featherdance 1', 'move fierydance -2, move finalgambit 1');
assert.fullHP(p2active[0]);
assert.statStage(p1active[0], 'atk', 6);
assert.statStage(p1active[1], 'atk', 0);
assert.statStage(p2active[0], 'atk', -6);
assert.statStage(p2active[0], 'spe', 0);
// Next turn
battle.makeChoices('move dragondance, move featherdance 1', 'move protect');
assert.statStage(p1active[0], 'atk', 6);
assert.statStage(p1active[1], 'atk', 0);
// Next turn: Teeter Dance should be copied as long as it hits one thing
battle.makeChoices('move protect, move featherdance 1', 'move teeterdance');
// Next turn: Teeter Dance should NOT be copied if everything it hits is already confused
assert.constant(() => p1active[0].volatiles['confusion'], () => battle.makeChoices('move teeterdance, move featherdance 1', 'move fierydance 1'));
});
it('should not copy a move that missed', function () {
battle = common.createBattle({gameType: 'singles', seed: [1, 2, 3, 4]});
battle.setPlayer('p1', {team: [{species: 'Oricorio', ability: 'dancer', item: 'choicescarf', moves: ['revelationdance']}]});
battle.setPlayer('p2', {team: [{species: 'Oricorio', ability: 'dancer', item: 'brightpowder', moves: ['dig']}]});
const [failDanceSource, evadesPokemon] = [battle.p1.active[0], battle.p2.active[0]];
failDanceSource.boostBy({accuracy: -6});
evadesPokemon.boostBy({evasion: 6});
battle.makeChoices('move revelationdance', 'move dig');
assert.fullHP(failDanceSource);
battle.makeChoices('move revelationdance', 'move dig');
assert.fullHP(failDanceSource);
});
it('should copy a move that hit, but did 0 damage', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: 'Oricorio', ability: 'dancer', moves: ['fierydance']}]});
battle.setPlayer('p2', {team: [{species: 'Shedinja', ability: 'dancer', item: 'focussash', moves: ['meanlook']}]});
const dancer = battle.p1.active[0];
assert.hurts(dancer, () => battle.makeChoices('move fierydance', 'move meanlook'));
});
it('should not activate if the holder fainted', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: 'Oricoriopompom', ability: 'dancer', moves: ['revelationdance']}]});
battle.setPlayer('p2', {team: [{species: 'oricorio', ability: 'dancer', level: 1, moves: ['sleeptalk']}, {species: 'oricorio', ability: 'dancer', level: 1, moves: ['sleeptalk']}]});
battle.makeChoices();
assert(!battle.log.includes('|-activate|p2: Oricorio|ability: Dancer'));
});
it('should target the user of a Dance move unless it was an ally attacking an opponent', function () {
battle = common.createBattle({gameType: 'doubles'});
battle.setPlayer('p1', {team: [
{species: 'Oricorio', level: 98, ability: 'dancer', item: 'laggingtail', moves: ['sleeptalk', 'protect', 'teeterdance']},
{species: 'Oricorio', level: 99, ability: 'heatproof', moves: ['fierydance', 'sleeptalk']},
]});
battle.setPlayer('p2', {team: [
{species: 'Oricorio', ability: 'heatproof', moves: ['fierydance', 'sleeptalk']},
{species: 'Suicune', ability: 'heatproof', moves: ['sleeptalk']},
]});
const opponentTargetingAlly = battle.p2.active[0];
assert.hurts(opponentTargetingAlly, () => battle.makeChoices('move sleeptalk, move sleeptalk', 'move fierydance 2, move sleeptalk'));
const opponentTargetingOpponent = battle.p2.active[0];
assert.hurts(opponentTargetingOpponent, () => battle.makeChoices('move sleeptalk, move sleeptalk', 'move fierydance -2, move sleeptalk'));
const allyTargetingDancer = battle.p1.active[1];
assert.hurts(allyTargetingDancer, () => battle.makeChoices('move sleeptalk, move fierydance -1', 'move sleeptalk, move sleeptalk'));
const allyTargetingOpponent = battle.p1.active[1];
const opponentTargetedByAlly = battle.p2.active[1];
const opponentNotTargetedByAlly = battle.p2.active[0];
assert.hurts(opponentTargetedByAlly, () => battle.makeChoices('move sleeptalk, move fierydance 2', 'move sleeptalk, move sleeptalk'));
assert(!allyTargetingOpponent.hurtThisTurn);
assert(!opponentNotTargetedByAlly.hurtThisTurn);
});
});