Upstream Paper

This commit is contained in:
Sotr
2019-03-04 18:16:32 +08:00
commit cadd3f71c0
1106 changed files with 193757 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.server.IRegistry;
import net.minecraft.server.MinecraftKey;
import net.minecraft.server.Paintings;
import org.bukkit.craftbukkit.CraftArt;
import org.junit.Test;
import com.google.common.collect.Lists;
import org.bukkit.support.AbstractTestingBase;
public class ArtTest extends AbstractTestingBase {
private static final int UNIT_MULTIPLIER = 16;
@Test
public void verifyMapping() {
List<Art> arts = Lists.newArrayList(Art.values());
for (MinecraftKey key : IRegistry.MOTIVE.keySet()) {
Paintings enumArt = IRegistry.MOTIVE.get(key);
String name = key.getKey();
int width = enumArt.b() / UNIT_MULTIPLIER;
int height = enumArt.c() / UNIT_MULTIPLIER;
Art subject = CraftArt.NotchToBukkit(enumArt);
String message = String.format("org.bukkit.Art is missing '%s'", name);
assertNotNull(message, subject);
assertThat(Art.getByName(name), is(subject));
assertThat("Art." + subject + "'s width", subject.getBlockWidth(), is(width));
assertThat("Art." + subject + "'s height", subject.getBlockHeight(), is(height));
arts.remove(subject);
}
assertThat("org.bukkit.Art has too many arts", arts, is(Collections.EMPTY_LIST));
}
@Test
public void testCraftArtToNotch() {
Map<Paintings, Art> cache = new HashMap<>();
for (Art art : Art.values()) {
Paintings enumArt = CraftArt.BukkitToNotch(art);
assertNotNull(art.name(), enumArt);
assertThat(art.name(), cache.put(enumArt, art), is(nullValue()));
}
}
@Test
public void testCraftArtToBukkit() {
Map<Art, Paintings> cache = new EnumMap(Art.class);
for (Paintings enumArt : (Iterable<Paintings>) IRegistry.MOTIVE) { // Eclipse fail
Art art = CraftArt.NotchToBukkit(enumArt);
assertNotNull("Could not CraftArt.NotchToBukkit " + enumArt, art);
assertThat("Duplicate artwork " + enumArt, cache.put(art, enumArt), is(nullValue()));
}
}
}

View File

@@ -0,0 +1,26 @@
package org.bukkit;
import net.minecraft.server.BiomeBase;
import net.minecraft.server.IRegistry;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
public class BiomeTest extends AbstractTestingBase {
@Test
public void testBukkitToMinecraft() {
for (Biome biome : Biome.values()) {
Assert.assertNotNull("No NMS mapping for " + biome, CraftBlock.biomeToBiomeBase(biome));
}
}
@Test
public void testMinecraftToBukkit() {
for (Object biome : IRegistry.BIOME) {
Assert.assertNotNull("No Bukkit mapping for " + biome, CraftBlock.biomeBaseToBiome((BiomeBase) biome));
}
}
}

View File

@@ -0,0 +1,38 @@
package org.bukkit;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.server.Block;
import net.minecraft.server.IBlockData;
import net.minecraft.server.IRegistry;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
/**
* This test class ensures that all Blocks (as registered in IRegistry.BLOCK)
* can be converted into their CraftBlockData equivalent.
*/
@RunWith(Parameterized.class)
public class BlockDataConversionTest extends AbstractTestingBase {
@Parameterized.Parameters(name = "{index}: {0}")
public static List<Object[]> args() {
List<Object[]> list = new ArrayList<>();
for (Block block : (Iterable<Block>) IRegistry.BLOCK) {
list.add(new Object[]{block.getBlockData()});
}
return list;
}
@Parameterized.Parameter(0) public IBlockData data;
@Test
public void testNotNull() {
Assert.assertNotNull(data);
Assert.assertNotNull(CraftBlockData.fromData(data));
}
}

View File

@@ -0,0 +1,172 @@
package org.bukkit;
import net.minecraft.server.BlockCake;
import net.minecraft.server.BlockChest;
import net.minecraft.server.Blocks;
import net.minecraft.server.EnumDirection;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Cake;
import org.bukkit.block.data.type.Chest;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.support.AbstractTestingBase;
import static org.hamcrest.Matchers.*;
import org.junit.Assert;
import org.junit.Test;
public class BlockDataTest extends AbstractTestingBase {
@Test
public void testParsing() {
BlockData cakeTest = CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3));
BlockData materialString = CraftBlockData.newData(Material.CAKE, "[bites=3]");
Assert.assertThat(materialString, is(cakeTest));
BlockData combined = CraftBlockData.newData(null, "cake[bites=3]");
Assert.assertThat(combined, is(cakeTest));
BlockData combinedMinecraft = CraftBlockData.newData(null, "minecraft:cake[bites=3]");
Assert.assertThat(combinedMinecraft, is(cakeTest));
BlockData inverted = CraftBlockData.newData(null, cakeTest.getAsString());
Assert.assertThat(inverted, is(cakeTest));
}
@Test(expected = IllegalArgumentException.class)
public void testBadMaterial() {
CraftBlockData.newData(null, "invalid");
}
@Test(expected = IllegalArgumentException.class)
public void testBadSyntax() {
CraftBlockData.newData(null, "minecraft:cake[bites=3");
}
@Test(expected = IllegalArgumentException.class)
public void testDoubleMaterial() {
CraftBlockData.newData(Material.CAKE, "minecraft:cake[bites=3]");
}
@Test(expected = IllegalArgumentException.class)
public void testMistake() {
BlockData cakeTest = CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3));
CraftBlockData.newData(Material.CAKE, cakeTest.toString());
}
@Test(expected = IllegalArgumentException.class)
public void testItem() {
CraftBlockData.newData(Material.DIAMOND_AXE, null);
}
@Test(expected = IllegalArgumentException.class)
public void testItemParse() {
CraftBlockData.newData(null, "minecraft:diamond_axe");
}
@Test
public void testClone() {
Cake cakeTest = (Cake) CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3));
Cake clone = (Cake) cakeTest.clone();
Assert.assertFalse("Clone did not return new object", cakeTest == clone);
Assert.assertThat("Clone is not equal", clone, is(cakeTest));
clone.setBites(1);
Assert.assertThat("Clone is not actually clone", clone, is(not(cakeTest)));
}
@Test
public void testMerge() {
Chest trueTarget = (Chest) CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=true]");
Chest falseTarget = (Chest) CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=false]");
Chest waterlogged = (Chest) CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]");
BlockData candidate;
Assert.assertFalse("Target and match are not yet equal", trueTarget.equals(waterlogged));
candidate = trueTarget.merge(waterlogged);
Assert.assertTrue("Target and candidate are now equal", trueTarget.equals(candidate));
Assert.assertFalse("Target and match are not yet equal", falseTarget.equals(waterlogged));
candidate = falseTarget.merge(waterlogged);
Assert.assertFalse("Target and candidate are still not equal", falseTarget.equals(candidate));
}
@Test
public void testMergeAny() {
Chest trueTarget = (Chest) CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=true]");
Chest falseTarget = (Chest) CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=false]");
Chest any = (Chest) CraftBlockData.newData(null, "minecraft:chest");
BlockData candidate;
Assert.assertFalse("Target and match are not yet equal", trueTarget.equals(any));
candidate = trueTarget.merge(any);
Assert.assertTrue("Target and candidate are now equal", trueTarget.equals(candidate));
Assert.assertFalse("Target and match are not yet equal", falseTarget.equals(any));
candidate = falseTarget.merge(any);
Assert.assertTrue("Target and candidate are now equal", falseTarget.equals(candidate));
}
@Test(expected = IllegalArgumentException.class)
public void testCannotMerge1() {
Chest one = (Chest) CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=true]");
Chest two = (Chest) CraftBlockData.fromData(Blocks.CHEST.getBlockData());
one.merge(two);
}
@Test(expected = IllegalArgumentException.class)
public void testCannotMerge2() {
Chest one = (Chest) CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]");
Chest two = (Chest) CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]");
one.merge(two);
two.setFacing(BlockFace.NORTH);
one.merge(two);
}
@Test(expected = IllegalArgumentException.class)
public void testCannotMerge3() {
Chest one = (Chest) CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]");
Chest two = (Chest) CraftBlockData.newData(null, "minecraft:trapped_chest[waterlogged=true]");
one.merge(two);
}
@Test
public void testMatch() {
Assert.assertTrue(CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=true]").matches(CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]")));
Assert.assertFalse(CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=false]").matches(CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]")));
Assert.assertTrue(CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=true]").matches(CraftBlockData.newData(null, "minecraft:chest")));
Assert.assertFalse(CraftBlockData.newData(null, "minecraft:trapped_chest[facing=east,waterlogged=false]").matches(CraftBlockData.newData(null, "minecraft:chest[waterlogged=true]")));
Assert.assertTrue(CraftBlockData.newData(null, "minecraft:chest[facing=east,waterlogged=true]").matches(CraftBlockData.newData(null, "minecraft:chest[waterlogged=true,facing=east]")));
Chest one = (Chest) CraftBlockData.fromData(Blocks.CHEST.getBlockData().set(BlockChest.FACING, EnumDirection.EAST));
Chest two = (Chest) CraftBlockData.newData(null, "minecraft:chest[waterlogged=false]");
Assert.assertTrue(one.matches(two));
Assert.assertFalse(two.matches(one));
}
@Test
public void testGetAsString() {
String dataString = "minecraft:chest[facing=east,waterlogged=true]";
BlockData data = CraftBlockData.newData(null, dataString);
Assert.assertThat(data.getAsString(true), is(dataString));
Assert.assertThat(data.getAsString(false), is("minecraft:chest[facing=east,type=single,waterlogged=true]"));
}
@Test
public void testGetAsString2() {
Chest data = (Chest) CraftBlockData.fromData(Blocks.CHEST.getBlockData().set(BlockChest.FACING, EnumDirection.EAST));
Assert.assertThat(data.getAsString(true), is("minecraft:chest[facing=east,type=single,waterlogged=false]"));
Assert.assertThat(data.getAsString(false), is("minecraft:chest[facing=east,type=single,waterlogged=false]"));
}
}

View File

@@ -0,0 +1,41 @@
package org.bukkit;
import net.minecraft.server.EnumChatFormat;
import net.minecraft.server.IChatBaseComponent;
import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ChatTest {
@Test
public void testColors() {
for (ChatColor color : ChatColor.values()) {
Assert.assertNotNull(CraftChatMessage.getColor(color));
Assert.assertEquals(color, CraftChatMessage.getColor(CraftChatMessage.getColor(color)));
}
for (EnumChatFormat format : EnumChatFormat.values()) {
Assert.assertNotNull(CraftChatMessage.getColor(format));
Assert.assertEquals(format, CraftChatMessage.getColor(CraftChatMessage.getColor(format)));
}
}
@Test
public void testURLJsonConversion() {
IChatBaseComponent[] components;
components = CraftChatMessage.fromString("https://spigotmc.org/test Test Message");
assertEquals("{\"extra\":[{\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://spigotmc.org/test\"},\"text\":\"https://spigotmc.org/test\"},{\"text\":\" Test Message\"}],\"text\":\"\"}",
CraftChatMessage.toJSON(components[0]));
components = CraftChatMessage.fromString("123 " + ChatColor.GOLD + "https://spigotmc.org " + ChatColor.BOLD + "test");
assertEquals("{\"extra\":[{\"text\":\"123 \"},{\"color\":\"gold\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://spigotmc.org\"},\"text\":\"https://spigotmc.org\"},{\"color\":\"gold\",\"text\":\" \"},{\"bold\":true,\"color\":\"gold\",\"text\":\"test\"}],\"text\":\"\"}",
CraftChatMessage.toJSON(components[0]));
components = CraftChatMessage.fromString("multiCase http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE");
assertEquals("{\"extra\":[{\"text\":\"multiCase \"},{\"clickEvent\":{\"action\":\"open_url\",\"value\":\"http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE\"},\"text\":\"http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE\"}],\"text\":\"\"}",
CraftChatMessage.toJSON(components[0]));
}
}

View File

@@ -0,0 +1,46 @@
package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.server.EnumColor;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class DyeColorsTest extends AbstractTestingBase {
@Parameters(name= "{index}: {0}")
public static List<Object[]> data() {
List<Object[]> list = new ArrayList<Object[]>();
for (DyeColor dye : DyeColor.values()) {
list.add(new Object[] {dye});
}
return list;
}
@Parameter public DyeColor dye;
@Test
public void checkColor() {
Color color = dye.getColor();
float[] nmsColorArray = EnumColor.fromColorIndex(dye.getWoolData()).d();
Color nmsColor = Color.fromRGB((int) (nmsColorArray[0] * 255), (int) (nmsColorArray[1] * 255), (int) (nmsColorArray[2] * 255));
assertThat(color, is(nmsColor));
}
@Test
public void checkFireworkColor() {
Color color = dye.getFireworkColor();
int nmsColor = EnumColor.fromColorIndex(dye.getWoolData()).f();
assertThat(color, is(Color.fromRGB(nmsColor)));
}
}

View File

@@ -0,0 +1,25 @@
package org.bukkit;
import net.minecraft.server.IRegistry;
import net.minecraft.server.MinecraftKey;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
public class EnchantmentTest extends AbstractTestingBase {
@Test
public void verifyMapping() {
for (MinecraftKey key : IRegistry.ENCHANTMENT.keySet()) {
net.minecraft.server.Enchantment nms = IRegistry.ENCHANTMENT.get(key);
Enchantment bukkitById = Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(key));
Assert.assertFalse("Unknown enchant name for " + key, bukkitById.getName().startsWith("UNKNOWN"));
Assert.assertNotNull("Unknown target for " + key, bukkitById.getItemTarget());
}
}
}

View File

@@ -0,0 +1,56 @@
package org.bukkit;
import java.util.Map;
import java.util.TreeMap;
import net.minecraft.server.GameRules;
import org.junit.Assert;
import org.junit.Test;
public class GameRuleTest {
@Test
public void testBukkitRules() {
GameRule<?>[] rules = GameRule.values();
for (GameRule<?> rule : rules) {
GameRule<?> registeredRule = GameRule.getByName(rule.getName());
Assert.assertNotNull("Null GameRule", registeredRule);
Assert.assertEquals("Invalid GameRule equality", rule, registeredRule);
}
}
@Test
public void testMinecraftRules() {
TreeMap<String, GameRules.b> minecraftRules = GameRules.getGameRules();
for (Map.Entry<String, GameRules.b> entry : minecraftRules.entrySet()) {
GameRule<?> bukkitRule = GameRule.getByName(entry.getKey());
Assert.assertNotNull(bukkitRule);
Assert.assertEquals("Invalid GameRule Name", bukkitRule.getName(), entry.getKey());
}
}
@Test(expected = NullPointerException.class)
public void nullGameRuleName() {
GameRule.getByName(null);
}
@Test
public void emptyGameRuleName() {
Assert.assertNull(GameRule.getByName(""));
}
@Test
public void incorrectGameRuleName() {
Assert.assertNull(GameRule.getByName("doAnnounceAdvancements"));
Assert.assertNull(GameRule.getByName("sendCommandBlockFeedback"));
}
@Test
public void invalidCasing() {
Assert.assertNull(GameRule.getByName("CommandBlockOutput"));
Assert.assertNull(GameRule.getByName("spAwnRadius"));
Assert.assertNull(GameRule.getByName("rand0mTickSpeEd"));
}
}

View File

