package com.jcwhatever.nucleus.providers.bankitems;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.jcwhatever.nucleus.NucleusTest;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
/**
* Abstract test for {@link IBankItem} implementations.
*/
public abstract class IBankItemTest {
protected abstract IBankItem getBankItem(UUID id, ItemStack itemStack, int amount);
/**
* Make sure Nucleus and Bukkit are initialized.
*/
@BeforeClass
public static void init() {
NucleusTest.init();
}
/**
* Make sure the {@link BankItem} returns the correct ID.
*/
@Test
public void testGetId() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 4);
assertEquals(id, bankItem.getId());
}
/**
* Make sure {@link #isRootItem} returns the correct value.
*/
@Test
public void testIsRootItem() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 4);
assertEquals(true, bankItem.isRootItem());
List<IBankItem> items = bankItem.getPage(1);
for (IBankItem subItem : items) {
assertTrue(subItem != bankItem);
assertEquals(false, subItem.isRootItem());
}
}
/**
* Make sure {@link #getRootItem} returns the correct value.
*/
@Test
public void testGetRootItem() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 4);
assertEquals(bankItem, bankItem.getRootItem());
List<IBankItem> items = bankItem.getPage(1);
for (IBankItem subItem : items) {
assertTrue(subItem != bankItem);
assertEquals(bankItem, subItem.getRootItem());
}
}
/**
* Make sure {@link #getType} returns the correct value.
*/
@Test
public void testGetType() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 4);
assertEquals(Material.WOOD, bankItem.getType());
}
/**
* Make sure {@link #getAmount} returns the correct amount.
*/
@Test
public void testGetAmount() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
assertEquals(128, bankItem.getAmount());
List<IBankItem> items = bankItem.getPage(1);
for (IBankItem subItem : items) {
assertEquals(64, subItem.getAmount());
}
}
/**
* Make sure {@link #getRootAmount} returns the correct value.
*/
@Test
public void testGetRootAmount() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
assertEquals(128, bankItem.getRootAmount());
List<IBankItem> items = bankItem.getPage(1);
for (IBankItem subItem : items) {
assertEquals(128, subItem.getRootAmount());
}
}
/**
* Make sure {@link #getMaxStackSize} returns the correct value.
*/
@Test
public void testGetMaxStackSize() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
assertEquals(Material.WOOD.getMaxStackSize(), bankItem.getMaxStackSize());
stack = new ItemStack(Material.IRON_SWORD);
bankItem = getBankItem(id, stack, 128);
assertEquals(Material.IRON_SWORD.getMaxStackSize(), bankItem.getMaxStackSize());
}
/**
* Make sure {@link #getTotalStacks} returns the correct amount.
*/
@Test
public void testGetTotalStacks() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 130);
assertEquals(3, bankItem.getTotalStacks());
stack = new ItemStack(Material.IRON_SWORD);
bankItem = getBankItem(id, stack, 128);
assertEquals(128, bankItem.getTotalStacks());
}
/**
* Make sure {@link #toItemStack} works correctly.
*/
@Test
public void testToItemStack() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 130);
ItemStack itemStack = bankItem.toItemStack(10);
assertEquals(Material.WOOD, itemStack.getType());
assertEquals(10, itemStack.getAmount());
}
/**
* Make sure {@link #getTotalPages} works correctly.
*/
@Test
public void testGetTotalPages() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 130);
bankItem.setItemsPerPage(1);
assertEquals(3, bankItem.getTotalPages());
bankItem.setItemsPerPage(2);
assertEquals(2, bankItem.getTotalPages());
bankItem.setItemsPerPage(3);
assertEquals(1, bankItem.getTotalPages());
}
/**
* Make sure {@link getPage} works correctly.
*/
@Test
public void testGetPage() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
bankItem.setItemsPerPage(2);
List<IBankItem> items = bankItem.getPage(1);
assertEquals(2, items.size());
bankItem.setItemsPerPage(1);
items = bankItem.getPage(1);
assertEquals(1, items.size());
}
/**
* Make sure {@link #getItems} works correctly.
*/
@Test
public void testGetItems() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
List<IBankItem> items = bankItem.getItems();
assertEquals(2, items.size());
}
/**
* Make sure {@link #iterator} works correctly.
*/
@Test
public void testIterator() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
Iterator<IBankItem> iterator = bankItem.iterator();
int count = 0;
while (iterator.hasNext()) {
IBankItem item = iterator.next();
assertEquals(64, item.getAmount());
count++;
}
// should be 2 items iterated. (128total / 64maxStackSize = 2 stacks)
assertEquals(2, count);
iterator = bankItem.iterator();
try {
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
throw new AssertionError("UnsupportedOperationException expected.");
}
catch (UnsupportedOperationException ignore) {}
}
/**
* Make sure {@link #iterator(int)} works correctly.
*/
@Test
public void testIterator1() {
UUID id = UUID.randomUUID();
ItemStack stack = new ItemStack(Material.WOOD);
IBankItem bankItem = getBankItem(id, stack, 128);
// set only one item in a page
bankItem.setItemsPerPage(1);
// get iterator for page 1.
Iterator<IBankItem> iterator = bankItem.iterator(1);
int count = 0;
while (iterator.hasNext()) {
IBankItem item = iterator.next();
assertEquals(64, item.getAmount());
count++;
}
// make sure there was only one item in iterator
assertEquals(1, count);
iterator = bankItem.iterator(1);
try {
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
throw new AssertionError("UnsupportedOperationException expected.");
}
catch (UnsupportedOperationException ignore) {}
}
}