Added Enter/Exit messages

This required adding support for world-specific toggle settings.

This also affected some other listeners.
This commit is contained in:
tastybento 2018-06-03 20:54:37 -07:00
parent beafb5dd4c
commit 5904ef9194
23 changed files with 571 additions and 53 deletions

View File

@ -316,7 +316,12 @@ protection:
DOOR: "Use doors"
ELYTRA: "Use elytras"
ENCHANTING: "Use enchanting table"
ENTER_EXIT_MESSAGES: "Display entry and exit messages"
ENTER_EXIT_MESSAGES:
name: "Enter/Exit messages"
description: "Display entry and exit messages"
now-leaving: "Now leaving [name]"
now-entering: "Now entering [name]"
island: "[name]'s island"
FIRE: "FIRE"
FIRE_EXTINGUISH: "FIRE_EXTINGUISH"
FIRE_SPREAD: "FIRE_SPREAD"
@ -360,6 +365,12 @@ protection:
allowed_rank: "&3- &a"
blocked_rank: "&3- &c"
minimal_rank: "&3- &2"
setting-layout: |+
&a[description]
&7Current setting: [setting]
setting-active: "&aActive"
setting-disabled: "&cDisabled"
language:
panel-title: "Select your language"

View File

@ -1306,5 +1306,4 @@ public class Settings implements ISettings<Settings>, WorldSettings {
return "bskyblock";
}
}

View File