@@ -0,0 +1,92 @@
package org.bukkit;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.craftbukkit.util.CraftLegacy;
import org.bukkit.material.MaterialData;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
public class LegacyTest extends AbstractTestingBase {
private final Set<Material> INVALIDATED_MATERIALS = new HashSet<>(Arrays.asList(Material.ACACIA_BUTTON, Material.ACACIA_PRESSURE_PLATE, Material.ACACIA_TRAPDOOR, Material.AIR, Material.ATTACHED_MELON_STEM, Material.ATTACHED_PUMPKIN_STEM,
Material.BIRCH_BUTTON, Material.BIRCH_PRESSURE_PLATE, Material.BIRCH_TRAPDOOR, Material.BLACK_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.BUBBLE_COLUMN, Material.CAVE_AIR, Material.CREEPER_WALL_HEAD,
Material.CYAN_WALL_BANNER, Material.DARK_OAK_BUTTON, Material.DARK_OAK_PRESSURE_PLATE, Material.DARK_OAK_TRAPDOOR, Material.DARK_PRISMARINE_SLAB, Material.DARK_PRISMARINE_STAIRS, Material.DEBUG_STICK, Material.DONKEY_SPAWN_EGG,
Material.DRAGON_WALL_HEAD, Material.DRIED_KELP, Material.DRIED_KELP_BLOCK, Material.ELDER_GUARDIAN_SPAWN_EGG, Material.EVOKER_SPAWN_EGG, Material.GRAY_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.HUSK_SPAWN_EGG,
Material.JUNGLE_BUTTON, Material.JUNGLE_PRESSURE_PLATE, Material.JUNGLE_TRAPDOOR, Material.KELP, Material.KELP_PLANT, Material.LIGHT_BLUE_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.LIME_WALL_BANNER, Material.LLAMA_SPAWN_EGG,
Material.MAGENTA_WALL_BANNER, Material.MULE_SPAWN_EGG, Material.ORANGE_WALL_BANNER, Material.PARROT_SPAWN_EGG, Material.PHANTOM_SPAWN_EGG, Material.PINK_WALL_BANNER, Material.PLAYER_WALL_HEAD, Material.POLAR_BEAR_SPAWN_EGG,
Material.POTTED_ACACIA_SAPLING, Material.POTTED_ALLIUM, Material.POTTED_AZURE_BLUET, Material.POTTED_BIRCH_SAPLING, Material.POTTED_BLUE_ORCHID, Material.POTTED_BROWN_MUSHROOM, Material.POTTED_DANDELION, Material.POTTED_DARK_OAK_SAPLING,
Material.POTTED_DEAD_BUSH, Material.POTTED_FERN, Material.POTTED_JUNGLE_SAPLING, Material.POTTED_OAK_SAPLING, Material.POTTED_ORANGE_TULIP, Material.POTTED_OXEYE_DAISY, Material.POTTED_PINK_TULIP, Material.POTTED_POPPY,
Material.POTTED_RED_MUSHROOM, Material.POTTED_RED_TULIP, Material.POTTED_SPRUCE_SAPLING, Material.POTTED_WHITE_TULIP, Material.PRISMARINE_BRICK_SLAB, Material.PRISMARINE_BRICK_STAIRS, Material.PRISMARINE_SLAB, Material.PRISMARINE_STAIRS,
Material.PUMPKIN, Material.PURPLE_WALL_BANNER, Material.RED_WALL_BANNER, Material.SEAGRASS, Material.SKELETON_HORSE_SPAWN_EGG, Material.SKELETON_WALL_SKULL, Material.SPRUCE_BUTTON, Material.SPRUCE_PRESSURE_PLATE, Material.SPRUCE_TRAPDOOR,
Material.STRAY_SPAWN_EGG, Material.STRIPPED_ACACIA_LOG, Material.STRIPPED_BIRCH_LOG, Material.STRIPPED_DARK_OAK_LOG, Material.STRIPPED_JUNGLE_LOG, Material.STRIPPED_OAK_LOG, Material.STRIPPED_SPRUCE_LOG, Material.TALL_SEAGRASS,
Material.TRIDENT, Material.TURTLE_EGG, Material.TURTLE_HELMET, Material.SCUTE, Material.TURTLE_SPAWN_EGG, Material.VEX_SPAWN_EGG, Material.VINDICATOR_SPAWN_EGG, Material.VOID_AIR, Material.WHITE_BED,
Material.WITHER_SKELETON_SPAWN_EGG, Material.WITHER_SKELETON_WALL_SKULL, Material.YELLOW_WALL_BANNER, Material.ZOMBIE_HORSE_SPAWN_EGG, Material.ZOMBIE_VILLAGER_SPAWN_EGG, Material.ZOMBIE_WALL_HEAD,
Material.COD_BUCKET, Material.COD_SPAWN_EGG, Material.PUFFERFISH_BUCKET, Material.PUFFERFISH_SPAWN_EGG, Material.SALMON_BUCKET, Material.SALMON_SPAWN_EGG,
Material.TROPICAL_FISH_BUCKET, Material.DROWNED_SPAWN_EGG, Material.SHULKER_BOX, Material.TROPICAL_FISH_SPAWN_EGG,
Material.BLUE_ICE, Material.BRAIN_CORAL, Material.BRAIN_CORAL_BLOCK, Material.BRAIN_CORAL_FAN, Material.BUBBLE_CORAL, Material.BUBBLE_CORAL_BLOCK, Material.BUBBLE_CORAL_FAN, Material.CONDUIT, Material.DEAD_BRAIN_CORAL_BLOCK,
Material.DEAD_BUBBLE_CORAL_BLOCK, Material.DEAD_FIRE_CORAL_BLOCK, Material.DEAD_HORN_CORAL_BLOCK, Material.DEAD_TUBE_CORAL_BLOCK, Material.DOLPHIN_SPAWN_EGG, Material.FIRE_CORAL, Material.FIRE_CORAL_BLOCK, Material.FIRE_CORAL_FAN,
Material.HEART_OF_THE_SEA, Material.HORN_CORAL, Material.HORN_CORAL_BLOCK, Material.HORN_CORAL_FAN, Material.NAUTILUS_SHELL, Material.PHANTOM_MEMBRANE, Material.SEA_PICKLE, Material.TUBE_CORAL, Material.TUBE_CORAL_BLOCK,
Material.TUBE_CORAL_FAN, Material.STRIPPED_ACACIA_WOOD, Material.STRIPPED_BIRCH_WOOD, Material.STRIPPED_DARK_OAK_WOOD, Material.STRIPPED_JUNGLE_WOOD, Material.STRIPPED_OAK_WOOD, Material.STRIPPED_SPRUCE_WOOD,
Material.ACACIA_WOOD, Material.BIRCH_WOOD, Material.DARK_OAK_WOOD, Material.JUNGLE_WOOD, Material.OAK_WOOD, Material.SPRUCE_WOOD,
Material.TUBE_CORAL_WALL_FAN, Material.BRAIN_CORAL_WALL_FAN, Material.BUBBLE_CORAL_WALL_FAN, Material.FIRE_CORAL_WALL_FAN, Material.HORN_CORAL_WALL_FAN, Material.DEAD_TUBE_CORAL_WALL_FAN, Material.DEAD_BRAIN_CORAL_WALL_FAN,
Material.DEAD_BUBBLE_CORAL_WALL_FAN, Material.DEAD_FIRE_CORAL_WALL_FAN, Material.DEAD_HORN_CORAL_WALL_FAN, Material.DEAD_TUBE_CORAL_FAN, Material.DEAD_BRAIN_CORAL_FAN, Material.DEAD_BUBBLE_CORAL_FAN, Material.DEAD_FIRE_CORAL_FAN,
Material.DEAD_HORN_CORAL_FAN, Material.DEAD_BRAIN_CORAL, Material.DEAD_BUBBLE_CORAL, Material.DEAD_FIRE_CORAL, Material.DEAD_HORN_CORAL, Material.DEAD_TUBE_CORAL,
//
Material.LEGACY_AIR, Material.LEGACY_DEAD_BUSH, Material.LEGACY_BURNING_FURNACE, Material.LEGACY_WALL_SIGN, Material.LEGACY_REDSTONE_TORCH_OFF, Material.LEGACY_SKULL, Material.LEGACY_REDSTONE_COMPARATOR_ON, Material.LEGACY_WALL_BANNER, Material.LEGACY_MONSTER_EGG));
private final Set<Material> INVERSION_FAILS = new HashSet<>(Arrays.asList(Material.LEGACY_DOUBLE_STEP, Material.LEGACY_GLOWING_REDSTONE_ORE, Material.LEGACY_DIODE_BLOCK_ON, Material.LEGACY_REDSTONE_LAMP_ON, Material.LEGACY_WOOD_DOUBLE_STEP,
Material.LEGACY_DAYLIGHT_DETECTOR_INVERTED, Material.LEGACY_DOUBLE_STONE_SLAB2, Material.LEGACY_PURPUR_DOUBLE_SLAB, Material.LEGACY_WHEAT, Material.LEGACY_SIGN, Material.LEGACY_WOOD_DOOR, Material.LEGACY_IRON_DOOR, Material.LEGACY_SUGAR_CANE,
Material.LEGACY_CAKE, Material.LEGACY_BED, Material.LEGACY_DIODE, Material.LEGACY_NETHER_STALK, Material.LEGACY_BREWING_STAND_ITEM, Material.LEGACY_CAULDRON_ITEM, Material.LEGACY_REDSTONE_COMPARATOR, Material.LEGACY_SPRUCE_DOOR_ITEM,
Material.LEGACY_BIRCH_DOOR_ITEM, Material.LEGACY_JUNGLE_DOOR_ITEM, Material.LEGACY_ACACIA_DOOR_ITEM, Material.LEGACY_DARK_OAK_DOOR_ITEM, Material.LEGACY_STATIONARY_LAVA, Material.LEGACY_STATIONARY_WATER));
@Test
public void toLegacyMaterial() {
for (Material material : Material.values()) {
if (!INVALIDATED_MATERIALS.contains(material) && !material.isLegacy()) {
MaterialData converted = CraftLegacy.toLegacyData(material);
Assert.assertNotEquals("Could not toLegacy " + material, Material.LEGACY_AIR, converted.getItemType());
if (!INVALIDATED_MATERIALS.contains(converted.getItemType())) {
Assert.assertNotEquals("Could not fromLegacy(toLegacy) " + converted + "(" + material + ")", Material.AIR, CraftLegacy.fromLegacy(converted));
}
if (!INVERSION_FAILS.contains(material)) {
Assert.assertEquals("Could not fromLegacy(toLegacy) " + converted + "(" + material + ")", material, CraftLegacy.fromLegacy(converted));
}
}
}
Assert.assertEquals("Could not toLegacy Air", Material.LEGACY_AIR, CraftLegacy.toLegacy(Material.AIR));
}
@Test
public void fromLegacyMaterial() {
for (Material material : Material.values()) {
if (!INVALIDATED_MATERIALS.contains(material) && material.isLegacy()) {
Material converted = CraftLegacy.fromLegacy(material);
Assert.assertNotEquals("Could not fromLegacy " + material, Material.AIR, converted);
Assert.assertNotEquals("Could not toLegacy(fromLegacy) " + converted + "(" + material + ")", Material.AIR, CraftLegacy.toLegacy(converted));
if (!INVERSION_FAILS.contains(material)) {
Assert.assertEquals("Could not toLegacy(fromLegacy) " + converted + "(" + material + ")", material, CraftLegacy.toLegacy(converted));
}
}
}
Assert.assertEquals("Could not fromLegacy Air", Material.AIR, CraftLegacy.fromLegacy(Material.LEGACY_AIR));
}
@Test
public void testRestricted() {
for (Material material : CraftLegacy.values()) {
Assert.assertTrue("Must iterate only legacy materials", material.isLegacy());
}
for (Material material : CraftLegacy.modern_values()) {
Assert.assertFalse("Must iterate only modern materials", material.isLegacy());
}
}
}

View File

@@ -0,0 +1,22 @@
package org.bukkit;
import org.bukkit.loot.LootTable;
import org.bukkit.loot.LootTables;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
public class LootTablesTest extends AbstractTestingBase {
@Test
public void testLootTablesEnumExists() {
LootTables[] tables = LootTables.values();
for (LootTables table : tables) {
LootTable lootTable = Bukkit.getLootTable(table.getKey());
Assert.assertNotNull("Unknown LootTable " + table.getKey(), lootTable);
Assert.assertEquals(lootTable.getKey(), table.getKey());
}
}
}

View File

@@ -0,0 +1,50 @@
package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.Collections;
import java.util.Map;
import net.minecraft.server.IRegistry;
import net.minecraft.server.Item;
import net.minecraft.server.MinecraftKey;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import com.google.common.collect.Maps;
import java.util.Iterator;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
public class MaterialTest extends AbstractTestingBase {
@Test
public void verifyMapping() {
Map<MinecraftKey, Material> materials = Maps.newHashMap();
for (Material material : Material.values()) {
if (INVALIDATED_MATERIALS.contains(material)) {
continue;
}
materials.put(CraftMagicNumbers.key(material), material);
}
Iterator<Item> items = IRegistry.ITEM.iterator();
while (items.hasNext()) {
Item item = items.next();
if (item == null) continue;
MinecraftKey id = IRegistry.ITEM.getKey(item);
String name = item.getName();
Material material = materials.remove(id);
assertThat("Missing " + name + "(" + id + ")", material, is(not(nullValue())));
assertNotNull("No item mapping for " + name, CraftMagicNumbers.getMaterial(item));
}
assertThat(materials, is(Collections.EMPTY_MAP));
}
}

View File

@@ -0,0 +1,29 @@
package org.bukkit;
import java.util.Random;
import net.minecraft.server.NibbleArray;
import org.junit.Assert;
import org.junit.Test;
public class NibbleArrayTest {
private static final int NIBBLE_SIZE = 4096;
@Test
public void testNibble() {
Random random = new Random();
byte[] classic = new byte[NIBBLE_SIZE];
NibbleArray nibble = new NibbleArray();
for (int i = 0; i < classic.length; i++) {
byte number = (byte) (random.nextInt() & 0xF);
classic[i] = number;
nibble.a(i, number);
}
for (int i = 0; i < classic.length; i++) {
Assert.assertEquals("Nibble array mismatch", classic[i], nibble.a(i));
}
}
}

View File

@@ -0,0 +1,35 @@
package org.bukkit;
import net.minecraft.server.IRegistry;
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftParticle;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
public class ParticleTest extends AbstractTestingBase {
@Test
public void verifyMapping() {
for (Particle bukkit : Particle.values()) {
Object data = null;
if (bukkit.getDataType().equals(ItemStack.class)) {
data = new ItemStack(Material.STONE);
} else if (bukkit.getDataType() == MaterialData.class) {
data = new MaterialData(Material.LEGACY_STONE);
} else if (bukkit.getDataType() == Particle.DustOptions.class) {
data = new Particle.DustOptions(Color.BLACK, 0);
} else if (bukkit.getDataType() == BlockData.class) {
data = CraftBlockData.newData(Material.STONE, "");
}
Assert.assertNotNull("Missing Bukkit->NMS particle mapping for " + bukkit, CraftParticle.toNMS(bukkit, data));
}
for (net.minecraft.server.Particle nms : (Iterable<net.minecraft.server.Particle<?>>) IRegistry.PARTICLE_TYPE) { // Eclipse fail
Assert.assertNotNull("Missing NMS->Bukkit particle mapping for " + nms, CraftParticle.toBukkit(nms));
}
}
}

View File

