package org.mafagafogigante.dungeon.io;
import org.mafagafogigante.dungeon.schema.JsonRule;
import org.mafagafogigante.dungeon.schema.rules.JsonRuleFactory;
import com.eclipsesource.json.JsonObject;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class AchievementsJsonFileTest extends ResourcesTypeTest {
private static final String ID_FIELD = "id";
private static final String NAME_FIELD = "name";
private static final String INFO_FIELD = "info";
private static final String TEXT_FIELD = "text";
private static final String TYPE_FIELD = "type";
private static final String COUNT_FIELD = "count";
private static final String QUERY_FIELD = "query";
private static final String FOREST_FIELD = "FOREST";
private static final String DESERT_FIELD = "DESERT";
private static final String GRAVEYARD_FIELD = "GRAVEYARD";
private static final String PART_OF_DAY_FIELD = "partOfDay";
private static final String ACHIEVEMENTS_FIELD = "achievements";
private static final String STONE_BRIDGE_FIELD = "STONE_BRIDGE";
private static final String CAUSE_OF_DEATH_FIELD = "causeOfDeath";
private static final String TIMBER_BRIDGE_FIELD = "TIMBER_BRIDGE";
private static final String VISITED_LOCATIONS_FIELD = "visitedLocations";
private static final String BATTLE_REQUIREMENTS_FIELD = "battleRequirements";
private static final String KILLS_BY_LOCATION_ID_FIELD = "killsByLocationID";
private static final String ACHIEVEMENTS_JSON_FILE_NAME = "achievements.json";
private static final String MAXIMUM_NUMBER_OF_VISITS_FIELD = "maximumNumberOfVisits";
private static final String EXPLORATION_REQUIREMENTS_FIELD = "explorationRequirements";
@Test
public void testIsFileHasValidStructure() {
JsonRule caseOfDeathRule = getCauseOfDeathRule();
JsonRule queryRule = getQueryRule(caseOfDeathRule);
JsonRule battleRequirementsRule = getBattleRequirementsRule(queryRule);
JsonRule visitedLocationsRule = getVisitedLocationsRule();
JsonRule maximumNumberOfVisitsRule = getMaximumNumberOfVisitsRule();
JsonRule killsByLocationIdRule = getKillsByLocationIdRule();
Map<String, JsonRule> explorationRequirementsRules = new HashMap<>();
JsonRule optionalKillsByLocationRule = JsonRuleFactory.makeOptionalRule(killsByLocationIdRule);
explorationRequirementsRules.put(KILLS_BY_LOCATION_ID_FIELD, optionalKillsByLocationRule);
JsonRule optionalMaximumNumberRule = JsonRuleFactory.makeOptionalRule(maximumNumberOfVisitsRule);
explorationRequirementsRules.put(MAXIMUM_NUMBER_OF_VISITS_FIELD, optionalMaximumNumberRule);
JsonRule optionalVisitedLocationsRule = JsonRuleFactory.makeOptionalRule(visitedLocationsRule);
explorationRequirementsRules.put(VISITED_LOCATIONS_FIELD, optionalVisitedLocationsRule);
JsonRule explorationRequirementsRule = JsonRuleFactory.makeObjectRule(explorationRequirementsRules);
JsonRule achievementRule = makeAchievementsRule(explorationRequirementsRule, battleRequirementsRule);
JsonRule achievementsFileRule = getAchievementsFileRule(achievementRule);
JsonObject achievementsFileJson = getJsonObjectByJsonFile(ACHIEVEMENTS_JSON_FILE_NAME);
achievementsFileRule.validate(achievementsFileJson);
}
private JsonRule getAchievementsFileRule(JsonRule achievementRule) {
Map<String, JsonRule> achievementsFileRules = new HashMap<>();
achievementsFileRules.put(ACHIEVEMENTS_FIELD, JsonRuleFactory.makeVariableArrayRule(achievementRule));
return JsonRuleFactory.makeObjectRule(achievementsFileRules);
}
private JsonRule makeAchievementsRule(JsonRule explorationRequirementsRule, JsonRule battleRequirementsRule) {
JsonRule jsonStringRule = JsonRuleFactory.makeStringRule();
Map<String, JsonRule> achievementRules = new HashMap<>();
achievementRules.put(ID_FIELD, JsonRuleFactory.makeIdRule());
achievementRules.put(NAME_FIELD, jsonStringRule);
achievementRules.put(INFO_FIELD, jsonStringRule);
achievementRules.put(TEXT_FIELD, jsonStringRule);
JsonRule battleVariableJsonRule = JsonRuleFactory.makeVariableArrayRule(battleRequirementsRule);
achievementRules.put(BATTLE_REQUIREMENTS_FIELD, JsonRuleFactory.makeOptionalRule(battleVariableJsonRule));
JsonRule optionalExplorationRule = JsonRuleFactory.makeOptionalRule(explorationRequirementsRule);
achievementRules.put(EXPLORATION_REQUIREMENTS_FIELD, optionalExplorationRule);
return JsonRuleFactory.makeObjectRule(achievementRules);
}
private JsonRule getBattleRequirementsRule(JsonRule queryRule) {
Map<String, JsonRule> battleRequirementsRules = new HashMap<>();
battleRequirementsRules.put(COUNT_FIELD, JsonRuleFactory.makeIntegerRule());
battleRequirementsRules.put(QUERY_FIELD, queryRule);
return JsonRuleFactory.makeObjectRule(battleRequirementsRules);
}
private JsonRule getQueryRule(JsonRule caseOfDeathRule) {
Map<String, JsonRule> queryRules = new HashMap<>();
JsonRule optionalStringRule = JsonRuleFactory.makeOptionalRule(JsonRuleFactory.makeStringRule());
queryRules.put(ID_FIELD, optionalStringRule);
queryRules.put(TYPE_FIELD, optionalStringRule);
JsonRule uppercaseRule = JsonRuleFactory.makeUppercaseStringRule();
JsonRule optionalUppercaseRule = JsonRuleFactory.makeOptionalRule(uppercaseRule);
queryRules.put(PART_OF_DAY_FIELD, optionalUppercaseRule);
queryRules.put(CAUSE_OF_DEATH_FIELD, JsonRuleFactory.makeOptionalRule(caseOfDeathRule));
return JsonRuleFactory.makeObjectRule(queryRules);
}
private JsonRule getCauseOfDeathRule() {
Map<String, JsonRule> causeOfDeathRules = new HashMap<>();
causeOfDeathRules.put(ID_FIELD, JsonRuleFactory.makeIdRule());
causeOfDeathRules.put(TYPE_FIELD, JsonRuleFactory.makeUppercaseStringRule());
return JsonRuleFactory.makeObjectRule(causeOfDeathRules);
}
private JsonRule getKillsByLocationIdRule() {
Map<String, JsonRule> killsByLocationIdRules = new HashMap<>();
JsonRule optionalIntegerRule = JsonRuleFactory.makeOptionalRule(JsonRuleFactory.makeIntegerRule());
killsByLocationIdRules.put(FOREST_FIELD, optionalIntegerRule);
return JsonRuleFactory.makeObjectRule(killsByLocationIdRules);
}
private JsonRule getMaximumNumberOfVisitsRule() {
Map<String, JsonRule> maximumNumberOfVisitsRules = new HashMap<>();
JsonRule optionalIntegerRule = JsonRuleFactory.makeOptionalRule(JsonRuleFactory.makeIntegerRule());
maximumNumberOfVisitsRules.put(STONE_BRIDGE_FIELD, optionalIntegerRule);
maximumNumberOfVisitsRules.put(TIMBER_BRIDGE_FIELD, optionalIntegerRule);
maximumNumberOfVisitsRules.put(GRAVEYARD_FIELD, optionalIntegerRule);
return JsonRuleFactory.makeObjectRule(maximumNumberOfVisitsRules);
}
private JsonRule getVisitedLocationsRule() {
Map<String, JsonRule> visitedLocationsRules = new HashMap<>();
JsonRule optionalIntegerRule = JsonRuleFactory.makeOptionalRule(JsonRuleFactory.makeIntegerRule());
visitedLocationsRules.put(DESERT_FIELD, optionalIntegerRule);
visitedLocationsRules.put(GRAVEYARD_FIELD, optionalIntegerRule);
return JsonRuleFactory.makeObjectRule(visitedLocationsRules);
}
}