From 1fb13830886eab9686b00a5da32b7aa92a558aa7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 11 Dec 2025 16:35:03 -0800 Subject: [PATCH 1/9] Version 4.6.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fc69750..0cfa3c3 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ ${build.version}-SNAPSHOT - 4.5.1 + 4.6.0 -LOCAL BentoBoxWorld_Border From 5f469510cb98e6fc9e30a467363b2b5583a74f10 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 11 Dec 2025 17:25:17 -0800 Subject: [PATCH 2/9] Update to Mockito 5. Remove PowerMockito. --- pom.xml | 85 ++-- .../bentobox/border/CommonTestSetup.java | 310 +++++++++++++ .../world/bentobox/border/SettingsTest.java | 12 +- .../bentobox/border/TestWorldSettings.java | 409 ++++++++++++++++++ .../java/world/bentobox/border/WhiteBox.java | 26 ++ .../commands/BorderTypeCommandTest.java | 62 +-- .../commands/IslandBorderCommandTest.java | 62 +-- .../border/listeners/PlayerListenerTest.java | 82 ++-- .../border/listeners/ShowBarrierTest.java | 89 ++-- .../listeners/ShowVirtualWorldBorderTest.java | 59 ++- 10 files changed, 931 insertions(+), 265 deletions(-) create mode 100644 src/test/java/world/bentobox/border/CommonTestSetup.java create mode 100644 src/test/java/world/bentobox/border/TestWorldSettings.java create mode 100644 src/test/java/world/bentobox/border/WhiteBox.java diff --git a/pom.xml b/pom.xml index 0cfa3c3..8ee988e 100644 --- a/pom.xml +++ b/pom.xml @@ -42,11 +42,12 @@ UTF-8 UTF-8 - 17 - 2.0.9 + 21 + 5.10.2 + 5.11.0 - 1.21.3-R0.1-SNAPSHOT - 2.7.1-SNAPSHOT + 1.21.10-R0.1-SNAPSHOT + 3.10.0 ${build.version}-SNAPSHOT @@ -102,8 +103,12 @@ - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots + jitpack.io + https://jitpack.io + + + papermc + https://repo.papermc.io/repository/maven-public/ bentoboxworld @@ -120,29 +125,42 @@ - - - org.javassist - javassist - 3.30.2-GA - - - org.powermock - powermock-module-junit4 - ${powermock.version} + com.github.MockBukkit + MockBukkit + v1.21-SNAPSHOT test - + - org.powermock - powermock-api-mockito2 - ${powermock.version} - test + io.papermc.paper + paper-api + ${paper.version} + provided + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.mockito + mockito-junit-jupiter + 5.11.0 + test + org.mockito mockito-core - 3.11.1 + ${mockito.version} test @@ -151,13 +169,6 @@ ${bentobox.version} provided - - - org.spigotmc - spigot-api - ${spigot.version} - provided - @@ -191,12 +202,12 @@ org.apache.maven.plugins maven-clean-plugin - 3.1.0 + 3.5.0 org.apache.maven.plugins maven-compiler-plugin - 3.7.0 + 3.14.1 ${java.version} @@ -204,7 +215,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M5 + 3.5.4 ${argLine} @@ -241,12 +252,12 @@ org.apache.maven.plugins maven-jar-plugin - 3.1.0 + 3.5.0 org.apache.maven.plugins maven-source-plugin - 3.0.1 + 3.4.0 attach-sources @@ -259,17 +270,17 @@ org.apache.maven.plugins maven-install-plugin - 2.5.2 + 3.1.4 org.apache.maven.plugins maven-deploy-plugin - 2.8.2 + 3.1.4 org.jacoco jacoco-maven-plugin - 0.8.10 + 0.8.14 true diff --git a/src/test/java/world/bentobox/border/CommonTestSetup.java b/src/test/java/world/bentobox/border/CommonTestSetup.java new file mode 100644 index 0000000..c3efbb8 --- /dev/null +++ b/src/test/java/world/bentobox/border/CommonTestSetup.java @@ -0,0 +1,310 @@ +package world.bentobox.border; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Player.Spigot; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.inventory.ItemFactory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.Nullable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import com.google.common.collect.ImmutableSet; + +import net.md_5.bungee.api.chat.TextComponent; +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.configuration.WorldSettings; +import world.bentobox.bentobox.api.user.Notifier; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.database.objects.Players; +import world.bentobox.bentobox.managers.BlueprintsManager; +import world.bentobox.bentobox.managers.FlagsManager; +import world.bentobox.bentobox.managers.HooksManager; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.IslandsManager; +import world.bentobox.bentobox.managers.LocalesManager; +import world.bentobox.bentobox.managers.PlaceholdersManager; +import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.util.Util; + +/** + * Common items for testing. Don't forget to use super.setUp()! + *