@@ -0,0 +1,239 @@
package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.List;
import net.minecraft.server.BlockFalling;
import net.minecraft.server.BlockFire;
import net.minecraft.server.Item;
import net.minecraft.server.ItemFood;
import net.minecraft.server.ItemRecord;
import net.minecraft.server.TileEntityFurnace;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
import org.bukkit.support.AbstractTestingBase;
import org.bukkit.support.Util;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.collect.Lists;
import java.util.Map;
import net.minecraft.server.Block;
import net.minecraft.server.BlockPosition;
import net.minecraft.server.Blocks;
import net.minecraft.server.EntityHuman;
import net.minecraft.server.EnumDirection;
import net.minecraft.server.EnumHand;
import net.minecraft.server.IBlockData;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.enchantments.EnchantmentTarget;
@RunWith(Parameterized.class)
public class PerMaterialTest extends AbstractTestingBase {
private static Map<Block, Integer> fireValues;
@BeforeClass
public static void getFireValues() {
fireValues = Util.getInternalState(BlockFire.class, Blocks.FIRE, "flameChances");
}
@Parameters(name= "{index}: {0}")
public static List<Object[]> data() {
List<Object[]> list = Lists.newArrayList();
for (Material material : Material.values()) {
if (!material.isLegacy()) {
list.add(new Object[] {material});
}
}
return list;
}
@Parameter public Material material;
@Test
public void isBlock() {
if (material != Material.AIR && material != Material.CAVE_AIR && material != Material.VOID_AIR) {
assertThat(material.isBlock(), is(not(CraftMagicNumbers.getBlock(material) == null)));
}
}
@Test
public void isSolid() {
if (material == Material.AIR) {
assertFalse(material.isSolid());
} else if (material.isBlock()) {
assertThat(material.isSolid(), is(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().isSolid()));
} else {
assertFalse(material.isSolid());
}
}
@Test
public void isEdible() {
assertThat(material.isEdible(), is(CraftMagicNumbers.getItem(material) instanceof ItemFood));
}
@Test
public void isRecord() {
assertThat(material.isRecord(), is(CraftMagicNumbers.getItem(material) instanceof ItemRecord));
}
@Test
public void maxDurability() {
if (INVALIDATED_MATERIALS.contains(material)) return;
if (material == Material.AIR) {
assertThat((int) material.getMaxDurability(), is(0));
} else if (material.isBlock()){
Item item = CraftMagicNumbers.getItem(material);
assertThat((int) material.getMaxDurability(), is(item.getMaxDurability()));
}
}
@Test
public void maxStackSize() {
if (INVALIDATED_MATERIALS.contains(material)) return;
final ItemStack bukkit = new ItemStack(material);
final CraftItemStack craft = CraftItemStack.asCraftCopy(bukkit);
if (material == Material.AIR) {
final int MAX_AIR_STACK = 0 /* Why can't I hold all of these AIR? */;
assertThat(material.getMaxStackSize(), is(MAX_AIR_STACK));
assertThat(bukkit.getMaxStackSize(), is(MAX_AIR_STACK));
assertThat(craft.getMaxStackSize(), is(MAX_AIR_STACK));
} else {
assertThat(material.getMaxStackSize(), is(CraftMagicNumbers.getItem(material).getMaxStackSize()));
assertThat(bukkit.getMaxStackSize(), is(material.getMaxStackSize()));
assertThat(craft.getMaxStackSize(), is(material.getMaxStackSize()));
}
}
@Test
public void isTransparent() {
if (material == Material.AIR) {
assertTrue(material.isTransparent());
} else if (material.isBlock()) {
// assertThat(material.isTransparent(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().blocksLight()))); // PAIL: not unit testable anymore (17w50a)
} else {
assertFalse(material.isTransparent());
}
}
@Test
public void isFlammable() {
if (material != Material.AIR && material.isBlock()) {
assertThat(material.isFlammable(), is(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().isBurnable()));
} else {
assertFalse(material.isFlammable());
}
}
@Test
public void isBurnable() {
if (material.isBlock()) {
Block block = CraftMagicNumbers.getBlock(material);
assertThat(material.isBurnable(), is(fireValues.containsKey(block) && fireValues.get(block) > 0));
} else {
assertFalse(material.isBurnable());
}
}
@Test
public void isFuel() {
assertThat(material.isFuel(), is(TileEntityFurnace.isFuel(new net.minecraft.server.ItemStack(CraftMagicNumbers.getItem(material)))));
}
@Test
public void isOccluding() {
if (material.isBlock()) {
assertThat(material.isOccluding(), is(CraftMagicNumbers.getBlock(material).isOccluding(CraftMagicNumbers.getBlock(material).getBlockData())));
} else {
assertFalse(material.isOccluding());
}
}
@Test
public void hasGravity() {
if (material.isBlock()) {
assertThat(material.hasGravity(), is(CraftMagicNumbers.getBlock(material) instanceof BlockFalling));
} else {
assertFalse(material.hasGravity());
}
}
@Test
public void usesDurability() {
if (!material.isBlock()) {
assertThat(EnchantmentTarget.BREAKABLE.includes(material), is(CraftMagicNumbers.getItem(material).usesDurability()));
} else {
assertFalse(EnchantmentTarget.BREAKABLE.includes(material));
}
}
@Test
public void testDurability() {
if (!material.isBlock()) {
assertThat(material.getMaxDurability(), is((short) CraftMagicNumbers.getItem(material).getMaxDurability()));
} else {
assertThat(material.getMaxDurability(), is((short) 0));
}
}
@Test
public void testBlock() {
if (material == Material.AIR) {
assertTrue(material.isBlock());
} else {
assertThat(material.isBlock(), is(equalTo(CraftMagicNumbers.getBlock(material) != null)));
}
}
@Test
public void testItem() {
if (material == Material.AIR) {
assertTrue(material.isItem());
} else {
assertThat(material.isItem(), is(equalTo(CraftMagicNumbers.getItem(material) != null)));
}
}
@Test
public void testInteractable() throws ReflectiveOperationException {
if (material.isBlock()) {
assertThat(material.isInteractable(),
is(!CraftMagicNumbers.getBlock(material).getClass()
.getMethod("interact", IBlockData.class, net.minecraft.server.World.class, BlockPosition.class, EntityHuman.class, EnumHand.class, EnumDirection.class, float.class, float.class, float.class)
.getDeclaringClass().equals(Block.class)));
} else {
assertFalse(material.isInteractable());
}
}
@Test
public void testBlockHardness() {
if (material.isBlock()) {
assertThat(material.getHardness(), is(CraftMagicNumbers.getBlock(material).strength));
}
}
@Test
public void testBlastResistance() {
if (material.isBlock()) {
assertThat(material.getBlastResistance(), is(CraftMagicNumbers.getBlock(material).getDurability()));
}
}
@Test
public void testBlockDataCreation() {
if (material.isBlock()) {
assertNotNull(material.createBlockData());
}
}
}

View File

@@ -0,0 +1,42 @@
package org.bukkit;
import net.minecraft.server.IRegistry;
import net.minecraft.server.MinecraftKey;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import org.bukkit.craftbukkit.CraftSound;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
public class SoundTest extends AbstractTestingBase {
@Test
public void testGetSound() {
for (Sound sound : Sound.values()) {
assertThat(sound.name(), CraftSound.getSound(sound), is(not(nullValue())));
}
}
@Test
public void testReverse() {
for (MinecraftKey effect : IRegistry.SOUND_EVENT.keySet()) {
assertNotNull(effect + "", Sound.valueOf(effect.getKey().replace('.', '_').toUpperCase(java.util.Locale.ENGLISH)));
}
}
@Test
public void testCategory() {
for (SoundCategory category : SoundCategory.values()) {
assertNotNull(category + "", net.minecraft.server.SoundCategory.valueOf(category.name()));
}
}
@Test
public void testCategoryReverse() {
for (net.minecraft.server.SoundCategory category : net.minecraft.server.SoundCategory.values()) {
assertNotNull(category + "", SoundCategory.valueOf(category.name()));
}
}
}

View File

@@ -0,0 +1,60 @@
package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import net.minecraft.server.EntityTypes;
import net.minecraft.server.IRegistry;
import net.minecraft.server.StatisticWrapper;
import org.bukkit.entity.EntityType;
import org.bukkit.craftbukkit.CraftStatistic;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import com.google.common.collect.HashMultiset;
public class StatisticsAndAchievementsTest extends AbstractTestingBase {
@Test
@SuppressWarnings("unchecked")
public void verifyEntityMapping() throws Throwable {
for (Statistic statistic : Statistic.values()) {
if (statistic.getType() == Statistic.Type.ENTITY) {
for (EntityType entity : EntityType.values()) {
if (entity.getName() != null) {
assertNotNull(statistic + " missing for " + entity, CraftStatistic.getEntityStatistic(statistic, entity));
}
}
}
}
}
@Test
@SuppressWarnings("unchecked")
public void verifyStatisticMapping() throws Throwable {
HashMultiset<Statistic> statistics = HashMultiset.create();
for (StatisticWrapper wrapper : (Iterable<StatisticWrapper<?>>) IRegistry.STATS) { // Eclipse fail
for (Object child : wrapper.a()) {
net.minecraft.server.Statistic<?> statistic = wrapper.b(child);
String message = String.format("org.bukkit.Statistic is missing: '%s'", statistic);
Statistic subject = CraftStatistic.getBukkitStatistic(statistic);
assertThat(message, subject, is(not(nullValue())));
if (wrapper.a() == IRegistry.BLOCK || wrapper.a() == IRegistry.ITEM) {
assertNotNull("Material type map missing for " + child, CraftStatistic.getMaterialFromStatistic(statistic));
} else if (wrapper.a() == IRegistry.ENTITY_TYPE) {
assertNotNull("Entity type map missing for " + EntityTypes.getName((EntityTypes<?>) child), CraftStatistic.getEntityTypeFromStatistic((net.minecraft.server.Statistic<EntityTypes<?>>) statistic));
}
statistics.add(subject);
}
}
for (Statistic statistic : Statistic.values()) {
String message = String.format("org.bukkit.Statistic.%s does not have a corresponding minecraft statistic", statistic.name());
assertThat(message, statistics.remove(statistic, statistics.count(statistic)), is(greaterThan(0)));
}
}
}

View File

@@ -0,0 +1,45 @@
package org.bukkit;
import java.util.Map;
import net.minecraft.server.WorldGenFactory;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* This test makes sure that Bukkit always has Minecraft structure types up to
* date.
*/
public class StructureTypeTest extends AbstractTestingBase {
private static Map<String, StructureType> structures;
@BeforeClass
public static void setUp() {
structures = StructureType.getStructureTypes();
}
@Test
public void testMinecraftToBukkit() {
for (String key : WorldGenFactory.structureStartMap.keySet()) {
Assert.assertNotNull(structures.get(key));
}
}
@Test
public void testBukkit() {
for (Map.Entry<String, StructureType> entry : structures.entrySet()) {
Assert.assertNotNull(StructureType.getStructureTypes().get(entry.getKey()));
Assert.assertNotNull(StructureType.getStructureTypes().get(entry.getValue().getName()));
}
}
@Test
public void testBukkitToMinecraft() {
for (Map.Entry<String, StructureType> entry : structures.entrySet()) {
Assert.assertNotNull(WorldGenFactory.structureStartMap.get(entry.getKey()));
Assert.assertNotNull(WorldGenFactory.structureStartMap.get(entry.getValue().getName()));
}
}
}

View File

@@ -0,0 +1,19 @@
package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import net.minecraft.server.WorldType;
import org.junit.Test;
public class WorldTypeTest {
@Test
public void testTypes() {
for (WorldType type : WorldType.types) {
if (type == null) continue;
if (type == WorldType.DEBUG_ALL_BLOCK_STATES) continue; // Doesn't work anyway
assertThat(type.name() + " has no Bukkit world", org.bukkit.WorldType.getByName(type.name()), is(not(nullValue())));
}
}
}

View File

@@ -0,0 +1,81 @@
package org.bukkit.craftbukkit.generator;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import static org.junit.Assert.*;
public class ChunkDataTest extends AbstractTestingBase {
private static final BlockData RED_WOOL = Material.RED_WOOL.createBlockData();
private static final BlockData AIR = Material.AIR.createBlockData();
private boolean testSetBlock(CraftChunkData data, int x, int y, int z, BlockData type, BlockData expected) {
data.setBlock(x, y, z, type);
return expected.equals(data.getBlockData(x, y, z)) && expected.getMaterial().equals(data.getType(x, y, z));
}
private void testSetRegion(CraftChunkData data, int minx, int miny, int minz, int maxx, int maxy, int maxz, BlockData type) {
data.setRegion(minx, miny, minz, maxx, maxy, maxz, type);
for (int y = 0; y < data.getMaxHeight(); y++) {
for (int z = 0; z < 16; z++) {
for (int x = 0; x < 16; x++) {
boolean inRegion = miny <= y && y < maxy && minx <= x && x < maxx && minz <= z && z < maxz;
if (inRegion != type.equals(data.getBlockData(x, y, z))) {
throw new IllegalStateException(
"setRegion(" + minx + ", " + miny + ", " + minz + ", " + maxx + ", " + maxy + ", " + maxz + ", " + type + ")"
+ "-> block at " + x + ", " + y + ", " + z + " is " + data.getBlockData(x, y, z));
}
}
}
}
}
@Test
public void testMaxHeight() {
CraftChunkData data = new CraftChunkData(128);
assertTrue("Could not set block above max height", testSetBlock(data, 0, 128, 0, RED_WOOL, AIR));
assertTrue("Could set block below max height", testSetBlock(data, 0, 127, 0, RED_WOOL, RED_WOOL));
}
@Test
public void testBoundsCheckingSingle() {
CraftChunkData data = new CraftChunkData(256);
assertTrue("Can set block inside chunk bounds", testSetBlock(data, 0, 0, 0, RED_WOOL, RED_WOOL));
assertTrue("Can set block inside chunk bounds", testSetBlock(data, 15, 255, 15, RED_WOOL, RED_WOOL));
assertTrue("Can no set block outside chunk bounds", testSetBlock(data, -1, 0, 0, RED_WOOL, AIR));
assertTrue("Can no set block outside chunk bounds", testSetBlock(data, 0, -1, 0, RED_WOOL, AIR));
assertTrue("Can no set block outside chunk bounds", testSetBlock(data, 0, 0, -1, RED_WOOL, AIR));
assertTrue("Can no set block outside chunk bounds", testSetBlock(data, 16, 0, 0, RED_WOOL, AIR));
assertTrue("Can no set block outside chunk bounds", testSetBlock(data, 0, 256, 0, RED_WOOL, AIR));
assertTrue("Can no set block outside chunk bounds", testSetBlock(data, 0, 0, 16, RED_WOOL, AIR));
}
@Test
public void testSetRegion() {
CraftChunkData data = new CraftChunkData(256);
testSetRegion(data, -100, 0, -100, 0, 256, 0, RED_WOOL); // exclusively outside
testSetRegion(data, 16, 256, 16, 0, 0, 0, RED_WOOL); // minimum >= maximum
testSetRegion(data, 0, 0, 0, 0, 0, 0, RED_WOOL); // minimum == maximum
testSetRegion(data, 0, 0, 0, 16, 16, 16, RED_WOOL); // Whole Chunk Section
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 8, 0, 16, 24, 16, RED_WOOL); // Start middle of this section, end middle of next
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 4, 0, 16, 12, 16, RED_WOOL); // Start in this section, end in this section
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 0, 0, 16, 16, 1, RED_WOOL); // Whole Chunk Section
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 8, 0, 16, 24, 1, RED_WOOL); // Start middle of this section, end middle of next
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 4, 0, 16, 12, 1, RED_WOOL); // Start in this section, end in this section
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 0, 0, 1, 16, 1, RED_WOOL); // Whole Chunk Section
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 8, 0, 1, 24, 1, RED_WOOL); // Start middle of this section, end middle of next
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 4, 0, 1, 12, 1, RED_WOOL); // Start in this section, end in this section
data.setRegion(0, 0, 0, 16, 256, 16, AIR);
testSetRegion(data, 0, 0, 0, 1, 1, 1, RED_WOOL); // Set single block.
}
}

View File

@@ -0,0 +1,62 @@
package org.bukkit.craftbukkit.inventory;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
public class CompositeSerialization extends AbstractTestingBase {
public YamlConfiguration getConfig() {
return new YamlConfiguration();
}
@Test
public void testSaveRestoreCompositeList() throws InvalidConfigurationException {
YamlConfiguration out = getConfig();
List<ItemStack> stacks = new ArrayList<ItemStack>();
stacks.add(new ItemStack(Material.STONE));
stacks.add(new ItemStack(Material.GRASS));
stacks.add(new ItemStack(Material.DIRT));
stacks.add(new ItemStack(Material.COBBLESTONE, 17));
stacks.add(new ItemStack(Material.OAK_PLANKS, 63));
stacks.add(new ItemStack(Material.OAK_SAPLING, 1, (short) 1));
stacks.add(new ItemStack(Material.OAK_LEAVES, 32, (short) 2));
ItemStack item7 = new ItemStack(Material.IRON_SHOVEL);
item7.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 1);
stacks.add(item7);
ItemStack item8 = new ItemStack(Material.IRON_PICKAXE);
item8.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 2);
item8.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 1);
item8.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 5);
item8.addUnsafeEnchantment(Enchantment.OXYGEN, 4);
stacks.add(item8);
out.set("composite-list.abc.def", stacks);
String yaml = out.saveToString();
YamlConfiguration in = new YamlConfiguration();
in.loadFromString(yaml);
List<?> raw = in.getList("composite-list.abc.def");
assertThat(stacks, hasSize(raw.size()));
for (int i = 0; i < 9; i++) {
assertThat(String.valueOf(i), (Object) stacks.get(i), is((Object) raw.get(i)));
}
}
}

