AI, tests: added testable use cases for getMultiAmount dialogs (part of #13638, #13766)

This commit is contained in:
Oleg Agafonov 2025-06-27 17:50:50 +04:00
parent a47c5726ec
commit b66912ea44
3 changed files with 67 additions and 22 deletions

View file

@ -42,7 +42,7 @@ class ChooseAmountTestableDialog extends BaseTestableDialog {
} }
private ChooseAmountTestableDialog aiMustChoose(boolean resStatus, int targetsCount) { 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()); TargetTestableResult res = ((TargetTestableResult) this.getResult());
res.aiAssertEnabled = true; res.aiAssertEnabled = true;
res.aiAssertResStatus = resStatus; res.aiAssertResStatus = resStatus;

View file

@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream;
/** /**
* Part of testable game dialogs * 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<Integer> 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 @Override
public void showDialog(Player player, Ability source, Game game, Player opponent) { public void showDialog(Player player, Ability source, Game game, Player opponent) {
Player choosingPlayer = this.isYou ? player : opponent; Player choosingPlayer = this.isYou ? player : opponent;
@ -91,29 +112,29 @@ class GetMultiAmountTestableDialog extends BaseTestableDialog {
for (boolean isYou : isYous) { for (boolean isYou : isYous) {
// make sure default values are valid due min/max settings // make sure default values are valid due min/max settings
// TODO: add bad effect for AI (must test default distribution)
// single target // 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, 1, genSameOptions(1, 0, 1, 0)).aiMustChoose(1));
runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 0 def", 0, 3, genSameOptions(1, 0, 3, 0))); 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))); 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))); 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))); 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))); runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "one, 10 def", 10, 10, genSameOptions(1, 0, 10, 10)).aiMustChoose(10));
// multiple targets // 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)).aiMustChoose(2, 2, 1));
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)).aiMustChoose(2, 2, 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)).aiMustChoose(20, 20, 20));
runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 1 def", 1, 5, genSameOptions(3, 1, 3, 1))); runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "many, 20 def", 60, 60, genSameOptions(3, 0, 60, 20)).aiMustChoose(20, 20, 20));
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)));
// big lists // 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(20, 0, 100, 0)).aiMustChooseMany(20, 5));
runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "big list", 0, 100, genSameOptions(100, 0, 100, 0))); runner.registerDialog(new GetMultiAmountTestableDialog(isYou, "big list", 0, 100, genSameOptions(100, 0, 100, 0)).aiMustChooseMany(100, 1));
} }
} }
private static List<List<Integer>> genSameOptions(int amount, int min, int max, int def) { private static List<List<Integer>> genSameOptions(int options, int min, int max, int def) {
List<List<Integer>> res = new ArrayList<>(); List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < amount; i++) { for (int i = 0; i < options; i++) {
// min, max, default // min, max, default
res.add(Arrays.asList(min, max, def)); res.add(Arrays.asList(min, max, def));
} }

View file

@ -10,21 +10,45 @@ import java.util.List;
*/ */
public class MultiAmountTestableResult extends BaseTestableResult { public class MultiAmountTestableResult extends BaseTestableResult {
List<Integer> values = new ArrayList<>(); List<Integer> selectedValues;
public void onFinish(String resDebugSource, boolean status, List<String> info, List<Integer> values) { boolean aiAssertEnabled = false;
List<Integer> aiAssertValues = new ArrayList<>();
public void onFinish(String resDebugSource, boolean status, List<String> info, List<Integer> selectedValues) {
this.onFinish(resDebugSource, status, info); this.onFinish(resDebugSource, status, info);
this.values = values; this.selectedValues = selectedValues;
} }
@Override @Override
public String getResAssert() { 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 @Override
public void onClear() { public void onClear() {
super.onClear(); super.onClear();
this.values.clear(); this.selectedValues = null;
} }
} }