diff --git a/.gitignore b/.gitignore index ac697fa7..e204b345 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,8 @@ .idea/ # Fern's utils -uploadtoserver.sh \ No newline at end of file +uploadtoserver.sh + +# Testing files: +debug.log + diff --git a/pom.xml b/pom.xml index d57ccd81..1447ce8b 100644 --- a/pom.xml +++ b/pom.xml @@ -193,12 +193,40 @@ compile - + org.junit junit 4.8.2 + test - + + org.powermock + powermock-module-junit4 + 1.4.9 + jar + test + + + org.powermock + powermock-api-easymock + 1.4.9 + jar + test + + + org.powermock + powermock-api-mockito + 1.4.9 + jar + test + + + org.easymock + easymock + 3.0 + test + + diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 6dd77c9b..dbe6b2de 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -33,6 +33,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; +import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -52,6 +53,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { public static boolean EnforceGameModes; public static boolean PrefixChat; public static boolean BedRespawn; + private File testConfigDirectory; + private PluginDescriptionFile testDescriptionFile; @Override @@ -124,6 +127,28 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { debugLog = new DebugLog("Multiverse-Core", getDataFolder() + File.separator + "debug.log"); } + @Override + public File getDataFolder() { + if (this.testConfigDirectory != null) { + return this.testConfigDirectory; + } + return super.getDataFolder(); + } + + @Override + public PluginDescriptionFile getDescription() { + if (this.testDescriptionFile != null) { + return this.testDescriptionFile; + } + return super.getDescription(); //To change body of overridden methods use File | Settings | File Templates. + } + + + public void setTestMode(File configDir, PluginDescriptionFile descriptionFile) { + this.testConfigDirectory = configDir; + this.testDescriptionFile = descriptionFile; + } + public FileConfiguration getMVConfiguration() { return this.multiverseConfig; } @@ -230,6 +255,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { /** Function to Register all the Events needed. */ private void registerEvents() { + System.out.print(getServer().getName()); PluginManager pm = getServer().getPluginManager(); // pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Highest, this); // Low so it acts above any other. pm.registerEvent(Event.Type.PLAYER_TELEPORT, this.playerListener, Priority.Highest, this); // Cancel Teleports if needed. @@ -451,6 +477,9 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { private String getAuthors() { String authors = ""; ArrayList auths = this.getDescription().getAuthors(); + if(auths.size() == 0) { + return ""; + } if (auths.size() == 1) { return auths.get(0); diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java index 7d365c40..94d32a23 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java @@ -141,4 +141,12 @@ public interface MVWorldManager { * @return A valid {@link PurgeWorlds}. */ public PurgeWorlds getWorldPurger(); + + /** + * Gets the world players will spawn in on first join. + * Currently this always returns worlds.get(0) from Bukkit. + * + * @return A Multiverse world that players will spawn in or null if no MV world has been set. + */ + public MultiverseWorld getSpawnWorld(); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java index deecf179..5b41a785 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/WorldManager.java @@ -438,4 +438,8 @@ public class WorldManager implements MVWorldManager { this.plugin.log(Level.SEVERE, "Could not save worlds.yml. Please check your settings."); } } + + public MultiverseWorld getSpawnWorld() { + return this.getMVWorld(this.plugin.getServer().getWorlds().get(0)); + } } diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestMockWorld.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestMockWorld.java new file mode 100644 index 00000000..fe0dd50d --- /dev/null +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestMockWorld.java @@ -0,0 +1,41 @@ +package com.onarandombox.MultiverseCore.test; + +import junit.framework.Assert; +import org.bukkit.World; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(PowerMockRunner.class) +public class TestMockWorld { + private World mockWorld; + private World mockNetherWorld; + @Test + public void testWorldInit() { + // Initialize a fake world and world_nether. + this.mockWorld = PowerMockito.mock(World.class); + when(this.mockWorld.getName()).thenReturn("world"); + when(this.mockWorld.getEnvironment()).thenReturn(World.Environment.NORMAL); + + this.mockNetherWorld = PowerMockito.mock(World.class); + when(this.mockNetherWorld.getName()).thenReturn("world_nether"); + when(this.mockNetherWorld.getEnvironment()).thenReturn(World.Environment.NETHER); + + // Test the mock world objects + Assert.assertEquals(this.mockWorld.getName(), "world"); + Assert.assertEquals(this.mockNetherWorld.getName(), "world_nether"); + verify(this.mockWorld).getName(); + verify(this.mockNetherWorld).getName(); + + // Test the environments + Assert.assertEquals(this.mockWorld.getEnvironment(), World.Environment.NORMAL); + Assert.assertEquals(this.mockNetherWorld.getEnvironment(), World.Environment.NETHER); + verify(this.mockWorld).getEnvironment(); + verify(this.mockNetherWorld).getEnvironment(); + } +} diff --git a/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldImport.java b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldImport.java new file mode 100644 index 00000000..5ecc3dc2 --- /dev/null +++ b/src/test/java/com/onarandombox/MultiverseCore/test/TestWorldImport.java @@ -0,0 +1,123 @@ +package com.onarandombox.MultiverseCore.test; + +import com.onarandombox.MultiverseCore.MultiverseCore; +import junit.framework.Assert; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginLoader; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({PluginManager.class, MultiverseCore.class, Permission.class}) +public class TestWorldImport { + ConsoleCommandSender mockCommandSender; + private World mockWorld; + private World mockNetherWorld; + private List worldList; + private Server mockServer; + private PluginManager mockPluginManager; + private PluginLoader pluginLoader; + MultiverseCore core; + + @Before + public void setUp() throws Exception { + // Initialize a fake console. + this.mockCommandSender = mock(ConsoleCommandSender.class); + + // Initialize a fake world and world_nether. + this.mockWorld = mock(World.class); + when(this.mockWorld.getName()).thenReturn("world"); + when(this.mockWorld.getEnvironment()).thenReturn(World.Environment.NORMAL); + + this.mockNetherWorld = mock(World.class); + when(this.mockNetherWorld.getName()).thenReturn("world_nether"); + when(this.mockNetherWorld.getEnvironment()).thenReturn(World.Environment.NETHER); + + // Initialize our fake worldlist. + this.worldList = new ArrayList(); + this.worldList.add(mockWorld); + + + JavaPlugin[] plugins = new JavaPlugin[]{core}; + + PowerMockito.whenNew(Permission.class).withArguments("Test").thenThrow(new Exception("Permission created exception")); + Method addPermissionMethod = PowerMockito.method(PluginManager.class, "addPermission", Permission.class); + Constructor permissionConst = PowerMockito.constructor(Permission.class, String.class, String.class, PermissionDefault.class); + PowerMockito.suppress(permissionConst); + Permission p = new Permission("Test", "test", PermissionDefault.OP); + + + // Mock the Plugin Manager + this.mockPluginManager = PowerMockito.mock(PluginManager.class); + when(this.mockPluginManager.getPlugins()).thenReturn(plugins); + when(this.mockPluginManager.getPlugin("Multiverse-Core")).thenReturn(core); + + mockPluginManager.addPermission(new Permission("")); + + + // Initialize our server. + this.mockServer = mock(Server.class); + when(this.mockServer.getWorld("world")).thenReturn(mockWorld); + when(this.mockServer.getWorlds()).thenReturn(worldList); + when(this.mockServer.getPluginManager()).thenReturn(this.mockPluginManager); + when(this.mockServer.getName()).thenReturn("FernCraft"); + + + PluginDescriptionFile pdf = new PluginDescriptionFile("Multiverse-Core", "2.1-Test", "com.onarandombox.MultiverseCore.MultiverseCore"); + this.core = PowerMockito.spy(new MultiverseCore()); + doReturn(this.mockServer).when(core).getServer(); + doReturn(new File(".")).when(core).getDataFolder(); + doReturn(pdf).when(core).getDescription(); + core.onLoad(); + // Enable it. + core.onEnable(); + + + } + + @Test + public void TestWorldImport() { + + + // Start actual testing. + // Create a core instance. + Plugin plugin = this.mockServer.getPluginManager().getPlugin("Multiverse-Core"); + // Make sure Core is not null + Assert.assertNotNull(plugin); + // Make sure core is actually a multiverse core + + // Initialize a fake command + Command mockCommand = mock(Command.class); + when(mockCommand.getName()).thenReturn("mv"); + String[] normalArgs = new String[]{"import", "world", "normal"}; + String[] netherArgs = new String[]{"import", "world_nether", "nether"}; + + Assert.assertEquals(0, this.core.getMVWorldManager().getMVWorlds().size()); + + // Import the first world. + plugin.onCommand(mockCommandSender, mockCommand, "", normalArgs); + + Assert.assertEquals(1, this.core.getMVWorldManager().getMVWorlds().size()); + } +}