View File

@@ -0,0 +1,156 @@
package org.bukkit.craftbukkit.inventory;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Material;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class FactoryItemMaterialTest extends AbstractTestingBase {
static final ItemFactory factory = CraftItemFactory.instance();
static final StringBuilder buffer = new StringBuilder();
static final Material[] materials;
static {
Material[] local_materials = Material.values();
List<Material> list = new ArrayList<Material>(local_materials.length);
for (Material material : local_materials) {
if (INVALIDATED_MATERIALS.contains(material)) {
continue;
}
list.add(material);
}
materials = list.toArray(new Material[list.size()]);
}
static String name(Enum<?> from, Enum<?> to) {
if (from.getClass() == to.getClass()) {
return buffer.delete(0, Integer.MAX_VALUE).append(from.getClass().getName()).append(' ').append(from.name()).append(" to ").append(to.name()).toString();
}
return buffer.delete(0, Integer.MAX_VALUE).append(from.getClass().getName()).append('(').append(from.name()).append(") to ").append(to.getClass().getName()).append('(').append(to.name()).append(')').toString();
}
@Parameters(name="Material[{index}]:{0}")
public static List<Object[]> data() {
List<Object[]> list = new ArrayList<Object[]>();
for (Material material : materials) {
list.add(new Object[] {material});
}
return list;
}
@Parameter(0) public Material material;
@Test
public void itemStack() {
ItemStack bukkitStack = new ItemStack(material);
CraftItemStack craftStack = CraftItemStack.asCraftCopy(bukkitStack);
ItemMeta meta = factory.getItemMeta(material);
if (meta == null) {
assertThat(material, is(Material.AIR));
} else {
assertTrue(factory.isApplicable(meta, bukkitStack));
assertTrue(factory.isApplicable(meta, craftStack));
}
}
@Test
public void generalCase() {
CraftMetaItem meta = (CraftMetaItem) factory.getItemMeta(material);
if (meta == null) {
assertThat(material, is(Material.AIR));
} else {
assertTrue(factory.isApplicable(meta, material));
assertTrue(meta.applicableTo(material));
meta = meta.clone();
assertTrue(factory.isApplicable(meta, material));
assertTrue(meta.applicableTo(material));
}
}
@Test
public void asMetaFor() {
final CraftMetaItem baseMeta = (CraftMetaItem) factory.getItemMeta(material);
if (baseMeta == null) {
assertThat(material, is(Material.AIR));
return;
}
for (Material other : materials) {
final ItemStack bukkitStack = new ItemStack(other);
final CraftItemStack craftStack = CraftItemStack.asCraftCopy(bukkitStack);
final CraftMetaItem otherMeta = (CraftMetaItem) factory.asMetaFor(baseMeta, other);
final String testName = name(material, other);
if (otherMeta == null) {
assertThat(testName, other, is(Material.AIR));
continue;
}
assertTrue(testName, factory.isApplicable(otherMeta, craftStack));
assertTrue(testName, factory.isApplicable(otherMeta, bukkitStack));
assertTrue(testName, factory.isApplicable(otherMeta, other));
assertTrue(testName, otherMeta.applicableTo(other));
}
}
@Test
public void blankEqualities() {
if (material == Material.AIR) {
return;
}
final CraftMetaItem baseMeta = (CraftMetaItem) factory.getItemMeta(material);
final CraftMetaItem baseMetaClone = baseMeta.clone();
final ItemStack baseMetaStack = new ItemStack(material);
baseMetaStack.setItemMeta(baseMeta);
assertThat(baseMeta, is(not(sameInstance(baseMetaStack.getItemMeta()))));
assertTrue(factory.equals(baseMeta, null));
assertTrue(factory.equals(null, baseMeta));
assertTrue(factory.equals(baseMeta, baseMetaClone));
assertTrue(factory.equals(baseMetaClone, baseMeta));
assertThat(baseMeta, is(not(sameInstance(baseMetaClone))));
assertThat(baseMeta, is(baseMetaClone));
assertThat(baseMetaClone, is(baseMeta));
for (Material other : materials) {
final String testName = name(material, other);
final CraftMetaItem otherMeta = (CraftMetaItem) factory.asMetaFor(baseMetaClone, other);
if (otherMeta == null) {
assertThat(testName, other, is(Material.AIR));
continue;
}
assertTrue(testName, factory.equals(baseMeta, otherMeta));
assertTrue(testName, factory.equals(otherMeta, baseMeta));
assertThat(testName, baseMeta, is(otherMeta));
assertThat(testName, otherMeta, is(baseMeta));
assertThat(testName, baseMeta.hashCode(), is(otherMeta.hashCode()));
}
}
}

View File

@@ -0,0 +1,47 @@
package org.bukkit.craftbukkit.inventory;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.HashSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import net.minecraft.server.IAnimal;
import net.minecraft.server.IAttribute;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
public class ItemFactoryTest extends AbstractTestingBase {
@Test
public void testKnownAttributes() throws Throwable {
final ZipInputStream nmsZipStream = new ZipInputStream(IAnimal.class/* Magic class that isn't imported! */.getProtectionDomain().getCodeSource().getLocation().openStream());
final Collection<String> names = new HashSet<String>();
for (ZipEntry clazzEntry; (clazzEntry = nmsZipStream.getNextEntry()) != null; ) {
final String entryName = clazzEntry.getName();
if (!(entryName.endsWith(".class") && entryName.startsWith("net/minecraft/server/"))) {
continue;
}
final Class<?> clazz = Class.forName(entryName.substring(0, entryName.length() - ".class".length()).replace('/', '.'));
assertThat(entryName, clazz, is(not(nullValue())));
for (final Field field : clazz.getDeclaredFields()) {
if (IAttribute.class.isAssignableFrom(field.getType()) && Modifier.isStatic(field.getModifiers())) {
field.setAccessible(true);
final String attributeName = ((IAttribute) field.get(null)).getName();
assertThat("Logical error: duplicate name `" + attributeName + "' in " + clazz.getName(), names.add(attributeName), is(true));
assertThat(clazz.getName(), CraftItemFactory.KNOWN_NBT_ATTRIBUTE_NAMES, hasItem(attributeName));
}
}
}
nmsZipStream.close();
assertThat("Extra values detected", CraftItemFactory.KNOWN_NBT_ATTRIBUTE_NAMES, is(names));
}
}

View File

@@ -0,0 +1,22 @@
package org.bukkit.craftbukkit.inventory;
import java.lang.reflect.Method;
import org.bukkit.Material;
import org.junit.Test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
public class ItemMetaCloneTest {
@Test
public void testClone() throws Throwable {
for (Material material : ItemStackTest.COMPOUND_MATERIALS) {
Class<?> clazz = CraftItemFactory.instance().getItemMeta(material).getClass();
Method clone = clazz.getDeclaredMethod("clone");
assertNotNull("Class " + clazz + " does not override clone()", clone);
assertThat("Class " + clazz + " clone return type does not match", clone.getReturnType(), is(equalTo(clazz)));
}
}
}

View File

@@ -0,0 +1,327 @@
package org.bukkit.craftbukkit.inventory;
import java.io.StringReader;
import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Map;
import java.util.UUID;
import net.minecraft.server.NBTBase;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.NBTTagIntArray;
import net.minecraft.server.NBTTagList;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.craftbukkit.inventory.tags.CraftCustomItemTagContainer;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.tags.CustomItemTagContainer;
import org.bukkit.inventory.meta.tags.ItemTagAdapterContext;
import org.bukkit.inventory.meta.tags.ItemTagType;
import org.bukkit.support.AbstractTestingBase;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
public class ItemMetaCustomValueTest extends AbstractTestingBase {
private static NamespacedKey VALID_KEY;
@Before
public void setup() {
VALID_KEY = new NamespacedKey("test", "validkey");
}
/*
Sets a test
*/
@Test(expected = IllegalArgumentException.class)
public void testSetNoAdapter() {
ItemMeta itemMeta = createNewItemMeta();
itemMeta.getCustomTagContainer().setCustomTag(VALID_KEY, new PrimitiveTagType<>(boolean.class), true);
}
/*
Contains a tag
*/
@Test(expected = IllegalArgumentException.class)
public void testHasNoAdapter() {
ItemMeta itemMeta = createNewItemMeta();
itemMeta.getCustomTagContainer().setCustomTag(VALID_KEY, ItemTagType.INTEGER, 1); // We gotta set this so we at least try to compare it
itemMeta.getCustomTagContainer().hasCustomTag(VALID_KEY, new PrimitiveTagType<>(boolean.class));
}
/*
Getting a tag
*/
@Test(expected = IllegalArgumentException.class)
public void testGetNoAdapter() {
ItemMeta itemMeta = createNewItemMeta();
itemMeta.getCustomTagContainer().setCustomTag(VALID_KEY, ItemTagType.INTEGER, 1); //We gotta set this so we at least try to compare it
itemMeta.getCustomTagContainer().getCustomTag(VALID_KEY, new PrimitiveTagType<>(boolean.class));
}
@Test(expected = IllegalArgumentException.class)
public void testGetWrongType() {
ItemMeta itemMeta = createNewItemMeta();
itemMeta.getCustomTagContainer().setCustomTag(VALID_KEY, ItemTagType.INTEGER, 1);
itemMeta.getCustomTagContainer().getCustomTag(VALID_KEY, ItemTagType.STRING);
}
@Test
public void testDifferentNamespace() {
NamespacedKey namespacedKeyA = new NamespacedKey("plugin-a", "damage");
NamespacedKey namespacedKeyB = new NamespacedKey("plugin-b", "damage");
ItemMeta meta = createNewItemMeta();
meta.getCustomTagContainer().setCustomTag(namespacedKeyA, ItemTagType.LONG, 15L);
meta.getCustomTagContainer().setCustomTag(namespacedKeyB, ItemTagType.LONG, 160L);
assertEquals(15L, (long) meta.getCustomTagContainer().getCustomTag(namespacedKeyA, ItemTagType.LONG));
assertEquals(160L, (long) meta.getCustomTagContainer().getCustomTag(namespacedKeyB, ItemTagType.LONG));
}
private ItemMeta createNewItemMeta() {
return Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
}
private NamespacedKey requestKey(String keyName) {
return new NamespacedKey("test-plugin", keyName.toLowerCase());
}
/*
Removing a tag
*/
@Test
public void testNBTTagStoring() {
CraftMetaItem itemMeta = createComplexItemMeta();
NBTTagCompound compound = new NBTTagCompound();
itemMeta.applyToItem(compound);
assertEquals(itemMeta, new CraftMetaItem(compound));
}
@Test
public void testMapStoring() {
CraftMetaItem itemMeta = createComplexItemMeta();
Map<String, Object> serialize = itemMeta.serialize();
assertEquals(itemMeta, new CraftMetaItem(serialize));
}
@Test
public void testYAMLStoring() {
ItemStack stack = new ItemStack(Material.DIAMOND);
CraftMetaItem meta = createComplexItemMeta();
stack.setItemMeta(meta);
YamlConfiguration configuration = new YamlConfiguration();
configuration.set("testpath", stack);
String configValue = configuration.saveToString();
YamlConfiguration loadedConfig = YamlConfiguration.loadConfiguration(new StringReader(configValue));
assertEquals(stack, loadedConfig.getSerializable("testpath", ItemStack.class));
assertNotEquals(new ItemStack(Material.DIAMOND), loadedConfig.getSerializable("testpath", ItemStack.class));
}
@Test
public void testCorrectType() {
ItemStack stack = new ItemStack(Material.DIAMOND);
CraftMetaItem meta = createComplexItemMeta();
meta.getCustomTagContainer().setCustomTag(requestKey("int"), ItemTagType.STRING, "1");
meta.getCustomTagContainer().setCustomTag(requestKey("double"), ItemTagType.STRING, "1.33");
stack.setItemMeta(meta);
YamlConfiguration configuration = new YamlConfiguration();
configuration.set("testpath", stack);
String configValue = configuration.saveToString();
YamlConfiguration loadedConfig = YamlConfiguration.loadConfiguration(new StringReader(configValue));
ItemStack newStack = loadedConfig.getSerializable("testpath", ItemStack.class);
assertTrue(newStack.getItemMeta().getCustomTagContainer().hasCustomTag(requestKey("int"), ItemTagType.STRING));
assertEquals(newStack.getItemMeta().getCustomTagContainer().getCustomTag(requestKey("int"), ItemTagType.STRING), "1");
assertTrue(newStack.getItemMeta().getCustomTagContainer().hasCustomTag(requestKey("double"), ItemTagType.STRING));
assertEquals(newStack.getItemMeta().getCustomTagContainer().getCustomTag(requestKey("double"), ItemTagType.STRING), "1.33");
}
private CraftMetaItem createComplexItemMeta() {
CraftMetaItem itemMeta = (CraftMetaItem) createNewItemMeta();
itemMeta.setDisplayName("Item Display Name");
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-long"), ItemTagType.LONG, 4L); //Add random primitive values
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-byte-array"), ItemTagType.BYTE_ARRAY, new byte[]{
0, 1, 2, 10
});
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-string"), ItemTagType.STRING, "Hello there world");
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-int"), ItemTagType.INTEGER, 3);
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-double"), ItemTagType.DOUBLE, 3.123);
CustomItemTagContainer innerContainer = itemMeta.getCustomTagContainer().getAdapterContext().newTagContainer(); //Add a inner container
innerContainer.setCustomTag(VALID_KEY, ItemTagType.LONG, 5L);
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-inner-compound"), ItemTagType.TAG_CONTAINER, innerContainer);
Map<String, NBTBase> rawMap = ((CraftCustomItemTagContainer) itemMeta.getCustomTagContainer()).getRaw(); //Adds a tag list as well (even tho is has no API yet)
NBTTagList nbtList = new NBTTagList();
nbtList.add(new NBTTagIntArray(Arrays.asList(1, 5, 3)));
nbtList.add(new NBTTagIntArray(Arrays.asList(42, 51)));
rawMap.put("nbttaglist", nbtList);
return itemMeta;
}
/*
Test complex object storage
*/
@Test
public void storeUUIDOnItemTest() {
ItemMeta itemMeta = createNewItemMeta();
UUIDItemTagType uuidItemTagType = new UUIDItemTagType();
UUID uuid = UUID.fromString("434eea72-22a6-4c61-b5ef-945874a5c478");
itemMeta.getCustomTagContainer().setCustomTag(VALID_KEY, uuidItemTagType, uuid);
assertTrue(itemMeta.getCustomTagContainer().hasCustomTag(VALID_KEY, uuidItemTagType));
assertEquals(uuid, itemMeta.getCustomTagContainer().getCustomTag(VALID_KEY, uuidItemTagType));
}
@Test
public void encapsulatedContainers() {
NamespacedKey innerKey = new NamespacedKey("plugin-a", "inner");
ItemMeta meta = createNewItemMeta();
ItemTagAdapterContext context = meta.getCustomTagContainer().getAdapterContext();
CustomItemTagContainer thirdContainer = context.newTagContainer();
thirdContainer.setCustomTag(VALID_KEY, ItemTagType.LONG, 3L);
CustomItemTagContainer secondContainer = context.newTagContainer();
secondContainer.setCustomTag(VALID_KEY, ItemTagType.LONG, 2L);
secondContainer.setCustomTag(innerKey, ItemTagType.TAG_CONTAINER, thirdContainer);
meta.getCustomTagContainer().setCustomTag(VALID_KEY, ItemTagType.LONG, 1L);
meta.getCustomTagContainer().setCustomTag(innerKey, ItemTagType.TAG_CONTAINER, secondContainer);
assertEquals(3L, meta.getCustomTagContainer()
.getCustomTag(innerKey, ItemTagType.TAG_CONTAINER)
.getCustomTag(innerKey, ItemTagType.TAG_CONTAINER)
.getCustomTag(VALID_KEY, ItemTagType.LONG).longValue());
assertEquals(2L, meta.getCustomTagContainer()
.getCustomTag(innerKey, ItemTagType.TAG_CONTAINER)
.getCustomTag(VALID_KEY, ItemTagType.LONG).longValue());
assertEquals(1L, meta.getCustomTagContainer()
.getCustomTag(VALID_KEY, ItemTagType.LONG).longValue());
}
class UUIDItemTagType implements ItemTagType<byte[], UUID> {
@Override
public Class<byte[]> getPrimitiveType() {
return byte[].class;
}
@Override
public Class<UUID> getComplexType() {
return UUID.class;
}
@Override
public byte[] toPrimitive(UUID complex, ItemTagAdapterContext context) {
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(complex.getMostSignificantBits());
bb.putLong(complex.getLeastSignificantBits());
return bb.array();
}
@Override
public UUID fromPrimitive(byte[] primitive, ItemTagAdapterContext context) {
ByteBuffer bb = ByteBuffer.wrap(primitive);
long firstLong = bb.getLong();
long secondLong = bb.getLong();
return new UUID(firstLong, secondLong);
}
}
@Test
public void testPrimitiveCustomTags() {
ItemMeta itemMeta = createNewItemMeta();
testPrimitiveCustomTag(itemMeta, ItemTagType.BYTE, (byte) 1);
testPrimitiveCustomTag(itemMeta, ItemTagType.SHORT, (short) 1);
testPrimitiveCustomTag(itemMeta, ItemTagType.INTEGER, 1);
testPrimitiveCustomTag(itemMeta, ItemTagType.LONG, 1L);
testPrimitiveCustomTag(itemMeta, ItemTagType.FLOAT, 1.34F);
testPrimitiveCustomTag(itemMeta, ItemTagType.DOUBLE, 151.123);
testPrimitiveCustomTag(itemMeta, ItemTagType.STRING, "test");
testPrimitiveCustomTag(itemMeta, ItemTagType.BYTE_ARRAY, new byte[]{
1, 4, 2, Byte.MAX_VALUE
});
testPrimitiveCustomTag(itemMeta, ItemTagType.INTEGER_ARRAY, new int[]{
1, 4, 2, Integer.MAX_VALUE
});
testPrimitiveCustomTag(itemMeta, ItemTagType.LONG_ARRAY, new long[]{
1L, 4L, 2L, Long.MAX_VALUE
});
}
private <T, Z> void testPrimitiveCustomTag(ItemMeta meta, ItemTagType<T, Z> type, Z value) {
NamespacedKey tagKey = new NamespacedKey("test", String.valueOf(type.hashCode()));
meta.getCustomTagContainer().setCustomTag(tagKey, type, value);
assertTrue(meta.getCustomTagContainer().hasCustomTag(tagKey, type));
Z foundValue = meta.getCustomTagContainer().getCustomTag(tagKey, type);
if (foundValue.getClass().isArray()) { // Compare arrays using reflection access
int length = Array.getLength(foundValue);
int originalLength = Array.getLength(value);
for (int i = 0; i < length && i < originalLength; i++) {
assertEquals(Array.get(value, i), Array.get(foundValue, i));
}
} else {
assertEquals(foundValue, value);
}
meta.getCustomTagContainer().removeCustomTag(tagKey);
assertFalse(meta.getCustomTagContainer().hasCustomTag(tagKey, type));
}
class PrimitiveTagType<T> implements ItemTagType<T, T> {
private final Class<T> primitiveType;
PrimitiveTagType(Class<T> primitiveType) {
this.primitiveType = primitiveType;
}
@Override
public Class<T> getPrimitiveType() {
return primitiveType;
}
@Override
public Class<T> getComplexType() {
return primitiveType;
}
@Override
public T toPrimitive(T complex, ItemTagAdapterContext context) {
return complex;
}
@Override
public T fromPrimitive(T primitive, ItemTagAdapterContext context) {
return primitive;
}
}
}

