From d65dab9a955d10137fe45e6a02659971481f5c71 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 1 Dec 2018 08:20:46 +0400 Subject: [PATCH] Test framework: added choices support for multiple targets with multiple damage spells (targetName^X=3); --- .../java/org/mage/test/player/TestPlayer.java | 45 +++++++++++++++++++ .../base/impl/CardTestPlayerAPIImpl.java | 2 + 2 files changed, 47 insertions(+) diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index c1aff1cb7fb..55a79d17811 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -2867,6 +2867,51 @@ public class TestPlayer implements Player { public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game ) { + // command format: targetName^X=3 + + // chooseTargetAmount calls by TargetAmount for EACH target cycle + Assert.assertTrue("chooseTargetAmount supports only one target, but found " + target.getMaxNumberOfTargets(), target.getMaxNumberOfTargets() <= 1); + Assert.assertNotEquals("chooseTargetAmount need remaining > 0", 0, target.getAmountRemaining()); + + if (!targets.isEmpty()) { + + boolean founded = false; + String foundedRecord = ""; + CheckTargets: + for(String targetRecord : targets) { + String[] choiceSettings = targetRecord.split("\\^"); + if (choiceSettings.length == 2 && choiceSettings[1].startsWith("X=")) { + // can choice + String choiceName = choiceSettings[0]; + int choiceAmount = Integer.parseInt(choiceSettings[1].substring(2)); + + Assert.assertNotEquals("choice amount must be not zero", 0, choiceAmount); + Assert.assertTrue("choice amount " + choiceAmount + "must be <= remaining " + target.getAmountRemaining(), choiceAmount <= target.getAmountRemaining()); + + for(UUID possibleTarget : target.possibleTargets(source.getSourceId(), source.getControllerId(), game)) { + MageObject objectPermanent = game.getObject(possibleTarget); + Player objectPlayer = game.getPlayer(possibleTarget); + String objectName = objectPermanent != null ? objectPermanent.getName() : objectPlayer.getName(); + if (objectName.equals(choiceName)) { + if (!target.getTargets().contains(possibleTarget) && target.canTarget(possibleTarget, source, game)) { + // can select + target.addTarget(possibleTarget, choiceAmount, source, game); + founded = true; + foundedRecord = targetRecord; + break CheckTargets; + } + } + } + } + } + + if (founded) { + // all done + targets.remove(foundedRecord); + return true; + } + } + return computerPlayer.chooseTargetAmount(outcome, target, source, game); } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 9daed70295e..e86e9ee26cf 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -222,6 +222,8 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement logger.debug("Winner: " + currentGame.getWinner()); logger.info("Test has been executed. Execution time: " + (t2 - t1) / 1000000 + " ms"); + // TODO: 01.12.2018, JayDi85 - uncomment and fix MANY broken tests with wrong commands + //assertAllCommandsUsed(); } protected TestPlayer createNewPlayer(String playerName, RangeOfInfluence rangeOfInfluence) {