Challenges/src/test/java/world/bentobox/challenges/panel/user/ChallengesGUITest.java

393 lines
16 KiB
Java

package world.bentobox.challenges.panel.user;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.managers.BlueprintsManager;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
import world.bentobox.challenges.ChallengesAddon;
import world.bentobox.challenges.ChallengesManager;
import world.bentobox.challenges.config.Settings;
import world.bentobox.challenges.config.SettingsUtils.VisibilityMode;
import world.bentobox.challenges.database.object.Challenge;
import world.bentobox.challenges.database.object.Challenge.ChallengeType;
import world.bentobox.challenges.database.object.ChallengeLevel;
import world.bentobox.challenges.utils.LevelStatus;
/**
* @author tastybento
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({Bukkit.class, BentoBox.class, ChatColor.class})
public class ChallengesGUITest {
@Mock
private User user;
@Mock
private IslandsManager im;
@Mock
private IslandWorldManager iwm;
@Mock
private BentoBox plugin;
@Mock
private Settings settings;
@Mock
private CompositeCommand ic;
@Mock
private BlueprintsManager bpm;
@Mock
private Inventory inv;
@Mock
private ItemMeta meta;
@Mock
private ChallengesAddon addon;
@Mock
private World world;
private ChallengesGUI cg;
@Mock
private ChallengesManager chm;
private UUID uuid;
@Mock
private Challenge challenge1;
@Mock
private Challenge challenge2;
@Mock
private Challenge challenge3;
@Mock
private Challenge challenge4;
@Mock
private LevelStatus levelStatus;
private List<Challenge> freeChalls = new ArrayList<>();
private List<Challenge> levelChalls = new ArrayList<>();
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
// Set up plugin
Whitebox.setInternalState(BentoBox.class, "instance", plugin);
PowerMockito.mockStatic(Bukkit.class);
// Item Factory (needed for ItemStack)
ItemFactory itemF = mock(ItemFactory.class);
when(itemF.getItemMeta(Mockito.any())).thenReturn(meta);
when(Bukkit.getItemFactory()).thenReturn(itemF);
// Inventory
when(Bukkit.createInventory(eq(null), anyInt(), anyString())).thenReturn(inv);
// Addon
when(addon.getChallengesManager()).thenReturn(chm);
// Levels
when(levelStatus.isUnlocked()).thenReturn(true);
ChallengeLevel level = mock(ChallengeLevel.class);
when(level.getFriendlyName()).thenReturn("Novice");
when(level.getUniqueId()).thenReturn("novice");
when(level.getIcon()).thenReturn(new ItemStack(Material.BIRCH_BOAT));
when(level.getLockedIcon()).thenReturn(new ItemStack(Material.DARK_OAK_BOAT));
when(levelStatus.getLevel()).thenReturn(level);
List<LevelStatus> levels = Collections.singletonList(levelStatus);
when(chm.getAllChallengeLevelStatus(any(), any())).thenReturn(levels);
when(chm.getChallengeLevelStatus(any(), any(), any())).thenReturn(levelStatus);
// Challenges exist
when(chm.hasAnyChallengeData(any(World.class))).thenReturn(true);
// Free challenges - have more than 18 so that the special processing kicks in
when(chm.getFreeChallenges(any())).thenReturn(freeChalls);
when(challenge1.isDeployed()).thenReturn(true);
when(challenge2.isDeployed()).thenReturn(true);
// 1 is repeatable, 2 is not
when(challenge1.isRepeatable()).thenReturn(true);
// Level challenges
when(chm.getLevelChallenges(any())).thenReturn(levelChalls);
// ChatColor
PowerMockito.mockStatic(ChatColor.class);
when(ChatColor.translateAlternateColorCodes(any(char.class), anyString())).thenAnswer((Answer<String>) invocation -> invocation.getArgument(1, String.class));
// Settings
when(addon.getChallengesSettings()).thenReturn(settings);
when(settings.getVisibilityMode()).thenReturn(VisibilityMode.VISIBLE);
when(settings.isFreeChallengesFirst()).thenReturn(false);
when(settings.isRemoveCompleteOneTimeChallenges()).thenReturn(false);
// Player
Player p = mock(Player.class);
when(user.isOp()).thenReturn(false);
uuid = UUID.randomUUID();
when(user.getUniqueId()).thenReturn(uuid);
when(user.getPlayer()).thenReturn(p);
when(user.getName()).thenReturn("tastybento");
when(user.getPermissionValue(anyString(), anyInt())).thenReturn(-1);
when(user.isPlayer()).thenReturn(true);
when(user.getTranslation(anyString())).thenAnswer((Answer<String>) invocation -> invocation.getArgument(0, String.class));
cg = new ChallengesGUI(addon, world, user, "island", "bskyblock.");
}
private void addLevelChallenges(int number) {
for (int i = 0; i < number; i++) {
Challenge c = mock(Challenge.class);
when(c.isRepeatable()).thenReturn(true);
when(c.getUniqueId()).thenReturn(String.valueOf(i) + "unique");
when(c.getIcon()).thenReturn(new ItemStack(Material.EMERALD));
when(c.getFriendlyName()).thenReturn(String.valueOf(i) + "name");
when(c.getChallengeType()).thenReturn(ChallengeType.INVENTORY);
when(c.getDescription()).thenReturn(Collections.singletonList("Description"));
when(c.getEnvironment()).thenReturn(Collections.singleton(Environment.NORMAL));
when(c.getLevel()).thenReturn("Novice");
when(c.getRewardItems()).thenReturn(Collections.emptyList());
when(c.isDeployed()).thenReturn(true);
levelChalls.add(c);
}
}
private void addFreeChallenges(int number) {
for (int i = 0; i < number; i++) {
Challenge c = mock(Challenge.class);
when(c.getUniqueId()).thenReturn(String.valueOf(i) + "unique");
when(c.getIcon()).thenReturn(new ItemStack(Material.DIAMOND));
when(c.getFriendlyName()).thenReturn(String.valueOf(i) + "name");
when(c.getChallengeType()).thenReturn(ChallengeType.INVENTORY);
when(c.getDescription()).thenReturn(Collections.singletonList("Description"));
when(c.getEnvironment()).thenReturn(Collections.singleton(Environment.NORMAL));
when(c.getLevel()).thenReturn("Novice");
when(c.getRewardItems()).thenReturn(Collections.emptyList());
when(c.isDeployed()).thenReturn(true);
when(c.isRepeatable()).thenReturn(true);
freeChalls.add(c);
}
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuildNoChallenges() {
when(chm.hasAnyChallengeData(any(World.class))).thenReturn(false);
cg.build();
verify(addon).logError("There are no challenges set up!");
verify(user).sendMessage("challenges.errors.no-challenges");
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuild0Free0LevelChallenge() {
when(settings.isFreeChallengesFirst()).thenReturn(true);
cg.build();
verify(user).getTranslation("challenges.gui.title.challenges");
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<ItemStack> argument2 = ArgumentCaptor.forClass(ItemStack.class);
verify(inv).setItem(argument.capture(), argument2.capture());
// Level
assertTrue(argument.getAllValues().get(0) == 0);
assertEquals(Material.BIRCH_BOAT, argument2.getAllValues().get(0).getType());
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuild10Free10LevelChallenge() {
addFreeChallenges(10);
addLevelChallenges(10);
when(settings.isFreeChallengesFirst()).thenReturn(true);
cg.build();
verify(user).getTranslation("challenges.gui.title.challenges");
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<ItemStack> argument2 = ArgumentCaptor.forClass(ItemStack.class);
verify(inv, times(21)).setItem(argument.capture(), argument2.capture());
List<ItemStack> values = argument2.getAllValues();
// Free challenges
for (int i = 0; i < 10; i++) {
assertEquals("Failed on " + i, Material.DIAMOND, values.get(i).getType());
}
// Level challenges
for (int i = 11; i < 20; i++) {
assertEquals("Failed on " + i, Material.EMERALD, values.get(i).getType());
}
// Level icons
assertTrue(argument.getAllValues().get(20) == 36);
assertEquals(Material.BIRCH_BOAT, argument2.getAllValues().get(20).getType());
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuild20Free20LevelChallenge() {
addFreeChallenges(20);
addLevelChallenges(20);
when(settings.isFreeChallengesFirst()).thenReturn(true);
cg.build();
verify(user).getTranslation("challenges.gui.title.challenges");
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<ItemStack> argument2 = ArgumentCaptor.forClass(ItemStack.class);
verify(inv, times(38)).setItem(argument.capture(), argument2.capture());
List<ItemStack> values = argument2.getAllValues();
// Free challenges
for (int i = 0; i < 18; i++) {
assertEquals("Failed on " + i, Material.DIAMOND, values.get(i).getType());
}
// Next page
assertTrue(argument.getAllValues().get(18) == 18);
assertEquals(Material.OAK_SIGN, argument2.getAllValues().get(18).getType());
// Level challenges
for (int i = 19; i < 37; i++) {
assertEquals("Failed on " + i, Material.EMERALD, values.get(i).getType());
}
// Next page
assertTrue(argument.getAllValues().get(37) == 45);
assertEquals(Material.OAK_SIGN, argument2.getAllValues().get(37).getType());
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuildFreeChallenges10Free20LevelChallenge() {
addFreeChallenges(10);
addLevelChallenges(20);
when(settings.isFreeChallengesFirst()).thenReturn(true);
cg.build();
verify(user).getTranslation("challenges.gui.title.challenges");
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<ItemStack> argument2 = ArgumentCaptor.forClass(ItemStack.class);
verify(inv, times(30)).setItem(argument.capture(), argument2.capture());
List<ItemStack> values = argument2.getAllValues();
// Free challenges
for (int i = 0; i < 10; i++) {
assertEquals("Failed on " + i, Material.DIAMOND, values.get(i).getType());
}
// Level challenges
for (int i = 10; i < 27; i++) {
assertEquals("Failed on " + i, Material.EMERALD, values.get(i).getType());
}
// Next page
assertTrue(argument.getAllValues().get(28) == 36);
assertEquals(Material.OAK_SIGN, argument2.getAllValues().get(28).getType());
// Level
assertTrue(argument.getAllValues().get(29) == 45);
assertEquals(Material.BIRCH_BOAT, argument2.getAllValues().get(29).getType());
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuildFreeChallenges20Free10LevelChallenge() {
addFreeChallenges(20);
addLevelChallenges(10);
when(settings.isFreeChallengesFirst()).thenReturn(true);
cg.build();
verify(user).getTranslation("challenges.gui.title.challenges");
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<ItemStack> argument2 = ArgumentCaptor.forClass(ItemStack.class);
verify(inv, times(30)).setItem(argument.capture(), argument2.capture());
List<ItemStack> values = argument2.getAllValues();
// Free challenges
for (int i = 0; i < 18; i++) {
assertEquals("Failed on " + i, Material.DIAMOND, values.get(i).getType());
}
// Next page
assertTrue(argument.getAllValues().get(18) == 18);
assertEquals(Material.OAK_SIGN, argument2.getAllValues().get(18).getType());
// Level challenges
for (int i = 19; i < 29; i++) {
assertEquals("Failed on " + i, Material.EMERALD, values.get(i).getType());
}
// Level
assertTrue(argument.getAllValues().get(29) == 45);
assertEquals(Material.BIRCH_BOAT, argument2.getAllValues().get(29).getType());
}
/**
* Test method for {@link world.bentobox.challenges.panel.user.ChallengesGUI#build()}.
*/
@Test
public void testBuildFreeChallengesLast20Free10LevelChallenge() {
addFreeChallenges(20);
addLevelChallenges(10);
when(settings.isFreeChallengesFirst()).thenReturn(false);
cg.build();
verify(user).getTranslation("challenges.gui.title.challenges");
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<ItemStack> argument2 = ArgumentCaptor.forClass(ItemStack.class);
verify(inv, times(30)).setItem(argument.capture(), argument2.capture());
List<ItemStack> values = argument2.getAllValues();
// Level challenges
for (int i = 0; i < 10; i++) {
assertEquals("Failed on " + i, Material.EMERALD, values.get(i).getType());
}
// Next page
assertTrue(argument.getAllValues().get(10) == 18);
assertEquals(Material.BIRCH_BOAT, argument2.getAllValues().get(10).getType());
// Free challenges
for (int i = 11; i < 29; i++) {
assertEquals("Failed on " + i, Material.DIAMOND, values.get(i).getType());
}
// Level
assertTrue(argument.getAllValues().get(29) == 45);
assertEquals(Material.OAK_SIGN, argument2.getAllValues().get(29).getType());
}
}