Implement 1.4.6 ItemMeta. Adds BUKKIT-3236, BUKKIT-3237

Some meta functionality is refactored into common methods.

CraftItemStack uses the ItemMetaKey identifiers for enchantments.

Refactored unit test to include extra functionality; initially only
checking the presence of the DelegateDeserialization annotation.
This commit is contained in:
Wesley Wolfe
2012-12-21 07:37:53 -06:00
parent f377a7680f
commit 708252c020
19 changed files with 1341 additions and 89 deletions

View File

@@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.List;
import net.minecraft.server.EntitySheep;
import net.minecraft.server.ItemDye;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
@@ -36,4 +37,11 @@ public class DyeColorsTest extends AbstractTestingBase {
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 = ItemDye.b[dye.getData()];
assertThat(color, is(Color.fromRGB(nmsColor)));
}
}

View File

@@ -1,10 +1,15 @@
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;
@@ -15,14 +20,10 @@ import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class ItemMetaImplementationOverrideTest {
static final Class<CraftMetaItem> parent = CraftMetaItem.class;
static final Class<Overridden> annotation = Overridden.class;
static final List<Object[]> testData = new ArrayList<Object[]>();
static final Method[] methods;
static final Class<? extends CraftMetaItem>[] subclasses;
static {
@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) {
@@ -31,37 +32,49 @@ public class ItemMetaImplementationOverrideTest {
classes.add(clazz);
}
}
subclasses = classes.toArray(new Class[0]);
List<Method> list = new ArrayList<Method>();
for (Method method: parent.getDeclaredMethods()) {
if (method.isAnnotationPresent(annotation)) {
if (method.isAnnotationPresent(Overridden.class)) {
list.add(method);
}
}
for (Class<?> clazz : subclasses) {
for (Method method : list) {
testData.add(new Object[]{clazz, method, clazz.getSimpleName() + " contains " + method.getName()});
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
}
);
}
methods = list.toArray(new Method[list.size()]);
}
@Parameters(name="[{index}]:{2}")
public static List<Object[]> data() {
return testData;
}
@Parameter(0) public Class clazz;
@Parameter(1) public Method method;
@Parameter(2) public String name;
@Parameter(0) public Callable<?> test;
@Parameter(1) public String name;
@Test
public void testClass() throws Throwable {
clazz.getDeclaredMethod(method.getName(), method.getParameterTypes());
assertThat(name, test.call(), is(not(nullValue())));
}
}

View File

@@ -7,13 +7,19 @@ 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.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.inventory.ItemStack;
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.LeatherArmorMeta;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.inventory.meta.PotionMeta;
@@ -77,6 +83,30 @@ public class ItemMetaTest extends AbstractTestingBase {
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.FIREWORK) {
@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_CHARGE) {
@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;
}
}
);

View File

@@ -20,6 +20,7 @@ public class ItemStackBookTest extends ItemStackTest {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.WRITTEN_BOOK, Material.BOOK_AND_QUILL);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),

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_CHARGE);
}
@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);
}
@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(150);
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(200);
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

@@ -22,6 +22,7 @@ public class ItemStackLeatherTest extends ItemStackTest {
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('+'),

View File

@@ -20,6 +20,7 @@ public class ItemStackLoreEnchantmentTest extends ItemStackTest {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, ItemStackTest.COMPOUND_MATERIALS);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),

View File

@@ -21,6 +21,7 @@ public class ItemStackPotionsTest extends ItemStackTest {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.POTION);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),

View File

@@ -20,6 +20,7 @@ public class ItemStackSkullTest extends ItemStackTest {
return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.SKULL_ITEM);
}
@SuppressWarnings("unchecked")
static List<Object[]> operators() {
return CompoundOperator.compound(
Joiner.on('+'),

View File

@@ -184,6 +184,7 @@ public class ItemStackTest extends AbstractTestingBase {
out.addAll(primarySingleton);
}
@SuppressWarnings("unchecked")
final List<Object[]>[] lists = new List[notSingletons.size() + 1];
notSingletons.toArray(lists);
lists[lists.length - 1] = out;