diff --git a/build.gradle b/build.gradle index be00e2ed..4706fbc6 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,7 @@ repositories { configure(apiDependencies) { serverApiVersion = '1.21.4-R0.1-SNAPSHOT' mockBukkitServerApiVersion = '1.21' + mockBukkitVersion = '4.31.1' } dependencies { diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java index b0854893..67b7285f 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java @@ -88,6 +88,7 @@ public Try load() { for (final WorldGroup worldGroup : worldGroups) { getGroupNames().put(worldGroup.getName().toLowerCase(), worldGroup); } + Logging.fine("Loaded " + worldGroups.size() + " world groups from config."); }); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java b/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java index 32362050..29098745 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java @@ -626,19 +626,19 @@ public boolean updatePlayer(Player player, PlayerProfile profile) { /** * Grouping for inventory sharables. */ - public static final SharableGroup ALL_INVENTORY = new SharableGroup("inventory", + public static final Shares ALL_INVENTORY = new SharableGroup("inventory", fromSharables(INVENTORY, ARMOR, ENDER_CHEST, OFF_HAND), "inv", "inventories"); /** * Grouping for experience sharables. */ - public static final SharableGroup ALL_EXPERIENCE = new SharableGroup("experience", + public static final Shares ALL_EXPERIENCE = new SharableGroup("experience", fromSharables(EXPERIENCE, TOTAL_EXPERIENCE, LEVEL), "exp", "level"); /** * Grouping for air/breath related sharables. */ - public static final SharableGroup AIR = new SharableGroup("air", + public static final Shares AIR = new SharableGroup("air", fromSharables(REMAINING_AIR, MAXIMUM_AIR), "breath"); /** diff --git a/src/test/java/org/mvplugins/multiverse/inventories/InjectionTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/InjectionTest.kt new file mode 100644 index 00000000..1d843d57 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/InjectionTest.kt @@ -0,0 +1,44 @@ +package org.mvplugins.multiverse.inventories + +import org.junit.jupiter.api.Test +import org.mvplugins.multiverse.inventories.commands.InventoriesCommand +import org.mvplugins.multiverse.inventories.config.InventoriesConfig +import org.mvplugins.multiverse.inventories.listeners.InventoriesListener +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +class InjectionTest : TestWithMockBukkit() { + + @Test + fun `InventoriesCommand are available as a service`() { + assertEquals(5, serviceLocator.getAllActiveServices(InventoriesCommand::class.java).size) + } + + @Test + fun `InventoriesConfig is available as a service`() { + assertNotNull(serviceLocator.getActiveService(InventoriesConfig::class.java)) + } + + @Test + fun `InventoriesListener is available as a service`() { + assertNotNull(serviceLocator.getActiveService(InventoriesListener::class.java)) + } + + @Test + fun `ProfileDataSource is available as a service`() { + assertNotNull(serviceLocator.getActiveService(ProfileDataSource::class.java)) + } + + @Test + fun `ProfileContainerStoreProvider is available as a service`() { + assertNotNull(serviceLocator.getActiveService(ProfileContainerStoreProvider::class.java)) + } + + @Test + fun `WorldGroupManager is available as a service`() { + assertNotNull(serviceLocator.getActiveService(WorldGroupManager::class.java)) + } +} diff --git a/src/test/java/org/mvplugins/multiverse/inventories/TestWithMockBukkit.kt b/src/test/java/org/mvplugins/multiverse/inventories/TestWithMockBukkit.kt index fe74d5f6..6a263b31 100644 --- a/src/test/java/org/mvplugins/multiverse/inventories/TestWithMockBukkit.kt +++ b/src/test/java/org/mvplugins/multiverse/inventories/TestWithMockBukkit.kt @@ -4,10 +4,15 @@ import com.dumptruckman.minecraft.util.Logging import org.bukkit.Location import org.bukkit.configuration.MemorySection import org.bukkit.configuration.file.YamlConfiguration +import org.bukkit.configuration.serialization.ConfigurationSerialization import org.mockbukkit.mockbukkit.MockBukkit +import org.mockbukkit.mockbukkit.inventory.ItemStackMock import org.mvplugins.multiverse.core.MultiverseCore import org.mvplugins.multiverse.core.inject.PluginServiceLocator import org.mvplugins.multiverse.inventories.mock.MVServerMock +import java.io.File +import java.nio.file.Path +import kotlin.io.path.absolutePathString import kotlin.test.* /** @@ -22,6 +27,8 @@ abstract class TestWithMockBukkit { @BeforeTest fun setUpMockBukkit() { + ConfigurationSerialization.registerClass(ItemStackMock::class.java) + server = MockBukkit.mock(MVServerMock()) multiverseCore = MockBukkit.load(MultiverseCore::class.java) multiverseInventories = MockBukkit.load(MultiverseInventories::class.java) @@ -32,11 +39,20 @@ abstract class TestWithMockBukkit { @AfterTest fun tearDownMockBukkit() { + server.pluginManager.disablePlugin(multiverseInventories) + server.pluginManager.disablePlugin(multiverseCore) MockBukkit.unmock() } fun getResourceAsText(path: String): String? = object {}.javaClass.getResource(path)?.readText() + fun writeResourceToConfigFile(resourcePath: String, configPath: String) { + val configResource = getResourceAsText(resourcePath) + assertNotNull(configResource) + File(Path.of(multiverseInventories.dataFolder.absolutePath, configPath).absolutePathString()) + .writeText(configResource) + } + fun assertConfigEquals(expectedPath: String, actualPath: String) { val actualString = multiverseInventories.dataFolder.toPath().resolve(actualPath).toFile().readText() val expectedString = getResourceAsText(expectedPath) diff --git a/src/test/java/org/mvplugins/multiverse/inventories/commands/AbstractCommandTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/commands/AbstractCommandTest.kt new file mode 100644 index 00000000..325fd281 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/commands/AbstractCommandTest.kt @@ -0,0 +1,18 @@ +package org.mvplugins.multiverse.inventories.commands + +import org.mockbukkit.mockbukkit.command.ConsoleCommandSenderMock +import org.mockbukkit.mockbukkit.entity.PlayerMock +import org.mvplugins.multiverse.inventories.TestWithMockBukkit +import kotlin.test.BeforeTest + +abstract class AbstractCommandTest : TestWithMockBukkit() { + + protected lateinit var console: ConsoleCommandSenderMock + protected lateinit var player: PlayerMock + + @BeforeTest + fun setUpCommand() { + console = server.consoleSender + player = server.addPlayer("benwoo1110"); + } +} diff --git a/src/test/java/org/mvplugins/multiverse/inventories/commands/ToggleCommandTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/commands/ToggleCommandTest.kt new file mode 100644 index 00000000..5a3d7497 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/commands/ToggleCommandTest.kt @@ -0,0 +1,37 @@ +package org.mvplugins.multiverse.inventories.commands + +import org.mvplugins.multiverse.inventories.config.InventoriesConfig +import org.mvplugins.multiverse.inventories.share.Sharables +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class ToggleCommandTest : AbstractCommandTest() { + + private lateinit var config : InventoriesConfig + + @BeforeTest + fun setUp() { + config = serviceLocator.getActiveService(InventoriesConfig::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("InventoriesConfig is not available as a service") } + } + + @Test + fun `Toggle last_location on and off`() { + assertFalse(config.optionalShares.contains(Sharables.LAST_LOCATION)) + server.dispatchCommand(console, "mvinv toggle last_location") + assertTrue(config.optionalShares.contains(Sharables.LAST_LOCATION)) + server.dispatchCommand(console, "mvinv toggle last_location") + assertFalse(config.optionalShares.contains(Sharables.LAST_LOCATION)) + } + + @Test + fun `Toggle economy on and off`() { + assertFalse(config.optionalShares.contains(Sharables.ECONOMY)) + server.dispatchCommand(console, "mvinv toggle economy") + assertTrue(config.optionalShares.contains(Sharables.ECONOMY)) + server.dispatchCommand(console, "mvinv toggle economy") + assertFalse(config.optionalShares.contains(Sharables.ECONOMY)) + } +} diff --git a/src/test/java/org/mvplugins/multiverse/inventories/gameplay/GameModeChangeTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/gameplay/GameModeChangeTest.kt new file mode 100644 index 00000000..372e82c8 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/gameplay/GameModeChangeTest.kt @@ -0,0 +1,7 @@ +package org.mvplugins.multiverse.inventories.gameplay + +import org.mvplugins.multiverse.inventories.TestWithMockBukkit + +class GameModeChangeTest : TestWithMockBukkit() { + //TODO +} diff --git a/src/test/java/org/mvplugins/multiverse/inventories/gameplay/PlayerNameChangeTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/gameplay/PlayerNameChangeTest.kt new file mode 100644 index 00000000..3962b697 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/gameplay/PlayerNameChangeTest.kt @@ -0,0 +1,81 @@ +package org.mvplugins.multiverse.inventories.gameplay + +import org.bukkit.Material +import org.bukkit.inventory.ItemStack +import org.mockbukkit.mockbukkit.entity.PlayerMock +import org.mvplugins.multiverse.core.world.WorldManager +import org.mvplugins.multiverse.core.world.options.CreateWorldOptions +import org.mvplugins.multiverse.inventories.TestWithMockBukkit +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager +import java.nio.file.Path +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotEquals +import kotlin.test.assertTrue + +class PlayerNameChangeTest : TestWithMockBukkit() { + + private lateinit var profileDataSource: ProfileDataSource + private lateinit var player: PlayerMock + + @BeforeTest + fun setUp() { + profileDataSource = serviceLocator.getService(ProfileDataSource::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("ProfileDataSource is not available as a service") } + + val worldManager = serviceLocator.getActiveService(WorldManager::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("WorldManager is not available as a service") } + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world")).isSuccess) + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world_nether")).isSuccess) + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("test")).isSuccess) + + val worldGroupManager = serviceLocator.getActiveService(WorldGroupManager::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("WorldGroupManager is not available as a service") } + writeResourceToConfigFile("/gameplay/name_change_groups.yml", "groups.yml") + assertTrue(worldGroupManager.load().isSuccess) + + player = server.addPlayer("Benji_0224") + } + + @Test + fun `Player name changes`() { + val stack = ItemStack.of(Material.STONE_BRICKS, 5) + player.health = 5.0 + player.inventory.setItem(0, stack) + + server.getWorld("world_nether")?.let { player.teleport(it.spawnLocation) } + assertEquals(5.0, player.health) + assertEquals(stack, player.inventory.getItem(0)) + + server.getWorld("test")?.let { player.teleport(it.spawnLocation) } + assertNotEquals(5.0, player.health) + assertNotEquals(stack, player.inventory.getItem(0)) + + assertTrue(player.disconnect()) + player.name = "benthecat10" + assertTrue(player.reconnect()) + + server.getWorld("world")?.let { player.teleport(it.spawnLocation) } + assertEquals(5.0, player.health) + assertEquals(stack, player.inventory.getItem(0)) + + // check files + assertTrue(Path.of(multiverseInventories.dataFolder.absolutePath, "worlds", "world", "benthecat10.json").toFile().exists()) + assertTrue(Path.of(multiverseInventories.dataFolder.absolutePath, "worlds", "world_nether", "benthecat10.json").toFile().exists()) + assertTrue(Path.of(multiverseInventories.dataFolder.absolutePath, "worlds", "test", "benthecat10.json").toFile().exists()) + assertTrue(Path.of(multiverseInventories.dataFolder.absolutePath, "groups", "default", "benthecat10.json").toFile().exists()) + assertTrue(Path.of(multiverseInventories.dataFolder.absolutePath, "groups", "test", "benthecat10.json").toFile().exists()) + + assertFalse(Path.of(multiverseInventories.dataFolder.absolutePath, "worlds", "world", "Benji_0224.json").toFile().exists()) + assertFalse(Path.of(multiverseInventories.dataFolder.absolutePath, "worlds", "world_nether", "Benji_0224.json").toFile().exists()) + assertFalse(Path.of(multiverseInventories.dataFolder.absolutePath, "worlds", "test", "Benji_0224.json").toFile().exists()) + assertFalse(Path.of(multiverseInventories.dataFolder.absolutePath, "groups", "default", "Benji_0224.json").toFile().exists()) + assertFalse(Path.of(multiverseInventories.dataFolder.absolutePath, "groups", "test", "Benji_0224.json").toFile().exists()) + + // check player profile + assertEquals("benthecat10", profileDataSource.getGlobalProfile(player)?.lastKnownName) + } +} diff --git a/src/test/java/org/mvplugins/multiverse/inventories/gameplay/WorldChangeTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/gameplay/WorldChangeTest.kt new file mode 100644 index 00000000..843ecd42 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/gameplay/WorldChangeTest.kt @@ -0,0 +1,38 @@ +package org.mvplugins.multiverse.inventories.gameplay + +import com.dumptruckman.minecraft.util.Logging +import org.bukkit.Material +import org.bukkit.inventory.ItemStack +import org.mvplugins.multiverse.core.world.WorldManager +import org.mvplugins.multiverse.core.world.options.CreateWorldOptions +import org.mvplugins.multiverse.inventories.TestWithMockBukkit +import kotlin.test.* + +class WorldChangeTest : TestWithMockBukkit() { + + @BeforeTest + fun setUp() { + val worldManager = serviceLocator.getActiveService(WorldManager::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("WorldManager is not available as a service") } + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world1")).isSuccess) + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world2")).isSuccess) + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world3")).isSuccess) + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world4")).isSuccess) + } + + @Test + fun `Test shares`() { + writeResourceToConfigFile("/gameplay/world_change_groups.yml", "groups.yml") + multiverseInventories.reloadConfig() + val player = server.addPlayer("Benji_0224") + Logging.fine("player world: " + server.getPlayer("Benji_0224")?.world?.name) + val stack = ItemStack.of(Material.STONE_BRICKS, 64) + player.inventory.setItem(0, stack) + server.getWorld("world2")?.let { player.teleport(it.spawnLocation) } + assertEquals(stack, player.inventory.getItem(0)) + server.getWorld("world4")?.let { player.teleport(it.spawnLocation) } + assertNotEquals(stack, player.inventory.getItem(0)) + server.getWorld("world2")?.let { player.teleport(it.spawnLocation) } + assertEquals(stack, player.inventory.getItem(0)) + } +} diff --git a/src/test/java/org/mvplugins/multiverse/inventories/profile/ProfileContainerTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/profile/ProfileContainerTest.kt new file mode 100644 index 00000000..7736f73c --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/profile/ProfileContainerTest.kt @@ -0,0 +1,7 @@ +package org.mvplugins.multiverse.inventories.profile + +import org.mvplugins.multiverse.inventories.TestWithMockBukkit + +class ProfileContainerTest : TestWithMockBukkit() { + //TODO +} \ No newline at end of file diff --git a/src/test/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSourceTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSourceTest.kt new file mode 100644 index 00000000..599011c0 --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSourceTest.kt @@ -0,0 +1,7 @@ +package org.mvplugins.multiverse.inventories.profile + +import org.mvplugins.multiverse.inventories.TestWithMockBukkit + +class ProfileDataSourceTest : TestWithMockBukkit() { + //TODO +} \ No newline at end of file diff --git a/src/test/java/org/mvplugins/multiverse/inventories/profile/WorldGroupManagerTest.kt b/src/test/java/org/mvplugins/multiverse/inventories/profile/WorldGroupManagerTest.kt new file mode 100644 index 00000000..0348423e --- /dev/null +++ b/src/test/java/org/mvplugins/multiverse/inventories/profile/WorldGroupManagerTest.kt @@ -0,0 +1,50 @@ +package org.mvplugins.multiverse.inventories.profile + +import org.mvplugins.multiverse.core.world.WorldManager +import org.mvplugins.multiverse.core.world.options.CreateWorldOptions +import org.mvplugins.multiverse.inventories.TestWithMockBukkit +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager +import org.mvplugins.multiverse.inventories.share.Sharables +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class WorldGroupManagerTest : TestWithMockBukkit() { + + private lateinit var worldGroupManager: WorldGroupManager + + @BeforeTest + fun setUp() { + worldGroupManager = + serviceLocator.getActiveService(WorldGroupManager::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("WorldGroupManager is not available as a service") + } + + val worldManager = serviceLocator.getActiveService(WorldManager::class.java).takeIf { it != null } ?: run { + throw IllegalStateException("WorldManager is not available as a service") + } + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world")).isSuccess) + assertTrue(worldManager.createWorld(CreateWorldOptions.worldName("world_nether")).isSuccess) + } + + @Test + fun `First run creates default group`() { + writeResourceToConfigFile("/group/empty.yml", "groups.yml") + assertTrue(worldGroupManager.load().isSuccess) + worldGroupManager.createDefaultGroup() + assertEquals("default", worldGroupManager.defaultGroup.name) + assertEquals(setOf("world", "world_nether"), worldGroupManager.defaultGroup.worlds) + assertConfigEquals("/group/default_group.yml", "groups.yml") + } + + @Test + fun `Create a new group`() { + val group = worldGroupManager.newEmptyGroup("test") + group.addWorld("test1") + group.addWorld("test2") + group.shares.setSharing(Sharables.ALL_INVENTORY, true) + worldGroupManager.updateGroup(group) + assertConfigEquals("/group/test_group.yml", "groups.yml") + } +} diff --git a/src/test/resources/gameplay/name_change_groups.yml b/src/test/resources/gameplay/name_change_groups.yml new file mode 100644 index 00000000..4d8e448c --- /dev/null +++ b/src/test/resources/gameplay/name_change_groups.yml @@ -0,0 +1,12 @@ +groups: + default: + worlds: + - world + - world_nether + shares: + - all + test: + worlds: + - test + shares: + - all \ No newline at end of file diff --git a/src/test/resources/gameplay/world_change_groups.yml b/src/test/resources/gameplay/world_change_groups.yml new file mode 100644 index 00000000..f44e2bbb --- /dev/null +++ b/src/test/resources/gameplay/world_change_groups.yml @@ -0,0 +1,21 @@ +groups: + group1: + worlds: + - world1 + - world2 + shares: + - inventory_contents + - hit_points + group2: + worlds: + - world3 + shares: + - inventory_contents + - hit_points + group3: + worlds: + - world1 + - world2 + - world3 + shares: + - off_hand diff --git a/src/test/resources/group/default_group.yml b/src/test/resources/group/default_group.yml new file mode 100644 index 00000000..5aaab393 --- /dev/null +++ b/src/test/resources/group/default_group.yml @@ -0,0 +1,7 @@ +groups: + default: + worlds: + - world + - world_nether + shares: + - all diff --git a/src/test/resources/group/empty.yml b/src/test/resources/group/empty.yml new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/group/test_group.yml b/src/test/resources/group/test_group.yml new file mode 100644 index 00000000..cfc105c2 --- /dev/null +++ b/src/test/resources/group/test_group.yml @@ -0,0 +1,10 @@ +groups: + test: + worlds: + - test2 + - test1 + shares: + - inventory_contents + - armor_contents + - ender_chest + - off_hand