View File

@@ -0,0 +1,80 @@
package org.bukkit.craftbukkit.inventory;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import org.bukkit.Material;
import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.craftbukkit.Overridden;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class ItemMetaImplementationOverrideTest {
static final Class<CraftMetaItem> parent = CraftMetaItem.class;
@Parameters(name="[{index}]:{1}")
public static List<Object[]> data() {
final List<Object[]> testData = new ArrayList<Object[]>();
List<Class<? extends CraftMetaItem>> classes = new ArrayList<Class<? extends CraftMetaItem>>();
for (Material material : ItemStackTest.COMPOUND_MATERIALS) {
Class<? extends CraftMetaItem> clazz = CraftItemFactory.instance().getItemMeta(material).getClass().asSubclass(parent);
if (clazz != parent) {
classes.add(clazz);
}
}
List<Method> list = new ArrayList<Method>();
for (Method method: parent.getDeclaredMethods()) {
if (method.isAnnotationPresent(Overridden.class)) {
list.add(method);
}
}
for (final Class<?> clazz : classes) {
for (final Method method : list) {
testData.add(
new Object[] {
new Callable<Method>() {
public Method call() throws Exception {
return clazz.getDeclaredMethod(method.getName(), method.getParameterTypes());
}
},
clazz.getSimpleName() + " contains " + method.getName()
}
);
}
testData.add(
new Object[] {
new Callable<DelegateDeserialization>() {
public DelegateDeserialization call() throws Exception {
return clazz.getAnnotation(DelegateDeserialization.class);
}
},
clazz.getSimpleName() + " contains annotation " + DelegateDeserialization.class
}
);
}
return testData;
}
@Parameter(0) public Callable<?> test;
@Parameter(1) public String name;
@Test
public void testClass() throws Throwable {
assertThat(name, test.call(), is(not(nullValue())));
}
}

View File

@@ -0,0 +1,423 @@
package org.bukkit.craftbukkit.inventory;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; // Paper
import java.util.List;
import java.util.UUID;
import com.destroystokyo.paper.inventory.meta.ArmorStandMeta; // Paper
import net.minecraft.server.Block;
import net.minecraft.server.IRegistry;
import net.minecraft.server.ITileEntity;
import net.minecraft.server.Item;
import net.minecraft.server.ItemBlock;
import net.minecraft.server.ItemBlockWallable;
import net.minecraft.server.NBTTagInt;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.NamespacedKey;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.bukkit.craftbukkit.inventory.ItemStackTest.StackProvider;
import org.bukkit.craftbukkit.inventory.ItemStackTest.StackWrapper;
import org.bukkit.craftbukkit.inventory.ItemStackTest.BukkitWrapper;
import org.bukkit.craftbukkit.inventory.ItemStackTest.CraftWrapper;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.TropicalFish;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BannerMeta;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.FireworkEffectMeta;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.KnowledgeBookMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.inventory.meta.SpawnEggMeta;
import org.bukkit.inventory.meta.TropicalFishBucketMeta;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
public class ItemMetaTest extends AbstractTestingBase {
static final int MAX_FIREWORK_POWER = 127; // Please update ItemStackFireworkTest if/when this gets changed.
@Test(expected=IllegalArgumentException.class)
public void testPowerLimitExact() {
newFireworkMeta().setPower(MAX_FIREWORK_POWER + 1);
}
@Test(expected=IllegalArgumentException.class)
public void testPowerLimitMax() {
newFireworkMeta().setPower(Integer.MAX_VALUE);
}
@Test(expected=IllegalArgumentException.class)
public void testPowerLimitMin() {
newFireworkMeta().setPower(Integer.MIN_VALUE);
}
@Test(expected=IllegalArgumentException.class)
public void testPowerLimitNegative() {
newFireworkMeta().setPower(-1);
}
@Test
public void testPowers() {
for (int i = 0; i <= MAX_FIREWORK_POWER; i++) {
FireworkMeta firework = newFireworkMeta();
firework.setPower(i);
assertThat(String.valueOf(i), firework.getPower(), is(i));
}
}
@Test
public void testConflictingEnchantment() {
ItemMeta itemMeta = Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
assertThat(itemMeta.hasConflictingEnchant(Enchantment.DURABILITY), is(false));
itemMeta.addEnchant(Enchantment.SILK_TOUCH, 1, false);
assertThat(itemMeta.hasConflictingEnchant(Enchantment.DURABILITY), is(false));
assertThat(itemMeta.hasConflictingEnchant(Enchantment.LOOT_BONUS_BLOCKS), is(true));
assertThat(itemMeta.hasConflictingEnchant(null), is(false));
}
@Test
public void testConflictingStoredEnchantment() {
EnchantmentStorageMeta itemMeta = (EnchantmentStorageMeta) Bukkit.getItemFactory().getItemMeta(Material.ENCHANTED_BOOK);
assertThat(itemMeta.hasConflictingStoredEnchant(Enchantment.DURABILITY), is(false));
itemMeta.addStoredEnchant(Enchantment.SILK_TOUCH, 1, false);
assertThat(itemMeta.hasConflictingStoredEnchant(Enchantment.DURABILITY), is(false));
assertThat(itemMeta.hasConflictingStoredEnchant(Enchantment.LOOT_BONUS_BLOCKS), is(true));
assertThat(itemMeta.hasConflictingStoredEnchant(null), is(false));
}
@Test
public void testConflictingEnchantments() {
ItemMeta itemMeta = Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
itemMeta.addEnchant(Enchantment.DURABILITY, 6, true);
itemMeta.addEnchant(Enchantment.DIG_SPEED, 6, true);
assertThat(itemMeta.hasConflictingEnchant(Enchantment.LOOT_BONUS_BLOCKS), is(false));
itemMeta.addEnchant(Enchantment.SILK_TOUCH, 1, false);
assertThat(itemMeta.hasConflictingEnchant(Enchantment.LOOT_BONUS_BLOCKS), is(true));
assertThat(itemMeta.hasConflictingEnchant(null), is(false));
}
@Test
public void testConflictingStoredEnchantments() {
EnchantmentStorageMeta itemMeta = (EnchantmentStorageMeta) Bukkit.getItemFactory().getItemMeta(Material.ENCHANTED_BOOK);
itemMeta.addStoredEnchant(Enchantment.DURABILITY, 6, true);
itemMeta.addStoredEnchant(Enchantment.DIG_SPEED, 6, true);
assertThat(itemMeta.hasConflictingStoredEnchant(Enchantment.LOOT_BONUS_BLOCKS), is(false));
itemMeta.addStoredEnchant(Enchantment.SILK_TOUCH, 1, false);
assertThat(itemMeta.hasConflictingStoredEnchant(Enchantment.LOOT_BONUS_BLOCKS), is(true));
assertThat(itemMeta.hasConflictingStoredEnchant(null), is(false));
}
private static FireworkMeta newFireworkMeta() {
return ((FireworkMeta) Bukkit.getItemFactory().getItemMeta(Material.FIREWORK_ROCKET));
}
@Test
public void testCrazyEquality() {
CraftItemStack craft = CraftItemStack.asCraftCopy(new ItemStack(Material.STONE));
craft.setItemMeta(craft.getItemMeta());
ItemStack bukkit = new ItemStack(craft);
assertThat(craft, is(bukkit));
assertThat(bukkit, is((ItemStack) craft));
}
@Test
public void testTaggedButNotMeta() {
CraftItemStack craft = CraftItemStack.asCraftCopy(new ItemStack(Material.SHEARS));
craft.handle.setDamage(0);
assertThat("Should have NBT tag", CraftItemStack.hasItemMeta(craft.handle), is(true));
assertThat("NBT Tag should contain Damage", craft.handle.getTag().get("Damage"), instanceOf(NBTTagInt.class));
assertThat("But we should not have meta", craft.hasItemMeta(), is(false));
ItemStack pureBukkit = new ItemStack(Material.SHEARS);
assertThat("Bukkit and craft stacks should be similar", craft.isSimilar(pureBukkit), is(true));
assertThat("Bukkit and craft stacks should be equal", craft.equals(pureBukkit), is(true));
// Paper start - test additional ItemMeta damage cases
ItemStack clone = CraftItemStack.asBukkitCopy(CraftItemStack.asNMSCopy(craft));
assertThat("Bukkit and craft stacks should be similar", craft.isSimilar(clone), is(true));
assertThat("Bukkit and craft stacks should be equal", craft.equals(clone), is(true));
pureBukkit = new ItemStack(Material.DIAMOND_SWORD);
pureBukkit.setDurability((short) 2);
net.minecraft.server.ItemStack nms = CraftItemStack.asNMSCopy(pureBukkit);
ItemStack other = CraftItemStack.asBukkitCopy(nms);
assertThat("Bukkit and NMS ItemStack copies should be similar", pureBukkit.isSimilar(other), is(true));
assertThat("Bukkit and NMS ItemStack copies should be equal", pureBukkit.equals(other), is(true));
}
private void testItemMeta(ItemStack stack) {
assertThat("Should not have ItemMeta", stack.hasItemMeta(), is(false));
stack.setDurability((short) 0);
assertThat("ItemStack with zero durability should not have ItemMeta", stack.hasItemMeta(), is(false));
stack.setDurability((short) 2);
assertThat("ItemStack with non-zero durability should have ItemMeta", stack.hasItemMeta(), is(true));
stack.setLore(Collections.singletonList("Lore"));
assertThat("ItemStack with lore and durability should have ItemMeta", stack.hasItemMeta(), is(true));
stack.setDurability((short) 0);
assertThat("ItemStack with lore should have ItemMeta", stack.hasItemMeta(), is(true));
stack.setLore(null);
}
@Test
public void testHasItemMeta() {
ItemStack itemStack = new ItemStack(Material.SHEARS);
testItemMeta(itemStack);
testItemMeta(CraftItemStack.asCraftCopy(itemStack));
}
// Paper end
@Test
public void testBlockStateMeta() {
List<Block> queue = new ArrayList<>();
for (Item item : (Iterable<Item>) IRegistry.ITEM) { // Eclipse fail
if (item instanceof ItemBlock) {
queue.add(((ItemBlock) item).getBlock());
}
if (item instanceof ItemBlockWallable) {
queue.add(((ItemBlockWallable) item).wallBlock);
}
}
for (Block block : queue) {
if (block != null) {
ItemStack stack = CraftItemStack.asNewCraftStack(Item.getItemOf(block));
// Command blocks aren't unit testable atm
if (stack.getType() == Material.COMMAND_BLOCK || stack.getType() == Material.CHAIN_COMMAND_BLOCK || stack.getType() == Material.REPEATING_COMMAND_BLOCK) {
return;
}
ItemMeta meta = stack.getItemMeta();
if (block instanceof ITileEntity) {
assertTrue(stack + " has meta of type " + meta + " expected BlockStateMeta", meta instanceof BlockStateMeta);
BlockStateMeta blockState = (BlockStateMeta) meta;
assertNotNull(stack + " has null block state", blockState.getBlockState());
blockState.setBlockState(blockState.getBlockState());
} else {
assertTrue(stack + " has unexpected meta of type BlockStateMeta (but is not a tile)", !(meta instanceof BlockStateMeta));
}
}
}
}
@Test
public void testEachExtraData() {
final List<StackProvider> providers = Arrays.asList(
new StackProvider(Material.WRITABLE_BOOK) {
@Override ItemStack operate(final ItemStack cleanStack) {
final BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("Some author");
meta.setPages("Page 1", "Page 2");
meta.setTitle("A title");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.WRITTEN_BOOK) {
@Override ItemStack operate(final ItemStack cleanStack) {
final BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("Some author");
meta.setPages("Page 1", "Page 2");
meta.setTitle("A title");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
/* Skulls rely on a running server instance
new StackProvider(Material.SKULL_ITEM) {
@Override ItemStack operate(final ItemStack cleanStack) {
final SkullMeta meta = (SkullMeta) cleanStack.getItemMeta();
meta.setOwner("Notch");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
*/
new StackProvider(Material.FILLED_MAP) {
@Override ItemStack operate(final ItemStack cleanStack) {
final MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.LEATHER_BOOTS) {
@Override ItemStack operate(final ItemStack cleanStack) {
final LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
meta.setColor(Color.FUCHSIA);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.POTION) {
@Override ItemStack operate(final ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.setBasePotionData(new PotionData(PotionType.UNCRAFTABLE, false, false));
meta.addCustomEffect(PotionEffectType.CONFUSION.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.FIREWORK_ROCKET) {
@Override ItemStack operate(final ItemStack cleanStack) {
final FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.GREEN).withFade(Color.OLIVE).with(Type.BALL_LARGE).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.ENCHANTED_BOOK) {
@Override ItemStack operate(final ItemStack cleanStack) {
final EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addStoredEnchant(Enchantment.ARROW_FIRE, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.FIREWORK_STAR) {
@Override ItemStack operate(final ItemStack cleanStack) {
final FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.MAROON, Color.BLACK).with(Type.CREEPER).withFlicker().build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.WHITE_BANNER) {
@Override ItemStack operate(ItemStack cleanStack) {
final BannerMeta meta = (BannerMeta) cleanStack.getItemMeta();
meta.setBaseColor(DyeColor.CYAN);
meta.addPattern(new Pattern(DyeColor.WHITE, PatternType.BRICKS));
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
/* No distinguishing features, add back with virtual entity API
new StackProvider(Material.ZOMBIE_SPAWN_EGG) {
@Override ItemStack operate(ItemStack cleanStack) {
final SpawnEggMeta meta = (SpawnEggMeta) cleanStack.getItemMeta();
meta.setSpawnedType(EntityType.ZOMBIE);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
*/
new StackProvider(Material.KNOWLEDGE_BOOK) {
@Override ItemStack operate(ItemStack cleanStack) {
final KnowledgeBookMeta meta = (KnowledgeBookMeta) cleanStack.getItemMeta();
meta.addRecipe(new NamespacedKey("minecraft", "test"), new NamespacedKey("plugin", "test"));
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.TROPICAL_FISH_BUCKET) {
@Override ItemStack operate(ItemStack cleanStack) {
final TropicalFishBucketMeta meta = (TropicalFishBucketMeta) cleanStack.getItemMeta();
meta.setBodyColor(DyeColor.ORANGE);
meta.setPatternColor(DyeColor.BLACK);
meta.setPattern(TropicalFish.Pattern.DASHER);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
// Paper start
new StackProvider(Material.ARMOR_STAND) {
@Override
ItemStack operate(ItemStack cleanStack) {
final ArmorStandMeta meta = (ArmorStandMeta) cleanStack.getItemMeta();
meta.setInvisible(true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
}
// paper end
);
assertThat("Forgotten test?", providers, hasSize(ItemStackTest.COMPOUND_MATERIALS.length - 4/* Normal item meta, skulls, eggs and tile entities */));
for (final StackProvider provider : providers) {
downCastTest(new BukkitWrapper(provider));
downCastTest(new CraftWrapper(provider));
}
}
@Test
public void testAttributeModifiers() {
UUID sameUUID = UUID.randomUUID();
ItemMeta itemMeta = Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
itemMeta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, new AttributeModifier(sameUUID, "Test Modifier", 10, AttributeModifier.Operation.ADD_NUMBER));
ItemMeta equalMeta = Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
equalMeta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, new AttributeModifier(sameUUID, "Test Modifier", 10, AttributeModifier.Operation.ADD_NUMBER));
assertThat(itemMeta.equals(equalMeta), is(true));
ItemMeta itemMeta2 = Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
itemMeta2.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, new AttributeModifier(sameUUID, "Test Modifier", 10, AttributeModifier.Operation.ADD_NUMBER));
ItemMeta notEqualMeta2 = Bukkit.getItemFactory().getItemMeta(Material.DIAMOND_PICKAXE);
notEqualMeta2.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, new AttributeModifier(sameUUID, "Test Modifier", 11, AttributeModifier.Operation.ADD_NUMBER));
assertThat(itemMeta2.equals(notEqualMeta2), is(false));
}
private void downCastTest(final StackWrapper provider) {
final String name = provider.toString();
final ItemStack blank = new ItemStack(Material.STONE);
final ItemStack craftBlank = CraftItemStack.asCraftCopy(blank);
downCastTest(name, provider.stack(), blank);
blank.setItemMeta(blank.getItemMeta());
downCastTest(name, provider.stack(), blank);
downCastTest(name, provider.stack(), craftBlank);
craftBlank.setItemMeta(craftBlank.getItemMeta());
downCastTest(name, provider.stack(), craftBlank);
}
private void downCastTest(final String name, final ItemStack stack, final ItemStack blank) {
assertThat(name, stack, is(not(blank)));
assertThat(name, stack.getItemMeta(), is(not(blank.getItemMeta())));
stack.setType(Material.STONE);
assertThat(name, stack, is(blank));
}
}

View File

@@ -0,0 +1,213 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackBookTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.WRITTEN_BOOK, Material.WRITABLE_BOOK);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("1110", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.addPage("Page 1", "Page 2");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Pages vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.addPage("Page 1", "Page 2");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.setItemMeta(cleanStack.getItemMeta());
return cleanStack;
}
},
"Pages vs. blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.addPage("Page 1", "Page 2");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.addPage("Page 2", "Page 1");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Pages switched"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.addPage("Page 1", "Page 2");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.addPage("Page 1");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Pages short"
}
),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("AnAuthor");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Author vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("AnAuthor");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.setItemMeta(cleanStack.getItemMeta());
return cleanStack;
}
},
"Author vs. blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("AnAuthor");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("AnotherAuthor");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Authors"
}
),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setTitle("Some title");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Title vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setTitle("Some title");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.setItemMeta(cleanStack.getItemMeta());
return cleanStack;
}
},
"title vs. blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setTitle("Some title");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setTitle("Different title");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Titles"
}
)
);
}
}

