package toadmess.explosives; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.bukkit.util.config.Configuration; import org.junit.Before; import org.junit.Test; import toadmess.explosives.messymocks.NullLogger; import toadmess.explosives.messymocks.PredicatableNumGen; public class ExplodingConfTest { private Configuration conf; @Before public void setup() { conf = new Configuration(null); EntityConf.hasConflictWithMiningTNT = false; } @Test public void testEmptyConfig() { checkEmptyConfigDefaults(conf, ""); } @Test public void testEmptyConfig_InvalidPath() { checkEmptyConfigDefaults(conf, "someplace.overtherainbow"); } private void checkEmptyConfigDefaults(final Configuration conf, final String confPath) { final EntityConf ec = new EntityConf(conf, confPath, new NullLogger()); // Check some defualt bounds are created checkBoundsAreDefault(ec); // Check the fire defaults to false even though it's not in the config. checkFire(ec, false, false); // Check the next radius multiplier defaults to 1.0 event though none was specified in the config checkRadiusMultiplier(ec, 1.0F, false); checkRadiusMultiplier(ec, 1.0F, false); // Check the next player damage multiplier defaults to 1.0 even though none was specified in the config checkPlayerDmgMultiplier(ec, 1.0F, false); checkPlayerDmgMultiplier(ec, 1.0F, false); // Check the next creature damage multiplier defaults to 1.0 even though none was specified in the config checkCreatureDmgMultiplier(ec, 1.0F, false); checkCreatureDmgMultiplier(ec, 1.0F, false); // Check the next item damage multiplier defaults to 1.0 even though none was specified in the config checkItemDmgMultiplier(ec, 1.0F, false); checkItemDmgMultiplier(ec, 1.0F, false); checkTNTFuseMultiplier(ec, 1.0F, false); checkTNTFuseMultiplier(ec, 1.0F, false); checkPreventTerrainDamage(ec, false, false); checkYield(ec, 0.3F, false); assertTrue(ec.isEmptyConfig()); } @Test public void testFire_False() { testFire(false); } @Test public void testFire_True() { testFire(true); } private void testFire(final boolean confHasFireSetToTrue) { conf.setProperty("someentity." + HEMain.CONF_ENTITY_FIRE, confHasFireSetToTrue); checkFire(new EntityConf(conf, "someentity", new NullLogger()), confHasFireSetToTrue, true); } @Test public void testYield() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_YIELD, 0.42D); checkYield(new EntityConf(conf, "someentity", new NullLogger()), 0.42F, true); } @Test public void testYield_Integer() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_YIELD, 1); checkYield(new EntityConf(conf, "someentity", new NullLogger()), 1.0F, true); } @Test public void testYield_Float() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_YIELD, 0.42F); checkYield(new EntityConf(conf, "someentity", new NullLogger()), 0.42F, true); } @Test public void testYield_WithMiningTNTConflict() { // Check that the default yield is 1.0 if the MiningTNT plugin was detected. EntityConf.hasConflictWithMiningTNT = true; checkYield(new EntityConf(conf, "someentity", new NullLogger()), 1.0F, true); // But check that the yield is as per the configuration if there is a configuration set. conf.setProperty("someentity." + HEMain.CONF_ENTITY_YIELD, 0.16F); checkYield(new EntityConf(conf, "someentity", new NullLogger()), 0.16F, true); } @Test public void testPreventTerrainDamage_False() { testPreventTerrainDamage(false); } @Test public void testPreventTerrainDamage_True() { testPreventTerrainDamage(true); } private void testPreventTerrainDamage(final boolean confHasPreventTerrainDamageSetToTrue) { conf.setProperty("someentity." + HEMain.CONF_ENTITY_PREVENT_TERRAIN_DAMAGE, confHasPreventTerrainDamageSetToTrue); checkPreventTerrainDamage(new EntityConf(conf, "someentity", new NullLogger()), confHasPreventTerrainDamageSetToTrue, true); } @Test public void testRadiusMultiplierSingle() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_RADIUSMULT, 0.23F); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkRadiusMultiplier(ec, 0.23F, true); checkRadiusMultiplier(ec, 0.23F, true); checkRadiusMultiplier(ec, 0.23F, true); } @Test public void testRadiusMultiplierSingle_Int() { // Test int config conf.setProperty("someentity." + HEMain.CONF_ENTITY_RADIUSMULT, 23); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkRadiusMultiplier(ec, 23.0F, true); } @Test public void testRadiusMultiplierSingle_Double() { // Test Double config conf.setProperty("someentity." + HEMain.CONF_ENTITY_RADIUSMULT, 42D); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkRadiusMultiplier(ec, 42.0F, true); } @Test public void testRadiusMultiplierMulti() { checkMultipliers(eMultiplierType.RADIUS); } private enum eMultiplierType { RADIUS(HEMain.CONF_ENTITY_RADIUSMULT), PLAYER_DMG(HEMain.CONF_ENTITY_PLAYER_DAMAGEMULT), CREATURE_DMG(HEMain.CONF_ENTITY_CREATURE_DAMAGEMULT), FUSE(HEMain.CONF_ENTITY_TNT_FUSEMULT), ITEM_DMG(HEMain.CONF_ENTITY_ITEM_DAMAGEMULT); private final String confKey; private eMultiplierType(final String confKey) { this.confKey = confKey;} protected String getConfKey() { return this.confKey; } }; private void checkMultipliers(final eMultiplierType multiplerType) { final String confPrefix = "someentity"; /** * Set up a configuration like: * * radiusMultiplier: * - {chance: 0.2, value: 2.0} * - {chance: 0.7, value: 1.0} * - {chance: 0.1, value: 0.0} */ final List<HashMap<String,Object>> listOMultipliers = new ArrayList<HashMap<String,Object>>(); final HashMap<String,Object> firstMultiplier = new HashMap<String,Object>(); final HashMap<String,Object> secondMultiplier = new HashMap<String,Object>(); final HashMap<String,Object> thirdMultiplier = new HashMap<String,Object>(); listOMultipliers.add(firstMultiplier); listOMultipliers.add(secondMultiplier); listOMultipliers.add(thirdMultiplier); firstMultiplier.put(HEMain.CONF_MULTIPLIER_CHANCE, 0.2D); firstMultiplier.put(HEMain.CONF_MULTIPLIER_VALUE, 2.0D); secondMultiplier.put(HEMain.CONF_MULTIPLIER_CHANCE, 0.7D); secondMultiplier.put(HEMain.CONF_MULTIPLIER_VALUE, 1.0D); thirdMultiplier.put(HEMain.CONF_MULTIPLIER_CHANCE, 0.1D); thirdMultiplier.put(HEMain.CONF_MULTIPLIER_VALUE, 0.0D); conf.setProperty(confPrefix + "." + multiplerType.getConfKey(), listOMultipliers); final PredicatableNumGen rng = new PredicatableNumGen(0.01D, 1.0D); final EntityConf ec = new EntityConf(conf, confPrefix, new NullLogger(), rng); for(int i = 0; i < 500; i++) { // Make our fake RNG Cycle round a few times final float expectedMultiplier; if(rng.peekNextDouble() <= 0.7D) { expectedMultiplier = 1.0F; } else if (rng.peekNextDouble() <= 0.9D) { expectedMultiplier = 2.0F; } else { expectedMultiplier = 0.0F; } switch(multiplerType) { case RADIUS: checkRadiusMultiplier(ec, expectedMultiplier, true); break; case PLAYER_DMG: checkPlayerDmgMultiplier(ec, expectedMultiplier, true); break; case CREATURE_DMG: checkCreatureDmgMultiplier(ec, expectedMultiplier, true); break; case FUSE: checkTNTFuseMultiplier(ec, expectedMultiplier, true); break; } } assertToStringThrowsNothing(ec); } @Test public void testPlayerDmgMultiplierSingle() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_PLAYER_DAMAGEMULT, 0.23F); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkPlayerDmgMultiplier(ec, 0.23F, true); checkPlayerDmgMultiplier(ec, 0.23F, true); checkPlayerDmgMultiplier(ec, 0.23F, true); } @Test public void testPlayerDmgMultiplierMulti() { checkMultipliers(eMultiplierType.PLAYER_DMG); } @Test public void testCreatureDmgMultiplierSingle() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_CREATURE_DAMAGEMULT, 0.23F); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkCreatureDmgMultiplier(ec, 0.23F, true); checkCreatureDmgMultiplier(ec, 0.23F, true); checkCreatureDmgMultiplier(ec, 0.23F, true); } @Test public void testCreatureDmgMultiplierMulti() { checkMultipliers(eMultiplierType.CREATURE_DMG); } @Test public void testItemDmgMultiplierSingle() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_ITEM_DAMAGEMULT, 0.23F); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkItemDmgMultiplier(ec, 0.23F, true); checkItemDmgMultiplier(ec, 0.23F, true); checkItemDmgMultiplier(ec, 0.23F, true); } @Test public void testItemDmgMultiplierMulti() { checkMultipliers(eMultiplierType.ITEM_DMG); } @Test public void testFuseMultiplierSingle() { conf.setProperty("someentity." + HEMain.CONF_ENTITY_TNT_FUSEMULT, 0.23F); final EntityConf ec = new EntityConf(conf, "someentity", new NullLogger()); checkTNTFuseMultiplier(ec, 0.23F, true); checkTNTFuseMultiplier(ec, 0.23F, true); checkTNTFuseMultiplier(ec, 0.23F, true); } @Test public void testFuseMultiplierMulti() { checkMultipliers(eMultiplierType.FUSE); } private void checkRadiusMultiplier(final EntityConf ec, final float expectMultiplier, final boolean expectRadiusConfig) { assertEquals((Float) expectMultiplier, (Float) ec.getNextRadiusMultiplier()); assertEquals(expectRadiusConfig, ec.hasRadiusConfig()); if(expectRadiusConfig) assertFalse(ec.isEmptyConfig()); } private void checkPlayerDmgMultiplier(final EntityConf ec, final float expectMultiplier, final boolean expectPlayerDmgConfig) { assertEquals((Float) expectMultiplier, (Float) ec.getNextPlayerDamageMultiplier()); assertEquals(expectPlayerDmgConfig, ec.hasPlayerDamageConfig()); if(expectPlayerDmgConfig) assertFalse(ec.isEmptyConfig()); } private void checkCreatureDmgMultiplier(final EntityConf ec, final float expectMultiplier, final boolean expectCreatureDmgConfig) { assertEquals((Float) expectMultiplier, (Float) ec.getNextCreatureDamageMultiplier()); assertEquals(expectCreatureDmgConfig, ec.hasCreatureDamageConfig()); if(expectCreatureDmgConfig) assertFalse(ec.isEmptyConfig()); } private void checkItemDmgMultiplier(final EntityConf ec, final float expectMultiplier, final boolean expectItemDmgConfig) { assertEquals((Float) expectMultiplier, (Float) ec.getNextItemDamageMultiplier()); assertEquals(expectItemDmgConfig, ec.hasItemDamageConfig()); if(expectItemDmgConfig) assertFalse(ec.isEmptyConfig()); } private void checkTNTFuseMultiplier(final EntityConf ec, final float expectMultiplier, final boolean expectFuseConfig) { assertEquals((Float) expectMultiplier, (Float) ec.getNextTNTFuseMultiplier()); assertEquals(expectFuseConfig, ec.hasTNTFuseConfig()); if(expectFuseConfig) assertFalse(ec.isEmptyConfig()); } private void checkFire(final EntityConf ec, final boolean expectFire, final boolean expectFireConfig) { assertEquals(expectFire, ec.getFire()); assertEquals(expectFireConfig, ec.hasFireConfig()); if(expectFireConfig) assertFalse(ec.isEmptyConfig()); } private void checkPreventTerrainDamage(final EntityConf ec, final boolean expectTerrainDamage, final boolean expectTerrainDamageConfig) { assertEquals(expectTerrainDamage, ec.getPreventTerrainDamage()); assertEquals(expectTerrainDamageConfig, ec.hasPreventTerrainDamageConfig()); if(expectTerrainDamageConfig) assertFalse(ec.isEmptyConfig()); } private void checkYield(final EntityConf ec, final float expectYield, final boolean expectYieldConfig) { assertEquals((Float) expectYield, (Float) ec.getYield()); assertEquals(expectYieldConfig, ec.hasYieldConfig()); if(expectYieldConfig) assertFalse(ec.isEmptyConfig()); } private void checkBoundsAreDefault(final EntityConf ec) { assertNull(ec.getActiveBounds().getMaxX()); assertNull(ec.getActiveBounds().getMaxY()); assertNull(ec.getActiveBounds().getMaxZ()); assertNull(ec.getActiveBounds().getMaxX()); assertNull(ec.getActiveBounds().getMaxY()); assertNull(ec.getActiveBounds().getMaxZ()); } @Test public void testToString() { assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_PLAYER_DAMAGEMULT, 0.23D); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_CREATURE_DAMAGEMULT, 0.23D); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_ITEM_DAMAGEMULT, 0.23D); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_TNT_FUSEMULT, 0.23D); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_RADIUSMULT, 0.23D); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_FIRE, true); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_YIELD, 0.23D); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); conf.setProperty("someentity." + HEMain.CONF_ENTITY_PREVENT_TERRAIN_DAMAGE, true); assertToStringThrowsNothing(new EntityConf(conf, "someentity", new NullLogger())); } private void assertToStringThrowsNothing(final EntityConf ec) { try { ec.toString(); } catch (final Throwable t) { fail("toString() threw " + t); } } }