Tests: improved verify tests for tokens data, added how-to fix hints, added new checks (disabled by default)

This commit is contained in:
Oleg Agafonov 2023-04-12 09:51:19 +04:00
parent 47ee0f7f5a
commit 5bff03f57a

View file

@ -1283,6 +1283,8 @@ public class VerifyCardDataTest {
if (token == null) {
errorsList.add("Error: token must have default constructor with zero params: " + tokenClass.getName());
} else if (tokDataNamesIndex.getOrDefault(token.getName().replace(" Token", ""), "").isEmpty()) {
// how-to fix: public token must be downloadable, so tok-data must contain miss set
// (also don't forget to add new set to scryfall download)
errorsList.add("Error: can't find data in card-pictures-tok.txt for token: " + tokenClass.getName() + " -> " + token.getName());
}
}
@ -1312,20 +1314,45 @@ public class VerifyCardDataTest {
}
// set uses tokens, but tok data miss it
setsWithTokens.forEach((setCode, sourceCards) -> {
if (!tokDataTokensBySetIndex.containsKey(setCode)) {
List<CardDownloadData> setTokens = tokDataTokensBySetIndex.getOrDefault(setCode, null);
if (setTokens == null) {
// it's not a problem -- just find set's cards without real tokens for image tests
// (most use cases: promo sets)
warningsList.add("info, set has cards with token abilities, but it haven't token data: "
// Possible reasons:
// - promo sets with cards without tokens (nothing to do with it)
// - miss set from tok-data (must add new set to tok-data and scryfall download)
warningsList.add("info, set's cards uses tokens but tok-data haven't it: "
+ setCode + " - " + sourceCards.stream().map(MageObject::getName).collect(Collectors.joining(", ")));
} else {
// Card can be checked on scryfall like "set:set_code oracle:token_name oracle:token"
// Possible reasons for un-used tokens:
// - normal use case: tok-data contains wrong token data and must be removed
// - normal use case: card uses wrong rules text (must contain "create" and "token" words)
// - rare use case: un-implemented card that uses a token
setTokens.forEach(token -> {
if (token.getName().contains("Plane - ")) {
// cards don't put it to the game, so no related cards
return;
}
String needTokenName = token.getName()
.replace(" Token", "")
.replace("Emblem ", "");
// need add card name, so it will skip no name emblems like Sarkhan, the Dragonspeaker
if (sourceCards.stream()
.map(card -> card.getName() + " - " + String.join(", ", card.getRules()))
.noneMatch(s -> s.contains(needTokenName))) {
warningsList.add("info, tok-data has un-used tokens: "
+ token.getSet() + " - " + token.getName());
}
});
}
});
// tok data have tokens, but cards from set are miss
tokDataTokensBySetIndex.forEach((setCode, setTokens) -> {
if (!setsWithTokens.containsKey(setCode)) {
// possible reasons:
// - bad: outdated set code in tokens database (must use exists set codes, see additional check with token's codes)
// - ok: promo set contains additional tokens for main set -- it's ok and must be ignored (example: Saproling in E02)
warningsList.add("warning, tok data has set with tokens, but real set haven't cards with it: "
// Possible reasons:
// - outdated set code in tokens database (must be fixed by new set code, another verify check it)
// - promo set contains additional tokens for main set (it's ok and must be ignored, example: Saproling in E02)
warningsList.add("warning, tok-data has tokens, but real set haven't cards with it: "
+ setCode + " - " + setTokens.stream().map(CardDownloadData::getName).collect(Collectors.joining(", ")));
}
});