+ * Sets up BentoBox plugin, pluginManager and ItemFactory. + * Location, world, playersManager and player. + * IWM, Addon and WorldSettings. IslandManager with one + * island with protection and nothing allowed by default. + * Owner of island is player with same UUID. + * Locales, placeholders. + * @author tastybento + * + */ +public abstract class CommonTestSetup { + + protected UUID uuid = UUID.randomUUID(); + + @Mock + protected Player mockPlayer; + @Mock + protected PluginManager pim; + @Mock + protected ItemFactory itemFactory; + @Mock + protected Location location; + @Mock + protected World world; + @Mock + protected IslandWorldManager iwm; + @Mock + protected IslandsManager im; + @Mock + protected Island island; + @Mock + protected BentoBox plugin; + @Mock + protected PlayerInventory inv; + @Mock + protected Notifier notifier; + @Mock + protected FlagsManager fm; + @Mock + protected Spigot spigot; + @Mock + protected HooksManager hooksManager; + @Mock + protected BlueprintsManager bm; + + protected ServerMock server; + + protected MockedStatic mockedBukkit; + protected MockedStatic mockedUtil; + + protected AutoCloseable closeable; + + @Mock + protected BukkitScheduler sch; + @Mock + protected LocalesManager lm; + + @Mock + protected PlaceholdersManager phm; + + + @BeforeEach + public void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + // Processes the @Mock annotations and initializes the field + closeable = MockitoAnnotations.openMocks(this); + server = MockBukkit.mock(); + // Bukkit + // Set up plugin + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); + + // Register the static mock + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getMinecraftVersion).thenReturn("1.21.10"); + mockedBukkit.when(Bukkit::getBukkitVersion).thenReturn(""); + mockedBukkit.when(Bukkit::getPluginManager).thenReturn(pim); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(itemFactory); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + // Location + when(location.getWorld()).thenReturn(world); + when(location.getBlockX()).thenReturn(0); + when(location.getBlockY()).thenReturn(0); + when(location.getBlockZ()).thenReturn(0); + when(location.toVector()).thenReturn(new Vector(0,0,0)); + when(location.clone()).thenReturn(location); // Paper + + // Players Manager and meta data + PlayersManager pm = mock(PlayersManager.class); + when(plugin.getPlayers()).thenReturn(pm); + Players players = mock(Players.class); + when(players.getMetaData()).thenReturn(Optional.empty()); + when(pm.getPlayer(any(UUID.class))).thenReturn(players); + + // Player + when(mockPlayer.getUniqueId()).thenReturn(uuid); + when(mockPlayer.getLocation()).thenReturn(location); + when(mockPlayer.getWorld()).thenReturn(world); + when(mockPlayer.getName()).thenReturn("tastybento"); + when(mockPlayer.getInventory()).thenReturn(inv); + when(mockPlayer.spigot()).thenReturn(spigot); + when(mockPlayer.getType()).thenReturn(EntityType.PLAYER); + when(mockPlayer.getWorld()).thenReturn(world); + + User.setPlugin(plugin); + User.clearUsers(); + User.getInstance(mockPlayer); + + // IWM + when(plugin.getIWM()).thenReturn(iwm); + when(iwm.inWorld(any(Location.class))).thenReturn(true); + when(iwm.inWorld(any(World.class))).thenReturn(true); + when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); + // Addon + when(iwm.getAddon(any())).thenReturn(Optional.empty()); + + // World Settings + WorldSettings worldSet = new TestWorldSettings(); + when(iwm.getWorldSettings(any())).thenReturn(worldSet); + + // Island Manager + when(plugin.getIslands()).thenReturn(im); + Optional optionalIsland = Optional.of(island); + when(im.getProtectedIslandAt(any())).thenReturn(optionalIsland); + + // Island - nothing is allowed by default + when(island.isAllowed(any())).thenReturn(false); + when(island.isAllowed(any(User.class), any())).thenReturn(false); + when(island.getOwner()).thenReturn(uuid); + when(island.getMemberSet()).thenReturn(ImmutableSet.of(uuid)); + + // Enable reporting from Flags class + MetadataValue mdv = new FixedMetadataValue(plugin, "_why_debug"); + when(mockPlayer.getMetadata(anyString())).thenReturn(Collections.singletonList(mdv)); + + // Locales & Placeholders + when(lm.get(any(), any())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); + when(plugin.getPlaceholdersManager()).thenReturn(phm); + when(phm.replacePlaceholders(any(), any())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); + when(plugin.getLocalesManager()).thenReturn(lm); + // Notifier + when(plugin.getNotifier()).thenReturn(notifier); + + // Fake players + world.bentobox.bentobox.Settings settings = new world.bentobox.bentobox.Settings(); + when(plugin.getSettings()).thenReturn(settings); + + //Util + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(mock(World.class)); + Util.setPlugin(plugin); + + // Util + mockedUtil.when(() -> Util.findFirstMatchingEnum(any(), any())).thenCallRealMethod(); + // Util translate color codes (used in user translate methods) + //mockedUtil.when(() -> translateColorCodes(anyString())).thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); + + // Server & Scheduler + mockedBukkit.when(Bukkit::getScheduler).thenReturn(sch); + + // Hooks + when(hooksManager.getHook(anyString())).thenReturn(Optional.empty()); + when(plugin.getHooks()).thenReturn(hooksManager); + + // Blueprints Manager + when(plugin.getBlueprintsManager()).thenReturn(bm); + } + + /** + * @throws Exception + */ + @AfterEach + public void tearDown() throws Exception { + // IMPORTANT: Explicitly close the mock to prevent leakage + mockedBukkit.closeOnDemand(); + mockedUtil.closeOnDemand(); + closeable.close(); + MockBukkit.unmock(); + User.clearUsers(); + Mockito.framework().clearInlineMocks(); + deleteAll(new File("database")); + deleteAll(new File("database_backup")); + } + + protected static void deleteAll(File file) throws IOException { + if (file.exists()) { + Files.walk(file.toPath()).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } + + } + + /** + * Check that spigot sent the message + * @param message - message to check + */ + public void checkSpigotMessage(String expectedMessage) { + checkSpigotMessage(expectedMessage, 1); + } + + @SuppressWarnings("deprecation") + public void checkSpigotMessage(String expectedMessage, int expectedOccurrences) { + // Capture the argument passed to spigot().sendMessage(...) if messages are sent + ArgumentCaptor captor = ArgumentCaptor.forClass(TextComponent.class); + + // Verify that sendMessage() was called at least 0 times (capture any sent messages) + verify(spigot, atLeast(0)).sendMessage(captor.capture()); + + // Get all captured TextComponents + List capturedMessages = captor.getAllValues(); + + // Count the number of occurrences of the expectedMessage in the captured messages + long actualOccurrences = capturedMessages.stream().map(component -> component.toLegacyText()) // Convert each TextComponent to plain text + .filter(messageText -> messageText.contains(expectedMessage)) // Check if the message contains the expected text + .count(); // Count how many times the expected message appears + + // Assert that the number of occurrences matches the expectedOccurrences + assertEquals(expectedOccurrences, + actualOccurrences, "Expected message occurrence mismatch: " + expectedMessage); + } + + /** + * Get the exploded event + * @param entity + * @param l + * @param list + * @return + */ + public EntityExplodeEvent getExplodeEvent(Entity entity, Location l, List list) { + //return new EntityExplodeEvent(entity, l, list, 0, null); + return new EntityExplodeEvent(entity, l, list, 0, null); + } + + public PlayerDeathEvent getPlayerDeathEvent(Player player, List drops, int droppedExp, int newExp, + int newTotalExp, int newLevel, @Nullable String deathMessage) { + //Technically this null is not allowed, but it works right now + return new PlayerDeathEvent(player, null, drops, droppedExp, newExp, + newTotalExp, newLevel, deathMessage); + } + +} diff --git a/src/test/java/world/bentobox/border/SettingsTest.java b/src/test/java/world/bentobox/border/SettingsTest.java index a98c8ec..6f655e2 100644 --- a/src/test/java/world/bentobox/border/SettingsTest.java +++ b/src/test/java/world/bentobox/border/SettingsTest.java @@ -1,13 +1,13 @@ package world.bentobox.border; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Collections; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * @author tastybento @@ -20,7 +20,7 @@ public class SettingsTest { /** * @throws java.lang.Exception */ - @Before + @BeforeEach public void setUp() throws Exception { settings = new Settings(); } diff --git a/src/test/java/world/bentobox/border/TestWorldSettings.java b/src/test/java/world/bentobox/border/TestWorldSettings.java new file mode 100644 index 0000000..b447e88 --- /dev/null +++ b/src/test/java/world/bentobox/border/TestWorldSettings.java @@ -0,0 +1,409 @@ +package world.bentobox.border; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.bukkit.Difficulty; +import org.bukkit.GameMode; +import org.bukkit.entity.EntityType; +import org.eclipse.jdt.annotation.NonNull; + +import world.bentobox.bentobox.api.configuration.WorldSettings; +import world.bentobox.bentobox.api.flags.Flag; + +/** + * Class for tests that require world settings + * @author tastybento + * + */ +public class TestWorldSettings implements WorldSettings { + + private long epoch; + + @Override + public GameMode getDefaultGameMode() { + + return GameMode.SURVIVAL; + } + + @Override + public Map getDefaultIslandFlags() { + + return Collections.emptyMap(); + } + + @Override + public Map getDefaultIslandSettings() { + + return Collections.emptyMap(); + } + + @Override + public Difficulty getDifficulty() { + + return Difficulty.EASY; + } + + @Override + public void setDifficulty(Difficulty difficulty) { + + + } + + @Override + public String getFriendlyName() { + + return "friendly_name"; + } + + @Override + public int getIslandDistance() { + + return 0; + } + + @Override + public int getIslandHeight() { + + return 0; + } + + @Override + public int getIslandProtectionRange() { + + return 0; + } + + @Override + public int getIslandStartX() { + + return 0; + } + + @Override + public int getIslandStartZ() { + + return 0; + } + + @Override + public int getIslandXOffset() { + + return 0; + } + + @Override + public int getIslandZOffset() { + + return 0; + } + + @Override + public List getIvSettings() { + + return Collections.emptyList(); + } + + @Override + public int getMaxHomes() { + + return 3; + } + + @Override + public int getMaxIslands() { + + return 0; + } + + @Override + public int getMaxTeamSize() { + + return 4; + } + + @Override + public int getNetherSpawnRadius() { + + return 10; + } + + @Override + public String getPermissionPrefix() { + + return "perm."; + } + + @Override + public Set getRemoveMobsWhitelist() { + + return Collections.emptySet(); + } + + @Override + public int getSeaHeight() { + + return 0; + } + + @Override + public List getHiddenFlags() { + + return Collections.emptyList(); + } + + @Override + public List getVisitorBannedCommands() { + + return Collections.emptyList(); + } + + @Override + public Map getWorldFlags() { + + return Collections.emptyMap(); + } + + @Override + public String getWorldName() { + + return "world_name"; + } + + @Override + public boolean isDragonSpawn() { + + return false; + } + + @Override + public boolean isEndGenerate() { + + return true; + } + + @Override + public boolean isEndIslands() { + + return true; + } + + @Override + public boolean isNetherGenerate() { + + return true; + } + + @Override + public boolean isNetherIslands() { + + return true; + } + + @Override + public boolean isOnJoinResetEnderChest() { + + return false; + } + + @Override + public boolean isOnJoinResetInventory() { + + return false; + } + + @Override + public boolean isOnJoinResetMoney() { + + return false; + } + + @Override + public boolean isOnJoinResetHealth() { + + return false; + } + + @Override + public boolean isOnJoinResetHunger() { + + return false; + } + + @Override + public boolean isOnJoinResetXP() { + + return false; + } + + @Override + public @NonNull List getOnJoinCommands() { + + return Collections.emptyList(); + } + + @Override + public boolean isOnLeaveResetEnderChest() { + + return false; + } + + @Override + public boolean isOnLeaveResetInventory() { + + return false; + } + + @Override + public boolean isOnLeaveResetMoney() { + + return false; + } + + @Override + public boolean isOnLeaveResetHealth() { + + return false; + } + + @Override + public boolean isOnLeaveResetHunger() { + + return false; + } + + @Override + public boolean isOnLeaveResetXP() { + + return false; + } + + @Override + public @NonNull List getOnLeaveCommands() { + + return Collections.emptyList(); + } + + @Override + public boolean isUseOwnGenerator() { + + return false; + } + + @Override + public boolean isWaterUnsafe() { + + return false; + } + + @Override + public List getGeoLimitSettings() { + + return Collections.emptyList(); + } + + @Override + public int getResetLimit() { + + return 0; + } + + @Override + public long getResetEpoch() { + + return epoch; + } + + @Override + public void setResetEpoch(long timestamp) { + this.epoch = timestamp; + + } + + @Override + public boolean isTeamJoinDeathReset() { + + return false; + } + + @Override + public int getDeathsMax() { + + return 0; + } + + @Override + public boolean isDeathsCounted() { + + return true; + } + + @Override + public boolean isDeathsResetOnNewIsland() { + + return true; + } + + @Override + public boolean isAllowSetHomeInNether() { + + return false; + } + + @Override + public boolean isAllowSetHomeInTheEnd() { + + return false; + } + + @Override + public boolean isRequireConfirmationToSetHomeInNether() { + + return false; + } + + @Override + public boolean isRequireConfirmationToSetHomeInTheEnd() { + + return false; + } + + @Override + public int getBanLimit() { + + return 10; + } + + @Override + public boolean isLeaversLoseReset() { + + return true; + } + + @Override + public boolean isKickedKeepInventory() { + + return true; + } + + @Override + public boolean isCreateIslandOnFirstLoginEnabled() { + + return false; + } + + @Override + public int getCreateIslandOnFirstLoginDelay() { + + return 0; + } + + @Override + public boolean isCreateIslandOnFirstLoginAbortOnLogout() { + + return false; + } + +} diff --git a/src/test/java/world/bentobox/border/WhiteBox.java b/src/test/java/world/bentobox/border/WhiteBox.java new file mode 100644 index 0000000..f292236 --- /dev/null +++ b/src/test/java/world/bentobox/border/WhiteBox.java @@ -0,0 +1,26 @@ +package world.bentobox.border; + +public class WhiteBox { + /** + * Sets the value of a private static field using Java Reflection. + * @param targetClass The class containing the static field. + * @param fieldName The name of the private static field. + * @param value The value to set the field to. + */ + public static void setInternalState(Class targetClass, String fieldName, Object value) { + try { + // 1. Get the Field object from the class + java.lang.reflect.Field field = targetClass.getDeclaredField(fieldName); + + // 2. Make the field accessible (required for private fields) + field.setAccessible(true); + + // 3. Set the new value. The first argument is 'null' for static fields. + field.set(null, value); + + } catch (NoSuchFieldException | IllegalAccessException e) { + // Wrap reflection exceptions in a runtime exception for clarity + throw new RuntimeException("Failed to set static field '" + fieldName + "' on class " + targetClass.getName(), e); + } + } +} diff --git a/src/test/java/world/bentobox/border/commands/BorderTypeCommandTest.java b/src/test/java/world/bentobox/border/commands/BorderTypeCommandTest.java index f50e1b2..8344a6e 100644 --- a/src/test/java/world/bentobox/border/commands/BorderTypeCommandTest.java +++ b/src/test/java/world/bentobox/border/commands/BorderTypeCommandTest.java @@ -1,8 +1,8 @@ package world.bentobox.border.commands; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -19,31 +19,20 @@ import java.util.Set; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -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 world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.CommandsManager; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; -import world.bentobox.bentobox.managers.LocalesManager; import world.bentobox.bentobox.util.Util; import world.bentobox.border.Border; import world.bentobox.border.BorderType; +import world.bentobox.border.CommonTestSetup; import world.bentobox.border.Settings; import world.bentobox.border.listeners.BorderShower; @@ -51,18 +40,12 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, User.class, Util.class }) -public class BorderTypeCommandTest { - @Mock - private BentoBox plugin; +public class BorderTypeCommandTest extends CommonTestSetup { @Mock private CompositeCommand ac; @Mock private User user; @Mock - private LocalesManager lm; - @Mock private Border addon; private final Set availableBorderTypes = EnumSet.of(BorderType.VANILLA, BorderType.BARRIER); @@ -70,15 +53,6 @@ public class BorderTypeCommandTest { private BorderTypeCommand ic; - private UUID uuid; - @Mock - private World world; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock - private IslandWorldManager iwm; @Mock private BorderShower bs; @@ -86,11 +60,10 @@ public class BorderTypeCommandTest { /** * @throws java.lang.Exception */ - @Before + @Override + @BeforeEach public void setUp() throws Exception { - // Set up plugin - BentoBox plugin = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", plugin); + super.setUp(); // Command manager CommandsManager cm = mock(CommandsManager.class); @@ -117,16 +90,13 @@ public void setUp() throws Exception { when(addon.getAvailableBorderTypesView()).thenReturn(availableBorderTypes); // Util - PowerMockito.mockStatic(Util.class, Mockito.RETURNS_MOCKS); // Return what was put into the method - when(Util.getWorld(any())).thenAnswer(invocation -> invocation.getArgument(0, World.class)); + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(invocation -> invocation.getArgument(0, World.class)); // Islands - when(plugin.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); // IWM - when(plugin.getIWM()).thenReturn(iwm); when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock."); // Shower @@ -140,6 +110,12 @@ public void setUp() throws Exception { ic = new BorderTypeCommand(addon, ac, "type"); } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } /** * Test method for {@link world.bentobox.border.commands.BorderTypeCommand#setup()}. @@ -186,7 +162,7 @@ public void testCanExecuteOk() { @Test public void testExecuteUserStringListOfStringShowHelp() { assertFalse(ic.execute(user, "", List.of("arg", "two"))); - verify(user).sendMessage("commands.help.header","[label]",null); + verify(user).sendMessage("commands.help.header","[label]","BSkyBlock"); } /** diff --git a/src/test/java/world/bentobox/border/commands/IslandBorderCommandTest.java b/src/test/java/world/bentobox/border/commands/IslandBorderCommandTest.java index daa5b86..ee3eb13 100644 --- a/src/test/java/world/bentobox/border/commands/IslandBorderCommandTest.java +++ b/src/test/java/world/bentobox/border/commands/IslandBorderCommandTest.java @@ -1,8 +1,8 @@ package world.bentobox.border.commands; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -19,34 +19,22 @@ import java.util.Set; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -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 world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.metadata.MetaDataValue; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.CommandsManager; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; -import world.bentobox.bentobox.managers.LocalesManager; import world.bentobox.bentobox.managers.PlayersManager; import world.bentobox.bentobox.util.Util; import world.bentobox.border.Border; import world.bentobox.border.BorderType; +import world.bentobox.border.CommonTestSetup; import world.bentobox.border.Settings; import world.bentobox.border.listeners.BorderShower; @@ -54,33 +42,18 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, User.class, Util.class }) -public class IslandBorderCommandTest { +public class IslandBorderCommandTest extends CommonTestSetup { - @Mock - private BentoBox plugin; @Mock private CompositeCommand ac; @Mock private User user; @Mock - private LocalesManager lm; - @Mock private Border addon; private final Set availableBorderTypes = EnumSet.of(BorderType.VANILLA, BorderType.BARRIER); private IslandBorderCommand ic; - private UUID uuid; - @Mock - private World world; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock - private IslandWorldManager iwm; @Mock private BorderShower bs; @Mock @@ -89,12 +62,10 @@ public class IslandBorderCommandTest { /** * @throws java.lang.Exception */ - @Before + @Override + @BeforeEach public void setUp() throws Exception { - // Set up plugin - BentoBox plugin = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", plugin); - + super.setUp(); // Command manager CommandsManager cm = mock(CommandsManager.class); when(plugin.getCommandsManager()).thenReturn(cm); @@ -120,18 +91,15 @@ public void setUp() throws Exception { when(addon.getAvailableBorderTypesView()).thenReturn(availableBorderTypes); // Util - PowerMockito.mockStatic(Util.class, Mockito.RETURNS_MOCKS); - // Return what was put into the method - when(Util.getWorld(any())).thenAnswer(invocation -> invocation.getArgument(0, World.class)); + // Return what was put into the method + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(invocation -> invocation.getArgument(0, World.class)); // Islands - when(plugin.getIslands()).thenReturn(im); when(addon.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); when(im.getIslandAt(any())).thenReturn(Optional.of(island)); // IWM - when(plugin.getIWM()).thenReturn(iwm); when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock."); // Shower @@ -150,8 +118,10 @@ public void setUp() throws Exception { /** * @throws java.lang.Exception */ - @After + @Override + @AfterEach public void tearDown() throws Exception { + super.tearDown(); } /** diff --git a/src/test/java/world/bentobox/border/listeners/PlayerListenerTest.java b/src/test/java/world/bentobox/border/listeners/PlayerListenerTest.java index 632369f..794c024 100644 --- a/src/test/java/world/bentobox/border/listeners/PlayerListenerTest.java +++ b/src/test/java/world/bentobox/border/listeners/PlayerListenerTest.java @@ -1,8 +1,8 @@ package world.bentobox.border.listeners; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -14,40 +14,36 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.vehicle.VehicleMoveEvent; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.events.island.IslandProtectionRangeChangeEvent; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; import world.bentobox.border.Border; +import world.bentobox.border.CommonTestSetup; import world.bentobox.border.PerPlayerBorderProxy; import world.bentobox.border.Settings; @@ -55,12 +51,8 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, User.class, Util.class }) -public class PlayerListenerTest { +public class PlayerListenerTest extends CommonTestSetup { - @Mock - private BentoBox plugin; @Mock private Border addon; @Mock @@ -77,29 +69,20 @@ public class PlayerListenerTest { private Location to; private Settings settings; @Mock - private World world; - @Mock - private IslandsManager im; - @Mock - private Island island; - @Mock private Vehicle vehicle; @Mock - private IslandWorldManager iwm; - @Mock private GameModeAddon gma; /** * @throws java.lang.Exception */ - @Before + @Override + @BeforeEach public void setUp() throws Exception { - - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - - PowerMockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); - when(User.getInstance(any(Player.class))).thenReturn(user); + super.setUp(); + MockedStatic mockedUser = Mockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); + mockedUser.when(() -> User.getInstance(any(Player.class))).thenReturn(user); // Border Shower when(addon.getBorderShower()).thenReturn(show); @@ -111,6 +94,8 @@ public void setUp() throws Exception { // Locations when(to.getWorld()).thenReturn(world); when(from.getWorld()).thenReturn(world); + when(from.clone()).thenReturn(from); + when(to.clone()).thenReturn(to); when(from.toVector()).thenReturn(new Vector(1,2,3)); when(to.toVector()).thenReturn(new Vector(6,7,8)); @@ -137,10 +122,7 @@ public void setUp() throws Exception { // Vehicle when(vehicle.getPassengers()).thenReturn(List.of(player)); - - // Util - PowerMockito.mockStatic(Util.class, Mockito.RETURNS_MOCKS); - + // Plugin when(addon.getPlugin()).thenReturn(plugin); @@ -149,10 +131,19 @@ public void setUp() throws Exception { when(iwm.getAddon(world)).thenReturn(Optional.of(gma)); when(plugin.getIWM()).thenReturn(iwm); + // Util + CompletableFuture future = new CompletableFuture<>(); + mockedUtil.when(() -> Util.teleportAsync(any(), any())).thenReturn(future); pl = new PlayerListener(addon); } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } /** * Test method for {@link world.bentobox.border.listeners.PlayerListener#PlayerListener(world.bentobox.border.Border)}. @@ -171,8 +162,7 @@ public void testOnPlayerJoinNoPerms() { pl.processEvent(event); verify(user).putMetaData(eq(BorderShower.BORDER_STATE_META_DATA), any()); verify(user).putMetaData(eq(PerPlayerBorderProxy.BORDER_BORDERTYPE_META_DATA), any()); - PowerMockito.verifyStatic(Bukkit.class); - Bukkit.getScheduler(); + mockedBukkit.verify(() -> Bukkit.getScheduler()); verify(show).hideBorder(user); verify(player).setWorldBorder(null); @@ -193,10 +183,9 @@ public void testOnPlayerQuit() { */ @Test public void testOnPlayerRespawn() { - PlayerRespawnEvent event = new PlayerRespawnEvent(player, from, false, false, null); + PlayerRespawnEvent event = new PlayerRespawnEvent(player, from, false, false, false, RespawnReason.DEATH); pl.onPlayerRespawn(event); - PowerMockito.verifyStatic(Bukkit.class); - Bukkit.getScheduler(); + mockedBukkit.verify(() -> Bukkit.getScheduler()); verify(show).clearUser(user); } @@ -209,8 +198,7 @@ public void testOnPlayerTeleportNotInGameWorld() { PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, TeleportCause.NETHER_PORTAL); pl.onPlayerTeleport(event); verify(show).clearUser(user); - PowerMockito.verifyStatic(Bukkit.class, never()); - Bukkit.getScheduler(); + mockedBukkit.verify(() -> Bukkit.getScheduler(), never()); } /** @@ -222,8 +210,7 @@ public void testOnPlayerTeleportInGameWorld() { PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, TeleportCause.NETHER_PORTAL); pl.onPlayerTeleport(event); verify(show).clearUser(user); - PowerMockito.verifyStatic(Bukkit.class); - Bukkit.getScheduler(); + mockedBukkit.verify(() -> Bukkit.getScheduler()); } /** @@ -324,8 +311,7 @@ public void testOnPlayerLeaveIslandReturnTeleportWaaayOutsideIsland() { pl.onPlayerLeaveIsland(event); verify(addon, times(4)).getIslands(); assertFalse(event.isCancelled()); - PowerMockito.verifyStatic(Util.class); - Util.teleportAsync(any(), any()); + mockedUtil.verify(() -> Util.teleportAsync(any(), any()), times(2)); } /** diff --git a/src/test/java/world/bentobox/border/listeners/ShowBarrierTest.java b/src/test/java/world/bentobox/border/listeners/ShowBarrierTest.java index 9e23827..392c851 100644 --- a/src/test/java/world/bentobox/border/listeners/ShowBarrierTest.java +++ b/src/test/java/world/bentobox/border/listeners/ShowBarrierTest.java @@ -1,70 +1,59 @@ package world.bentobox.border.listeners; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import org.bukkit.Chunk; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.NonNull; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; import world.bentobox.border.Border; +import world.bentobox.border.CommonTestSetup; import world.bentobox.border.Settings; /** * @author tastybento * */ -@PrepareForTest({User.class, Util.class}) -@RunWith(PowerMockRunner.class) -public class ShowBarrierTest { +public class ShowBarrierTest extends CommonTestSetup { @Mock private Border addon; @Mock private Player player; - @Mock - private Island island; - @Mock - private IslandsManager im; private ShowBarrier sb; private Settings settings; @Mock private @NonNull User user; @Mock - private Location location; - @Mock private @NonNull Location center; - @Mock - private World world; - - /** * @throws java.lang.Exception */ - @Before + @Override + @BeforeEach public void setUp() throws Exception { + super.setUp(); settings = new Settings(); settings.setShowMaxBorder(false); when(addon.getSettings()).thenReturn(settings); @@ -80,6 +69,7 @@ public void setUp() throws Exception { when(island.getMaxProtectedX()).thenReturn(100); when(island.getMaxProtectedZ()).thenReturn(100); when(center.toVector()).thenReturn(new Vector(0,0,0)); + when(center.clone()).thenReturn(center); when(island.getCenter()).thenReturn(center); // Island Manager @@ -87,8 +77,8 @@ public void setUp() throws Exception { when(im.getIslandAt(any(Location.class))).thenReturn(Optional.of(island)); // User - PowerMockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); - when(User.getInstance(any(Player.class))).thenReturn(user); + MockedStatic mockedUser = Mockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); + mockedUser.when(() -> User.getInstance(any(Player.class))).thenReturn(user); when(user.getMetaData(anyString())).thenReturn(Optional.empty()); when(user.getPlayer()).thenReturn(player); when(location.getBlockX()).thenReturn(99); @@ -98,11 +88,18 @@ public void setUp() throws Exception { when(player.getWorld()).thenReturn(world); // Util - PowerMockito.mockStatic(Util.class, Mockito.RETURNS_MOCKS); - - + Chunk chunk = mock(Chunk.class); + CompletableFuture future = new CompletableFuture<>(); + future.complete(chunk); + mockedUtil.when(() -> Util.getChunkAtAsync(any())).thenReturn(future); sb = new ShowBarrier(addon); } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } /** * Test method for {@link world.bentobox.border.listeners.ShowBarrier#ShowBarrier(world.bentobox.border.Border)}. @@ -119,9 +116,7 @@ public void testShowBarrier() { public void testShowBorderNearBorder() { sb.showBorder(player, island); verify(player, times(131)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(120)); - Util.getChunkAtAsync(any(Location.class)); - + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(120)); } /** @@ -132,8 +127,7 @@ public void testShowBorderNearBorderNoBarrierBlocks() { settings.setUseBarrierBlocks(false); sb.showBorder(player, island); verify(player).getLocation(); - PowerMockito.verifyStatic(Util.class, times(120)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(120)); } @@ -146,8 +140,7 @@ public void testShowBorderFarBorderWithOffset() { settings.setBarrierOffset(50); sb.showBorder(player, island); verify(player).getLocation(); - PowerMockito.verifyStatic(Util.class, never()); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), never()); } @@ -160,8 +153,7 @@ public void testShowBorderNearBorderWithOffset() { settings.setBarrierOffset(2); sb.showBorder(player, island); verify(player, times(171)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(160)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(160)); } /** @@ -173,8 +165,7 @@ public void testShowBorderNotNearMaxBorder() { // Not close to the max border, so the times will be the same as above sb.showBorder(player, island); verify(player, times(131)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(120)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(120)); } @@ -192,8 +183,7 @@ public void testShowBorderNearBorderShowMaxBorder() { sb.showBorder(player, island); // Number of times should be double verify(player, times(261)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(240)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(240)); } @@ -207,8 +197,7 @@ public void testShowBorderNearBorder2() { when(location.toVector()).thenReturn(new Vector(0,0,99)); sb.showBorder(player, island); verify(player, times(111)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(100)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(100)); } @@ -222,8 +211,7 @@ public void testShowBorderNearBorder3() { when(location.toVector()).thenReturn(new Vector(99,0,0)); sb.showBorder(player, island); verify(player, times(101)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(100)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(100)); } @@ -237,8 +225,7 @@ public void testShowBorderNearBorder4() { when(location.toVector()).thenReturn(new Vector(0,0,-99)); sb.showBorder(player, island); verify(player, times(111)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(100)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(100)); } @@ -252,8 +239,7 @@ public void testShowBorderNearBorder5() { when(location.toVector()).thenReturn(new Vector(-99,0,0)); sb.showBorder(player, island); verify(player, times(101)).getLocation(); - PowerMockito.verifyStatic(Util.class, times(100)); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), times(100)); } @@ -267,8 +253,7 @@ public void testShowBorderAwayFromBorder() { when(location.toVector()).thenReturn(new Vector(0,0,0)); sb.showBorder(player, island); verify(player).getLocation(); - PowerMockito.verifyStatic(Util.class, never()); - Util.getChunkAtAsync(any(Location.class)); + mockedUtil.verify(() -> Util.getChunkAtAsync(any(Location.class)), never()); } diff --git a/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java b/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java index c7dd007..ccd8fba 100644 --- a/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java +++ b/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java @@ -1,52 +1,38 @@ package world.bentobox.border.listeners; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.WorldBorder; import org.bukkit.entity.Player; import org.eclipse.jdt.annotation.NonNull; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.border.Border; +import world.bentobox.border.CommonTestSetup; import world.bentobox.border.Settings; /** * @author tastybento * */ -@PrepareForTest({Bukkit.class, User.class}) -@RunWith(PowerMockRunner.class) -public class ShowVirtualWorldBorderTest { +public class ShowVirtualWorldBorderTest extends CommonTestSetup { @Mock private Border addon; private Settings settings; private ShowVirtualWorldBorder svwb; @Mock - private Player player; - @Mock - private Island island; - @Mock private @NonNull User user; @Mock - private Location location; - @Mock - private World world; - @Mock private WorldBorder wb; @@ -54,8 +40,10 @@ public class ShowVirtualWorldBorderTest { /** * @throws java.lang.Exception */ - @Before + @Override + @BeforeEach public void setUp() throws Exception { + super.setUp(); settings = new Settings(); when(addon.getSettings()).thenReturn(settings); @@ -64,18 +52,23 @@ public void setUp() throws Exception { when(island.getProtectionRange()).thenReturn(100); // User - PowerMockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); - when(User.getInstance(any(Player.class))).thenReturn(user); - when(user.getPlayer()).thenReturn(player); - when(player.getLocation()).thenReturn(location); - when(player.getWorld()).thenReturn(world); + MockedStatic mockedUser = Mockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); + mockedUser.when(() -> User.getInstance(any(Player.class))).thenReturn(user); + when(user.getPlayer()).thenReturn(mockPlayer); + when(mockPlayer.getLocation()).thenReturn(location); + when(mockPlayer.getWorld()).thenReturn(world); // Bukkit - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - when(Bukkit.createWorldBorder()).thenReturn(wb); + mockedBukkit.when(() -> Bukkit.createWorldBorder()).thenReturn(wb); svwb = new ShowVirtualWorldBorder(addon); } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } /** * Test method for {@link world.bentobox.border.listeners.ShowVirtualWorldBorder#ShowVirtualWorldBorder(world.bentobox.border.Border)}. @@ -90,7 +83,7 @@ public void testShowVirtualWorldBorder() { */ @Test public void testShowBorder() { - svwb.showBorder(player, island); + svwb.showBorder(mockPlayer, island); verify(wb).setSize(200.0D); } @@ -101,7 +94,7 @@ public void testShowBorder() { @Test public void testShowBorderWithOffset() { settings.setBarrierOffset(10); - svwb.showBorder(player, island); + svwb.showBorder(mockPlayer, island); verify(wb).setSize(220.0D); } @@ -112,7 +105,7 @@ public void testShowBorderWithOffset() { @Test public void testShowBorderWithLargeOffset() { settings.setBarrierOffset(10000); - svwb.showBorder(player, island); + svwb.showBorder(mockPlayer, island); verify(wb).setSize(800.0D); // Max size } @@ -124,7 +117,7 @@ public void testShowBorderWithLargeOffset() { public void testHideBorder() { // Nothing to hide svwb.hideBorder(user); - verify(player).setWorldBorder(null); + verify(mockPlayer).setWorldBorder(null); } } From 0ee2ac372a4eaec7929a236c11dbb420180dff43 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 11 Dec 2025 20:07:22 -0800 Subject: [PATCH 3/9] Defensive code to prevent nether border if it doesn't need one. --- .../bentobox/border/listeners/ShowVirtualWorldBorder.java | 6 +++++- .../border/listeners/ShowVirtualWorldBorderTest.java | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java b/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java index 309044d..373b2c8 100644 --- a/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java +++ b/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java @@ -35,7 +35,11 @@ public void showBorder(Player player, Island island) { || !Objects.requireNonNull(User.getInstance(player)).getMetaData(BORDER_STATE_META_DATA).map(MetaDataValue::asBoolean).orElse(addon.getSettings().isShowByDefault())) { return; } - Location l = island.getProtectionCenter(); + + if (player.getWorld().getEnvironment() == Environment.NETHER && !addon.getPlugin().getIWM().isIslandNether(player.getWorld())) { + return; + } + Location l = island.getProtectionCenter().toVector().toLocation(player.getWorld()); if (player.getWorld().getEnvironment() == Environment.NETHER) { l.multiply(8); } diff --git a/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java b/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java index ccd8fba..c8872e7 100644 --- a/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java +++ b/src/test/java/world/bentobox/border/listeners/ShowVirtualWorldBorderTest.java @@ -8,6 +8,7 @@ import org.bukkit.Bukkit; import org.bukkit.WorldBorder; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.NonNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -50,11 +51,13 @@ public void setUp() throws Exception { // Island when(island.getRange()).thenReturn(400); when(island.getProtectionRange()).thenReturn(100); + when(island.getProtectionCenter()).thenReturn(location); // User MockedStatic mockedUser = Mockito.mockStatic(User.class, Mockito.RETURNS_MOCKS); mockedUser.when(() -> User.getInstance(any(Player.class))).thenReturn(user); when(user.getPlayer()).thenReturn(mockPlayer); + when(location.toVector()).thenReturn(new Vector(0,0,0)); when(mockPlayer.getLocation()).thenReturn(location); when(mockPlayer.getWorld()).thenReturn(world); From 387851d999381b222fef3ef7c6bdd80bc8b49944 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 15 Dec 2025 15:56:07 -0800 Subject: [PATCH 4/9] Update JDK version from 17 to 21 in build workflow --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 825b18d..6e88943 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,11 +14,11 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: distribution: 'adopt' - java-version: 17 + java-version: 21 - name: Cache SonarCloud packages uses: actions/cache@v3 with: @@ -35,4 +35,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \ No newline at end of file + run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar From a47b47de356f8b24e266cd7cacff6676f03a7767 Mon Sep 17 00:00:00 2001 From: Dieu Date: Tue, 16 Dec 2025 19:46:37 +0100 Subject: [PATCH 5/9] Fix Nether WorldBorder (nether island is same size as overworld island size, not / 8) --- .../bentobox/border/listeners/ShowVirtualWorldBorder.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java b/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java index 373b2c8..45f9359 100644 --- a/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java +++ b/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java @@ -40,9 +40,6 @@ public void showBorder(Player player, Island island) { return; } Location l = island.getProtectionCenter().toVector().toLocation(player.getWorld()); - if (player.getWorld().getEnvironment() == Environment.NETHER) { - l.multiply(8); - } WorldBorder wb = Bukkit.createWorldBorder(); wb.setCenter(l); double size = Math.min(island.getRange() * 2D, (island.getProtectionRange() + addon.getSettings().getBarrierOffset()) * 2D); From c91bfe3a2a150c73d23a650636b00c49e4833ac4 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 16 Dec 2025 13:13:48 -0800 Subject: [PATCH 6/9] Update src/test/java/world/bentobox/border/CommonTestSetup.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/test/java/world/bentobox/border/CommonTestSetup.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/world/bentobox/border/CommonTestSetup.java b/src/test/java/world/bentobox/border/CommonTestSetup.java index c3efbb8..6337bd5 100644 --- a/src/test/java/world/bentobox/border/CommonTestSetup.java +++ b/src/test/java/world/bentobox/border/CommonTestSetup.java @@ -132,7 +132,6 @@ public abstract class CommonTestSetup { @BeforeEach public void setUp() throws Exception { - MockitoAnnotations.openMocks(this); // Processes the @Mock annotations and initializes the field closeable = MockitoAnnotations.openMocks(this); server = MockBukkit.mock(); From 2eecebc144824cb21f9e8d74f8270032f3ec3e7c Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 16 Dec 2025 13:14:05 -0800 Subject: [PATCH 7/9] Update pom.xml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8ee988e..04c7c0c 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ org.mockito mockito-junit-jupiter - 5.11.0 + ${mockito.version} test From 238d144321f7696df437c1aa4c0cdff6a85dcebd Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 16 Dec 2025 13:14:26 -0800 Subject: [PATCH 8/9] Update src/test/java/world/bentobox/border/CommonTestSetup.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/test/java/world/bentobox/border/CommonTestSetup.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/world/bentobox/border/CommonTestSetup.java b/src/test/java/world/bentobox/border/CommonTestSetup.java index 6337bd5..df95ec9 100644 --- a/src/test/java/world/bentobox/border/CommonTestSetup.java +++ b/src/test/java/world/bentobox/border/CommonTestSetup.java @@ -295,7 +295,6 @@ public void checkSpigotMessage(String expectedMessage, int expectedOccurrences) * @return */ public EntityExplodeEvent getExplodeEvent(Entity entity, Location l, List list) { - //return new EntityExplodeEvent(entity, l, list, 0, null); return new EntityExplodeEvent(entity, l, list, 0, null); } From 5dc6bc24acdc8893550f2191c0ba61610c9a1400 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 16 Dec 2025 13:16:31 -0800 Subject: [PATCH 9/9] Update src/test/java/world/bentobox/border/CommonTestSetup.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/test/java/world/bentobox/border/CommonTestSetup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/world/bentobox/border/CommonTestSetup.java b/src/test/java/world/bentobox/border/CommonTestSetup.java index df95ec9..ea03ace 100644 --- a/src/test/java/world/bentobox/border/CommonTestSetup.java +++ b/src/test/java/world/bentobox/border/CommonTestSetup.java @@ -260,7 +260,7 @@ protected static void deleteAll(File file) throws IOException { /** * Check that spigot sent the message - * @param message - message to check + * @param expectedMessage - message to check */ public void checkSpigotMessage(String expectedMessage) { checkSpigotMessage(expectedMessage, 1);