@ -544,6 +544,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi
}
/**
* The the world that this command applies to.
* @return the world
*/
public World getWorld() {

View File

@ -1,8 +1,11 @@
package us.tastybento.bskyblock.api.flags;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
@ -13,6 +16,7 @@ import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder;
import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.database.objects.Island;
import us.tastybento.bskyblock.managers.RanksManager;
import us.tastybento.bskyblock.util.Util;
public class Flag implements Comparable<Flag> {
@ -25,7 +29,8 @@ public class Flag implements Comparable<Flag> {
private final Material icon;
private final Listener listener;
private final Type type;
private boolean defaultSetting;
private Map<World, Boolean> worldSettings = new HashMap<>();
private boolean setting;
private final int defaultRank;
private final PanelItem.ClickHandler clickHandler;
@ -33,7 +38,7 @@ public class Flag implements Comparable<Flag> {
this.id = id;
this.icon = icon;
this.listener = listener;
this.defaultSetting = defaultSetting;
this.setting = defaultSetting;
this.type = type;
this.defaultRank = defaultRank;
this.clickHandler = clickListener;
@ -52,10 +57,21 @@ public class Flag implements Comparable<Flag> {
}
/**
* @return - true means it is allowed. false means it is not allowed
* Check if a setting is set in this world
* @param world - world
* @return world setting, or default system setting if a specific world setting is not set
*/
public boolean isDefaultSetting() {
return defaultSetting;
public boolean isSet(World world) {
return worldSettings.getOrDefault(Util.getWorld(world), setting);
}
/**
* Set the default or global setting for this world
* @param world - world
* @param setting - true or false
*/
public void setSetting(World world, boolean setting) {
worldSettings.put(Util.getWorld(world), setting);
}
/**
@ -63,7 +79,7 @@ public class Flag implements Comparable<Flag> {
* @param defaultSetting - true means it is allowed. false means it is not allowed
*/
public void setDefaultSetting(boolean defaultSetting) {
this.defaultSetting = defaultSetting;
this.setting = defaultSetting;
}
/**
@ -130,6 +146,16 @@ public class Flag implements Comparable<Flag> {
.icon(new ItemStack(icon))
.name(user.getTranslation("protection.panel.flag-item.name-layout", TextVariables.NAME, user.getTranslation("protection.flags." + id + ".name")))
.clickHandler(clickHandler);
// Check if this is a setting
if (this.getType().equals(Type.SETTING)) {
String setting = this.isSet(user.getWorld()) ? user.getTranslation("protection.panel.flag-item.setting-active")
: user.getTranslation("protection.panel.flag-item.setting-disabled");
pib.description(user.getTranslation("protection.panel.flag-item.setting-layout", "[description]", user.getTranslation("protection.flags." + id + ".description")
, "[setting]", setting));
return pib.build();
}
// Protection flag
pib.description(user.getTranslation("protection.panel.flag-item.description-layout", "[description]", user.getTranslation("protection.flags." + id + ".description")));
// Get the island this user is on or their own
@ -157,7 +183,7 @@ public class Flag implements Comparable<Flag> {
@Override
public String toString() {
return "Flag [id=" + id + ", icon=" + icon + ", listener=" + listener + ", type=" + type + ", defaultSetting="
+ defaultSetting + ", defaultRank=" + defaultRank + ", clickHandler=" + clickHandler + "]";
+ setting + ", defaultRank=" + defaultRank + ", clickHandler=" + clickHandler + "]";
}
@Override

View File

@ -13,7 +13,7 @@ public class FlagBuilder {
private String id;
private Material icon;
private Listener listener;
private boolean defaultSetting;
private boolean setting;
private Type type = Type.PROTECTION;
private int defaultRank = RanksManager.MEMBER_RANK;
private PanelItem.ClickHandler onClick;
@ -25,18 +25,25 @@ public class FlagBuilder {
return this;
}
/**
* The material that will become the icon for this flag
* @param icon
*/
public FlagBuilder icon(Material icon) {
this.icon = icon;
return this;
}
/**
* @param listener - the Bukkit listener that will be registered to handle this flag
*/
public FlagBuilder listener(Listener listener) {
this.listener = listener;
return this;
}
public Flag build() {
return new Flag(id, icon, listener, defaultSetting, type, defaultRank, onClick);
return new Flag(id, icon, listener, setting, type, defaultRank, onClick);
}
/**
@ -45,7 +52,7 @@ public class FlagBuilder {
* @return FlagBuilder
*/
public FlagBuilder allowedByDefault(boolean setting) {
defaultSetting = setting;
this.setting = setting;
return this;
}
@ -89,4 +96,5 @@ public class FlagBuilder {
this.onClick = onClickListener;
return this;
}
}

View File

@ -19,7 +19,6 @@ import us.tastybento.bskyblock.managers.island.NewIsland;
public class IslandResetCommand extends CompositeCommand {
private Map<UUID, Long> cooldown;
private Map<UUID, Long> confirm;
public IslandResetCommand(CompositeCommand islandCommand) {
super(islandCommand, "reset", "restart");
@ -28,7 +27,6 @@ public class IslandResetCommand extends CompositeCommand {
@Override
public void setup() {
cooldown = new HashMap<>();
confirm = new HashMap<>();
setPermission("island.create");
setOnlyPlayer(true);
setDescription("commands.island.reset.description");
@ -73,8 +71,6 @@ public class IslandResetCommand extends CompositeCommand {
}
private boolean resetIsland(User user) {
// Remove the confirmation
confirm.remove(user.getUniqueId());
// Reset the island
Player player = user.getPlayer();
player.setGameMode(GameMode.SPECTATOR);

View File

@ -5,7 +5,6 @@ import java.util.UUID;
import java.util.stream.Collectors;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import us.tastybento.bskyblock.api.commands.CompositeCommand;
import us.tastybento.bskyblock.api.localization.TextVariables;
@ -34,8 +33,7 @@ public class IslandSetnameCommand extends CompositeCommand {
*/
@Override
public boolean execute(User user, List<String> args) {
Player player = user.getPlayer();
UUID playerUUID = player.getUniqueId();
UUID playerUUID = user.getUniqueId();
if (!getIslands().hasIsland(getWorld(), playerUUID)) {
user.sendMessage("general.errors.no-island");
@ -66,8 +64,8 @@ public class IslandSetnameCommand extends CompositeCommand {
}
// Set the name
if (!player.hasPermission("island.name.format")) {
getIslands().getIsland(getWorld(), player.getUniqueId()).setName(ChatColor.translateAlternateColorCodes('&', name));
if (user.isOp() || user.hasPermission(this.getPermissionPrefix() + ".island.name.format")) {
getIslands().getIsland(getWorld(), playerUUID).setName(ChatColor.translateAlternateColorCodes('&', name));
} else {
getIslands().getIsland(getWorld(), playerUUID).setName(name);
}

View File

@ -5,6 +5,7 @@ import java.util.List;
import us.tastybento.bskyblock.api.commands.CompositeCommand;
import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.panels.SettingsPanel;
import us.tastybento.bskyblock.util.Util;
/**
* @author Poslovitch
@ -30,7 +31,13 @@ public class IslandSettingsCommand extends CompositeCommand {
*/
@Override
public boolean execute(User user, List<String> args) {
SettingsPanel.openPanel(getPlugin(), user);
return true;
// Settings are only shown if you are in the right world
if (Util.getWorld(user.getWorld()).equals(getWorld())) {
SettingsPanel.openPanel(getPlugin(), user);
return true;
} else {
user.sendMessage("general.errors.wrong-world");
return false;
}
}
}

View File

@ -387,7 +387,6 @@ public class Clipboard {
/**
* Load a file to clipboard
* @param file
* @throws IOException
* @throws InvalidConfigurationException
*/

View File

@ -102,20 +102,21 @@ public abstract class AbstractFlagListener implements Listener {
}
/**
* Generic flag checker
* Check if flag is allowed at location
* @param e - event
* @param loc - location
* @param breakBlocks
* @return true if the check is okay, false if it was disallowed
* @param flag - flag {@link us.tastybento.bskyblock.lists.Flags}
* @return true if allowed, false if not
*/
public boolean checkIsland(Event e, Location loc, Flag breakBlocks) {
return checkIsland(e, loc, breakBlocks, false);
public boolean checkIsland(Event e, Location loc, Flag flag) {
return checkIsland(e, loc, flag, false);
}
/**
* Check if flag is allowed
* Check if flag is allowed at location
* @param e - event
* @param loc - location
* @param flag - flag {@link us.tastybento.bskyblock.lists.Flags}
* @param silent - if true, no attempt is made to tell the user
* @return true if the check is okay, false if it was disallowed
*/
@ -129,7 +130,7 @@ public abstract class AbstractFlagListener implements Listener {
// Handle Settings Flag
if (flag.getType().equals(Type.SETTING)) {
// If the island exists, return the setting, otherwise return the default setting for this flag
return island.map(x -> x.isAllowed(flag)).orElse(flag.isDefaultSetting());
return island.map(x -> x.isAllowed(flag)).orElse(flag.isSet(loc.getWorld()));
}
// Protection flag
@ -157,7 +158,7 @@ public abstract class AbstractFlagListener implements Listener {
}
}
// The player is in the world, but not on an island, so general world settings apply
if (!flag.isDefaultSetting()) {
if (!flag.isSet(loc.getWorld())) {
noGo(e, silent);
user = null;
return false;

View File

@ -104,7 +104,7 @@ public class BreakBlocksListener extends AbstractFlagListener {
});
// The player is in the world, but not on an island, so general world settings apply
if (!Flags.BREAK_BLOCKS.isDefaultSetting()) {
if (!Flags.BREAK_BLOCKS.isSet(e.getVehicle().getWorld())) {
e.setCancelled(true);
user.sendMessage("protection.protected");
}

View File

@ -0,0 +1,55 @@
/**
*
*/
package us.tastybento.bskyblock.listeners.flags;
import java.util.Optional;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.util.Vector;
import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.database.objects.Island;
import us.tastybento.bskyblock.lists.Flags;
/**
* The Enter/Exit messages flag is a global flag and applies everywhere
* @author tastybento
*
*/
public class EnterExitListener extends AbstractFlagListener {
private static final Vector XZ = new Vector(1,0,1);
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onMove(PlayerMoveEvent e) {
// Only process if Enter Exit flags are active, we are in the right world and there is a change in X or Z coords
if (!Flags.ENTER_EXIT_MESSAGES.isSet(e.getFrom().getWorld())
|| e.getFrom().toVector().multiply(XZ).equals(e.getTo().toVector().multiply(XZ))
|| !getIslandWorldManager().inWorld(e.getFrom())) {
return;
}
Optional<Island> from = this.getIslands().getProtectedIslandAt(e.getFrom());
Optional<Island> to = this.getIslands().getProtectedIslandAt(e.getTo());
/*
* Options:
*
* from = empty, to = island - entering
* from = island1, to = island2 - leaving 1, entering 2
* from = island, to = empty - leaving
* from = empty, to = empty
* from = island, to = island
*/
if (from.equals(to)) {
return;
}
User user = User.getInstance(e.getPlayer());
from.ifPresent(i -> user.sendMessage("protection.flags.ENTER_EXIT_MESSAGES.now-leaving", "[name]", !i.getName().isEmpty() ? i.getName() :
user.getTranslation("protection.flags.ENTER_EXIT_MESSAGES.island", "[name]", getPlugin().getPlayers().getName(i.getOwner()))));
to.ifPresent(i -> user.sendMessage("protection.flags.ENTER_EXIT_MESSAGES.now-entering", "[name]", !i.getName().isEmpty() ? i.getName() :
user.getTranslation("protection.flags.ENTER_EXIT_MESSAGES.island", "[name]", getPlugin().getPlayers().getName(i.getOwner()))));
}
}

View File

@ -40,8 +40,7 @@ public class FireListener extends AbstractFlagListener {
return false;
}
// Check if the island exists and if fire is allowed
boolean cancel = getIslands().getIslandAt(l).map(i -> !i.isAllowed(flag)).orElse(!flag.isDefaultSetting());
boolean cancel = getIslands().getIslandAt(l).map(i -> !i.isAllowed(flag)).orElse(!flag.isSet(l.getWorld()));
e.setCancelled(cancel);
return cancel;
}

View File

@ -43,11 +43,11 @@ public class MobSpawnListener extends AbstractFlagListener {
Optional<Island> island = getIslands().getIslandAt(e.getLocation());
// Cancel the event if these are true
if ((e.getEntity() instanceof Monster || e.getEntity() instanceof Slime)) {
boolean cancel = island.map(i -> !i.isAllowed(Flags.MONSTER_SPAWN)).orElse(!Flags.MONSTER_SPAWN.isDefaultSetting());
boolean cancel = island.map(i -> !i.isAllowed(Flags.MONSTER_SPAWN)).orElse(!Flags.MONSTER_SPAWN.isSet(e.getEntity().getWorld()));
e.setCancelled(cancel);
return cancel;
} else if (e.getEntity() instanceof Animals) {
boolean cancel = island.map(i -> !i.isAllowed(Flags.ANIMAL_SPAWN)).orElse(!Flags.ANIMAL_SPAWN.isDefaultSetting());
boolean cancel = island.map(i -> !i.isAllowed(Flags.ANIMAL_SPAWN)).orElse(!Flags.ANIMAL_SPAWN.isSet(e.getEntity().getWorld()));
e.setCancelled(cancel);
return cancel;
}

View File

@ -0,0 +1,59 @@
/**
*
*/
package us.tastybento.bskyblock.listeners.flags;
import org.bukkit.Sound;
import org.bukkit.event.inventory.ClickType;
import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.api.flags.Flag;
import us.tastybento.bskyblock.api.panels.Panel;
import us.tastybento.bskyblock.api.panels.PanelItem.ClickHandler;
import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.util.Util;
/**
* @author tastybento
*
*/
public class SettingsToggleClickListener implements ClickHandler {
private BSkyBlock plugin = BSkyBlock.getInstance();
private String id;
/**
* @param id
*/
public SettingsToggleClickListener(String id) {
this.id = id;
}
/* (non-Javadoc)
* @see us.tastybento.bskyblock.api.panels.PanelItem.ClickHandler#onClick(us.tastybento.bskyblock.api.panels.Panel, us.tastybento.bskyblock.api.user.User, org.bukkit.event.inventory.ClickType, int)
*/
@Override
public boolean onClick(Panel panel, User user, ClickType clickType, int slot) {
// Get the world
if (!plugin.getIWM().inWorld(user.getLocation())) {
user.sendMessage("general.errors.wrong-world");
return true;
}
String reqPerm = plugin.getIWM().getPermissionPrefix(Util.getWorld(user.getWorld())) + ".settings." + id;
if (!user.hasPermission(reqPerm)) {
user.sendMessage("general.errors.no-permission");
user.sendMessage("general.errors.you-need", "[permission]", reqPerm);
return true;
}
// Get flag
Flag flag = plugin.getFlagsManager().getFlagByID(id);
// Toggle flag
flag.setSetting(user.getWorld(), !flag.isSet(user.getWorld()));
user.getWorld().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F);
// Apply change to panel
panel.getInventory().setItem(slot, flag.toPanelItem(plugin, user).getItem());
return true;
}
}

View File

@ -15,6 +15,7 @@ import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener;
import us.tastybento.bskyblock.listeners.flags.BreedingListener;
import us.tastybento.bskyblock.listeners.flags.BucketListener;
import us.tastybento.bskyblock.listeners.flags.EggListener;
import us.tastybento.bskyblock.listeners.flags.EnterExitListener;
import us.tastybento.bskyblock.listeners.flags.EntityInteractListener;
import us.tastybento.bskyblock.listeners.flags.FireListener;
import us.tastybento.bskyblock.listeners.flags.HurtingListener;
@ -26,6 +27,7 @@ import us.tastybento.bskyblock.listeners.flags.PVPListener;
import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener;
import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener;
import us.tastybento.bskyblock.listeners.flags.PortalListener;
import us.tastybento.bskyblock.listeners.flags.SettingsToggleClickListener;
import us.tastybento.bskyblock.listeners.flags.ShearingListener;
import us.tastybento.bskyblock.listeners.flags.TeleportationListener;
import us.tastybento.bskyblock.managers.RanksManager;
@ -132,7 +134,10 @@ public class Flags {
public static final Flag PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).type(Type.SETTING).build();
public static final Flag PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).type(Type.SETTING).build();
// Others
public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).type(Type.SETTING).build();
public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).type(Type.SETTING)
.listener(new EnterExitListener())
.onClick(new SettingsToggleClickListener("ENTER_EXIT_MESSAGES"))
.build();
public static final Flag ANIMAL_SPAWN = new FlagBuilder().id("ANIMAL_SPAWN").icon(Material.APPLE).allowedByDefault(true).type(Type.SETTING).build();
public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).type(Type.SETTING).build();
public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).type(Type.SETTING).build();

View File

@ -454,4 +454,5 @@ public class IslandWorldManager {
return worldSettings.get(Util.getWorld(world)).getPermissionPrefix();
}
}

View File

@ -118,7 +118,7 @@ public class RanksManager {
/**
* Gets the next rank value above the current rank. Highest is {@link RanksManager.OWNER_RANK}
* Gets the next rank value above the current rank. Highest is {@link RanksManager#OWNER_RANK}
* @param currentRank
* @return Optional rank value
*/
@ -132,7 +132,7 @@ public class RanksManager {
}
/**
* Gets the previous rank value below the current rank. Lowest is {@link RanksManager.VISITOR_RANK}
* Gets the previous rank value below the current rank. Lowest is {@link RanksManager#VISITOR_RANK}
* @param currentRank
* @return Optional rank value
*/

View File

@ -13,6 +13,7 @@ import java.util.UUID;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.junit.Before;
@ -31,9 +32,10 @@ import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.database.objects.Island;
import us.tastybento.bskyblock.managers.IslandsManager;
import us.tastybento.bskyblock.managers.RanksManager;
import us.tastybento.bskyblock.util.Util;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Flag.class })
@PrepareForTest({ Flag.class, Util.class })
public class FlagTest {
@BeforeClass
@ -42,6 +44,8 @@ public class FlagTest {
@Before
public void setUp() throws Exception {
PowerMockito.mockStatic(Util.class);
when(Util.getWorld(Mockito.any())).thenReturn(mock(World.class));
}
@Test
@ -81,19 +85,19 @@ public class FlagTest {
@Test
public void testIsDefaultSetting() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null);
assertFalse(id.isDefaultSetting());
assertFalse(id.isSet(mock(World.class)));
id = new Flag("id", Material.ACACIA_DOOR, null, true, null, 0, null);
assertTrue(id.isDefaultSetting());
assertTrue(id.isSet(mock(World.class)));
}
@Test
public void testSetDefaultSetting() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null);
assertFalse(id.isDefaultSetting());
assertFalse(id.isSet(mock(World.class)));
id.setDefaultSetting(true);
assertTrue(id.isDefaultSetting());
assertTrue(id.isSet(mock(World.class)));
id.setDefaultSetting(false);
assertFalse(id.isDefaultSetting());
assertFalse(id.isSet(mock(World.class)));
}

View File

@ -0,0 +1,240 @@
/**
*
*/
package us.tastybento.bskyblock.listeners.flags;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Optional;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.util.Vector;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
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 us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.Settings;
import us.tastybento.bskyblock.api.user.Notifier;
import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.database.objects.Island;
import us.tastybento.bskyblock.managers.IslandWorldManager;
import us.tastybento.bskyblock.managers.IslandsManager;
import us.tastybento.bskyblock.managers.LocalesManager;
import us.tastybento.bskyblock.managers.PlayersManager;
import us.tastybento.bskyblock.util.Util;
/**
* @author tastybento
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({Bukkit.class, BSkyBlock.class, Util.class })
public class EnterExitListenerTest {
private static final Integer PROTECTION_RANGE = 200;
private static final Integer X = 600;
private static final Integer Y = 120;
private static final Integer Z = 10000;
private UUID uuid;
private User user;
private IslandsManager im;
private Island island;
private World world;
private Location outside;
private Location inside;
private Notifier notifier;
private Location inside2;
private EnterExitListener listener;
private LocalesManager lm;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
// Set up plugin
BSkyBlock plugin = mock(BSkyBlock.class);
Whitebox.setInternalState(BSkyBlock.class, "instance", plugin);
// World
world = mock(World.class);
// Settings
Settings s = mock(Settings.class);
when(plugin.getSettings()).thenReturn(s);
// Player
Player p = mock(Player.class);
// Sometimes use Mockito.withSettings().verboseLogging()
user = mock(User.class);
User.setPlugin(plugin);
when(user.isOp()).thenReturn(false);
uuid = UUID.randomUUID();
when(user.getUniqueId()).thenReturn(uuid);
when(user.getPlayer()).thenReturn(p);
when(user.getName()).thenReturn("tastybento");
// No island for player to begin with (set it later in the tests)
im = mock(IslandsManager.class);
when(plugin.getIslands()).thenReturn(im);
// Locales
lm = mock(LocalesManager.class);
when(plugin.getLocalesManager()).thenReturn(lm);
when(lm.get(any(), any())).thenReturn("mock translation");
// Notifier
notifier = mock(Notifier.class);
when(plugin.getNotifier()).thenReturn(notifier);
// Island Banned list initialization
island = mock(Island.class);
Location loc = mock(Location.class);
when(loc.getWorld()).thenReturn(world);
when(loc.getBlockX()).thenReturn(X);
when(loc.getBlockY()).thenReturn(Y);
when(loc.getBlockZ()).thenReturn(Z);
when(island.getCenter()).thenReturn(loc);
when(island.getProtectionRange()).thenReturn(PROTECTION_RANGE);
when(island.getOwner()).thenReturn(uuid);
when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island);
// Common from to's
outside = mock(Location.class);
when(outside.getWorld()).thenReturn(world);
when(outside.getBlockX()).thenReturn(X + PROTECTION_RANGE + 1);
when(outside.getBlockY()).thenReturn(Y);
when(outside.getBlockZ()).thenReturn(Z);
when(outside.toVector()).thenReturn(new Vector(X + PROTECTION_RANGE + 1, Y, Z));
inside = mock(Location.class);
when(inside.getWorld()).thenReturn(world);
when(inside.getBlockX()).thenReturn(X + PROTECTION_RANGE - 1);
when(inside.getBlockY()).thenReturn(Y);
when(inside.getBlockZ()).thenReturn(Z);
when(inside.toVector()).thenReturn(new Vector(X + PROTECTION_RANGE - 1, Y, Z));
inside2 = mock(Location.class);
when(inside.getWorld()).thenReturn(world);
when(inside.getBlockX()).thenReturn(X + PROTECTION_RANGE - 2);
when(inside.getBlockY()).thenReturn(Y);
when(inside.getBlockZ()).thenReturn(Z);
when(inside.toVector()).thenReturn(new Vector(X + PROTECTION_RANGE -2, Y, Z));
Optional<Island> opIsland = Optional.ofNullable(island);
when(im.getProtectedIslandAt(Mockito.eq(inside))).thenReturn(opIsland);
when(im.getProtectedIslandAt(Mockito.eq(inside2))).thenReturn(opIsland);
when(im.getProtectedIslandAt(Mockito.eq(outside))).thenReturn(Optional.empty());
// Island World Manager
IslandWorldManager iwm = mock(IslandWorldManager.class);
when(iwm.inWorld(Mockito.any())).thenReturn(true);
when(plugin.getIWM()).thenReturn(iwm);
// Player's manager
PlayersManager pm = mock(PlayersManager.class);
when(pm.getName(Mockito.any())).thenReturn("tastybento");
when(plugin.getPlayers()).thenReturn(pm);
// Listener
listener = new EnterExitListener();
PowerMockito.mockStatic(Util.class);
when(Util.getWorld(Mockito.any())).thenReturn(world);
}
/**
* Test method for {@link us.tastybento.bskyblock.listeners.flags.EnterExitListener#onMove(org.bukkit.event.player.PlayerMoveEvent)}.
*/
@Test
public void testOnMoveInsideIsland() {
PlayerMoveEvent e = new PlayerMoveEvent(user.getPlayer(), inside, inside);
listener.onMove(e);
// Moving in the island should result in no messages to the user
Mockito.verify(user, Mockito.never()).sendMessage(Mockito.anyVararg());
}
/**
* Test method for {@link us.tastybento.bskyblock.listeners.flags.EnterExitListener#onMove(org.bukkit.event.player.PlayerMoveEvent)}.
*/
@Test
public void testOnMoveOutsideIsland() {
PlayerMoveEvent e = new PlayerMoveEvent(user.getPlayer(), outside, outside);
listener.onMove(e);
// Moving outside the island should result in no messages to the user
Mockito.verify(user, Mockito.never()).sendMessage(Mockito.anyVararg());
}
/**
* Test method for {@link us.tastybento.bskyblock.listeners.flags.EnterExitListener#onMove(org.bukkit.event.player.PlayerMoveEvent)}.
*/
@Test
public void testOnGoingIntoIslandEmptyIslandName() {
when(island.getName()).thenReturn("");
PlayerMoveEvent e = new PlayerMoveEvent(user.getPlayer(), outside, inside);
listener.onMove(e);
// Moving into the island should show a message
Mockito.verify(lm).get(Mockito.any(), Mockito.eq("protection.flags.ENTER_EXIT_MESSAGES.now-entering"));
// The island owner needs to be checked
Mockito.verify(island).getOwner();
}
/**
* Test method for {@link us.tastybento.bskyblock.listeners.flags.EnterExitListener#onMove(org.bukkit.event.player.PlayerMoveEvent)}.
*/
@Test
public void testOnGoingIntoIslandWithIslandName() {
when(island.getName()).thenReturn("fancy name");
PlayerMoveEvent e = new PlayerMoveEvent(user.getPlayer(), outside, inside);
listener.onMove(e);
// Moving into the island should show a message
Mockito.verify(lm).get(Mockito.any(), Mockito.eq("protection.flags.ENTER_EXIT_MESSAGES.now-entering"));
// No owner check
Mockito.verify(island, Mockito.never()).getOwner();
Mockito.verify(island, Mockito.times(2)).getName();
}
/**
* Test method for {@link us.tastybento.bskyblock.listeners.flags.EnterExitListener#onMove(org.bukkit.event.player.PlayerMoveEvent)}.
*/
@Test
public void testExitingIslandEmptyIslandName() {
when(island.getName()).thenReturn("");
PlayerMoveEvent e = new PlayerMoveEvent(user.getPlayer(), inside, outside);
listener.onMove(e);
// Moving into the island should show a message
Mockito.verify(lm).get(Mockito.any(), Mockito.eq("protection.flags.ENTER_EXIT_MESSAGES.now-leaving"));
// The island owner needs to be checked
Mockito.verify(island).getOwner();
}
/**
* Test method for {@link us.tastybento.bskyblock.listeners.flags.EnterExitListener#onMove(org.bukkit.event.player.PlayerMoveEvent)}.
*/
@Test
public void testExitingIslandWithIslandName() {
when(island.getName()).thenReturn("fancy name");
PlayerMoveEvent e = new PlayerMoveEvent(user.getPlayer(), inside, outside);
listener.onMove(e);
// Moving into the island should show a message
Mockito.verify(lm).get(Mockito.any(), Mockito.eq("protection.flags.ENTER_EXIT_MESSAGES.now-leaving"));
// No owner check
Mockito.verify(island, Mockito.never()).getOwner();
Mockito.verify(island, Mockito.times(2)).getName();
}
}

View File

@ -29,6 +29,7 @@ import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.plugin.PluginManager;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -61,7 +62,7 @@ public class FireListenerTest {
private static IslandWorldManager iwm;
@BeforeClass
public static void setUp() {
public static void setUpClass() {
// Set up plugin
plugin = mock(BSkyBlock.class);
Whitebox.setInternalState(BSkyBlock.class, "instance", plugin);
@ -103,10 +104,7 @@ public class FireListenerTest {
when(iwm.getEndWorld()).thenReturn(world);
when(iwm.inWorld(any())).thenReturn(true);
when(plugin.getIWM()).thenReturn(iwm);
PowerMockito.mockStatic(Util.class);
when(Util.getWorld(Mockito.any())).thenReturn(world);
// Monsters and animals
Zombie zombie = mock(Zombie.class);
when(zombie.getLocation()).thenReturn(location);
@ -137,6 +135,12 @@ public class FireListenerTest {
when(pm.getName(Mockito.any())).thenReturn("tastybento");
when(plugin.getPlayers()).thenReturn(pm);
}
@Before
public void setUp() {
PowerMockito.mockStatic(Util.class);
when(Util.getWorld(Mockito.any())).thenReturn(mock(World.class));
}
@Test
public void testCheckFire() {

View File

@ -39,9 +39,10 @@ import us.tastybento.bskyblock.lists.Flags;
import us.tastybento.bskyblock.managers.FlagsManager;
import us.tastybento.bskyblock.managers.IslandWorldManager;
import us.tastybento.bskyblock.managers.IslandsManager;
import us.tastybento.bskyblock.util.Util;
@RunWith(PowerMockRunner.class)
@PrepareForTest( {BSkyBlock.class, Flags.class })
@PrepareForTest( {BSkyBlock.class, Flags.class, Util.class })
public class MobSpawnListenerTest {
private static Location location;
@ -96,7 +97,7 @@ public class MobSpawnListenerTest {
when(slime.getLocation()).thenReturn(location);
cow = mock(Cow.class);
when(cow.getLocation()).thenReturn(location);
}
@Before
@ -109,6 +110,10 @@ public class MobSpawnListenerTest {
when(iwm.getEndWorld()).thenReturn(world);
when(iwm.inWorld(any(Location.class))).thenReturn(true);
when(plugin.getIWM()).thenReturn(iwm);
PowerMockito.mockStatic(Util.class);
when(Util.getWorld(Mockito.any())).thenReturn(mock(World.class));
}

View File

@ -0,0 +1,100 @@
package us.tastybento.bskyblock.listeners.flags;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
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 us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.api.flags.Flag;
import us.tastybento.bskyblock.api.panels.Panel;
import us.tastybento.bskyblock.api.panels.PanelItem;
import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.managers.FlagsManager;
import us.tastybento.bskyblock.managers.IslandWorldManager;
import us.tastybento.bskyblock.util.Util;
@RunWith(PowerMockRunner.class)
@PrepareForTest({BSkyBlock.class, Util.class })
public class SettingsToggleClickListenerTest {
private IslandWorldManager iwm;
private SettingsToggleClickListener listener;
private Panel panel;
private User user;
private Flag flag;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
// Set up plugin
BSkyBlock plugin = mock(BSkyBlock.class);
Whitebox.setInternalState(BSkyBlock.class, "instance", plugin);
// Island World Manager
iwm = mock(IslandWorldManager.class);
when(iwm.inWorld(Mockito.any())).thenReturn(true);
when(iwm.getPermissionPrefix(Mockito.any())).thenReturn("bskyblock");
when(plugin.getIWM()).thenReturn(iwm);
listener = new SettingsToggleClickListener("test");
panel = mock(Panel.class);
when(panel.getInventory()).thenReturn(mock(Inventory.class));
// Sometimes use Mockito.withSettings().verboseLogging()
user = mock(User.class);
when(user.getWorld()).thenReturn(mock(World.class));
when(user.getLocation()).thenReturn(mock(Location.class));
PowerMockito.mockStatic(Util.class);
when(Util.getWorld(Mockito.any())).thenReturn(mock(World.class));
FlagsManager fm = mock(FlagsManager.class);
flag = mock(Flag.class);
when(flag.isSet(Mockito.any())).thenReturn(false);
PanelItem item = mock(PanelItem.class);
when(item.getItem()).thenReturn(mock(ItemStack.class));
when(flag.toPanelItem(Mockito.any(), Mockito.eq(user))).thenReturn(item);
when(fm.getFlagByID(Mockito.anyString())).thenReturn(flag);
when(plugin.getFlagsManager()).thenReturn(fm);
}
@Test
public void testOnClickWrongWorld() {
when(iwm.inWorld(Mockito.any())).thenReturn(false);
listener.onClick(panel, user, ClickType.LEFT, 0);
Mockito.verify(user).sendMessage("general.errors.wrong-world");
}
@Test
public void testOnClickNoPermission() {
when(user.hasPermission(Mockito.anyString())).thenReturn(false);
listener.onClick(panel, user, ClickType.LEFT, 0);
Mockito.verify(user).sendMessage("general.errors.no-permission");
Mockito.verify(user).sendMessage("general.errors.you-need", "[permission]", "bskyblock.settings.test");
}
@Test
public void testOnClick() {
when(user.hasPermission(Mockito.anyString())).thenReturn(true);
listener.onClick(panel, user, ClickType.LEFT, 0);
Mockito.verify(flag).setSetting(Mockito.any(), Mockito.eq(true));
Mockito.verify(panel).getInventory();
}
}