diff --git a/Mage.Common/src/main/java/mage/utils/testers/ChooseAmountTestableDialog.java b/Mage.Common/src/main/java/mage/utils/testers/ChooseAmountTestableDialog.java index 57388c4920b..37bb11eb381 100644 --- a/Mage.Common/src/main/java/mage/utils/testers/ChooseAmountTestableDialog.java +++ b/Mage.Common/src/main/java/mage/utils/testers/ChooseAmountTestableDialog.java @@ -42,7 +42,7 @@ class ChooseAmountTestableDialog extends BaseTestableDialog { } private ChooseAmountTestableDialog aiMustChoose(boolean resStatus, int targetsCount) { - // TODO: AI use default distribution, imrove someday + // TODO: AI use default distribution, improve someday TargetTestableResult res = ((TargetTestableResult) this.getResult()); res.aiAssertEnabled = true; res.aiAssertResStatus = resStatus; diff --git a/Mage.Common/src/main/java/mage/utils/testers/GetMultiAmountTestableDialog.java b/Mage.Common/src/main/java/mage/utils/testers/GetMultiAmountTestableDialog.java index 2edf407b9eb..869791a6e8a 100644 --- a/Mage.Common/src/main/java/mage/utils/testers/GetMultiAmountTestableDialog.java +++ b/Mage.Common/src/main/java/mage/utils/testers/GetMultiAmountTestableDialog.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * Part of testable game dialogs @@ -51,6 +52,26 @@ class GetMultiAmountTestableDialog extends BaseTestableDialog { } } + private GetMultiAmountTestableDialog aiMustChoose(Integer... needValues) { + // TODO: AI use default distribution (min possible values), improve someday + MultiAmountTestableResult res = ((MultiAmountTestableResult) this.getResult()); + res.aiAssertEnabled = true; + res.aiAssertValues = Arrays.stream(needValues).collect(Collectors.toList()); + return this; + } + + private GetMultiAmountTestableDialog aiMustChooseMany(Integer options, Integer perOption) { + List need = new ArrayList<>(); + IntStream.rangeClosed(1, options).forEach(x -> { + need.add(perOption); + }); + + MultiAmountTestableResult res = ((MultiAmountTestableResult) this.getResult()); + res.aiAssertEnabled = true; + res.aiAssertValues = need; + return this; + } + @Override public void showDialog(Player player, Ability source, Game game, Player opponent) { Player choosingPlayer = this.isYou ? player : opponent; @@ -91,29 +112,29 @@ class GetMultiAmountTestableDialog extends BaseTestableDialog { for (boolean isYou : isYous) { // make sure default values are valid due min/max settings + // TODO: add bad effect for AI (must test default distribution) + // single target - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 0 def", 0, 1, genSameOptions(1, 0, 1, 0))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 0 def", 0, 3, genSameOptions(1, 0, 3, 0))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 1 def", 1, 1, genSameOptions(1, 1, 1, 1))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 1 def", 1, 3, genSameOptions(1, 1, 3, 1))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 5 def", 0, 10, genSameOptions(1, 0, 10, 5))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 10 def", 10, 10, genSameOptions(1, 0, 10, 10))); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 0 def", 0, 1, genSameOptions(1, 0, 1, 0)).aiMustChoose(1)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 0 def", 0, 3, genSameOptions(1, 0, 3, 0)).aiMustChoose(3)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 1 def", 1, 1, genSameOptions(1, 1, 1, 1)).aiMustChoose(1)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 1 def", 1, 3, genSameOptions(1, 1, 3, 1)).aiMustChoose(3)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 5 def", 0, 10, genSameOptions(1, 0, 10, 5)).aiMustChoose(10)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 10 def", 10, 10, genSameOptions(1, 0, 10, 10)).aiMustChoose(10)); // multiple targets - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 0 def", 0, 5, genSameOptions(3, 0, 3, 0))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 0 def", 0, 5, genSameOptions(3, 0, 3, 0))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 1 def", 1, 5, genSameOptions(3, 1, 3, 1))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 1 def", 1, 5, genSameOptions(3, 1, 3, 1))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 20 def", 0, 60, genSameOptions(3, 0, 60, 20))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 20 def", 60, 60, genSameOptions(3, 0, 60, 20))); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 0 def", 0, 5, genSameOptions(3, 0, 3, 0)).aiMustChoose(2, 2, 1)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 1 def", 1, 5, genSameOptions(3, 1, 3, 1)).aiMustChoose(2, 2, 1)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 20 def", 0, 60, genSameOptions(3, 0, 60, 20)).aiMustChoose(20, 20, 20)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 20 def", 60, 60, genSameOptions(3, 0, 60, 20)).aiMustChoose(20, 20, 20)); // big lists - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "big list", 0, 100, genSameOptions(20, 0, 100, 0))); - runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "big list", 0, 100, genSameOptions(100, 0, 100, 0))); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "big list", 0, 100, genSameOptions(20, 0, 100, 0)).aiMustChooseMany(20, 5)); + runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "big list", 0, 100, genSameOptions(100, 0, 100, 0)).aiMustChooseMany(100, 1)); } } - private static List> genSameOptions(int amount, int min, int max, int def) { + private static List> genSameOptions(int options, int min, int max, int def) { List> res = new ArrayList<>(); - for (int i = 0; i < amount; i++) { + for (int i = 0; i < options; i++) { // min, max, default res.add(Arrays.asList(min, max, def)); } diff --git a/Mage.Common/src/main/java/mage/utils/testers/MultiAmountTestableResult.java b/Mage.Common/src/main/java/mage/utils/testers/MultiAmountTestableResult.java index 75ce8b31c18..53ae9a4f5ab 100644 --- a/Mage.Common/src/main/java/mage/utils/testers/MultiAmountTestableResult.java +++ b/Mage.Common/src/main/java/mage/utils/testers/MultiAmountTestableResult.java @@ -10,21 +10,45 @@ import java.util.List; */ public class MultiAmountTestableResult extends BaseTestableResult { - List values = new ArrayList<>(); + List selectedValues; - public void onFinish(String resDebugSource, boolean status, List info, List values) { + boolean aiAssertEnabled = false; + List aiAssertValues = new ArrayList<>(); + + public void onFinish(String resDebugSource, boolean status, List info, List selectedValues) { this.onFinish(resDebugSource, status, info); - this.values = values; + this.selectedValues = selectedValues; } @Override public String getResAssert() { - return null; // TODO: implement + if (!this.aiAssertEnabled) { + return null; + } + + // not finished + if (this.selectedValues == null) { + return null; + } + + // wrong selection + String selected = this.selectedValues.toString(); + String need = this.aiAssertValues.toString(); + + if (!selected.equals(need)) { + return String.format("Wrong selection: need %s, but get %s", + need, + selected + ); + } + + // all fine + return ""; } @Override public void onClear() { super.onClear(); - this.values.clear(); + this.selectedValues = null; } }