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) {
// 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;

View file

@ -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<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
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<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<>();
for (int i = 0; i < amount; i++) {
for (int i = 0; i < options; i++) {
// min, max, default
res.add(Arrays.asList(min, max, def));
}

View file

@ -10,21 +10,45 @@ import java.util.List;
*/
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.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;
}
}