View File

@@ -0,0 +1,108 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackEnchantStorageTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.ENCHANTED_BOOK);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("10", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addStoredEnchant(Enchantment.DURABILITY, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Enchantable vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addStoredEnchant(Enchantment.KNOCKBACK, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Enchantable vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addStoredEnchant(Enchantment.DAMAGE_UNDEAD, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addStoredEnchant(Enchantment.DAMAGE_UNDEAD, 1, true);
meta.addStoredEnchant(Enchantment.FIRE_ASPECT, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Enchantable vs More"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addStoredEnchant(Enchantment.PROTECTION_FIRE, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) cleanStack.getItemMeta();
meta.addEnchant(Enchantment.PROTECTION_FIRE, 2, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Enchantable vs Other"
}
)
);
}
}

View File

@@ -0,0 +1,128 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkEffectMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackFireworkChargeTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_STAR);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("10", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.BLACK).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect Color 1 vs. Effect Color 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).with(Type.CREEPER).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).with(Type.BURST).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect type 1 vs. Effect type 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).withFade(Color.BLUE).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).withFade(Color.RED).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect fade 1 vs. Effect fade 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).withFlicker().build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.WHITE).withTrail().build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Effect vs. None"
}
)
);
}
}

View File

@@ -0,0 +1,184 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackFireworkTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_ROCKET);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("110", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.BLACK).build());
meta.addEffect(FireworkEffect.builder().withColor(Color.GREEN).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect Color 1 vs. Effect Color 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).with(Type.CREEPER).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).with(Type.BURST).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect type 1 vs. Effect type 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).withFade(Color.BLUE).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).withFade(Color.RED).build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect fade 1 vs. Effect fade 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).withFlicker().build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Effect vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.WHITE).withTrail().build());
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Effect vs. None"
}
),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.setPower(127);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.setPower(100);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Height vs. Other"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.setPower(42);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Height vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.setPower(10);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Height vs. None"
}
)
);
}
}

View File

@@ -0,0 +1,89 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackLeatherTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.LEATHER_BOOTS, Material.LEATHER_CHESTPLATE, Material.LEATHER_HELMET, Material.LEATHER_LEGGINGS);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("10", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
meta.setColor(Color.FUCHSIA);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Color vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
meta.setColor(Color.GRAY);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Color vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
meta.setColor(Color.MAROON);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
meta.setColor(Color.ORANGE);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Color vs Other"
}
)
);
}
}

View File

@@ -0,0 +1,297 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.Repairable;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackLoreEnchantmentTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, ItemStackTest.COMPOUND_MATERIALS);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
~0l,
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setLore(Arrays.asList("First Lore", "Second Lore"));
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Lore vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setLore(Arrays.asList("Some lore"));
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Lore vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setLore(Arrays.asList("Some more lore", "Another lore"));
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setLore(Arrays.asList("Some more lore"));
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Lore vs Other"
}
),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setDisplayName("TestItemName");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Name vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setDisplayName("AnotherItemName");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Name vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setDisplayName("The original ItemName");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.setDisplayName("The other name");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Name vs Other"
}
),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.addUnsafeEnchantment(Enchantment.DIG_SPEED, 2);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"EnchantStack vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.addUnsafeEnchantment(Enchantment.OXYGEN, 1);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"EnchantStack vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
cleanStack.addUnsafeEnchantment(Enchantment.ARROW_FIRE, 1);
return cleanStack;
}
},
"EnchantStack vs OtherEnchantStack"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.addEnchant(Enchantment.DURABILITY, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Enchant vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.addEnchant(Enchantment.KNOCKBACK, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Enchant vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.addEnchant(Enchantment.PROTECTION_FIRE, 1, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
meta.addEnchant(Enchantment.PROTECTION_FIRE, 2, true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Enchant vs Other"
}
),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
((Repairable) meta).setRepairCost(42);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Repair vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
((Repairable) meta).setRepairCost(36);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Repair vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
((Repairable) meta).setRepairCost(89);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
ItemMeta meta = cleanStack.getItemMeta();
((Repairable) meta).setRepairCost(88);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Repair vs Other"
}
)
);
}
}

View File

@@ -0,0 +1,121 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.MapMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackMapTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FILLED_MAP);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("10", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Scale vs. Unscale"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Scale vs. Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Unscale vs. Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(true);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Scale vs. None"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Unscale vs. None"
}
)
);
}
}

View File

@@ -0,0 +1,146 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffectType;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackPotionsTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.POTION);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("10", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.CONFUSION.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Potion vs Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.HARM.createEffect(2, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Potion vs Blank"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.SLOW_DIGGING.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.FAST_DIGGING.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Potion vs Harder"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.JUMP.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.JUMP.createEffect(1, 1), false);
meta.addCustomEffect(PotionEffectType.REGENERATION.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Potion vs Better"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.SPEED.createEffect(10, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.SPEED.createEffect(5, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Potion vs Faster"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.INCREASE_DAMAGE.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.addCustomEffect(PotionEffectType.INCREASE_DAMAGE.createEffect(1, 2), false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Potion vs Stronger"
}
)
);
}
}

View File

@@ -0,0 +1,88 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
@RunWith(Parameterized.class)
public class ItemStackSkullTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.PLAYER_HEAD);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),
NAME_PARAMETER,
Long.parseLong("10", 2),
ItemStackLoreEnchantmentTest.operators(),
Arrays.asList(
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
SkullMeta meta = (SkullMeta) cleanStack.getItemMeta();
meta.setOwner("Notch");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
SkullMeta meta = (SkullMeta) cleanStack.getItemMeta();
meta.setOwner("Dinnerbone");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Name 1 vs. Name 2"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
SkullMeta meta = (SkullMeta) cleanStack.getItemMeta();
meta.setOwner("Notch");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
SkullMeta meta = (SkullMeta) cleanStack.getItemMeta();
meta.setOwner(null);
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
"Name vs. Null"
},
new Object[] {
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
SkullMeta meta = (SkullMeta) cleanStack.getItemMeta();
meta.setOwner("Notch");
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new Operator() {
public ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
},
"Name vs. None"
}
)
);
}
}

View File

