package me.desht.scrollingmenusign;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import me.desht.dhutils.LogUtils;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.MemoryConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.material.Dye;
import org.junit.Test;
import java.util.Arrays;
import java.util.UUID;
import static org.mockito.Mockito.*;
public class SMSMenuItemTest {
private final UUID mockUUID1 = UUID.randomUUID();
private final UUID mockUUID2 = UUID.randomUUID();
private final SMSMenu testMenu;
public SMSMenuItemTest() {
LogUtils.init("SMSMenuItemTest");
testMenu = new SMSMenu("testmenu", "Test Menu", (Player) null);
testMenu.setAutosave(false);
}
@Test
public void testCreation() {
SMSMenuItem item1 = new SMSMenuItem(testMenu, "Item One", "\\hello", "a message");
assertEquals("Label is correct", item1.getLabel(), "Item One");
assertEquals("Command is correct", item1.getCommand(), "\\hello");
assertEquals("Message is correct", item1.getMessage(), "a message");
SMSMenuItem item2 = new SMSMenuItem(testMenu, ChatColor.RED + "Item Two", "\\bye", "another message");
assertEquals("Raw label is correct", item2.getLabelStripped(), "Item Two");
boolean ok = false;
try {
SMSMenuItem item3 = new SMSMenuItem(null, null, null, null);
} catch (IllegalArgumentException e) {
ok = true;
}
assertTrue("Null parameters throw an IllegalArgumentException", ok);
}
@Test
public void testBuilderCreation() {
SMSMenuItem item1 = new SMSMenuItem.Builder(testMenu, "Item Three").build();
assertTrue("Comand is empty", item1.getCommand().isEmpty());
assertTrue("Alt comand is empty", item1.getAltCommand().isEmpty());
assertFalse("Icon is null", item1.hasIcon());
SMSMenuItem item2 = new SMSMenuItem.Builder(testMenu, "Item Four")
.withIcon("diamond")
.withLore("Lore 1", "Lore 2", "Lore 3")
.withPermissionNode("some.permission.node")
.build();
assertEquals("Icon is diamond", item2.getIcon().getType(), Material.DIAMOND);
assertEquals("Lore has 3 lines", item2.getLore().length, 3);
assertEquals("Permission node is correct", item2.getPermissionNode(), "some.permission.node");
}
@Test
public void testDeserialization() {
ConfigurationSection node = new MemoryConfiguration();
node.set("menu", testMenu.getName());
node.set("label", "Label 1 2 3");
node.set("command", "\\foo!");
node.set("message", "a message for you");
node.set("icon", "INK_SACK:WHITE");
node.set("lore", Arrays.asList("line 1", "line 2"));
node.set("usesRemaining.limits.globalMax", 10);
node.set("usesRemaining.limits.globalRemaining", 8);
SMSMenuItem item1 = new SMSMenuItem(testMenu, node);
assertEquals("Label", item1.getLabel(), "Label 1 2 3");
assertEquals("Command", item1.getCommand(), "\\foo!");
assertEquals("Message", item1.getMessage(), "a message for you");
assertEquals("Alt Command", item1.getAltCommand(), "");
Player mockedPlayer = mock(Player.class);
when(mockedPlayer.getUniqueId()).thenReturn(mockUUID1);
assertEquals("Usage", item1.getUseLimits().getRemainingUses(mockedPlayer), 8);
assertEquals("Icon mat", item1.getIcon().getType(), Material.INK_SACK);
Dye dye = (Dye) item1.getIcon().getData();
assertEquals("Icon data", dye.getColor(), DyeColor.WHITE);
assertEquals("Lore", item1.getLore()[1], "line 2");
}
@Test
public void testItemUseLimits() {
Player mockedPlayer = mock(Player.class);
when(mockedPlayer.getUniqueId()).thenReturn(mockUUID1);
Player mockedPlayer2 = mock(Player.class);
when(mockedPlayer2.getUniqueId()).thenReturn(mockUUID2);
SMSMenuItem item1 = new SMSMenuItem.Builder(testMenu, "Use Limits")
.withCommand("\\hello!")
.build();
item1.getUseLimits().setUses(5);
item1.getUseLimits().use(mockedPlayer);
item1.getUseLimits().use(mockedPlayer2);
item1.getUseLimits().use(mockedPlayer2);
assertEquals("Per-player use limits 1", item1.getUseLimits().getRemainingUses(mockedPlayer), 4);
assertEquals("Per-player use limits 2", item1.getUseLimits().getRemainingUses(mockedPlayer2), 3);
item1.getUseLimits().setGlobalUses(10);
item1.getUseLimits().use(mockedPlayer);
item1.getUseLimits().use(mockedPlayer);
item1.getUseLimits().use(mockedPlayer);
item1.getUseLimits().use(mockedPlayer2);
assertEquals("Global use limits 1", item1.getUseLimits().getRemainingUses(mockedPlayer), 6);
assertEquals("Global use limits 2", item1.getUseLimits().getRemainingUses(mockedPlayer2), 6);
}
}