mockDb = Mockito.mockStatic(DatabaseSetup.class);
+ DatabaseSetup dbSetup = mock(DatabaseSetup.class);
+ mockDb.when(() -> DatabaseSetup.getDatabase()).thenReturn(dbSetup);
+ when(dbSetup.getHandler(any())).thenReturn(h);
+ when(h.saveObject(any())).thenReturn(CompletableFuture.completedFuture(true));
+
+
+ // The database type has to be created one line before the thenReturn() to work!
+ DatabaseType value = DatabaseType.JSON;
+ when(plugin.getSettings()).thenReturn(settings);
+ when(settings.getDatabaseType()).thenReturn(value);
+
+ // Command manager
+ CommandsManager cm = mock(CommandsManager.class);
+ when(plugin.getCommandsManager()).thenReturn(cm);
+
+ // Player
+ when(user.isOp()).thenReturn(false);
+ UUID uuid = UUID.randomUUID();
+ when(user.getUniqueId()).thenReturn(uuid);
+ when(user.getPlayer()).thenReturn(mockPlayer);
+ when(user.getName()).thenReturn("tastybento");
+ User.setPlugin(plugin);
+
+ // Player has island to begin with
+ when(im.getIsland(any(), any(UUID.class))).thenReturn(island);
+
+ // Create an Addon
+ addon = new AOneBlock();
+ File jFile = new File("addon.jar");
+ try (JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(jFile))) {
+
+ // Copy over config file from src folder
+ Path fromPath = Paths.get("src/main/resources/config.yml");
+ Path path = Paths.get("config.yml");
+ Files.copy(fromPath, path);
+
+ // Add the new files to the jar.
+ add(path, tempJarOutputStream);
+
+ // Copy over panels file from src folder
+ fromPath = Paths.get("src/main/resources/panels/phases_panel.yml");
+ path = Paths.get("panels");
+ Files.createDirectory(path);
+ path = Paths.get("panels/phases_panel.yml");
+ Files.copy(fromPath, path);
+
+ // Add the new files to the jar.
+ add(path, tempJarOutputStream);
+ }
+
+ File dataFolder = new File("addons/AOneBlock");
+ addon.setDataFolder(dataFolder);
+ addon.setFile(jFile);
+ AddonDescription desc = new AddonDescription.Builder("bentobox", "aoneblock", "1.3").description("test")
+ .authors("tasty").build();
+ addon.setDescription(desc);
+ // Addons manager
+ AddonsManager am = mock(AddonsManager.class);
+ when(plugin.getAddonsManager()).thenReturn(am);
+
+ // Flags manager
+ when(plugin.getFlagsManager()).thenReturn(fm);
+ when(fm.getFlags()).thenReturn(Collections.emptyList());
+
+ }
+
+ private void add(Path path, JarOutputStream tempJarOutputStream) throws FileNotFoundException, IOException {
+ try (FileInputStream fis = new FileInputStream(path.toFile())) {
+ byte[] buffer = new byte[1024];
+ int bytesRead = 0;
+ JarEntry entry = new JarEntry(path.toString());
+ tempJarOutputStream.putNextEntry(entry);
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ tempJarOutputStream.write(buffer, 0, bytesRead);
+ }
+ }
+
+ }
+
+ /**
+ * Test method for {@link world.bentobox.aoneblock.AOneBlock#onEnable()}.
+ */
+ @Test
+ public void testOnEnable() {
+ testOnLoad();
+ addon.setState(State.ENABLED);
+ addon.onEnable();
+ assertNotEquals(State.DISABLED, addon.getState());
+ assertNotNull(addon.getBlockListener());
+ assertNotNull(addon.getOneBlockManager());
+
+ }
+
+ /**
+ * Test method for {@link world.bentobox.aoneblock.AOneBlock#onLoad()}.
+ */
+ @Test
+ public void testOnLoad() {
+ addon.onLoad();
+ // Check that config.yml file has been saved
+ File check = new File("addons/AOneBlock", "config.yml");
+ assertTrue(check.exists());
+ assertTrue(addon.getPlayerCommand().isPresent());
+ assertTrue(addon.getAdminCommand().isPresent());
+
+ }
+
+ /**
+ * Test method for {@link world.bentobox.aoneblock.AOneBlock#onReload()}.
+ */
+ @Test
+ public void testOnReload() {
+ addon.onLoad();
+ addon.onEnable();
+ addon.onReload();
+ // Check that config.yml file has been saved
+ File check = new File("addons/AOneBlock", "config.yml");
+ assertTrue(check.exists());
+ }
+
+ /**
+ * Test method for {@link world.bentobox.aoneblock.AOneBlock#createWorlds()}.
+ */
+ @Test
+ public void testCreateWorlds() {
+ addon.onLoad();
+ addon.createWorlds();
+ verify(plugin).log("[aoneblock] Creating AOneBlock world ...");
+ verify(plugin).log("[aoneblock] Creating AOneBlock's Nether...");
+ verify(plugin).log("[aoneblock] Creating AOneBlock's End World...");
+
+ }
+
+ /**
+ * Test method for {@link world.bentobox.aoneblock.AOneBlock#getSettings()}.
+ */
+ @Test
+ public void testGetSettings() {
+ addon.onLoad();
+ assertNotNull(addon.getSettings());
+
+ }
+
+ /**
+ * Test method for
+ * {@link world.bentobox.aoneblock.AOneBlock#getWorldSettings()}.
+ */
+ @Test
+ public void testGetWorldSettings() {
+ addon.onLoad();
+ assertEquals(addon.getSettings(), addon.getWorldSettings());
+ }
+
+ /**
+ * Test method for
+ * {@link world.bentobox.aoneblock.AOneBlock#getOneBlocksIsland(world.bentobox.bentobox.database.objects.Island)}.
+ */
+ @Test
+ public void testGetOneBlocksIsland() {
+ addon.onLoad();
+ addon.onEnable();
+ @NonNull
+ OneBlockIslands i = addon.getOneBlocksIsland(island);
+ assertEquals(island.getUniqueId(), i.getUniqueId());
+ }
+
+ /**
+ * Test method for
+ * {@link world.bentobox.aoneblock.AOneBlock#getOneBlockManager()}.
+ */
+ @Test
+ public void testGetOneBlockManager() {
+ assertNull(addon.getOneBlockManager());
+ }
+
+ /**
+ * Test method for
+ * {@link world.bentobox.aoneblock.AOneBlock#getBlockListener()}.
+ */
+ @Test
+ public void testGetBlockListener() {
+ assertNull(addon.getBlockListener());
+ }
+
+ /**
+ * Test method for
+ * {@link world.bentobox.aoneblock.AOneBlock#getPlaceholdersManager()}.
+ */
+ @Test
+ public void testGetPlaceholdersManager() {
+ assertNull(addon.getPlaceholdersManager());
+ }
+
+ /**
+ * Test method for {@link world.bentobox.aoneblock.AOneBlock#getHoloListener()}.
+ */
+ @Test
+ public void testGetHoloListener() {
+ assertNull(addon.getHoloListener());
+ }
}
diff --git a/src/test/java/world/bentobox/aoneblock/CommonTestSetup.java b/src/test/java/world/bentobox/aoneblock/CommonTestSetup.java
new file mode 100644
index 00000000..0ed6f4f0
--- /dev/null
+++ b/src/test/java/world/bentobox/aoneblock/CommonTestSetup.java
@@ -0,0 +1,336 @@
+package world.bentobox.aoneblock;
+
+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);
+
+
+ // Tags
+ /*
+ for (Material m : Material.values()) {
+ if (m.name().contains("_SIGN")) {
+ when(Tag.ALL_SIGNS.isTagged(m)).thenReturn(true);
+ when(Tag.SIGNS.isTagged(m)).thenReturn(true);
+ }
+ if (m.name().contains("_WALL_SIGN")) {
+ when(Tag.WALL_SIGNS.isTagged(m)).thenReturn(true);
+ }
+ if (m.name().contains("_TRAPDOOR")) {
+ when(Tag.TRAPDOORS.isTagged(m)).thenReturn(true);
+ }
+ if (m.name().contains("FENCE")) {
+ when(Tag.FENCES.isTagged(m)).thenReturn(true);
+ }
+ if (m.name().contains("_DOOR")) {
+ when(Tag.DOORS.isTagged(m)).thenReturn(true);
+ }
+ if (m.name().contains("_BOAT") || m.name().contains("_RAFT")) {
+ when(Tag.ITEMS_BOATS.isTagged(m)).thenReturn(true);
+ }
+
+ }*/
+ }
+
+ /**
+ * @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 explode 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/aoneblock/PlaceholdersManagerTest.java b/src/test/java/world/bentobox/aoneblock/PlaceholdersManagerTest.java
index adf7e17e..680f3c0e 100644
--- a/src/test/java/world/bentobox/aoneblock/PlaceholdersManagerTest.java
+++ b/src/test/java/world/bentobox/aoneblock/PlaceholdersManagerTest.java
@@ -1,64 +1,44 @@
package world.bentobox.aoneblock;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import java.util.List;
import java.util.Optional;
-import java.util.UUID;
-import org.bukkit.Location;
-import org.bukkit.World;
import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.mockito.Mock;
-import org.powermock.modules.junit4.PowerMockRunner;
import world.bentobox.aoneblock.dataobjects.OneBlockIslands;
import world.bentobox.aoneblock.oneblocks.OneBlocksManager;
import world.bentobox.bentobox.api.user.User;
-import world.bentobox.bentobox.database.objects.Island;
-import world.bentobox.bentobox.managers.IslandsManager;
-import world.bentobox.bentobox.managers.PlaceholdersManager;
/**
* @author tastybento
*
*/
-@RunWith(PowerMockRunner.class)
-public class PlaceholdersManagerTest {
+public class PlaceholdersManagerTest extends CommonTestSetup {
@Mock
private AOneBlock addon;
@Mock
private User user;
- private UUID uuid = UUID.randomUUID();
-
private AOneBlockPlaceholders pm;
- @Mock
- private IslandsManager im;
- @Mock
- private Island island;
- @Mock
- private @Nullable Location location;
private @NonNull OneBlockIslands obi;
@Mock
- private World world;
- @Mock
private OneBlocksManager obm;
private Settings settings;
- @Mock
- private PlaceholdersManager phm;
/**
* @throws java.lang.Exception
*/
- @Before
+ @Override
+ @BeforeEach
public void setUp() throws Exception {
+ super.setUp();
// User
when(user.getLocation()).thenReturn(location);
when(user.getTranslation("aoneblock.placeholders.infinite")).thenReturn("Infinite");
diff --git a/src/test/java/world/bentobox/aoneblock/SettingsTest.java b/src/test/java/world/bentobox/aoneblock/SettingsTest.java
index e8b8a9a4..6f318e00 100644
--- a/src/test/java/world/bentobox/aoneblock/SettingsTest.java
+++ b/src/test/java/world/bentobox/aoneblock/SettingsTest.java
@@ -1,28 +1,20 @@
package world.bentobox.aoneblock;
-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 java.util.List;
import java.util.Map;
-import org.bukkit.Bukkit;
import org.bukkit.Difficulty;
import org.bukkit.GameMode;
-import org.bukkit.Registry;
import org.bukkit.block.Biome;
import org.bukkit.entity.EntityType;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import world.bentobox.aoneblock.listeners.BlockListener;
@@ -30,26 +22,27 @@
* @author tastybento
*
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ Bukkit.class, Biome.class, Registry.class })
-public class SettingsTest {
+public class SettingsTest extends CommonTestSetup {
private Settings s;
/**
* @throws java.lang.Exception
*/
- @Before
+ @Override
+ @BeforeEach
public void setUp() throws Exception {
- PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS);
+ super.setUp();
s = new Settings();
}
/**
* @throws java.lang.Exception
*/
- @After
+ @Override
+ @AfterEach
public void tearDown() throws Exception {
+ super.tearDown();
}
/**
@@ -1012,7 +1005,7 @@ public void testIsWaterUnsafe() {
* Test method for {@link world.bentobox.aoneblock.Settings#getDefaultBiome()}.
*/
@Test
- @Ignore("Need to solve Biome enum issue")
+ //@Ignore("Need to solve Biome enum issue")
public void testGetDefaultBiome() {
assertEquals(Biome.PLAINS, s.getDefaultBiome());
}
@@ -1021,7 +1014,7 @@ public void testGetDefaultBiome() {
* Test method for {@link world.bentobox.aoneblock.Settings#setDefaultBiome(org.bukkit.block.Biome)}.
*/
@Test
- @Ignore("Need to solve Biome enum issue")
+ //@Ignore("Need to solve Biome enum issue")
public void testSetDefaultBiome() {
assertEquals(Biome.PLAINS, s.getDefaultBiome());
s.setDefaultBiome(Biome.BAMBOO_JUNGLE);
@@ -1281,8 +1274,6 @@ public void testSetPasteMissingIslands() {
assertFalse(s.isPasteMissingIslands());
s.setPasteMissingIslands(true);
assertTrue(s.isPasteMissingIslands());
-
-
}
/**
@@ -1559,7 +1550,6 @@ public void testSetDropOnTop() {
* Test method for {@link world.bentobox.aoneblock.Settings#getDefaultNetherBiome()}.
*/
@Test
- @Ignore("Biome enum conversion")
public void testGetDefaultNetherBiome() {
assertEquals(Biome.NETHER_WASTES, s.getDefaultNetherBiome());
}
@@ -1568,7 +1558,6 @@ public void testGetDefaultNetherBiome() {
* Test method for {@link world.bentobox.aoneblock.Settings#setDefaultNetherBiome(org.bukkit.block.Biome)}.
*/
@Test
- @Ignore("Biome enum conversion")
public void testSetDefaultNetherBiome() {
assertEquals(Biome.NETHER_WASTES, s.getDefaultNetherBiome());
s.setDefaultNetherBiome(Biome.BADLANDS);
@@ -1579,7 +1568,6 @@ public void testSetDefaultNetherBiome() {
* Test method for {@link world.bentobox.aoneblock.Settings#getDefaultEndBiome()}.
*/
@Test
- @Ignore("Biome enum conversion")
public void testGetDefaultEndBiome() {
assertEquals(Biome.THE_END, s.getDefaultEndBiome());
}
@@ -1588,7 +1576,6 @@ public void testGetDefaultEndBiome() {
* Test method for {@link world.bentobox.aoneblock.Settings#setDefaultEndBiome(org.bukkit.block.Biome)}.
*/
@Test
- @Ignore("Biome enum conversion")
public void testSetDefaultEndBiome() {
assertEquals(Biome.THE_END, s.getDefaultEndBiome());
s.setDefaultEndBiome(Biome.BADLANDS);
diff --git a/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java b/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java
new file mode 100644
index 00000000..b6b3a1ae
--- /dev/null
+++ b/src/test/java/world/bentobox/aoneblock/TestWorldSettings.java
@@ -0,0 +1,409 @@
+package world.bentobox.aoneblock;
+
+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/aoneblock/WhiteBox.java b/src/test/java/world/bentobox/aoneblock/WhiteBox.java
new file mode 100644
index 00000000..a65316cd
--- /dev/null
+++ b/src/test/java/world/bentobox/aoneblock/WhiteBox.java
@@ -0,0 +1,26 @@
+package world.bentobox.aoneblock;
+
+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/aoneblock/commands/island/IslandSetCountCommandTest.java b/src/test/java/world/bentobox/aoneblock/commands/island/IslandSetCountCommandTest.java
index 58e50193..42668426 100644
--- a/src/test/java/world/bentobox/aoneblock/commands/island/IslandSetCountCommandTest.java
+++ b/src/test/java/world/bentobox/aoneblock/commands/island/IslandSetCountCommandTest.java
@@ -1,9 +1,9 @@
package world.bentobox.aoneblock.commands.island;
-import static org.junit.Assert.assertEquals;
-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.assertEquals;
+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.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
@@ -11,212 +11,167 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import java.beans.IntrospectionException;
import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
-import org.bukkit.Bukkit;
-import org.bukkit.World;
import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Player;
import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-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 org.powermock.reflect.Whitebox;
import world.bentobox.aoneblock.AOneBlock;
+import world.bentobox.aoneblock.CommonTestSetup;
import world.bentobox.aoneblock.Settings;
+import world.bentobox.aoneblock.WhiteBox;
import world.bentobox.aoneblock.dataobjects.OneBlockIslands;
import world.bentobox.aoneblock.listeners.BlockListener;
import world.bentobox.aoneblock.oneblocks.OneBlockObject;
-import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.AbstractDatabaseHandler;
import world.bentobox.bentobox.database.DatabaseSetup;
-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.RanksManager;
/**
* @author tastybento
*
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ Bukkit.class, BentoBox.class, User.class, DatabaseSetup.class, RanksManager.class })
-public class IslandSetCountCommandTest {
- @Mock
- private BentoBox plugin;
- @Mock
- private CompositeCommand ac;
- @Mock
- private User user;
- @Mock
- private LocalesManager lm;
- @Mock
- private AOneBlock addon;
- private UUID uuid;
- @Mock
- private World world;
- @Mock
- private IslandsManager im;
- @Mock
- private @Nullable Island island;
- @Mock
- private IslandWorldManager iwm;
- private IslandSetCountCommand iscc;
- @Mock
- private BlockListener bl;
+public class IslandSetCountCommandTest extends CommonTestSetup {
+ @Mock
+ private CompositeCommand ac;
+
+ @Mock
+ private User user;
+ @Mock
+ private AOneBlock addon;
+ private IslandSetCountCommand iscc;
+ @Mock
+ private BlockListener bl;
@Mock
private RanksManager rm;
- private @NonNull OneBlockIslands oneBlockIsland = new OneBlockIslands(UUID.randomUUID().toString());
-
- private static AbstractDatabaseHandler