text: 'use strict';
  
  const assert = require('./../../assert');
  const common = require('./../../common');
  
  let battle;
  
  describe('Counter', function () {
  	afterEach(function () {
  		battle.destroy();
  	});
  
  	it('should deal damage equal to twice the damage taken from the last Physical attack', function () {
  		battle = common.createBattle();
  		battle.setPlayer('p1', {team: [{species: 'Sawk', ability: 'sturdy', moves: ['seismictoss']}]});
  		battle.setPlayer('p2', {team: [{species: 'Throh', ability: 'guts', moves: ['counter']}]});
  		assert.hurtsBy(battle.p1.active[0], 200, () => battle.makeChoices());
  	});
  
  	it('should deal damage based on the last hit from the last Physical attack', function () {
  		battle = common.createBattle();
  		battle.setPlayer('p1', {team: [{species: 'Sawk', ability: 'sturdy', moves: ['doublekick']}]});
  		battle.setPlayer('p2', {team: [{species: 'Throh', ability: 'guts', moves: ['counter']}]});
  		let lastDamage = 0;
  		battle.onEvent('Damage', battle.format, function (damage, attacker, defender, move) {
  			if (move.id === 'doublekick') {
  				lastDamage = damage;
  			}
  		});
  
  		battle.makeChoices();
  		assert.equal(battle.p1.active[0].maxhp - battle.p1.active[0].hp, 2 * lastDamage);
  	});
  
  	it('should fail if user is not damaged by Physical attacks this turn', function () {
  		battle = common.createBattle();
  		battle.setPlayer('p1', {team: [{species: 'Sawk', ability: 'sturdy', moves: ['aurasphere']}]});
  		battle.setPlayer('p2', {team: [{species: 'Throh', ability: 'guts', moves: ['counter']}]});
  		assert.false.hurts(battle.p1.active[0], () => battle.makeChoices());
  	});
  
  	it('should target the opposing Pokemon that hit the user with a Physical attack most recently that turn', function () {
  		battle = common.gen(5).createBattle({gameType: 'triples'});
  		battle.setPlayer('p1', {team: [
  			{species: 'Bastiodon', ability: 'sturdy', moves: ['counter']},
  			{species: 'Toucannon', ability: 'keeneye', moves: ['beakblast']},
  			{species: 'Kingdra', ability: 'sniper', moves: ['dragonpulse']},
  		]});
  		battle.setPlayer('p2', {team: [
  			{species: 'Crobat', ability: 'innerfocus', moves: ['acrobatics']},
  			{species: 'Avalugg', ability: 'sturdy', moves: ['avalanche']},
  			{species: 'Castform', ability: 'forecast', moves: ['weatherball']},
  		]});
  		battle.makeChoices('move counter, move beakblast -1, move dragonpulse -1', 'move acrobatics 1, move avalanche 1, move weatherball 1');
  		assert.fullHP(battle.p1.active[1]);
  		assert.fullHP(battle.p2.active[0]);
  		assert.false.fullHP(battle.p2.active[1]);
  	});
  
  	it('should respect Follow Me', function () {
  		battle = common.createBattle({gameType: 'doubles'});
  		battle.setPlayer('p1', {team: [
  			{species: 'Bastiodon', ability: 'sturdy', moves: ['counter']},
  			{species: 'Magikarp', ability: 'rattled', moves: ['splash']},
  		]});
  		battle.setPlayer('p2', {team: [
  			{species: 'Crobat', ability: 'innerfocus', moves: ['acrobatics']},
  			{species: 'Clefable', ability: 'unaware', moves: ['followme']},
  		]});
  		battle.makeChoices('move counter, move splash', 'move acrobatics 1, move followme');
  		assert.false.fullHP(battle.p2.active[1]);
  		assert.fullHP(battle.p2.active[0]);
  	});
  
  	it(`[Gen 1] Counter Desync Clause`, function () {
  		// seed chosen so Water Gun succeeds and Pound full paras
  		battle = common.gen(1).createBattle({seed: [1, 2, 3, 6]}, [[
  			{species: 'Mew', moves: ['pound', 'watergun', 'counter', 'thunderwave']},
  		], [
  			{species: 'Persian', moves: ['pound', 'watergun', 'counter', 'thunderwave']},
  		]]);
  		battle.makeChoices('move watergun', 'move thunderwave');
  		battle.makeChoices('move pound', 'move counter');
  		assert(battle.log.some(line => line.includes('Desync Clause Mod activated')));
  
  		// seed chosen so Pound succeeds and Water Gun full paras
  		battle = common.gen(1).createBattle({seed: [1, 2, 3, 6]}, [[
  			{species: 'Mew', moves: ['pound', 'watergun', 'counter', 'thunderwave']},
  		], [
  			{species: 'Persian', moves: ['pound', 'watergun', 'counter', 'thunderwave']},
  		]]);
  		battle.makeChoices('move pound', 'move thunderwave');
  		battle.makeChoices('move watergun', 'move counter');
  		assert(battle.log.some(line => line.includes('Desync Clause Mod activated')));
  
  		battle = common.gen(1).createBattle([[
  			{species: 'Mew', moves: ['pound', 'watergun', 'counter', 'splash']},
  		], [
  			{species: 'Persian', moves: ['pound', 'watergun', 'counter', 'splash']},
  		]]);
  		battle.makeChoices('move watergun', 'move splash');
  		battle.makeChoices('move pound', 'move counter');
  		assert(!battle.log.some(line => line.includes('Desync Clause Mod activated')));
  		assert.false.fullHP(battle.p1.active[0]);
  
  		battle = common.gen(1).createBattle([[
  			{species: 'Mew', moves: ['pound', 'watergun', 'counter', 'splash']},
  		], [
  			{species: 'Persian', moves: ['pound', 'watergun', 'counter', 'splash']},
  		]]);
  		battle.makeChoices('move pound', 'move splash');
  		battle.makeChoices('move watergun', 'move counter');
  		assert(!battle.log.some(line => line.includes('Desync Clause Mod activated')));
  		assert.fullHP(battle.p1.active[0]);
  	});
  
  	it(`[Gen 1 Stadium] should counter Normal/Fighting moves only`, function () {
  		// should counter Normal/Fighting moves
  		battle = common.mod('gen1stadium').createBattle([[
  			{species: 'Mew', moves: ['pound', 'watergun', 'counter', 'thunderwave']},
  		], [
  			{species: 'Persian', moves: ['pound', 'watergun', 'counter', 'thunderwave']},
  		]]);
  		battle.makeChoices('move watergun', 'move counter');
  		assert.fullHP(battle.p1.active[0]);
  		battle.makeChoices('move pound', 'move counter');
  		assert.false.fullHP(battle.p1.active[0]);
  	});
  
  	it(`should not have its target changed by Stalwart`, function () {
  		battle = common.createBattle({gameType: 'doubles'}, [[
  			{species: "Duraludon", ability: 'stalwart', moves: ['counter']},
  			{species: "Diglett", moves: ['sleeptalk']},
  		], [
  			{species: "Wynaut", moves: ['sleeptalk']},
  			{species: "Noivern", moves: ['dragonclaw']},
  		]]);
  
  		const wynaut = battle.p2.active[0];
  		battle.makeChoices('auto', 'move sleeptalk, move dragonclaw 1');
  		assert.equal(wynaut.maxhp, wynaut.hp);
  	});
  });
  
  describe('Mirror Coat', function () {
  	afterEach(function () {
  		battle.destroy();
  	});
  
  	it('should deal damage equal to twice the damage taken from the last Special attack', function () {
  		battle = common.createBattle();
  		battle.setPlayer('p1', {team: [{species: 'Espeon', ability: 'synchronize', moves: ['sonicboom']}]});
  		battle.setPlayer('p2', {team: [{species: 'Umbreon', ability: 'synchronize', moves: ['mirrorcoat']}]});
  		assert.hurtsBy(battle.p1.active[0], 40, () => battle.makeChoices());
  	});
  
  	it('should deal damage based on the last hit from the last Special attack', function () {
  		battle = common.createBattle();
  		battle.setPlayer('p1', {team: [{species: 'Espeon', ability: 'synchronize', moves: ['watershuriken']}]});
  		battle.setPlayer('p2', {team: [{species: 'Umbreon', ability: 'synchronize', moves: ['mirrorcoat']}]});
  		let lastDamage = 0;
  		battle.onEvent('Damage', battle.format, function (damage, attacker, defender, move) {
  			if (move.id === 'watershuriken') {
  				lastDamage = damage;
  			}
  		});
  
  		battle.makeChoices();
  		assert.equal(battle.p1.active[0].maxhp - battle.p1.active[0].hp, 2 * lastDamage);
  	});
  
  	it('should fail if user is not damaged by Special attacks this turn', function () {
  		battle = common.createBattle();
  		battle.setPlayer('p1', {team: [{species: 'Espeon', ability: 'synchronize', moves: ['tackle']}]});
  		battle.setPlayer('p2', {team: [{species: 'Umbreon', ability: 'synchronize', moves: ['mirrorcoat']}]});
  		assert.false.hurts(battle.p1.active[0], () => battle.makeChoices());
  	});
  
  	it('should target the opposing Pokemon that hit the user with a Special attack most recently that turn', function () {
  		battle = common.createBattle({gameType: 'doubles'});
  		battle.setPlayer('p1', {team: [
  			{species: 'Mew', ability: 'synchronize', moves: ['mirrorcoat']},
  			{species: 'Lucario', ability: 'justified', item: 'laggingtail', moves: ['aurasphere']},
  		]});
  		battle.setPlayer('p2', {team: [
  			{species: 'Crobat', ability: 'innerfocus', moves: ['venoshock']},
  			{species: 'Avalugg', ability: 'sturdy', moves: ['flashcannon']},
  		]});
  		battle.makeChoices('move mirrorcoat, move aurasphere -1', 'move venoshock 1, move flashcannon 1');
  		assert.fullHP(battle.p1.active[1]);
  		assert.fullHP(battle.p2.active[0]);
  		assert.false.fullHP(battle.p2.active[1]);
  	});
  
  	it('should respect Follow Me', function () {
  		battle = common.createBattle({gameType: 'doubles'});
  		battle.setPlayer('p1', {team: [
  			{species: 'Mew', ability: 'synchronize', moves: ['mirrorcoat']},
  			{species: 'Magikarp', ability: 'rattled', moves: ['splash']},
  		]});
  		battle.setPlayer('p2', {team: [
  			{species: 'Crobat', ability: 'innerfocus', moves: ['venoshock']},
  			{species: 'Clefable', ability: 'unaware', moves: ['followme']},
  		]});
  		battle.makeChoices('move mirrorcoat, move splash', 'move venoshock 1, move followme');
  		assert.false.fullHP(battle.p2.active[1]);
  		assert.fullHP(battle.p2.active[0]);
  	});
  
  	it(`should not have its target changed by Stalwart`, function () {
  		battle = common.createBattle({gameType: 'doubles'}, [[
  			{species: "Duraludon", ability: 'stalwart', moves: ['mirrorcoat']},
  			{species: "Diglett", moves: ['sleeptalk']},
  		], [
  			{species: "Wynaut", moves: ['sleeptalk']},
  			{species: "Noivern", moves: ['dragonpulse']},
  		]]);
  
  		const wynaut = battle.p2.active[0];
  		battle.makeChoices('auto', 'move sleeptalk, move dragonpulse 1');
  		assert.equal(wynaut.maxhp, wynaut.hp);
  	});
  });
  