Tests: fixed false positive tests (AI related, see prev commit);

This commit is contained in:
Oleg Agafonov 2019-12-20 20:21:49 +04:00
parent 8cce5a3648
commit 7a7a9c20ec
11 changed files with 107 additions and 79 deletions

View file

@ -1,7 +1,5 @@
package mage.cards.p;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
@ -19,20 +17,21 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class PublicExecution extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
static {
filter.add(new ControllerPredicate(TargetController.NOT_YOU));
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
public PublicExecution(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{5}{B}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{B}");
// Destroy target creature an opponent controls. Each other creature that player controls gets -2/-0 until end of turn.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
@ -51,7 +50,7 @@ public final class PublicExecution extends CardImpl {
}
class PublicExecutionEffect extends OneShotEffect {
public PublicExecutionEffect() {
super(Outcome.Benefit);
staticText = "Each other creature that player controls gets -2/-0 until end of turn";
@ -70,7 +69,7 @@ class PublicExecutionEffect extends OneShotEffect {
FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature that player controls");
filter.add(new ControllerIdPredicate(opponent));
filter.add(Predicates.not(new PermanentIdPredicate(target.getId())));
ContinuousEffect effect = new BoostAllEffect(-2,0, Duration.EndOfTurn, filter, false);
ContinuousEffect effect = new BoostAllEffect(-2, 0, Duration.EndOfTurn, filter, false);
game.addEffect(effect, source);
return true;
}

View file

@ -1,7 +1,5 @@
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
@ -17,8 +15,9 @@ import mage.constants.SubType;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class TreasureKeeper extends CardImpl {
@ -71,7 +70,7 @@ class TreasureKeeperEffect extends OneShotEffect {
}
}
controller.revealCards(source, toReveal, game);
if (nonLandCard != null && controller.chooseUse(outcome, "Cast " + nonLandCard.getLogName() + "without paying its mana cost?", source, game)) {
if (nonLandCard != null && controller.chooseUse(outcome, "Cast " + nonLandCard.getLogName() + " without paying its mana cost?", source, game)) {
controller.cast(nonLandCard.getSpellAbility(), game, true, new MageObjectReference(source.getSourceObject(game), game));
toReveal.remove(nonLandCard);
}

View file

@ -1,4 +1,3 @@
package mage.cards.v;
import mage.MageInt;
@ -77,8 +76,6 @@ class VesuvanShapeShifterFaceUpApplier extends ApplyToPermanent {
Effect effect = new VesuvanShapeshifterFaceDownEffect();
Ability ability = new BeginningOfUpkeepTriggeredAbility(effect, TargetController.YOU, true);
permanent.getAbilities().add(ability);
// Why is this needed?
permanent.addAbility(new MorphAbility(permanent, new ManaCostsImpl("{1}{U}")), permanent.getId(), game);
return true;
}

View file

@ -0,0 +1,42 @@
package org.mage.test.AI.basic;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestCommander4Players;
/**
* @author JayDi85
*/
public class ExileTargetTest extends CardTestCommander4Players {
// Player order: A -> D -> C -> B
@Test
public void test_chooseOpponentTargets() {
// AI sometimes chooses own permanents in multiplayer game instead opponents
// When Oblivion Ring enters the battlefield, exile another target nonland permanent.
// When Oblivion Ring leaves the battlefield, return the exiled card to the battlefield under its owners control.
addCard(Zone.HAND, playerA, "Oblivion Ring", 1);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
//
addCard(Zone.BATTLEFIELD, playerA, "Apex Altisaur", 1); // 10/10
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // 2/2
addCard(Zone.BATTLEFIELD, playerC, "Balduvian Bears", 1); // 2/2
// must select opponent's Balduvian Bears
showAvaileableAbilities("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Oblivion Ring");
//addTarget(playerA, "Balduvian Bears"); // disable to activate AI target choose
showAvaileableAbilities("after", 1, PhaseStep.BEGIN_COMBAT, playerA);
//setStrictChooseMode(true); // disable strict mode to activate AI for choosing
setStopAt(1, PhaseStep.END_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerC, "Balduvian Bears", 0);
}
}

View file

@ -36,7 +36,7 @@ public class EchoTest extends CardTestPlayerBase {
// cast Avalanche Riders and destroy forest
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Avalanche Riders");
addTarget(playerA, "Forest");
@ -45,10 +45,19 @@ public class EchoTest extends CardTestPlayerBase {
activateManaAbility(3, PhaseStep.UPKEEP, playerA, "{T}: Add {W}");
activateManaAbility(3, PhaseStep.UPKEEP, playerA, "{T}: Add {W}");
activateManaAbility(3, PhaseStep.UPKEEP, playerA, "{T}: Add {W}");
castSpell(3, PhaseStep.UPKEEP, playerA, "Restoration Angel", null, "Echo {3}{R} <i>(At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.)</i>");
castSpell(3, PhaseStep.UPKEEP, playerA, "Restoration Angel");
addTarget(playerA, "Avalanche Riders");
setChoice(playerA, "Yes"); // raider do restore
// Avalanche Riders triggered again
addTarget(playerA, "Forest");
// but no echo for blinked rider
setStrictChooseMode(true);
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertLife(playerB, 20);
@ -56,7 +65,8 @@ public class EchoTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Avalanche Riders", 1);
assertPermanentCount(playerA, "Restoration Angel", 1);
assertPermanentCount(playerB, "Forest", 0);
assertPermanentCount(playerA, "Forest", 0);
assertGraveyardCount(playerA, "Forest", 2);
assertTappedCount("Plains", true, 4);
assertTappedCount("Mountain", true, 0);
}

View file

@ -717,14 +717,22 @@ public class MorphTest extends CardTestPlayerBase {
* not work correctly. When Vesuvan Shapeshifter turns face up and becomes a
* copy of the targeted creature, it should still be in the state of
* "turning face up", thus triggering the ability of the Brine Elemental.
* <p>
* combo:
* Vesuvan Shapeshifter + Brine Elemental
* Brine Elemental in play, Vesuvan Shapeshifter in hand
* 1) Cast Vesuvan Shapeshifter face-down.
* 2) Flip Vesuvan Shapeshifter for its morph cost, copying Brine Elemental. Your opponent skips his next untap.
* 3) During your upkeep, flip Vesuvan Shapeshifter face-down.
* 4) Repeat from 2.
*/
@Test
public void testVesuvanShapeshifter() {
// Morph {5}{U}{U}
// When Brine Elemental is turned face up, each opponent skips their next untap step.
addCard(Zone.HAND, playerA, "Brine Elemental"); // Creature {4}{U}{U} 5/4
addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
addCard(Zone.BATTLEFIELD, playerA, "Brine Elemental"); // Creature {4}{U}{U} 5/4
//addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
// As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield.
// If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature
@ -733,23 +741,24 @@ public class MorphTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Vesuvan Shapeshifter"); // Creature 0/0
addCard(Zone.BATTLEFIELD, playerB, "Island", 5);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brine Elemental");
setChoice(playerA, "No"); // cast it normally
// 1. Cast Vesuvan as face-down
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Vesuvan Shapeshifter");
setChoice(playerB, "Yes");
setChoice(playerB, "Yes"); // cast as face-down
// 2. Moth Vesuvan and copy brine
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{1}{U}: Turn this face-down permanent");
setChoice(playerB, "Brine Elemental");
addTarget(playerB, "Brine Elemental");
// No face up trigger and choose from Vesuvan
// But brine's trigger must works on next turn 3 (skip untap)
setStrictChooseMode(true);
setStopAt(2, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Brine Elemental", 1);
assertPermanentCount(playerB, "Brine Elemental", 1);
Assert.assertTrue("Skip next turn has to be added to TurnMods", currentGame.getState().getTurnMods().size() == 1);
}

View file

@ -83,11 +83,13 @@ public class AngelOfJubilationTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Food Chain");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{2}, Sacrifice a permanent you control: Return target creature to its owner's hand.");
playerB.addChoice("Food Chain");
playerA.addTarget("Angel of Jubilation");
addTarget(playerB, "Angel of Jubilation"); // return to hand
setChoice(playerB, "Food Chain"); // cacrifice cost
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Angel of Jubilation", 0);
assertPermanentCount(playerB, "Food Chain", 0);

View file

@ -42,10 +42,12 @@ public class GainControlDiedCastAgainTest extends CardTestPlayerBase {
attack(2, playerB, "Elesh Norn, Grand Cenobite");
block(2, playerA, "Keiga, the Tide Star", "Elesh Norn, Grand Cenobite");
addTarget(playerB, "Elesh Norn, Grand Cenobite");
addTarget(playerA, "Elesh Norn, Grand Cenobite");
setStrictChooseMode(true);
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertLife(playerB, 20);

View file

@ -99,6 +99,7 @@ public class MisdirectionTest extends CardTestPlayerBase {
}
// check to change target permanent creature legal to to a creature the opponent of the spell controller controls
// target to illegal target can't be tested
@Test
public void test_ChangePublicExecution() {
// Destroy target creature an opponent controls. Each other creature that player controls gets -2/-0 until end of turn.
@ -129,41 +130,5 @@ public class MisdirectionTest extends CardTestPlayerBase {
assertGraveyardCount(playerB, "Custodian of the Trove", 1);
assertPermanentCount(playerB, "Pillarfield Ox", 1);
assertPowerToughness(playerB, "Pillarfield Ox", 0, 4);
}
// check to change target permanent creature not legal to to a creature the your opponent controls
@Test
public void test_ChangePublicExecution2() {
// Destroy target creature an opponent controls. Each other creature that player controls gets -2/-0 until end of turn.
addCard(Zone.HAND, playerA, "Public Execution");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6);
addCard(Zone.BATTLEFIELD, playerA, "Keeper of the Lens", 1);
/*
Misdirection {3}{U}{U}
Instant
You may exile a blue card from your hand rather than pay Misdirection's mana cost.
Change the target of target spell with a single target.
*/
addCard(Zone.HAND, playerB, "Misdirection");
addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1);
addCard(Zone.BATTLEFIELD, playerB, "Custodian of the Trove", 1); // 4/3
addCard(Zone.BATTLEFIELD, playerB, "Island", 5);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Public Execution", "Custodian of the Trove");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Misdirection", "Public Execution", "Public Execution");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Public Execution", 1);
assertGraveyardCount(playerB, "Misdirection", 1);
assertPermanentCount(playerA, "Keeper of the Lens", 1);
assertPermanentCount(playerB, "Pillarfield Ox", 1);
assertPowerToughness(playerB, "Pillarfield Ox", 0, 4);
assertGraveyardCount(playerB, "Custodian of the Trove", 1);
}
}

View file

@ -7,7 +7,6 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author escplan9
*/
public class DecimatorBeetleTest extends CardTestPlayerBase {
@ -19,29 +18,33 @@ When Decimator Beetle enters the battlefield, put a -1/-1 counter on target crea
Whenever Decimator Beetle attacks, remove a -1/-1 counter from target creature you control and put a -1/-1 counter on up to one target creature defending player controls.
*/
private final String decimator = "Decimator Beetle";
@Test
public void targetOpponentCreatureWithDecimator() {
String grizzly = "Grizzly Bears"; // {1}{G} 2/2
String hillGiant = "Hill Giant"; // {3}{R} 3/3
addCard(Zone.HAND, playerA, decimator);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
addCard(Zone.BATTLEFIELD, playerA, grizzly);
addCard(Zone.BATTLEFIELD, playerB, hillGiant);
// put -1/-1 on own creature
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, decimator);
addTarget(playerA, grizzly);
// remove -1/-1 from own creature and put to defender control
attack(3, playerA, decimator);
addTarget(playerA, grizzly);
addTarget(playerA, hillGiant);
addTarget(playerA, grizzly); // remove
addTarget(playerA, hillGiant); // put
setStrictChooseMode(true);
setStopAt(3, PhaseStep.END_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, grizzly, 2, 2); // had -1/-1 counter, but removed on attack
assertPowerToughness(playerB, hillGiant, 2, 2); // gets -1/-1 counter from decimator attack ability
assertCounterCount(playerA, grizzly, CounterType.M1M1, 0);

View file

@ -250,7 +250,7 @@ public class LoadTest {
}
@Test
//@Ignore
@Ignore
public void test_TwoAIPlayGame_Multiple() {
// save random seeds for repeated results