Test framework: added aliases support for activated abilities (related to #7036);

This commit is contained in:
Oleg Agafonov 2020-09-04 02:18:40 +04:00
parent 7a1795660a
commit 535e49b89f
5 changed files with 22 additions and 13 deletions

View file

@ -33,9 +33,9 @@ public class LightningStormTest extends CardTestPlayerBase {
// B discard and re-target
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Discard");
setChoice(playerB, "Mountain");
setChoice(playerB, "Yes");
addTarget(playerB, playerA);
setChoice(playerB, "Yes"); // change target
addTarget(playerB, playerA); // new target
setChoice(playerB, "Mountain"); // discard cost
// A discard and re-target
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Discard");

View file

@ -578,7 +578,8 @@ public class TestPlayer implements Player {
if (groups.length > 2 && !checkExecuteCondition(groups, game)) {
break;
}
for (ActivatedAbility ability : computerPlayer.getPlayable(game, true)) { // add wrong action log?
// must process all duplicated abilities (aliases need objects to search)
for (ActivatedAbility ability : computerPlayer.getPlayable(game, true, Zone.ALL, false)) { // add wrong action log?
if (hasAbilityTargetNameOrAlias(game, ability, groups[0])) {
int bookmark = game.bookmarkState();
ActivatedAbility newAbility = ability.copy();

View file

@ -1728,19 +1728,19 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
public void activateAbility(int turnNum, PhaseStep step, TestPlayer player, String ability) {
// TODO: it's uses computerPlayer to execute, only ability target will work, but choices and targets commands aren't
assertAliaseSupportInActivateCommand(ability, false);
assertAliaseSupportInActivateCommand(ability, true);
addPlayerAction(player, turnNum, step, ACTIVATE_ABILITY + ability);
}
public void activateAbility(int turnNum, PhaseStep step, TestPlayer player, String ability, Player target) {
// TODO: it's uses computerPlayer to execute, only ability target will work, but choices and targets commands aren't
assertAliaseSupportInActivateCommand(ability, false);
assertAliaseSupportInActivateCommand(ability, true);
addPlayerAction(player, turnNum, step, ACTIVATE_ABILITY + ability + "$targetPlayer=" + target.getName());
}
public void activateAbility(int turnNum, PhaseStep step, TestPlayer player, String ability, String... targetNames) {
// TODO: it's uses computerPlayer to execute, only ability target will work, but choices and targets commands aren't
assertAliaseSupportInActivateCommand(ability, false);
assertAliaseSupportInActivateCommand(ability, true);
Arrays.stream(targetNames).forEach(n -> {
assertAliaseSupportInActivateCommand(n, true);
});
@ -1771,8 +1771,8 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
* @param clause
*/
public void activateAbility(int turnNum, PhaseStep step, TestPlayer player, String ability, String targetName, String spellOnStack, StackClause clause) {
assertAliaseSupportInActivateCommand(ability, false);
assertAliaseSupportInActivateCommand(targetName, false);
assertAliaseSupportInActivateCommand(ability, true);
assertAliaseSupportInActivateCommand(targetName, true);
StringBuilder sb = new StringBuilder(ACTIVATE_ABILITY).append(ability);
if (targetName != null && !targetName.isEmpty()) {
sb.append("$target=").append(targetName);

View file

@ -205,12 +205,14 @@ public class TestAliases extends CardTestPlayerBase {
@Test
public void test_ActivateAbility_Alias() {
// {T}: Embermage Goblin deals 1 damage to any target.
addCard(Zone.BATTLEFIELD, playerA, "Embermage Goblin@goblin", 2);
addCard(Zone.BATTLEFIELD, playerA, "Embermage Goblin@goblin", 3);
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion@lion", 1);
// use 2 of 3 goblins
showAvailableAbilities("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {this} deals", "@lion");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {this} deals", "@lion");
showAliases("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@goblin.1 {T}: {this} deals", "@lion");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@goblin.3 {T}: {this} deals", "@lion");
setStopAt(1, PhaseStep.END_TURN);
execute();
@ -218,7 +220,11 @@ public class TestAliases extends CardTestPlayerBase {
assertPermanentCount(playerA, "@goblin.1", 1);
assertPermanentCount(playerA, "@goblin.2", 1);
assertPermanentCount(playerA, "@goblin.3", 1);
assertGraveyardCount(playerA, "@lion", 1);
assertTapped("@goblin.1", true);
assertTapped("@goblin.2", false);
assertTapped("@goblin.3", true);
}
@Test

View file

@ -3390,8 +3390,10 @@ public abstract class PlayerImpl implements Player, Serializable {
getPlayableFromObjectSingle(game, fromZone, adventureCard, adventureCard.getSharedAbilities(game), availableMana, output);
} else if (object instanceof Card) {
getPlayableFromObjectSingle(game, fromZone, object, ((Card) object).getAbilities(game), availableMana, output);
} else if (object instanceof StackObject) {
// spells on stack are processing by Card above, other stack objects must be ignored
} else {
// other things like StackObject or CommandObject
// other things like CommandObject
getPlayableFromObjectSingle(game, fromZone, object, object.getAbilities(), availableMana, output);
}