mirror of
https://github.com/magefree/mage.git
synced 2026-01-10 04:42:07 -08:00
Test framework improves:
* added aliases support to many assertXXX commands (check objects by alias/GUID instead card name); * added mode to test/simulate human's mana pool usage without auto-payment (enable it by command disableManaAutoPayment, fill mana pool by activateManaAbility and simulate clicks on mana icon by setChoice); * improves activateManaAbility command (you can activate it multiple times by one command); * improves setChoice command (you can activate it multiple times by one command);
This commit is contained in:
parent
d56f6b991b
commit
13ad86cb21
2 changed files with 91 additions and 29 deletions
|
|
@ -356,7 +356,7 @@ public class TestPlayer implements Player {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean isObjectHaveTargetNameOrAlias(MageObject object, String nameOrAlias) {
|
||||
public boolean isObjectHaveTargetNameOrAlias(MageObject object, String nameOrAlias) {
|
||||
if (object == null || nameOrAlias == null) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -375,7 +375,12 @@ public class TestPlayer implements Player {
|
|||
return false;
|
||||
}
|
||||
|
||||
return object.getName().startsWith(nameOrAlias);
|
||||
// two search mode: for cards/permanents (strict) and for abilities (like)
|
||||
if (object instanceof Ability) {
|
||||
return object.getName().startsWith(nameOrAlias);
|
||||
} else {
|
||||
return object.getName().equals(nameOrAlias);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean handleNonPlayerTargetTarget(String target, Ability ability, Game game) {
|
||||
|
|
@ -3471,6 +3476,42 @@ public class TestPlayer implements Player {
|
|||
String promptText, Game game
|
||||
) {
|
||||
groupsForTargetHandling = null;
|
||||
|
||||
if (!computerPlayer.getManaPool().isAutoPayment()) {
|
||||
// manual pay by mana clicks/commands
|
||||
if (!choices.isEmpty()) {
|
||||
String needColor = choices.get(0);
|
||||
switch (needColor) {
|
||||
case "White":
|
||||
Assert.assertTrue("pool must have white mana", computerPlayer.getManaPool().getWhite() > 0);
|
||||
computerPlayer.getManaPool().unlockManaType(ManaType.WHITE);
|
||||
break;
|
||||
case "Blue":
|
||||
Assert.assertTrue("pool must have blue mana", computerPlayer.getManaPool().getBlue() > 0);
|
||||
computerPlayer.getManaPool().unlockManaType(ManaType.BLUE);
|
||||
break;
|
||||
case "Black":
|
||||
Assert.assertTrue("pool must have black mana", computerPlayer.getManaPool().getBlack() > 0);
|
||||
computerPlayer.getManaPool().unlockManaType(ManaType.BLACK);
|
||||
break;
|
||||
case "Red":
|
||||
Assert.assertTrue("pool must have red mana", computerPlayer.getManaPool().getRed() > 0);
|
||||
computerPlayer.getManaPool().unlockManaType(ManaType.RED);
|
||||
break;
|
||||
case "Green":
|
||||
Assert.assertTrue("pool must have green mana", computerPlayer.getManaPool().getGreen() > 0);
|
||||
computerPlayer.getManaPool().unlockManaType(ManaType.GREEN);
|
||||
break;
|
||||
default:
|
||||
Assert.fail("Unknown choice command for mana unlock: " + needColor);
|
||||
break;
|
||||
}
|
||||
choices.remove(0);
|
||||
return true;
|
||||
}
|
||||
Assert.fail(this.getName() + " disabled mana auto-payment, but no choices found for color unlock in pool for unpaid cost: " + unpaid.getText());
|
||||
}
|
||||
|
||||
return computerPlayer.playMana(ability, unpaid, promptText, game);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package org.mage.test.serverside.base.impl;
|
||||
|
||||
import mage.MageObject;
|
||||
import mage.Mana;
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
|
|
@ -485,6 +486,16 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
getCommands(player).put(Zone.HAND, "clear");
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable auto-payment from mana pool, you must manually fill pool by activateManaAbility and unlock color by setChoice
|
||||
* Use it for pay color order testing (e.g. simulate user clicks on mana pool to pay)
|
||||
*
|
||||
* @param player
|
||||
*/
|
||||
public void disableManaAutoPayment(TestPlayer player) {
|
||||
player.getManaPool().setAutoPayment(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a card to specified zone of specified player.
|
||||
*
|
||||
|
|
@ -716,8 +727,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
int foundToughness = 0;
|
||||
int found = 0;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllPermanents()) {
|
||||
|
||||
if (permanent.getName().equals(cardName) && permanent.getControllerId().equals(player.getId())) {
|
||||
if (isObjectHaveTargetNameOrAlias(player, permanent, cardName) && permanent.getControllerId().equals(player.getId())) {
|
||||
count++;
|
||||
if (scope == Filter.ComparisonScope.All) {
|
||||
Assert.assertEquals("Power is not the same (" + power + " vs. " + permanent.getPower().getValue() + ')',
|
||||
|
|
@ -768,7 +778,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
int count = 0;
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(player.getId())) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
if (isObjectHaveTargetNameOrAlias(player, permanent, cardName)) {
|
||||
found = permanent;
|
||||
count++;
|
||||
}
|
||||
|
|
@ -804,7 +814,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
int foundCount = 0;
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(player.getId())) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
if (isObjectHaveTargetNameOrAlias(player, permanent, cardName)) {
|
||||
found = permanent;
|
||||
foundCount++;
|
||||
}
|
||||
|
|
@ -855,7 +865,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
int actualCount = 0;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) {
|
||||
if (permanent.getControllerId().equals(player.getId())) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
if (isObjectHaveTargetNameOrAlias(player, permanent, cardName)) {
|
||||
actualCount++;
|
||||
}
|
||||
}
|
||||
|
|
@ -868,7 +878,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
//Assert.assertNotEquals("", commandZoneObjectName);
|
||||
int actualCount = 0;
|
||||
for (CommandObject commandObject : currentGame.getState().getCommand()) {
|
||||
if (commandObject.getControllerId().equals(player.getId()) && commandObject.getName().equals(commandZoneObjectName)) {
|
||||
if (commandObject.getControllerId().equals(player.getId()) && isObjectHaveTargetNameOrAlias(player, commandObject, commandZoneObjectName)) {
|
||||
actualCount++;
|
||||
}
|
||||
}
|
||||
|
|
@ -908,7 +918,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
//Assert.assertNotEquals("", cardName);
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) {
|
||||
if (permanent.getName().equals(cardName) && (player == null || permanent.getControllerId().equals(player.getId()))) {
|
||||
if (isObjectHaveTargetNameOrAlias(player, permanent, cardName) && (player == null || permanent.getControllerId().equals(player.getId()))) {
|
||||
found = permanent;
|
||||
break;
|
||||
}
|
||||
|
|
@ -961,6 +971,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
*/
|
||||
public void assertType(String cardName, CardType type, boolean mustHave) throws AssertionError {
|
||||
//Assert.assertNotEquals("", cardName);
|
||||
assertAliaseSupportInActivateCommand(cardName, false);
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
|
|
@ -1062,6 +1073,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
*/
|
||||
public void assertTapped(String cardName, boolean tapped) throws AssertionError {
|
||||
//Assert.assertNotEquals("", cardName);
|
||||
assertAliaseSupportInActivateCommand(cardName, false);
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
|
|
@ -1088,6 +1100,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
*/
|
||||
public void assertTappedCount(String cardName, boolean tapped, int count) throws AssertionError {
|
||||
//Assert.assertNotEquals("", cardName);
|
||||
assertAliaseSupportInActivateCommand(cardName, false);
|
||||
int tappedAmount = 0;
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) {
|
||||
|
|
@ -1110,6 +1123,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
*/
|
||||
public void assertAttacking(String cardName, boolean attacking) throws AssertionError {
|
||||
//Assert.assertNotEquals("", cardName);
|
||||
assertAliaseSupportInActivateCommand(cardName, false);
|
||||
Permanent found = null;
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
|
|
@ -1242,6 +1256,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
*/
|
||||
public void assertExileCount(Player owner, String cardName, int count) throws AssertionError {
|
||||
//Assert.assertNotEquals("", cardName);
|
||||
assertAliaseSupportInActivateCommand(cardName, false);
|
||||
int actualCount = 0;
|
||||
for (ExileZone exile : currentGame.getExile().getExileZones()) {
|
||||
for (Card card : exile.getCards(currentGame)) {
|
||||
|
|
@ -1341,6 +1356,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
}
|
||||
|
||||
public Permanent getPermanent(String cardName, UUID controller) {
|
||||
assertAliaseSupportInActivateCommand(cardName, false);
|
||||
Permanent found = null;
|
||||
Pattern indexedName = Pattern.compile("^([\\w| ]+):(\\d+)$"); // Ends with <:number>
|
||||
Matcher indexedMatcher = indexedName.matcher(cardName);
|
||||
|
|
@ -1529,7 +1545,13 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
}
|
||||
|
||||
public void activateManaAbility(int turnNum, PhaseStep step, TestPlayer player, String ability) {
|
||||
player.addAction(turnNum, step, "manaActivate:" + ability);
|
||||
activateManaAbility(turnNum, step, player, ability, 1);
|
||||
}
|
||||
|
||||
public void activateManaAbility(int turnNum, PhaseStep step, TestPlayer player, String ability, int timesToActivate) {
|
||||
for (int i = 0; i < timesToActivate; i++) {
|
||||
player.addAction(turnNum, step, "manaActivate:" + ability);
|
||||
}
|
||||
}
|
||||
|
||||
public void activateAbility(int turnNum, PhaseStep step, TestPlayer player, String ability) {
|
||||
|
|
@ -1636,7 +1658,13 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
* @param choice
|
||||
*/
|
||||
public void setChoice(TestPlayer player, String choice) {
|
||||
player.addChoice(choice);
|
||||
setChoice(player, choice, 1);
|
||||
}
|
||||
|
||||
public void setChoice(TestPlayer player, String choice, int timesToChoose) {
|
||||
for (int i = 0; i < timesToChoose; i++) {
|
||||
player.addChoice(choice);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1723,26 +1751,9 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
gameOptions.skipInitShuffling = true;
|
||||
}
|
||||
|
||||
protected void checkPermanentPT(Player player, String cardName, int power, int toughness, Filter.ComparisonScope scope) {
|
||||
if (currentGame == null) {
|
||||
throw new IllegalStateException("Current game is null");
|
||||
}
|
||||
if (scope == Filter.ComparisonScope.All) {
|
||||
throw new UnsupportedOperationException("ComparisonScope.All is not implemented.");
|
||||
}
|
||||
|
||||
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(player.getId())) {
|
||||
if (permanent.getName().equals(cardName)) {
|
||||
Assert.assertEquals("Power is not the same", power, permanent.getPower().getValue());
|
||||
Assert.assertEquals("Toughness is not the same", toughness, permanent.getToughness().getValue());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void assertDamageReceived(Player player, String cardName, int expected) {
|
||||
//Assert.assertNotEquals("", cardName);
|
||||
Permanent p = getPermanent(cardName, player.getId());
|
||||
Permanent p = getPermanent(cardName, player);
|
||||
if (p != null) {
|
||||
Assert.assertEquals("Wrong damage received: ", expected, p.getDamage());
|
||||
}
|
||||
|
|
@ -1763,4 +1774,14 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isObjectHaveTargetNameOrAlias(Player player, MageObject object, String nameOrAlias) {
|
||||
TestPlayer testPlayer = (TestPlayer) player;
|
||||
if (player != null) { // TODO: remove null check and replace all null-player calls in tests by player
|
||||
return testPlayer.isObjectHaveTargetNameOrAlias(object, nameOrAlias);
|
||||
} else {
|
||||
return object.getName().equals(nameOrAlias);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue