package com.comphenix.xp;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.EntityType;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.junit.Test;
import com.comphenix.xp.expressions.ParameterProviderSet;
import com.comphenix.xp.lookup.MobQuery;
import com.comphenix.xp.messages.ChannelProvider;
import com.comphenix.xp.parser.ActionParser;
import com.comphenix.xp.parser.text.ItemNameParser;
import com.comphenix.xp.parser.text.ItemParser;
import com.comphenix.xp.parser.text.MobMatcher;
import com.comphenix.xp.parser.text.MobParser;
import com.comphenix.xp.parser.text.PlayerParser;
import com.comphenix.xp.rewards.RewardProvider;
import com.comphenix.xp.rewards.RewardTypes;
import com.comphenix.xp.rewards.items.ItemsParser;
import com.comphenix.xp.rewards.xp.ExperienceFactory;
import com.google.common.collect.Lists;
public class ConfigurationTest {
@Test
public void testMerging() {
Debugger debugger = new MockDebugger();
ItemNameParser nameParser = new ItemNameParser();
RewardProvider provider = new RewardProvider();
provider.register(new MockRewardable(RewardTypes.EXPERIENCE));
provider.register(new MockRewardable(RewardTypes.VIRTUAL));
provider.register(new MockRewardable(RewardTypes.ECONOMY));
provider.register(new MockRewardable(RewardTypes.DROPS, new ItemsParser(nameParser, null)));
provider.setDefaultReward(RewardTypes.EXPERIENCE);
String def = "EXPERIENCE";
// Reset parser
ActionParser.setCurrentID(0);
Configuration first = createConfig(
"multiplier: 1\n" +
"mobs:\n" +
" ?:\n" +
" experience: 5\n" +
" economy: 1\n" +
" message: 'hei'\n" +
" channels: [mining, general]", debugger, provider);
Configuration second = createConfig(
"multiplier: 1\n" +
"mobs:\n" +
" Blaze|ENTITY_ATTACK: 20\n" +
" Cave Spider|ENTITY_ATTACK: 5\n" +
" Chicken|ENTITY_ATTACK: 2\n" +
" Cow|ENTITY_ATTACK: 4\n" +
" Creeper|ENTITY_ATTACK: 17\n" +
" Enderman|ENTITY_ATTACK: 25\n" +
" Ghast|ENTITY_ATTACK: 35\n" +
" Giant|ENTITY_ATTACK: 55\n" +
" Iron golem|ENTITY_ATTACK: 55\n" +
" Magma cube|ENTITY_ATTACK: 15\n" +
" Mushroom cow|ENTITY_ATTACK: 10\n" +
" Ocelot|ENTITY_ATTACK: 15\n" +
" Pig|ENTITY_ATTACK: 3\n" +
" Pig Zombie|ENTITY_ATTACK: 17\n" +
" Sheep|ENTITY_ATTACK: 3\n" +
" Silverfish|ENTITY_ATTACK: 15\n" +
" Skeleton|ENTITY_ATTACK: 15\n" +
" Slime|ENTITY_ATTACK: 15\n" +
" Snowman|ENTITY_ATTACK: 15\n" +
" Spider|ENTITY_ATTACK: 15\n" +
" Squid|ENTITY_ATTACK: 7\n" +
" Villager|ENTITY_ATTACK: 10\n" +
" Wolf|ENTITY_ATTACK: 10\n" +
" Zombie|ENTITY_ATTACK: 15\n\n" +
"items:\n" +
" diamond ore:\n" +
" block source:\n" +
" drops:\n" +
" gold ingot: 5", debugger, provider);
Configuration result = Configuration.fromMultiple(Lists.newArrayList(first, second), debugger);
MobQuery queryBlace = MobQuery.fromAny(EntityType.BLAZE, DamageCause.ENTITY_ATTACK);
MobQuery queryZombie = MobQuery.fromAny(EntityType.ZOMBIE, DamageCause.ENTITY_ATTACK);
Action blaceAction = new Action();
blaceAction.addReward(def, new ExperienceFactory(20));
blaceAction.setId(1);
Action zombieAction = new Action(def, new ExperienceFactory(15));
zombieAction.setId(24);
assertEquals(blaceAction, result.getExperienceDrop().get(queryBlace));
assertEquals(zombieAction, result.getExperienceDrop().get(queryZombie));
}
// Load configuration from text
public static Configuration createConfig(String text, Debugger debugger, RewardProvider provider) {
Configuration config = new Configuration(debugger, provider, new ChannelProvider());
ItemNameParser nameParser = new ItemNameParser();
config.setParameterProviders(new ParameterProviderSet());
config.setPlayerParser(new PlayerParser());
config.setItemParser(new ItemParser(nameParser));
config.setMobParser(new MobParser(new MobMatcher()));
config.setActionTypes(ActionTypes.Default());
config.loadFromConfig(fromText(text));
return config;
}
private static YamlConfiguration fromText(String text) {
try {
InputStream buffer = new ByteArrayInputStream(text.getBytes("UTF-8"));
return YamlConfiguration.loadConfiguration(buffer);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("No UTF-8 installed.");
}
}
}