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.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CreaturesJsonFileTest extends ResourcesTypeTest {
private static final String ID_FIELD = "id";
private static final String TYPE_FIELD = "type";
private static final String NAME_FIELD = "name";
private static final String TAGS_FIELD = "tags";
private static final String DROPS_FIELD = "drops";
private static final String PLURAL_FIELD = "plural";
private static final String WEIGHT_FIELD = "weight";
private static final String HEALTH_FIELD = "health";
private static final String ATTACK_FIELD = "attack";
private static final String WEAPON_FIELD = "weapon";
private static final String SINGULAR_FIELD = "singular";
private static final String CREATURES_FIELD = "creatures";
private static final String INVENTORY_FIELD = "inventory";
private static final String LUMINOSITY_FIELD = "luminosity";
private static final String VISIBILITY_FIELD = "visibility";
private static final String CREATURES_JSON_FILE_NAME = "creatures.json";
private static final String ATTACK_ALGORITHM_ID_FIELD = "attackAlgorithmID";
private static final String INVENTORY_ITEM_LIMIT_FIELD = "inventoryItemLimit";
private static final String INVENTORY_WEIGHT_LIMIT_FIELD = "inventoryWeightLimit";
@Test
public void testIsFileHasValidStructure() {
final JsonRule nameJsonRuleObject = getNameRuleObject();
final JsonRule creatureRuleObject = getCreatureRuleObject(nameJsonRuleObject);
final JsonRule creaturesFileJsonRuleObject = getCreaturesFileRuleObject(creatureRuleObject);
JsonObject creaturesFileJsonObject = getJsonObjectByJsonFile(CREATURES_JSON_FILE_NAME);
creaturesFileJsonRuleObject.validate(creaturesFileJsonObject);
}
private JsonRule getCreaturesFileRuleObject(JsonRule creatureRuleObject) {
Map<String, JsonRule> creaturesFileRules = new HashMap<>();
creaturesFileRules.put(CREATURES_FIELD, JsonRuleFactory.makeVariableArrayRule(creatureRuleObject));
return JsonRuleFactory.makeObjectRule(creaturesFileRules);
}
private JsonRule getCreatureRuleObject(JsonRule nameJsonRuleObject) {
Map<String, JsonRule> creatureRules = new HashMap<>();
final JsonRule idRule = JsonRuleFactory.makeIdRule();
final JsonRule percentRule = JsonRuleFactory.makePercentRule();
final JsonRule integerRule = JsonRuleFactory.makeIntegerRule();
final JsonRule uppercaseJsonRule = JsonRuleFactory.makeUppercaseStringRule();
creatureRules.put(ID_FIELD, idRule);
creatureRules.put(TYPE_FIELD, JsonRuleFactory.makeStringRule());
creatureRules.put(NAME_FIELD, nameJsonRuleObject);
final JsonRule variableUppercaseRule = JsonRuleFactory.makeVariableArrayRule(uppercaseJsonRule);
creatureRules.put(TAGS_FIELD, JsonRuleFactory.makeOptionalRule(variableUppercaseRule));
creatureRules.put(INVENTORY_ITEM_LIMIT_FIELD, JsonRuleFactory.makeOptionalRule(integerRule));
final JsonRule optionalIntegerRule = JsonRuleFactory.makeOptionalRule(integerRule);
creatureRules.put(INVENTORY_WEIGHT_LIMIT_FIELD, optionalIntegerRule);
final JsonRule variableIdRule = JsonRuleFactory.makeVariableArrayRule(idRule);
creatureRules.put(INVENTORY_FIELD, JsonRuleFactory.makeOptionalRule(variableIdRule));
creatureRules.put(DROPS_FIELD, getDropsRule());
creatureRules.put(LUMINOSITY_FIELD, JsonRuleFactory.makeOptionalRule(percentRule));
creatureRules.put(VISIBILITY_FIELD, percentRule);
creatureRules.put(WEIGHT_FIELD, JsonRuleFactory.makeBoundDoubleRule(Double.MIN_VALUE, Double.MAX_VALUE));
creatureRules.put(HEALTH_FIELD, integerRule);
creatureRules.put(ATTACK_FIELD, integerRule);
creatureRules.put(ATTACK_ALGORITHM_ID_FIELD, idRule);
creatureRules.put(WEAPON_FIELD, JsonRuleFactory.makeOptionalRule(idRule));
return JsonRuleFactory.makeObjectRule(creatureRules);
}
private JsonRule getNameRuleObject() {
Map<String, JsonRule> nameRules = new HashMap<>();
final JsonRule optionalStringRule = JsonRuleFactory.makeOptionalRule(JsonRuleFactory.makeStringRule());
nameRules.put(SINGULAR_FIELD, JsonRuleFactory.makeStringRule());
nameRules.put(PLURAL_FIELD, optionalStringRule);
return JsonRuleFactory.makeObjectRule(nameRules);
}
private JsonRule getDropsRule() {
JsonRule doubleRule = JsonRuleFactory.makeBoundDoubleRule(0.0, 1.0);
JsonRule idRule = JsonRuleFactory.makeIdRule();
List<JsonRule> dropRules = new ArrayList<>(Arrays.asList(idRule, doubleRule));
JsonRule innerArrayRule = JsonRuleFactory.makeFixedArrayRule(dropRules);
JsonRule outerArrayRule = JsonRuleFactory.makeVariableArrayRule(innerArrayRule);
return JsonRuleFactory.makeOptionalRule(outerArrayRule);
}
}