@@ -0,0 +1,493 @@
package org.bukkit.craftbukkit.inventory;
import static org.bukkit.support.Matchers.sameHash;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.support.AbstractTestingBase;
import org.bukkit.util.io.BukkitObjectInputStream;
import org.bukkit.util.io.BukkitObjectOutputStream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
@RunWith(Parameterized.class)
public class ItemStackTest extends AbstractTestingBase {
static abstract class StackProvider {
final Material material;
StackProvider(Material material) {
this.material = material;
}
ItemStack bukkit() {
return operate(cleanStack(material, false));
}
ItemStack craft() {
return operate(cleanStack(material, true));
}
abstract ItemStack operate(ItemStack cleanStack);
static ItemStack cleanStack(Material material, boolean craft) {
final ItemStack stack = new ItemStack(material);
return craft ? CraftItemStack.asCraftCopy(stack) : stack;
}
@Override
public String toString() {
return material.toString();
}
/**
* For each item in parameterList, it will apply nameFormat at nameIndex.
* For each item in parameterList for each item in materials, it will create a stack provider at each array index that contains an Operator.
*
* @param parameterList
* @param nameFormat
* @param nameIndex
* @param materials
* @return
*/
static List<Object[]> compound(final List<Object[]> parameterList, final String nameFormat, final int nameIndex, final Material...materials) {
final List<Object[]> out = new ArrayList<Object[]>();
for (Object[] params : parameterList) {
final int len = params.length;
for (final Material material : materials) {
final Object[] paramsOut = params.clone();
for (int i = 0; i < len; i++) {
final Object param = paramsOut[i];
if (param instanceof Operator) {
final Operator operator = (Operator) param;
paramsOut[i] = new StackProvider(material) {
@Override
ItemStack operate(ItemStack cleanStack) {
return operator.operate(cleanStack);
}
};
}
}
paramsOut[nameIndex] = String.format(nameFormat, paramsOut[nameIndex], material);
out.add(paramsOut);
}
}
return out;
}
}
interface Operator {
ItemStack operate(ItemStack cleanStack);
}
static class CompoundOperator implements Operator {
static class RecursiveContainer {
final Joiner joiner;
final Object[] strings;
final int nameParameter;
final List<Object[]> stack;
final List<Object[]> out;
final List<Object[]>[] lists;
RecursiveContainer(Joiner joiner, Object[] strings, int nameParameter, List<Object[]> stack, List<Object[]> out, List<Object[]>[] lists) {
this.joiner = joiner;
this.strings = strings;
this.nameParameter = nameParameter;
this.stack = stack;
this.out = out;
this.lists = lists;
}
}
final Operator[] operators;
CompoundOperator(Operator...operators) {
this.operators = operators;
}
public ItemStack operate(ItemStack cleanStack) {
for (Operator operator : operators) {
operator.operate(cleanStack);
}
return cleanStack;
}
@Override
public String toString() {
return Arrays.toString(operators);
}
/**
* This combines different tests into one large collection, combining no two tests from the same list.
* @param joiner used to join names
* @param nameParameter index of the name parameter
* @param singletonBitmask a list of bits representing the 'singletons' located in your originalLists. Lowest order bits represent the first items in originalLists.
* Singletons are exponentially linked with each other, such that,
* the output will contain every unique subset of only items from the singletons,
* as well as every unique subset that contains at least one item from each non-singleton.
* @param originalLists
* @return
*/
static List<Object[]> compound(final Joiner joiner, final int nameParameter, final long singletonBitmask, final List<Object[]>...originalLists) {
final List<Object[]> out = new ArrayList<Object[]>();
final List<List<Object[]>> singletons = new ArrayList<List<Object[]>>();
final List<List<Object[]>> notSingletons = new ArrayList<List<Object[]>>();
{ // Separate and prime the 'singletons'
int i = 0;
for (List<Object[]> list : originalLists) {
(((singletonBitmask >>> i++) & 0x1) == 0x1 ? singletons : notSingletons).add(list);
}
}
for (final List<Object[]> primarySingleton : singletons) {
// Iterate over our singletons, to multiply the 'out' each time
for (final Object[] entry : out.toArray(EMPTY_ARRAY)) {
// Iterate over a snapshot of 'out' to prevent CMEs / infinite iteration
final int len = entry.length;
for (final Object[] singleton : primarySingleton) {
// Iterate over each item in our singleton for the current 'out' entry
final Object[] toOut = entry.clone();
for (int i = 0; i < len; i++) {
// Iterate over each parameter
if (i == nameParameter) {
toOut[i] = joiner.join(toOut[i], singleton[i]);
} else if (toOut[i] instanceof Operator) {
final Operator op1 = (Operator) toOut[i];
final Operator op2 = (Operator) singleton[i];
toOut[i] = new Operator() {
public ItemStack operate(final ItemStack cleanStack) {
return op2.operate(op1.operate(cleanStack));
}
};
}
}
out.add(toOut);
}
}
out.addAll(primarySingleton);
}
@SuppressWarnings("unchecked")
final List<Object[]>[] lists = new List[notSingletons.size() + 1];
notSingletons.toArray(lists);
lists[lists.length - 1] = out;
final RecursiveContainer methodParams = new RecursiveContainer(joiner, new Object[lists.length], nameParameter, new ArrayList<Object[]>(lists.length), new ArrayList<Object[]>(), lists);
recursivelyCompound(methodParams, 0);
methodParams.out.addAll(out);
return methodParams.out;
}
private static void recursivelyCompound(final RecursiveContainer methodParams, final int level) {
final List<Object[]> stack = methodParams.stack;
if (level == methodParams.lists.length) {
final Object[] firstParams = stack.get(0);
final int len = firstParams.length;
final int stackSize = stack.size();
final Object[] params = new Object[len];
for (int i = 0; i < len; i++) {
final Object firstParam = firstParams[i];
if (firstParam instanceof Operator) {
final Operator[] operators = new Operator[stackSize];
for (int j = 0; j < stackSize; j++) {
operators[j] = (Operator) stack.get(j)[i];
}
params[i] = new CompoundOperator(operators);
} else if (i == methodParams.nameParameter) {
final Object[] strings = methodParams.strings;
for (int j = 0; j < stackSize; j++) {
strings[j] = stack.get(j)[i];
}
params[i] = methodParams.joiner.join(strings);
} else {
params[i] = firstParam;
}
}
methodParams.out.add(params);
} else {
final int marker = stack.size();
for (final Object[] params : methodParams.lists[level]) {
stack.add(params);
recursivelyCompound(methodParams, level + 1);
stack.remove(marker);
}
}
}
}
interface StackWrapper {
ItemStack stack();
}
static class CraftWrapper implements StackWrapper {
final StackProvider provider;
CraftWrapper(StackProvider provider) {
this.provider = provider;
}
public ItemStack stack() {
return provider.craft();
}
@Override
public String toString() {
return "Craft " + provider;
}
}
static class BukkitWrapper implements StackWrapper {
final StackProvider provider;
BukkitWrapper(StackProvider provider) {
this.provider = provider;
}
public ItemStack stack() {
return provider.bukkit();
}
@Override
public String toString() {
return "Bukkit " + provider;
}
}
static class NoOpProvider extends StackProvider {
NoOpProvider(Material material) {
super(material);
}
@Override
ItemStack operate(ItemStack cleanStack) {
return cleanStack;
}
@Override
public String toString() {
return "NoOp " + super.toString();
}
}
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
return ImmutableList.of(); // TODO, test basic durability issues
}
static final Object[][] EMPTY_ARRAY = new Object[0][];
/**
* Materials that generate unique item meta types.
*/
static final Material[] COMPOUND_MATERIALS;
static final int NAME_PARAMETER = 2;
static {
final ItemFactory factory = CraftItemFactory.instance();
final Map<Class<? extends ItemMeta>, Material> possibleMaterials = new HashMap<Class<? extends ItemMeta>, Material>();
ItemMeta meta;
for (final Material material : Material.values()) {
meta = factory.getItemMeta(material);
if (meta == null || possibleMaterials.containsKey(meta.getClass()))
continue;
possibleMaterials.put(meta.getClass(), material);
}
COMPOUND_MATERIALS = possibleMaterials.values().toArray(new Material[possibleMaterials.size()]);
}
@Parameter(0) public StackProvider provider;
@Parameter(1) public StackProvider unequalProvider;
@Parameter(NAME_PARAMETER) public String name;
@Test
public void testBukkitInequality() {
final StackWrapper bukkitWrapper = new CraftWrapper(provider);
testInequality(bukkitWrapper, new BukkitWrapper(unequalProvider));
testInequality(bukkitWrapper, new BukkitWrapper(new NoOpProvider(provider.material)));
}
@Test
public void testCraftInequality() {
final StackWrapper craftWrapper = new CraftWrapper(provider);
testInequality(craftWrapper, new CraftWrapper(unequalProvider));
testInequality(craftWrapper, new CraftWrapper(new NoOpProvider(provider.material)));
}
@Test
public void testMixedInequality() {
final StackWrapper craftWrapper = new CraftWrapper(provider);
testInequality(craftWrapper, new BukkitWrapper(unequalProvider));
testInequality(craftWrapper, new BukkitWrapper(new NoOpProvider(provider.material)));
final StackWrapper bukkitWrapper = new CraftWrapper(provider);
testInequality(bukkitWrapper, new CraftWrapper(unequalProvider));
testInequality(bukkitWrapper, new CraftWrapper(new NoOpProvider(provider.material)));
}
static void testInequality(StackWrapper provider, StackWrapper unequalProvider) {
final ItemStack stack = provider.stack();
final ItemStack stack2 = provider.stack();
assertThat(stack, allOf(equalTo(stack), sameHash(stack)));
assertThat(stack, is(not(sameInstance(stack2))));
assertThat(stack, allOf(equalTo(stack2), sameHash(stack2)));
final ItemStack unequalStack = unequalProvider.stack();
final ItemStack unequalStack2 = unequalProvider.stack();
assertThat(unequalStack, allOf(equalTo(unequalStack), sameHash(unequalStack)));
assertThat(unequalStack, is(not(sameInstance(unequalStack2))));
assertThat(unequalStack, allOf(equalTo(unequalStack2), sameHash(unequalStack2)));
assertThat(stack, is(not(unequalStack)));
assertThat(unequalStack, is(not(stack)));
final ItemStack newStack = new ItemStack(stack2);
assertThat(newStack, allOf(equalTo(stack), sameHash(stack)));
assertThat(newStack, is(not(unequalStack)));
assertThat(newStack.getItemMeta(), allOf(equalTo(stack.getItemMeta()), sameHash(stack.getItemMeta())));
assertThat(newStack.getItemMeta(), is(not(unequalStack.getItemMeta())));
final ItemStack craftStack = CraftItemStack.asCraftCopy(stack2);
assertThat(craftStack, allOf(equalTo(stack), sameHash(stack)));
assertThat(craftStack, is(not(unequalStack)));
assertThat(craftStack.getItemMeta(), allOf(equalTo(stack.getItemMeta()), sameHash(stack.getItemMeta())));
assertThat(craftStack.getItemMeta(), is(not(unequalStack.getItemMeta())));
final ItemStack newUnequalStack = new ItemStack(unequalStack2);
assertThat(newUnequalStack, allOf(equalTo(unequalStack), sameHash(unequalStack)));
assertThat(newUnequalStack, is(not(stack)));
assertThat(newUnequalStack.getItemMeta(), allOf(equalTo(unequalStack.getItemMeta()), sameHash(unequalStack.getItemMeta())));
assertThat(newUnequalStack.getItemMeta(), is(not(stack.getItemMeta())));
final ItemStack newUnequalCraftStack = CraftItemStack.asCraftCopy(unequalStack2);
assertThat(newUnequalCraftStack, allOf(equalTo(unequalStack), sameHash(unequalStack)));
assertThat(newUnequalCraftStack, is(not(stack)));
assertThat(newUnequalCraftStack.getItemMeta(), allOf(equalTo(unequalStack.getItemMeta()), sameHash(unequalStack.getItemMeta())));
assertThat(newUnequalCraftStack.getItemMeta(), is(not(stack.getItemMeta())));
}
@Test
public void testBukkitYamlDeserialize() throws Throwable {
testYamlDeserialize(new BukkitWrapper(provider), new BukkitWrapper(unequalProvider));
}
@Test
public void testCraftYamlDeserialize() throws Throwable {
testYamlDeserialize(new CraftWrapper(provider), new CraftWrapper(unequalProvider));
}
@Test
public void testBukkitStreamDeserialize() throws Throwable {
testStreamDeserialize(new BukkitWrapper(provider), new BukkitWrapper(unequalProvider));
}
@Test
public void testCraftStreamDeserialize() throws Throwable {
testStreamDeserialize(new CraftWrapper(provider), new CraftWrapper(unequalProvider));
}
static void testStreamDeserialize(StackWrapper provider, StackWrapper unequalProvider) throws Throwable {
final ItemStack stack = provider.stack();
final ItemStack unequalStack = unequalProvider.stack();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new BukkitObjectOutputStream(out);
oos.writeObject(stack);
oos.writeObject(unequalStack);
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException ex) {
}
}
}
final String data = new String(Base64Coder.encode(out.toByteArray()));
ObjectInputStream ois = null;
final ItemStack readFirst;
final ItemStack readSecond;
try {
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ois = new BukkitObjectInputStream(in);
readFirst = (ItemStack) ois.readObject();
readSecond = (ItemStack) ois.readObject();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException ex) {
}
}
}
testEqualities(data, readFirst, readSecond, stack, unequalStack);
}
static void testYamlDeserialize(StackWrapper provider, StackWrapper unequalProvider) {
final ItemStack stack = provider.stack();
final ItemStack unequalStack = unequalProvider.stack();
final YamlConfiguration configOut = new YamlConfiguration();
configOut.set("provider", stack);
configOut.set("unequal", unequalStack);
final String out = '\n' + configOut.saveToString();
final YamlConfiguration configIn = new YamlConfiguration();
try {
configIn.loadFromString(out);
} catch (InvalidConfigurationException ex) {
throw new RuntimeException(out, ex);
}
testEqualities(out, configIn.getItemStack("provider"), configIn.getItemStack("unequal"), stack, unequalStack);
}
static void testEqualities(String information, ItemStack primaryRead, ItemStack unequalRead, ItemStack primaryOriginal, ItemStack unequalOriginal) {
assertThat(information, primaryRead, allOf(equalTo(primaryOriginal), sameHash(primaryOriginal)));
assertThat(information, unequalRead, allOf(equalTo(unequalOriginal), sameHash(unequalOriginal)));
assertThat(information, primaryRead, is(not(unequalOriginal)));
assertThat(information, primaryRead, is(not(unequalRead)));
}
}

View File

@@ -0,0 +1,35 @@
package org.bukkit.craftbukkit.inventory;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import net.minecraft.server.Enchantments;
import org.bukkit.inventory.ItemStack;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
public class NMSCraftItemStackTest extends AbstractTestingBase {
@Test
public void testCloneEnchantedItem() throws Exception {
net.minecraft.server.ItemStack nmsItemStack = new net.minecraft.server.ItemStack(net.minecraft.server.Items.POTION);
nmsItemStack.addEnchantment(Enchantments.DAMAGE_ALL, 1);
ItemStack itemStack = CraftItemStack.asCraftMirror(nmsItemStack);
ItemStack clone = itemStack.clone();
assertThat(clone.getType(), is(itemStack.getType()));
assertThat(clone.getAmount(), is(itemStack.getAmount()));
assertThat(clone.getDurability(), is(itemStack.getDurability()));
assertThat(clone.getEnchantments(), is(itemStack.getEnchantments()));
assertThat(clone.getData(), is(itemStack.getData()));
assertThat(clone, is(itemStack));
}
@Test
public void testCloneNullItem() throws Exception {
net.minecraft.server.ItemStack nmsItemStack = null;
ItemStack itemStack = CraftItemStack.asCraftMirror(nmsItemStack);
ItemStack clone = itemStack.clone();
assertThat(clone, is(itemStack));
}
}

View File

@@ -0,0 +1,60 @@
package org.bukkit.craftbukkit.inventory;
import net.minecraft.server.ItemStack;
import net.minecraft.server.Items;
import net.minecraft.server.PlayerInventory;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import static org.junit.Assert.*;
public class PlayerInventoryTest extends AbstractTestingBase {
@Test
public void testCanHold() throws Exception {
ItemStack itemStackApple = new ItemStack(Items.APPLE);
ItemStack itemStack1Coal = new ItemStack(Items.COAL);
ItemStack itemStack32Coal = new ItemStack(Items.COAL, 32);
ItemStack itemStack63Coal = new ItemStack(Items.COAL, 63);
ItemStack itemStack64Coal = new ItemStack(Items.COAL, 64);
// keep one slot empty
PlayerInventory inventory = new PlayerInventory(null);
for (int i = 0; i < inventory.items.size() - 1; i++) {
inventory.setItem(i, itemStackApple);
}
// one slot empty
assertEquals(1, inventory.canHold(itemStack1Coal));
assertEquals(32, inventory.canHold(itemStack32Coal));
assertEquals(64, inventory.canHold(itemStack64Coal));
// no free space with a stack of the item to check in the inventory
inventory.setItem(inventory.items.size() - 1, itemStack64Coal);
assertEquals(0, inventory.canHold(itemStack1Coal));
assertEquals(0, inventory.canHold(itemStack32Coal));
assertEquals(0, inventory.canHold(itemStack64Coal));
// no free space without a stack of the item to check in the inventory
inventory.setItem(inventory.items.size() - 1, itemStackApple);
assertEquals(0, inventory.canHold(itemStack1Coal));
assertEquals(0, inventory.canHold(itemStack32Coal));
assertEquals(0, inventory.canHold(itemStack64Coal));
// free space for 32 items in one slot
inventory.setItem(inventory.items.size() - 1, itemStack32Coal);
assertEquals(1, inventory.canHold(itemStack1Coal));
assertEquals(32, inventory.canHold(itemStack32Coal));
assertEquals(32, inventory.canHold(itemStack64Coal));
// free space for 1 item in two slots
inventory.setItem(inventory.items.size() - 1, itemStack63Coal);
inventory.setItem(inventory.items.size() - 2, itemStack63Coal);
assertEquals(1, inventory.canHold(itemStack1Coal));
assertEquals(2, inventory.canHold(itemStack32Coal));
assertEquals(2, inventory.canHold(itemStack64Coal));
}
}

View File

