game: improved visible rules of face down cards, removed visible face up cost (part of #10653, #11884)

This commit is contained in:
Oleg Agafonov 2024-03-01 16:47:42 +04:00
parent 9ea3356b77
commit 55f1d36695
10 changed files with 128 additions and 58 deletions

View file

@ -1,11 +1,14 @@
package org.mage.test.cards.abilities.keywords;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.TurnFaceUpAbility;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.constants.EmptyNames;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.permanent.Permanent;
import mage.view.CardView;
import mage.view.GameView;
import mage.view.PermanentView;
import mage.view.PlayerView;
@ -13,6 +16,8 @@ import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
import java.util.List;
/**
* Most of the face down logic was tested in MorphTest, here are tests for disguise related only
*
@ -21,7 +26,17 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class DisguiseTest extends CardTestPlayerBase {
@Test
public void test_NormalPlayAndClientData() {
public void test_NormalPlay_ClientData_CostRulesVisible() {
// it checks rules visible for face down cards, main logic:
// - real face up abilities uses special cost;
// - it must be hidden from opponent
// - so it must be replaced in rules by non-cost versions (e.g. text only)
String FACE_DOWN_SPELL = "with no text, no name, no subtypes";
String FACE_DOWN_TRIGGER = "When ";
String FACE_DOWN_FACE_UP = "down permanent face up";
// {R}{W}
// Disguise {R/W}{R/W} (You may cast this card face down for {3} as a 2/2 creature with ward {2}.
// Turn it face up any time for its disguise cost.)
@ -38,6 +53,18 @@ public class DisguiseTest extends CardTestPlayerBase {
// prepare face down
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dog Walker using Disguise");
runCode("face up on stack", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> {
Assert.assertEquals("stack, server - can't find spell", 1, currentGame.getStack().size());
SpellAbility spellAbility = (SpellAbility) currentGame.getStack().getFirst().getStackAbility();
Assert.assertEquals("stack, server - can't find spell", "Cast Dog Walker using Disguise", spellAbility.getName());
CardView spellView = getGameView(playerA).getStack().values().stream().findFirst().orElse(null);
Assert.assertNotNull("stack, client: can't find spell", spellView);
// make sure rules visible
assertRuleExist("client side, stack: face down spell - show", spellView.getRules(), FACE_DOWN_SPELL, true);
assertRuleExist("client side, stack: face up - hide", spellView.getRules(), FACE_DOWN_FACE_UP, false);
assertRuleExist("client side, stack: triggered ability - hide", spellView.getRules(), FACE_DOWN_TRIGGER, false);
});
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
checkPermanentCount("after face down", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dog Walker", 0);
checkPermanentCount("after face down", 1, PhaseStep.PRECOMBAT_MAIN, playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 1);
@ -53,9 +80,18 @@ public class DisguiseTest extends CardTestPlayerBase {
Assert.assertEquals("server side: wrong color", "", permanent.getColor(currentGame).toString());
Assert.assertEquals("server side: wrong power", "2", permanent.getPower().toString());
Assert.assertEquals("server side: wrong toughness", "2", permanent.getToughness().toString());
// make sure real abilities exists
// trigger
Ability ability = permanent.getAbilities(currentGame).stream().filter(a -> a instanceof TurnedFaceUpSourceTriggeredAbility).findFirst().orElse(null);
Assert.assertNotNull("server side: must have face up triggered ability", ability);
Assert.assertFalse("server side: face up triggered ability must be hidden", ability.getRuleVisible());
// face up
ability = permanent.getAbilities(currentGame).stream().filter(a -> a instanceof TurnFaceUpAbility).findFirst().orElse(null);
Assert.assertNotNull("server side: must have turn face up ability", ability);
String foundRule = permanent.getRules(currentGame).stream().filter(r -> r.contains("{R/W}")).findFirst().orElse(null);
// failed here? search BecomesFaceDownCreatureEffect and additionalAbilities
Assert.assertNull("server side: turn face up ability with {R/W} cost must be replaced by text only without cost", foundRule);
// client side - controller
GameView gameView = getGameView(playerA);
@ -69,9 +105,11 @@ public class DisguiseTest extends CardTestPlayerBase {
Assert.assertEquals("client side - controller: wrong color", "", permanentView.getColor().toString());
Assert.assertEquals("client side - controller: wrong power", "2", permanentView.getPower());
Assert.assertEquals("client side - controller: wrong toughness", "2", permanentView.getToughness());
// make sure rules hiding works fine
Assert.assertTrue("client side - controller: face up triggered ability must be hidden",
permanentView.getRules().stream().noneMatch(r -> r.contains("When ")));
// make sure rules visible
assertRuleExist("client side, controller: face down spell - show", permanentView.getRules(), FACE_DOWN_SPELL, true);
assertRuleExist("client side, controller: face up - hide", permanentView.getRules(), FACE_DOWN_FACE_UP, false);
assertRuleExist("client side, controller: triggered ability - hide", permanentView.getRules(), FACE_DOWN_TRIGGER, false);
assertRuleExist("client side, controller: {R/W} cost hide", permanentView.getRules(), "{R/W}", false);
// client side - opponent
gameView = getGameView(playerB);
@ -91,9 +129,11 @@ public class DisguiseTest extends CardTestPlayerBase {
Assert.assertEquals("client side - opponent: wrong color", "", permanentView.getColor().toString());
Assert.assertEquals("client side - opponent: wrong power", "2", permanentView.getPower());
Assert.assertEquals("client side - opponent: wrong toughness", "2", permanentView.getToughness());
// make sure rules hiding works fine
Assert.assertTrue("client side - opponent: face up triggered ability must be hidden",
permanentView.getRules().stream().noneMatch(r -> r.contains("When ")));
// make sure rules visible
assertRuleExist("client side, opponent: face down spell - show", permanentView.getRules(), FACE_DOWN_SPELL, true);
assertRuleExist("client side, opponent: face up - hide", permanentView.getRules(), FACE_DOWN_FACE_UP, false);
assertRuleExist("client side, opponent: triggered ability - hide", permanentView.getRules(), FACE_DOWN_TRIGGER, false);
assertRuleExist("client side, opponent: {R/W} cost hide", permanentView.getRules(), "{R/W}", false);
});
// make sure ward works too
@ -124,4 +164,13 @@ public class DisguiseTest extends CardTestPlayerBase {
setStopAt(1, PhaseStep.END_TURN);
execute();
}
private void assertRuleExist(String info, List<String> rules, String searchPart, boolean mustExists) {
String foundAbility = rules.stream().filter(r -> r.contains(searchPart)).findFirst().orElse(null);
if (mustExists) {
Assert.assertTrue(info, foundAbility != null);
} else {
Assert.assertFalse(info, foundAbility != null);
}
}
}

View file

@ -13,10 +13,12 @@ import org.mage.test.player.TestPlayer;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author levelX2
* @author levelX2, JayDi85
*/
public class MorphTest extends CardTestPlayerBase {
// DisguiseTest contains additional rules generation tests for face down
/**
* Tests if a creature with Morph is cast normal, it behaves as normal
* creature