diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/FlagChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/FlagChangeEvent.java deleted file mode 100644 index 6522dbb2c..000000000 --- a/src/main/java/world/bentobox/bentobox/api/events/island/FlagChangeEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -package world.bentobox.bentobox.api.events.island; - -import java.util.UUID; - -import world.bentobox.bentobox.api.events.IslandBaseEvent; -import world.bentobox.bentobox.api.flags.Flag; -import world.bentobox.bentobox.database.objects.Island; - -/** - * This event is fired when a player changes a flag on his island - *

- * Canceling this event will result in canceling the change. - * - * @author Poslovitch - */ -public class FlagChangeEvent extends IslandBaseEvent { - private final UUID player; - private final Flag editedFlag; - private final boolean setTo; - - /** - * @param island - island - * @param player - the player - * @param editedFlag - flag edited - * @param setTo - new value - */ - public FlagChangeEvent(Island island, UUID player, Flag editedFlag, boolean setTo) { - super(island); - this.player = player; - this.editedFlag = editedFlag; - this.setTo = setTo; - } - - /** - * @return the player - */ - public UUID getPlayer() { - return player; - } - - /** - * @return the edited flag - */ - public Flag getFlag() { - return editedFlag; - } - - /** - * @return enabled/disabled - */ - public boolean getSetTo() { - return setTo; - } -} diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/FlagProtectionChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/FlagProtectionChangeEvent.java new file mode 100644 index 000000000..45a8be460 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/events/island/FlagProtectionChangeEvent.java @@ -0,0 +1,62 @@ +package world.bentobox.bentobox.api.events.island; + +import java.util.UUID; + +import world.bentobox.bentobox.api.events.BentoBoxEvent; +import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.database.objects.Island; + +/** + * @author tastybento + * @since 1.6.0 + */ +public class FlagProtectionChangeEvent extends BentoBoxEvent { + + private final Island island; + private final UUID player; + private final Flag editedFlag; + private final int setTo; + + /** + * Event that fires when an island protection flag is changed + * @param island - island + * @param player - player changing the flag + * @param editedFlag - flag that has changed + * @param setTo - value it was set to + */ + public FlagProtectionChangeEvent(Island island, UUID player, Flag editedFlag, int setTo) { + this.island = island; + this.player = player; + this.editedFlag = editedFlag; + this.setTo = setTo; + } + + /** + * @return the island + */ + public Island getIsland() { + return island; + } + + /** + * @return the player + */ + public UUID getPlayer() { + return player; + } + + /** + * @return the editedFlag + */ + public Flag getEditedFlag() { + return editedFlag; + } + + /** + * @return the setTo + */ + public int getSetTo() { + return setTo; + } + +} diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/FlagSettingChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/FlagSettingChangeEvent.java new file mode 100644 index 000000000..4ddfe93f9 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/events/island/FlagSettingChangeEvent.java @@ -0,0 +1,62 @@ +package world.bentobox.bentobox.api.events.island; + +import java.util.UUID; + +import world.bentobox.bentobox.api.events.BentoBoxEvent; +import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.database.objects.Island; + +/** + * @author tastybento + * @since 1.6.0 + */ +public class FlagSettingChangeEvent extends BentoBoxEvent { + + private final Island island; + private final UUID player; + private final Flag editedFlag; + private final boolean setTo; + + /** + * Event that fires when an island setting flag is changed + * @param island - island + * @param player - player changing the flag + * @param editedFlag - flag that has changed + * @param setTo - value it was set to + */ + public FlagSettingChangeEvent(Island island, UUID player, Flag editedFlag, boolean setTo) { + this.island = island; + this.player = player; + this.editedFlag = editedFlag; + this.setTo = setTo; + } + + /** + * @return the island + */ + public Island getIsland() { + return island; + } + + /** + * @return the player + */ + public UUID getPlayer() { + return player; + } + + /** + * @return the editedFlag + */ + public Flag getEditedFlag() { + return editedFlag; + } + + /** + * @return the setTo + */ + public boolean isSetTo() { + return setTo; + } + +} diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/FlagWorldSettingChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/FlagWorldSettingChangeEvent.java new file mode 100644 index 000000000..5cc026edc --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/events/island/FlagWorldSettingChangeEvent.java @@ -0,0 +1,64 @@ +package world.bentobox.bentobox.api.events.island; + +import java.util.UUID; + +import org.bukkit.World; + +import world.bentobox.bentobox.api.events.BentoBoxEvent; +import world.bentobox.bentobox.api.flags.Flag; + +/** + * @author tastybento + * @since 1.6.0 + */ +public class FlagWorldSettingChangeEvent extends BentoBoxEvent { + + private final World world; + private final UUID player; + private final Flag editedFlag; + private final boolean setTo; + + /** + * Event that fires when a world setting is changed + * @param world - world + * @param player - player changing the flag + * @param editedFlag - flag that has changed + * @param setTo - value it was set to + */ + public FlagWorldSettingChangeEvent(World world, UUID player, Flag editedFlag, boolean setTo) { + this.world = world; + this.player = player; + this.editedFlag = editedFlag; + this.setTo = setTo; + } + + /** + * @return the world + */ + public World getWorld() { + return world; + } + + + /** + * @return the player + */ + public UUID getPlayer() { + return player; + } + + /** + * @return the editedFlag + */ + public Flag getEditedFlag() { + return editedFlag; + } + + /** + * @return the setTo + */ + public boolean isSetTo() { + return setTo; + } + +} diff --git a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java index e1f9051d8..5d19eb241 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java @@ -1,10 +1,12 @@ package world.bentobox.bentobox.api.flags.clicklisteners; +import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.event.inventory.ClickType; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.events.island.FlagProtectionChangeEvent; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; @@ -86,6 +88,8 @@ public class CycleClick implements PanelItem.ClickHandler { island.setFlag(flag, rm.getRankUpValue(currentRank)); } user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_OFF, 1F, 1F); + // Fire event + Bukkit.getPluginManager().callEvent(new FlagProtectionChangeEvent(island, user.getUniqueId(), flag, island.getFlag(flag))); } else if (click.equals(ClickType.RIGHT)) { if (currentRank <= minRank) { island.setFlag(flag, maxRank); @@ -93,6 +97,8 @@ public class CycleClick implements PanelItem.ClickHandler { island.setFlag(flag, rm.getRankDownValue(currentRank)); } user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F); + // Fire event + Bukkit.getPluginManager().callEvent(new FlagProtectionChangeEvent(island, user.getUniqueId(), flag, island.getFlag(flag))); } else if (click.equals(ClickType.SHIFT_LEFT) && user.isOp()) { if (!plugin.getIWM().getHiddenFlags(user.getWorld()).contains(flag.getID())) { invisible = true; @@ -103,8 +109,7 @@ public class CycleClick implements PanelItem.ClickHandler { user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_NOTE_BLOCK_CHIME, 1F, 1F); } // Save changes - plugin.getIWM().getAddon(user.getWorld()).ifPresent(GameModeAddon::saveWorldSettings); - } + plugin.getIWM().getAddon(user.getWorld()).ifPresent(GameModeAddon::saveWorldSettings); } // Apply change to panel panel.getInventory().setItem(slot, flag.toPanelItem(plugin, user, invisible).getItem()); }); diff --git a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClick.java b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClick.java index 7b09fc2a3..1119c03bc 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClick.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClick.java @@ -1,10 +1,12 @@ package world.bentobox.bentobox.api.flags.clicklisteners; +import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.event.inventory.ClickType; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.events.island.FlagSettingChangeEvent; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem.ClickHandler; @@ -72,6 +74,8 @@ public class IslandToggleClick implements ClickHandler { user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F); // Set cooldown island.setCooldown(flag); + // Fire event + Bukkit.getPluginManager().callEvent(new FlagSettingChangeEvent(island, user.getUniqueId(), flag, island.isAllowed(flag))); } // Apply change to panel panel.getInventory().setItem(slot, flag.toPanelItem(plugin, user, invisible).getItem()); diff --git a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClick.java b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClick.java index c8321cfc6..4e16c17a5 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClick.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClick.java @@ -1,10 +1,12 @@ package world.bentobox.bentobox.api.flags.clicklisteners; +import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.event.inventory.ClickType; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.events.island.FlagWorldSettingChangeEvent; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem.ClickHandler; @@ -60,6 +62,8 @@ public class WorldToggleClick implements ClickHandler { // Toggle flag flag.setSetting(user.getWorld(), !flag.isSetForWorld(user.getWorld())); user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F); + // Fire event + Bukkit.getPluginManager().callEvent(new FlagWorldSettingChangeEvent(user.getWorld(), user.getUniqueId(), flag, flag.isSetForWorld(user.getWorld()))); } // Apply change to panel panel.getInventory().setItem(slot, flag.toPanelItem(plugin, user, invisible).getItem()); diff --git a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClickTest.java b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClickTest.java index ea5195ecb..d288fe1d1 100644 --- a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClickTest.java +++ b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClickTest.java @@ -2,9 +2,13 @@ package world.bentobox.bentobox.api.flags.clicklisteners; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.eq; import java.util.Arrays; import java.util.HashSet; @@ -18,10 +22,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; import org.bukkit.scheduler.BukkitScheduler; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; @@ -30,6 +36,7 @@ import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.Settings; +import world.bentobox.bentobox.api.events.island.FlagProtectionChangeEvent; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; @@ -52,16 +59,27 @@ public class CycleClickTest { private static final Integer X = 600; private static final Integer Y = 120; private static final Integer Z = 10000; + @Mock private BentoBox plugin; private UUID uuid; + @Mock private User user; + @Mock private IslandsManager im; + @Mock private Island island; + @Mock private Flag flag; + @Mock private Panel panel; + @Mock private Inventory inv; + @Mock private IslandWorldManager iwm; + @Mock private RanksManager rm; + @Mock + private PluginManager pim; /** * @throws java.lang.Exception - exception @@ -70,7 +88,6 @@ public class CycleClickTest { public void setUp() throws Exception { // Set up plugin - plugin = mock(BentoBox.class); Whitebox.setInternalState(BentoBox.class, "instance", plugin); // World @@ -83,7 +100,6 @@ public class CycleClickTest { // 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(); @@ -91,17 +107,16 @@ public class CycleClickTest { when(user.getPlayer()).thenReturn(p); when(user.getName()).thenReturn("tastybento"); when(user.getWorld()).thenReturn(world); - when(user.hasPermission(Mockito.anyString())).thenReturn(true); + when(user.hasPermission(anyString())).thenReturn(true); // No island for player to begin with (set it later in the tests) - im = mock(IslandsManager.class); - when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(false); - when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(false); + when(im.hasIsland(any(), eq(uuid))).thenReturn(false); + when(im.isOwner(any(), eq(uuid))).thenReturn(false); when(plugin.getIslands()).thenReturn(im); // Has team PlayersManager pm = mock(PlayersManager.class); - when(im.inTeam(Mockito.any(), Mockito.eq(uuid))).thenReturn(true); + when(im.inTeam(any(), eq(uuid))).thenReturn(true); when(plugin.getPlayers()).thenReturn(pm); // Server & Scheduler @@ -119,9 +134,8 @@ public class CycleClickTest { when(plugin.getNotifier()).thenReturn(notifier); // Island Banned list initialization - island = mock(Island.class); when(island.getBanned()).thenReturn(new HashSet<>()); - when(island.isBanned(Mockito.any())).thenReturn(false); + when(island.isBanned(any())).thenReturn(false); Location loc = mock(Location.class); when(loc.getWorld()).thenReturn(world); when(loc.getBlockX()).thenReturn(X); @@ -130,11 +144,11 @@ public class CycleClickTest { when(island.getCenter()).thenReturn(loc); when(island.getProtectionRange()).thenReturn(PROTECTION_RANGE); // Island is not locked by default - when(island.isAllowed(Mockito.any(), Mockito.any())).thenReturn(true); + when(island.isAllowed(any(), any())).thenReturn(true); // Island owner is user by default when(island.getOwner()).thenReturn(uuid); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island); + when(im.getIsland(any(), any(UUID.class))).thenReturn(island); // Common from to's Location outside = mock(Location.class); @@ -156,49 +170,48 @@ public class CycleClickTest { when(inside.getBlockZ()).thenReturn(Z); Optional 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()); - when(im.getIslandAt(Mockito.any())).thenReturn(opIsland); + when(im.getProtectedIslandAt(eq(inside))).thenReturn(opIsland); + when(im.getProtectedIslandAt(eq(inside2))).thenReturn(opIsland); + when(im.getProtectedIslandAt(eq(outside))).thenReturn(Optional.empty()); + when(im.getIslandAt(any())).thenReturn(opIsland); PanelItem panelItem = mock(PanelItem.class); - flag = mock(Flag.class); - when(flag.toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false))).thenReturn(panelItem); + when(flag.toPanelItem(any(), any(), eq(false))).thenReturn(panelItem); when(panelItem.getItem()).thenReturn(mock(ItemStack.class)); FlagsManager fm = mock(FlagsManager.class); - when(fm.getFlag(Mockito.anyString())).thenReturn(Optional.of(flag)); + when(fm.getFlag(anyString())).thenReturn(Optional.of(flag)); when(plugin.getFlagsManager()).thenReturn(fm); - rm = mock(RanksManager.class); - + // Ranks Manager when(plugin.getRanksManager()).thenReturn(rm); // Provide a current rank value - member - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.MEMBER_RANK); // Set up up and down ranks - when(rm.getRankUpValue(Mockito.eq(RanksManager.VISITOR_RANK))).thenReturn(RanksManager.COOP_RANK); - when(rm.getRankUpValue(Mockito.eq(RanksManager.COOP_RANK))).thenReturn(RanksManager.TRUSTED_RANK); - when(rm.getRankUpValue(Mockito.eq(RanksManager.TRUSTED_RANK))).thenReturn(RanksManager.MEMBER_RANK); - when(rm.getRankUpValue(Mockito.eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.OWNER_RANK); - when(rm.getRankDownValue(Mockito.eq(RanksManager.OWNER_RANK))).thenReturn(RanksManager.MEMBER_RANK); - when(rm.getRankDownValue(Mockito.eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.TRUSTED_RANK); - when(rm.getRankDownValue(Mockito.eq(RanksManager.TRUSTED_RANK))).thenReturn(RanksManager.COOP_RANK); - when(rm.getRankDownValue(Mockito.eq(RanksManager.COOP_RANK))).thenReturn(RanksManager.VISITOR_RANK); + when(rm.getRankUpValue(eq(RanksManager.VISITOR_RANK))).thenReturn(RanksManager.COOP_RANK); + when(rm.getRankUpValue(eq(RanksManager.COOP_RANK))).thenReturn(RanksManager.TRUSTED_RANK); + when(rm.getRankUpValue(eq(RanksManager.TRUSTED_RANK))).thenReturn(RanksManager.MEMBER_RANK); + when(rm.getRankUpValue(eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.OWNER_RANK); + when(rm.getRankDownValue(eq(RanksManager.OWNER_RANK))).thenReturn(RanksManager.MEMBER_RANK); + when(rm.getRankDownValue(eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.TRUSTED_RANK); + when(rm.getRankDownValue(eq(RanksManager.TRUSTED_RANK))).thenReturn(RanksManager.COOP_RANK); + when(rm.getRankDownValue(eq(RanksManager.COOP_RANK))).thenReturn(RanksManager.VISITOR_RANK); - panel = mock(Panel.class); - inv = mock(Inventory.class); + // Panel when(panel.getInventory()).thenReturn(inv); // IslandWorldManager - iwm = mock(IslandWorldManager.class); when(plugin.getIWM()).thenReturn(iwm); when(iwm.inWorld(any(World.class))).thenReturn(true); when(iwm.inWorld(any(Location.class))).thenReturn(true); - when(iwm.getPermissionPrefix(Mockito.any())).thenReturn("bskyblock"); + when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock"); // Util PowerMockito.mockStatic(Util.class); - when(Util.getWorld(Mockito.any())).thenReturn(world); + when(Util.getWorld(any())).thenReturn(world); + + // Event + when(Bukkit.getPluginManager()).thenReturn(pim); } @@ -208,15 +221,15 @@ public class CycleClickTest { when(iwm.inWorld(any(Location.class))).thenReturn(false); CycleClick udc = new CycleClick("LOCK"); assertTrue(udc.onClick(panel, user, ClickType.LEFT, 5)); - Mockito.verify(user).sendMessage(Mockito.eq("general.errors.wrong-world")); + verify(user).sendMessage(eq("general.errors.wrong-world")); } @Test public void testNoPremission() { - when(user.hasPermission(Mockito.anyString())).thenReturn(false); + when(user.hasPermission(anyString())).thenReturn(false); CycleClick udc = new CycleClick("LOCK"); assertTrue(udc.onClick(panel, user, ClickType.LEFT, 5)); - Mockito.verify(user).sendMessage(Mockito.eq("general.errors.no-permission"), Mockito.eq("[permission]"), Mockito.eq("bskyblock.settings.LOCK")); + verify(user).sendMessage(eq("general.errors.no-permission"), eq("[permission]"), eq("bskyblock.settings.LOCK")); } @Test @@ -232,37 +245,39 @@ public class CycleClickTest { // Rank starts at member // Click left assertTrue(udc.onClick(panel, user, ClickType.LEFT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.OWNER_RANK)); - Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.OWNER_RANK)); + verify(flag).toPanelItem(any(), any(), eq(false)); + verify(inv).setItem(eq(SLOT), any()); // Check rollover // Clicking when Owner should go to Visitor - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.OWNER_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.OWNER_RANK); assertTrue(udc.onClick(panel, user, ClickType.LEFT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.VISITOR_RANK)); - Mockito.verify(flag, Mockito.times(2)).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.VISITOR_RANK)); + verify(flag, times(2)).toPanelItem(any(), any(), eq(false)); + verify(inv, times(2)).setItem(eq(SLOT), any()); + verify(pim, times(2)).callEvent(any(FlagProtectionChangeEvent.class)); } @Test public void testOnLeftClickSetMinMax() { // Provide a current rank value - coop - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.COOP_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.COOP_RANK); final int SLOT = 5; CycleClick udc = new CycleClick("LOCK", RanksManager.COOP_RANK, RanksManager.MEMBER_RANK); // Rank starts at member // Click left assertTrue(udc.onClick(panel, user, ClickType.LEFT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.TRUSTED_RANK)); - Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.TRUSTED_RANK)); + verify(flag).toPanelItem(any(), any(), eq(false)); + verify(inv).setItem(eq(SLOT), any()); // Check rollover // Clicking when Member should go to Coop - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.MEMBER_RANK); assertTrue(udc.onClick(panel, user, ClickType.LEFT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.COOP_RANK)); - Mockito.verify(flag, Mockito.times(2)).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.COOP_RANK)); + verify(flag, times(2)).toPanelItem(any(), any(), eq(false)); + verify(inv, times(2)).setItem(eq(SLOT), any()); + verify(pim, times(2)).callEvent(any(FlagProtectionChangeEvent.class)); } @Test @@ -272,37 +287,39 @@ public class CycleClickTest { // Rank starts at member // Right click - down rank to Trusted assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.TRUSTED_RANK)); - Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.TRUSTED_RANK)); + verify(flag).toPanelItem(any(), any(), eq(false)); + verify(inv).setItem(eq(SLOT), any()); // Check rollover // Clicking when Visitor should go to Owner - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.VISITOR_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.VISITOR_RANK); assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.OWNER_RANK)); - Mockito.verify(flag, Mockito.times(2)).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.OWNER_RANK)); + verify(flag, times(2)).toPanelItem(any(), any(), eq(false)); + verify(inv, times(2)).setItem(eq(SLOT), any()); + verify(pim, times(2)).callEvent(any(FlagProtectionChangeEvent.class)); } @Test public void testOnRightClickMinMaxSet() { // Provide a current rank value - coop - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.TRUSTED_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.TRUSTED_RANK); final int SLOT = 5; CycleClick udc = new CycleClick("LOCK", RanksManager.COOP_RANK, RanksManager.MEMBER_RANK); // Rank starts at member // Right click assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.COOP_RANK)); - Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.COOP_RANK)); + verify(flag).toPanelItem(any(), any(), eq(false)); + verify(inv).setItem(eq(SLOT), any()); // Check rollover // Clicking when Coop should go to Member - when(island.getFlag(Mockito.any())).thenReturn(RanksManager.COOP_RANK); + when(island.getFlag(any())).thenReturn(RanksManager.COOP_RANK); assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT)); - Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.MEMBER_RANK)); - Mockito.verify(flag, Mockito.times(2)).toPanelItem(Mockito.any(), Mockito.any(), Mockito.eq(false)); - Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any()); + verify(island).setFlag(eq(flag), eq(RanksManager.MEMBER_RANK)); + verify(flag, times(2)).toPanelItem(any(), any(), eq(false)); + verify(inv, times(2)).setItem(eq(SLOT), any()); + verify(pim, times(2)).callEvent(any(FlagProtectionChangeEvent.class)); } @Test @@ -310,6 +327,7 @@ public class CycleClickTest { // Test all possible click types CycleClick udc = new CycleClick("LOCK"); Arrays.asList(ClickType.values()).forEach(c -> assertTrue(udc.onClick(panel, user, c, 0))); + verify(pim, times(2)).callEvent(any(FlagProtectionChangeEvent.class)); } @Test @@ -317,14 +335,14 @@ public class CycleClickTest { UUID u = UUID.randomUUID(); when(island.getOwner()).thenReturn(u); - Mockito.verify(plugin, Mockito.never()).getRanksManager(); + verify(plugin, Mockito.never()).getRanksManager(); } @Test public void testNullIsland() { - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(null); - Mockito.verify(plugin, Mockito.never()).getRanksManager(); + when(im.getIsland(any(), any(UUID.class))).thenReturn(null); + verify(plugin, Mockito.never()).getRanksManager(); } } diff --git a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClickTest.java b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClickTest.java index 5259423a6..f9e1e4130 100644 --- a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClickTest.java +++ b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/IslandToggleClickTest.java @@ -2,20 +2,25 @@ package world.bentobox.bentobox.api.flags.clicklisteners; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; 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.inventory.ClickType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; @@ -23,6 +28,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.events.island.FlagSettingChangeEvent; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; @@ -34,17 +40,25 @@ import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; @RunWith(PowerMockRunner.class) -@PrepareForTest({BentoBox.class, Util.class }) +@PrepareForTest({Bukkit.class, BentoBox.class, Util.class }) public class IslandToggleClickTest { + @Mock private IslandWorldManager iwm; private IslandToggleClick listener; + @Mock private Panel panel; + @Mock private User user; + @Mock private Flag flag; + @Mock private IslandsManager im; + @Mock private Island island; private UUID uuid; + @Mock + private PluginManager pim; /** * @throws java.lang.Exception @@ -59,12 +73,12 @@ public class IslandToggleClickTest { iwm = mock(IslandWorldManager.class); when(iwm.inWorld(any(World.class))).thenReturn(true); when(iwm.inWorld(any(Location.class))).thenReturn(true); - when(iwm.getPermissionPrefix(Mockito.any())).thenReturn("bskyblock"); + when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock"); when(plugin.getIWM()).thenReturn(iwm); listener = new IslandToggleClick("test"); - panel = mock(Panel.class); + // Panel when(panel.getInventory()).thenReturn(mock(Inventory.class)); // Sometimes use Mockito.withSettings().verboseLogging() user = mock(User.class); @@ -75,28 +89,28 @@ public class IslandToggleClickTest { uuid = UUID.randomUUID(); when(user.getUniqueId()).thenReturn(uuid); PowerMockito.mockStatic(Util.class); - when(Util.getWorld(Mockito.any())).thenReturn(mock(World.class)); + when(Util.getWorld(any())).thenReturn(mock(World.class)); FlagsManager fm = mock(FlagsManager.class); - flag = mock(Flag.class); - when(flag.isSetForWorld(Mockito.any())).thenReturn(false); + when(flag.isSetForWorld(any())).thenReturn(false); PanelItem item = mock(PanelItem.class); when(item.getItem()).thenReturn(mock(ItemStack.class)); - when(flag.toPanelItem(Mockito.any(), Mockito.eq(user), Mockito.eq(false))).thenReturn(item); + when(flag.toPanelItem(any(), Mockito.eq(user), Mockito.eq(false))).thenReturn(item); when(fm.getFlag(Mockito.anyString())).thenReturn(Optional.of(flag)); when(plugin.getFlagsManager()).thenReturn(fm); // Island Manager - im = mock(IslandsManager.class); - island = mock(Island.class); when(island.getOwner()).thenReturn(uuid); - when(im.getIsland(Mockito.any(World.class), Mockito.any(User.class))).thenReturn(island); + when(im.getIsland(any(World.class), any(User.class))).thenReturn(island); when(plugin.getIslands()).thenReturn(im); // Optional island Optional opIsland = Optional.ofNullable(island); - when(im.getIslandAt(Mockito.any())).thenReturn(opIsland); + when(im.getIslandAt(any())).thenReturn(opIsland); + // Event + PowerMockito.mockStatic(Bukkit.class); + when(Bukkit.getPluginManager()).thenReturn(pim); } @Test @@ -104,28 +118,29 @@ public class IslandToggleClickTest { when(iwm.inWorld(any(World.class))).thenReturn(false); when(iwm.inWorld(any(Location.class))).thenReturn(false); listener.onClick(panel, user, ClickType.LEFT, 0); - Mockito.verify(user).sendMessage("general.errors.wrong-world"); + 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", "[permission]", "bskyblock.settings.test"); + verify(user).sendMessage("general.errors.no-permission", "[permission]", "bskyblock.settings.test"); } @Test public void testOnClick() { listener.onClick(panel, user, ClickType.LEFT, 0); - Mockito.verify(island).toggleFlag(flag); + verify(island).toggleFlag(flag); + verify(pim).callEvent(any(FlagSettingChangeEvent.class)); } @Test public void testOnClickNoIsland() { - when(im.getIslandAt(Mockito.any())).thenReturn(Optional.empty()); - when(im.getIsland(Mockito.any(), Mockito.any(User.class))).thenReturn(null); + when(im.getIslandAt(any())).thenReturn(Optional.empty()); + when(im.getIsland(any(), any(User.class))).thenReturn(null); listener.onClick(panel, user, ClickType.LEFT, 0); - Mockito.verify(island, Mockito.never()).toggleFlag(flag); + verify(island, never()).toggleFlag(flag); } @Test @@ -137,7 +152,7 @@ public class IslandToggleClickTest { } when(island.getOwner()).thenReturn(u); listener.onClick(panel, user, ClickType.LEFT, 0); - Mockito.verify(island, Mockito.never()).toggleFlag(flag); + verify(island, never()).toggleFlag(flag); } } diff --git a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClickTest.java b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClickTest.java index 93429d813..b55ca913d 100644 --- a/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClickTest.java +++ b/src/test/java/world/bentobox/bentobox/api/flags/clicklisteners/WorldToggleClickTest.java @@ -3,15 +3,18 @@ package world.bentobox.bentobox.api.flags.clicklisteners; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; import java.util.Optional; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,6 +27,7 @@ import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.events.island.FlagWorldSettingChangeEvent; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; @@ -33,7 +37,7 @@ import world.bentobox.bentobox.managers.IslandWorldManager; import world.bentobox.bentobox.util.Util; @RunWith(PowerMockRunner.class) -@PrepareForTest({BentoBox.class, Util.class }) +@PrepareForTest({Bukkit.class, BentoBox.class, Util.class }) public class WorldToggleClickTest { @Mock @@ -46,6 +50,8 @@ public class WorldToggleClickTest { private Flag flag; @Mock private GameModeAddon addon; + @Mock + private PluginManager pim; /** * @throws java.lang.Exception @@ -89,6 +95,10 @@ public class WorldToggleClickTest { when(flag.toPanelItem(Mockito.any(), Mockito.eq(user), Mockito.eq(false))).thenReturn(item); when(fm.getFlag(Mockito.anyString())).thenReturn(Optional.of(flag)); when(plugin.getFlagsManager()).thenReturn(fm); + + // Event + PowerMockito.mockStatic(Bukkit.class); + when(Bukkit.getPluginManager()).thenReturn(pim); } @Test @@ -96,24 +106,25 @@ public class WorldToggleClickTest { when(iwm.inWorld(any(World.class))).thenReturn(false); when(iwm.inWorld(any(Location.class))).thenReturn(false); listener.onClick(panel, user, ClickType.LEFT, 0); - Mockito.verify(user).sendMessage("general.errors.wrong-world"); - Mockito.verify(addon, Mockito.never()).saveWorldSettings(); + verify(user).sendMessage("general.errors.wrong-world"); + verify(addon, Mockito.never()).saveWorldSettings(); } @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", "[permission]", "bskyblock.admin.world.settings.test"); - Mockito.verify(addon, Mockito.never()).saveWorldSettings(); + verify(user).sendMessage("general.errors.no-permission", "[permission]", "bskyblock.admin.world.settings.test"); + verify(addon, Mockito.never()).saveWorldSettings(); } @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(); - Mockito.verify(addon).saveWorldSettings(); + verify(flag).setSetting(Mockito.any(), Mockito.eq(true)); + verify(panel).getInventory(); + verify(addon).saveWorldSettings(); + verify(pim).callEvent(any(FlagWorldSettingChangeEvent.class)); } }