'use strict';

const assert = require('./../../assert');
const common = require('./../../common');

let battle;

describe('Perish Song', () => {
	afterEach(() => {
		battle.destroy();
	});

	it(`should KO all Pokemon that heard it in 3 turns`, () => {
		battle = common.createBattle({ gameType: 'doubles' }, [[
			{ species: "Primarina", moves: ['perishsong', 'moonblast'] },
			{ species: "Magikarp", moves: ['splash'] },
		], [
			{ species: "Magikarp", moves: ['splash'] },
			{ species: "Magikarp", moves: ['splash'] },
		]]);
		battle.makeChoices('move perishsong, move splash', 'auto');
		// We've had a crash related to fainted Pokemon and Perish Song
		battle.makeChoices('move moonblast 1, move splash', 'auto');
		battle.makeChoices();
		battle.makeChoices();
		for (const active of battle.getAllActive()) {
			assert.fainted(active);
		}
	});

	it(`should cause Pokemon to faint by order of Speed`, () => {
		battle = common.createBattle([[
			{ species: 'Weavile', moves: ['perishsong'] },
		], [
			{ species: 'Slowpoke', moves: ['sleeptalk'] },
		]]);

		for (let i = 0; i < 4; i++) { battle.makeChoices(); }
		assert.equal(battle.winner, 'Player 2');
	});

	it(`should not affect other Pokemon with the ability Soundproof`, () => {
		battle = common.createBattle([[
			{ species: 'Weavile', ability: 'soundproof', moves: ['perishsong'] },
		], [
			{ species: 'Slowpoke', ability: 'soundproof', moves: ['sleeptalk'] },
		]]);

		battle.makeChoices();
		assert(battle.p1.active[0].volatiles['perishsong'], 'Weavile should have been affected by its own Perish Song');
		assert.false(battle.p2.active[0].volatiles['perishsong'], 'Slowpoke should not have been affected by Perish Song');
	});

	it(`should not affect any Pokemon with the ability Soundproof in Gen 7`, () => {
		battle = common.gen(7).createBattle([[
			{ species: 'Weavile', ability: 'soundproof', moves: ['perishsong'] },
		], [
			{ species: 'Slowpoke', ability: 'soundproof', moves: ['sleeptalk'] },
		]]);

		battle.makeChoices();
		assert.false(battle.p1.active[0].volatiles['perishsong'], 'Weavile should not have been affected by Perish Song');
		assert.false(battle.p2.active[0].volatiles['perishsong'], 'Slowpoke should not have been affected by Perish Song');
	});
});