@@ -0,0 +1,50 @@
package org.bukkit.entity;
import net.minecraft.server.DragonControllerPhase;
import org.bukkit.craftbukkit.entity.CraftEnderDragon;
import org.junit.Assert;
import org.junit.Test;
import static junit.framework.TestCase.assertNotNull;
public class EnderDragonPhaseTest {
@Test
public void testNotNull() {
for (EnderDragon.Phase phase : EnderDragon.Phase.values()) {
DragonControllerPhase dragonControllerPhase = CraftEnderDragon.getMinecraftPhase(phase);
assertNotNull(phase.name(), dragonControllerPhase);
assertNotNull(phase.name(), CraftEnderDragon.getBukkitPhase(dragonControllerPhase));
}
}
@Test
public void testBukkitToMinecraft() {
Assert.assertEquals("CIRCLING", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.CIRCLING), DragonControllerPhase.HOLDING_PATTERN);
Assert.assertEquals("STRAFING", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.STRAFING), DragonControllerPhase.STRAFE_PLAYER);
Assert.assertEquals("FLY_TO_PORTAL", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.FLY_TO_PORTAL), DragonControllerPhase.LANDING_APPROACH);
Assert.assertEquals("LAND_ON_PORTAL", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.LAND_ON_PORTAL), DragonControllerPhase.LANDING);
Assert.assertEquals("LEAVE_PORTAL", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.LEAVE_PORTAL), DragonControllerPhase.TAKEOFF);
Assert.assertEquals("BREATH_ATTACK", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.BREATH_ATTACK), DragonControllerPhase.SITTING_FLAMING);
Assert.assertEquals("SEARCH_FOR_BREATH_ATTACK_TARGET", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.SEARCH_FOR_BREATH_ATTACK_TARGET), DragonControllerPhase.SITTING_SCANNING);
Assert.assertEquals("ROAR_BEFORE_ATTACK", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.ROAR_BEFORE_ATTACK), DragonControllerPhase.SITTING_ATTACKING);
Assert.assertEquals("CHARGE_PLAYER", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.CHARGE_PLAYER), DragonControllerPhase.CHARGING_PLAYER);
Assert.assertEquals("DYING", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.DYING), DragonControllerPhase.DYING);
Assert.assertEquals("HOVER", CraftEnderDragon.getMinecraftPhase(EnderDragon.Phase.HOVER), DragonControllerPhase.HOVER);
}
@Test
public void testMinecraftToBukkit() {
Assert.assertEquals("CIRCLING", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.HOLDING_PATTERN), EnderDragon.Phase.CIRCLING);
Assert.assertEquals("STRAFING", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.STRAFE_PLAYER), EnderDragon.Phase.STRAFING);
Assert.assertEquals("FLY_TO_PORTAL", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.LANDING_APPROACH), EnderDragon.Phase.FLY_TO_PORTAL);
Assert.assertEquals("LAND_ON_PORTAL", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.LANDING), EnderDragon.Phase.LAND_ON_PORTAL);
Assert.assertEquals("LEAVE_PORTAL", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.TAKEOFF), EnderDragon.Phase.LEAVE_PORTAL);
Assert.assertEquals("BREATH_ATTACK", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.SITTING_FLAMING), EnderDragon.Phase.BREATH_ATTACK);
Assert.assertEquals("SEARCH_FOR_BREATH_ATTACK_TARGET", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.SITTING_SCANNING), EnderDragon.Phase.SEARCH_FOR_BREATH_ATTACK_TARGET);
Assert.assertEquals("ROAR_BEFORE_ATTACK", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.SITTING_ATTACKING), EnderDragon.Phase.ROAR_BEFORE_ATTACK);
Assert.assertEquals("CHARGE_PLAYER", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.CHARGING_PLAYER), EnderDragon.Phase.CHARGE_PLAYER);
Assert.assertEquals("DYING", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.DYING), EnderDragon.Phase.DYING);
Assert.assertEquals("HOVER", CraftEnderDragon.getBukkitPhase(DragonControllerPhase.HOVER), EnderDragon.Phase.HOVER);
}
}

View File

@@ -0,0 +1,31 @@
package org.bukkit.entity;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import net.minecraft.server.EntityTypes;
import net.minecraft.server.IRegistry;
import net.minecraft.server.MinecraftKey;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
public class EntityTypesTest extends AbstractTestingBase {
@Test
public void testMaps() {
Set<EntityType> allBukkit = Arrays.stream(EntityType.values()).filter((b) -> b.getName() != null).collect(Collectors.toSet());
for (Object o : IRegistry.ENTITY_TYPE) {
EntityTypes<?> nms = (EntityTypes<?>) o; // Eclipse fail
MinecraftKey key = EntityTypes.getName(nms);
EntityType bukkit = EntityType.fromName(key.getKey());
Assert.assertNotNull("Missing nms->bukkit " + key, bukkit);
Assert.assertTrue("Duplicate entity nms->" + bukkit, allBukkit.remove(bukkit));
}
Assert.assertTrue("Unmapped bukkit entities " + allBukkit, allBukkit.isEmpty());
}
}

View File

@@ -0,0 +1,45 @@
package org.bukkit.entity;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import org.bukkit.DyeColor;
import org.bukkit.craftbukkit.entity.CraftTropicalFish;
import org.bukkit.entity.TropicalFish.Pattern;
import org.junit.Test;
public class TropicalFishTest {
@Test
public void testVariants() {
testVariant(65536, DyeColor.ORANGE, DyeColor.WHITE, Pattern.KOB);
testVariant(917504, DyeColor.RED, DyeColor.WHITE, Pattern.KOB);
testVariant(918273, DyeColor.RED, DyeColor.WHITE, Pattern.BLOCKFISH);
testVariant(918529, DyeColor.RED, DyeColor.WHITE, Pattern.BETTY);
testVariant(16778497, DyeColor.WHITE, DyeColor.ORANGE, Pattern.CLAYFISH);
testVariant(50660352, DyeColor.LIME, DyeColor.LIGHT_BLUE, Pattern.BRINELY);
testVariant(50726144, DyeColor.PINK, DyeColor.LIGHT_BLUE, Pattern.SPOTTY);
testVariant(50790656, DyeColor.GRAY, DyeColor.LIGHT_BLUE, Pattern.SUNSTREAK);
testVariant(67108865, DyeColor.WHITE, DyeColor.YELLOW, Pattern.FLOPPER);
testVariant(67110144, DyeColor.WHITE, DyeColor.YELLOW, Pattern.SPOTTY);
testVariant(67371265, DyeColor.YELLOW, DyeColor.YELLOW, Pattern.STRIPEY);
testVariant(67764993, DyeColor.PURPLE, DyeColor.YELLOW, Pattern.BLOCKFISH);
testVariant(101253888, DyeColor.CYAN, DyeColor.PINK, Pattern.DASHER);
testVariant(117441025, DyeColor.WHITE, DyeColor.GRAY, Pattern.GLITTER);
testVariant(117441280, DyeColor.WHITE, DyeColor.GRAY, Pattern.DASHER);
testVariant(117441536, DyeColor.WHITE, DyeColor.GRAY, Pattern.BRINELY);
testVariant(117506305, DyeColor.ORANGE, DyeColor.GRAY, Pattern.STRIPEY);
testVariant(117899265, DyeColor.GRAY, DyeColor.GRAY, Pattern.FLOPPER);
testVariant(118161664, DyeColor.BLUE, DyeColor.GRAY, Pattern.SUNSTREAK);
testVariant(134217984, DyeColor.WHITE, DyeColor.LIGHT_GRAY, Pattern.SUNSTREAK);
testVariant(234882305, DyeColor.WHITE, DyeColor.RED, Pattern.CLAYFISH);
testVariant(235340288, DyeColor.GRAY, DyeColor.RED, Pattern.SNOOPER);
}
private void testVariant(int variant, DyeColor bodyColor, DyeColor patternColor, Pattern pattern) {
assertThat("variant write", CraftTropicalFish.getData(patternColor, bodyColor, pattern), is(variant));
assertThat("pattern colour read", CraftTropicalFish.getPatternColor(variant), is(patternColor));
assertThat("body colour read", CraftTropicalFish.getBodyColor(variant), is(bodyColor));
assertThat("pattern read", CraftTropicalFish.getPattern(variant), is(pattern));
}
}

View File

@@ -0,0 +1,62 @@
package org.bukkit.map;
import java.awt.Color;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.minecraft.server.MaterialMapColor;
import org.junit.Assert;
import org.junit.Test;
public class MapTest {
private static final Logger logger = Logger.getLogger("MapTest");
private static final int[] modifiers = {180, 220, 255, 135};
@Test
public void testColors() {
MaterialMapColor[] nmsColors = MaterialMapColor.a;
Color[] bukkitColors = MapPalette.colors;
boolean fail = false;
for (int i = 0; i < nmsColors.length; i++) {
if (nmsColors[i] == null) {
break;
}
int rgb = nmsColors[i].rgb;
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = rgb & 0xFF;
if (i + 1 > bukkitColors.length / 4) {
for (int modi : modifiers) {
int mr = (r * modi) / 255;
int mg = (g * modi) / 255;
int mb = (b * modi) / 255;
logger.log(Level.WARNING, "Missing color: c({0}, {1}, {2})", new Object[]{mr, mg, mb});
}
fail = true;
} else {
for (int j = 0; j < modifiers.length; j++) {
int modi = modifiers[j];
Color bukkit = bukkitColors[i * 4 + j];
int mr = (r * modi) / 255;
int mg = (g * modi) / 255;
int mb = (b * modi) / 255;
if (bukkit.getRed() != mr || bukkit.getGreen() != mg || bukkit.getBlue() != mb) {
logger.log(Level.WARNING, "Incorrect color: {6} {7} c({0}, {1}, {2}) != c({3}, {4}, {5})", new Object[]{
bukkit.getRed(), bukkit.getGreen(), bukkit.getBlue(),
mr, mg, mb,
i, j
});
fail = true;
}
}
}
}
Assert.assertFalse(fail);
}
}

View File

@@ -0,0 +1,35 @@
package org.bukkit.potion;
import static org.junit.Assert.*;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import net.minecraft.server.IRegistry;
import net.minecraft.server.MobEffect;
import net.minecraft.server.MobEffectList;
import net.minecraft.server.PotionRegistry;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
public class PotionTest extends AbstractTestingBase {
@Test
public void testEffectCompleteness() throws Throwable {
Map<PotionType, String> effects = new EnumMap(PotionType.class);
for (Object reg : IRegistry.POTION) {
List<MobEffect> eff = ((PotionRegistry)reg).a();
if (eff.size() != 1) continue;
int id = MobEffectList.getId(eff.get(0).getMobEffect());
PotionEffectType type = PotionEffectType.getById(id);
assertNotNull(String.valueOf(id), PotionEffectType.getById(id));
PotionType enumType = PotionType.getByEffect(type);
assertNotNull(type.getName(), enumType);
effects.put(enumType, enumType.name());
}
assertEquals(effects.entrySet().size(), PotionType.values().length - /* PotionTypes with no/shared Effects */ 6);
}
}

View File

@@ -0,0 +1,53 @@
package org.bukkit.support;
import com.google.common.collect.ImmutableList;
import java.util.Collections;
import java.util.List;
import net.minecraft.server.DispenserRegistry;
import net.minecraft.server.EnumResourcePackType;
import net.minecraft.server.LootTableRegistry;
import net.minecraft.server.ResourceManager;
import net.minecraft.server.ResourcePackVanilla;
import net.minecraft.server.TagRegistry;
import org.bukkit.Material;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.junit.Assert;
/**
* If you are getting: java.lang.ExceptionInInitializerError
* at net.minecraft.server.StatisticList.<clinit>(SourceFile:58)
* at net.minecraft.server.Item.<clinit>(SourceFile:252)
* at net.minecraft.server.Block.<clinit>(Block.java:577)
*
* extend this class to solve it.
*/
public abstract class AbstractTestingBase {
// Materials that only exist in block form (or are legacy)
public static final List<Material> INVALIDATED_MATERIALS;
public static final LootTableRegistry LOOT_TABLE_REGISTRY;
public static final TagRegistry TAG_REGISTRY;
static {
DispenserRegistry.c();
// Set up resource manager
ResourceManager resourceManager = new ResourceManager(EnumResourcePackType.SERVER_DATA);
// add tags and loot tables for unit tests
resourceManager.a(TAG_REGISTRY = new TagRegistry());
resourceManager.a(LOOT_TABLE_REGISTRY = new LootTableRegistry());
// Register vanilla pack
resourceManager.a(Collections.singletonList(new ResourcePackVanilla("minecraft")));
DummyServer.setup();
DummyEnchantments.setup();
ImmutableList.Builder<Material> builder = ImmutableList.builder();
for (Material m : Material.values()) {
if (m.isLegacy() || CraftMagicNumbers.getItem(m) == null) {
builder.add(m);
}
}
INVALIDATED_MATERIALS = builder.build();
Assert.assertEquals("Expected 543 invalidated materials (got " + INVALIDATED_MATERIALS.size() + ")", 543, INVALIDATED_MATERIALS.size());
}
}

View File

@@ -0,0 +1,12 @@
package org.bukkit.support;
import net.minecraft.server.Enchantments;
public class DummyEnchantments {
static {
Enchantments.DAMAGE_ALL.getClass();
org.bukkit.enchantments.Enchantment.stopAcceptingRegistrations();
}
public static void setup() {}
}

View File

@@ -0,0 +1,111 @@
package org.bukkit.support;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Server;
import org.bukkit.craftbukkit.CraftLootTable;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.inventory.CraftItemFactory;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.craftbukkit.util.Versioning;
public class DummyServer implements InvocationHandler {
private static interface MethodHandler {
Object handle(DummyServer server, Object[] args);
}
private static final HashMap<Method, MethodHandler> methods = new HashMap<Method, MethodHandler>();
static {
try {
methods.put(
Server.class.getMethod("getItemFactory"),
new MethodHandler() {
public Object handle(DummyServer server, Object[] args) {
return CraftItemFactory.instance();
}
}
);
methods.put(
Server.class.getMethod("getName"),
new MethodHandler() {
public Object handle(DummyServer server, Object[] args) {
return DummyServer.class.getName();
}
}
);
methods.put(
Server.class.getMethod("getVersion"),
new MethodHandler() {
public Object handle(DummyServer server, Object[] args) {
return DummyServer.class.getPackage().getImplementationVersion();
}
}
);
methods.put(
Server.class.getMethod("getBukkitVersion"),
new MethodHandler() {
public Object handle(DummyServer server, Object[] args) {
return Versioning.getBukkitVersion();
}
}
);
methods.put(
Server.class.getMethod("getLogger"),
new MethodHandler() {
final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
public Object handle(DummyServer server, Object[] args) {
return logger;
}
}
);
methods.put(
Server.class.getMethod("getUnsafe"),
new MethodHandler() {
public Object handle(DummyServer server, Object[] args) {
return CraftMagicNumbers.INSTANCE;
}
}
);
methods.put(
Server.class.getMethod("createBlockData", Material.class),
new MethodHandler() {
final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
public Object handle(DummyServer server, Object[] args) {
return CraftBlockData.newData((Material) args[0], null);
}
}
);
methods.put(Server.class.getMethod("getLootTable", NamespacedKey.class),
new MethodHandler() {
@Override
public Object handle(DummyServer server, Object[] args) {
NamespacedKey key = (NamespacedKey) args[0];
return new CraftLootTable(key, AbstractTestingBase.LOOT_TABLE_REGISTRY.getLootTable(CraftNamespacedKey.toMinecraft(key)));
}
}
);
Bukkit.setServer(Proxy.getProxyClass(Server.class.getClassLoader(), Server.class).asSubclass(Server.class).getConstructor(InvocationHandler.class).newInstance(new DummyServer()));
} catch (Throwable t) {
throw new Error(t);
}
}
public static void setup() {}
private DummyServer() {};
public Object invoke(Object proxy, Method method, Object[] args) {
MethodHandler handler = methods.get(method);
if (handler != null) {
return handler.handle(this, args);
}
throw new UnsupportedOperationException(String.valueOf(method));
}
}

View File

@@ -0,0 +1,30 @@
package org.bukkit.support;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
public final class Matchers {
private Matchers() {}
public static <T> Matcher<T> sameHash(T value) {
return new SameHash<T>(value);
}
static class SameHash<T> extends BaseMatcher<T> {
private final int expected;
SameHash(T object) {
expected = object.hashCode();
}
public boolean matches(Object item) {
return item.hashCode() == expected;
}
public void describeTo(Description description) {
description.appendValue(expected);
}
}
}

View File

@@ -0,0 +1,31 @@
package org.bukkit.support;
import java.lang.reflect.Field;
public class Util {
/*
public static <T> T getInternalState(Object object, String fieldName) {
return getInternalState(object.getClass(), object, fieldName);
}
*/
@SuppressWarnings("unchecked")
public static <T> T getInternalState(Class<?> clazz, Object object, String fieldName) {
Field field;
try {
field = clazz.getDeclaredField(fieldName);
} catch (SecurityException e) {
throw new RuntimeException("Not allowed to access " + clazz, e);
} catch (NoSuchFieldException e) {
throw new RuntimeException("Unable to find field " + fieldName, e);
}
field.setAccessible(true);
try {
return (T) field.get(object);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
throw new RuntimeException("Unable to get internal value");
}
}